OVH Cloud OVH Cloud

Recordset et SQL

14 réponses
Avatar
Guy FALESSE
Bonjour à tous,

Voici un code qui, lorsque le recordset est: Set rs =
maBD.OpenRecordset("tblCD")
J'ai toutes les données qui s'inscrivent dans le msFleshGrid, par contre,
lorsque je remplace tblCD par le SQL, rien ne s'affiche, je ne comprends.
Il ya des zip(trois) dans la table.

Private Sub Form_Load()
Dim maBD As Database
Dim rs As Recordset
Dim sPath As String
Dim monSQL As String, critère As String
critère = ".zip"
sPath = App.Path & "\EncodageCD.mdb"
Set maBD = DBEngine.OpenDatabase(sPath)
'Set rs = maBD.OpenRecordset("tblCD")
monSQL = "SELECT * FROM tblCD WHERE right(tblCD.File_Name,4) Like '" &
critère & "%'"
Set rs = maBD.OpenRecordset(monSQL)
Set Data1.Recordset = rs
Me.Text1.Text = rs.RecordCount & " " & "enr."
End Sub

Si quelqu'un pouvait m'aider, cela m'arrangerait fortement.
D'avance merci,

Guy FALESSE

4 réponses

1 2
Avatar
Eric
Bonjour Gloops,

Qu'entends-tu par aucun enregistrement ? La valeur de la propriété
RecordCount ?

Il faut éventuellement suivant le mode de connexion (ADO ou DAO) faire
un movelast pour remplir le recordset car si en adodc tu disposes
instantanément du nb d'enregistrements contenus dans le recordset, ce
n'est pas le cas avec Jet.

Je ne sais pas si c'était la réponse que tu attendais ...


Gloops a écrit :
Bonjour,

Puisqu'apparemment la réponse est trouvée, je vais profiter de ce fil
pour poser une question sur un sujet proche.

DB contient une table AdressePostale, avec quelques enregistrements.

Je n'ai aucun enregistrement sur
Set Rs = DB.OpenRecordset("AdressePostale")

alors que j'en ai plusieurs sur
Set RS = DB.OpenRecordset("SELECT * FROM AdressePostale")

Ma tête un peu capricieuse me dit que ça n'a pas toujours été, elle se
trompe ?




--
A+
Eric
Un petit tour ici : http://users.skynet.be/mpfa/
Accès aux archives :
http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Gloops
Bonjour Eric,

A moins que je neuneute, il me semble qu'à l'ouverture d'un jeu
d'enregistrements (en Jet) RecordCount comptabilise l'enregistrement
courant si il existe, et est donc dans ce cas à 1.

Si on fait un MoveLast alors que RecordCount vaut 0, on se déplace dans
le vide : Rs.RecordCount n'a pas créé d'enregistrement, et vaut toujours 0.

Je viens d'essayer, de mémoire j'aurais dit que MoveLast générait une
erreur si il n'y avait pas d'enregistrement. Peut-être bien que ça
dépend d'autres facteurs d'ailleurs, ou alors j'ai rêvé une erreur sur
un Rs.MoveLast lorsqu'il n'y avait pas d'enregistrement. ça ne doit pas
être le type de jeu, je viens d'essayer
Set Rs = DB.TableDefs("AdressePostale").OpenRecordset(),
il ne trouve pas d'enregistrement (avec ou sans Rs.MoveLast) alors qu'il
y en a.

Bref, à l'ouverture d'un jeu d'enregistrements Jet, on peut avoir aucun
enregistrement, ou plein d'enregistrements. Plein d'enregistrements se
nuance par MoveLast, alors qu'aucun enregistrement ne peut se modifier
que par Rs.Add : 'modification des champs obligatoires : Rs.Update (et
encore seulement avec les droits d'écriture).

Seulement là, je pensais être dans le deuxième cas de figure (plein
d'enregistrements -> Rs.RecordCount = 1), et je suis dans le premier
(aucun enregistrement -> Rs.RecordCount = 0)

J'ai dit une bêtise ? Ou fait une bêtise ?







Eric a écrit, le 17/05/2005 13:48 :
Bonjour Gloops,

Qu'entends-tu par aucun enregistrement ? La valeur de la propriété
RecordCount ?

Il faut éventuellement suivant le mode de connexion (ADO ou DAO) faire
un movelast pour remplir le recordset car si en adodc tu disposes
instantanément du nb d'enregistrements contenus dans le recordset, ce
n'est pas le cas avec Jet.

Je ne sais pas si c'était la réponse que tu attendais ...


Gloops a écrit :

Bonjour,

Puisqu'apparemment la réponse est trouvée, je vais profiter de ce fil
pour poser une question sur un sujet proche.

DB contient une table AdressePostale, avec quelques enregistrements.

Je n'ai aucun enregistrement sur
Set Rs = DB.OpenRecordset("AdressePostale")

alors que j'en ai plusieurs sur
Set RS = DB.OpenRecordset("SELECT * FROM AdressePostale")

Ma tête un peu capricieuse me dit que ça n'a pas toujours été, elle se
trompe ?






Avatar
Eric
Re,

Oui effectivement si le jeu est vide et qu'on fait un MoveLast on a, en
général, une erreur "Aucun enregistrement en cours" , d'où la nécessité
de tester rs.BOF .

Je viens de faire un petit test (Ref DAO 3.6 chargée).

Private Sub Command1_Click()
Dim bd As Database, rs As Recordset, strSQL As String
Set bd = OpenDatabase(App.Path & "donnees.mdb")
Set rs = bd.OpenRecordset("LaTable")
Debug.Print rs.RecordCount <<<--------- 62 (nb exact)
rs.Close
strSQL = "select * from LaTable"
Set rs = bd.OpenRecordset(strSQL)
Debug.Print rs.RecordCount <<<--------- 1
If Not rs.BOF Then
rs.MoveLast
Debug.Print rs.RecordCount <<<--------- 62
End If
rs.Close
Set rs = Nothing
Set bd = Nothing
End Sub

j'en déduis:
Ouverture d'un jeu de type table, RecordCount retourne le nb exact
d'enregistrements.
Ouverture avec un chaine sql, RecordCount me donne 0 ou 1 suivant que le
jeu contient ou non des enregistrements

Donc, en conclusion, je n'ai pas de réponse à ta question initiale :
"Ma tête un peu capricieuse me dit que ça n'a pas toujours été,
elle se trompe ? "
mais une nouvelle interrogation ;-)

A+
Eric
Avatar
Gloops
Au moins, tu as des résultats avec une certaine cohérence.
Un nombre d'enregistrements correct à l'ouverture, OK, pratique même,
mais 0 à l'ouverture alors que la table contient des enregistrements,
j'avoue que je suis un peu perplexe.

Bon, je mets SELECT * FROM, et ça marche, donc ce n'est pas bloquant,
mais je trouve que ça demeure bizarre.

J'ai aussi 0 avec
Set Rs = DB.TableDefs("AdressePostale").OpenRecordset(dbOpenTable)

ça doit dépendre d'une des propriétés de la base ou de la table, un peu
plus tard il faudra que je creuse. A moins que d'ici là quelqu'un ait la
réponse ...

Merci d'avoir cherché.











Eric a écrit, le 17/05/2005 16:39 :

Re,

Oui effectivement si le jeu est vide et qu'on fait un MoveLast on a, en
général, une erreur "Aucun enregistrement en cours" , d'où la nécessité
de tester rs.BOF .

Je viens de faire un petit test (Ref DAO 3.6 chargée).

Private Sub Command1_Click()
Dim bd As Database, rs As Recordset, strSQL As String
Set bd = OpenDatabase(App.Path & "donnees.mdb")
Set rs = bd.OpenRecordset("LaTable")
Debug.Print rs.RecordCount <<<--------- 62 (nb exact)
rs.Close
strSQL = "select * from LaTable"
Set rs = bd.OpenRecordset(strSQL)
Debug.Print rs.RecordCount <<<--------- 1
If Not rs.BOF Then
rs.MoveLast
Debug.Print rs.RecordCount <<<--------- 62
End If
rs.Close
Set rs = Nothing
Set bd = Nothing
End Sub

j'en déduis:
Ouverture d'un jeu de type table, RecordCount retourne le nb exact
d'enregistrements.
Ouverture avec un chaine sql, RecordCount me donne 0 ou 1 suivant que le
jeu contient ou non des enregistrements

Donc, en conclusion, je n'ai pas de réponse à ta question initiale :
"Ma tête un peu capricieuse me dit que ça n'a pas toujours été,
elle se trompe ? "
mais une nouvelle interrogation ;-)

A+
Eric


1 2