ACCES, Recordset et requête SQL

Résolu/Fermé
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 - 25 nov. 2008 à 10:32
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 - 2 mars 2009 à 08:59
Bonjour,
Me voilà confronté à un problème que je trouve étrange.
Dans un formulaire ACCESS 2000, j'ai créé un bouton de commande qui, sur un clic, doit déclencher la création d'un RecordSet qui me servira plus tard à inscrire des données sur EXCEL (c'est une commande très précise que l'on m'a demandé et je ne peux pas m'en écarter en faisant une exportation de table ou autre chose).

Tout se passe relativement bien jusqu'à l'ouverture du Recorset où le logiciel me dit que des valeurs nécessaire ne sont pas renseignée. J'essaye d'ouvrir l'aide (elle bugge), j'exécute pas à pas le script, je remarque que la source du recordset dans mon espion et tronqué de presque la moitié de la requête sql, j'essaye une autre requête plus simple, cela marche parfaitement.

Je me pose donc une question, y a-t-il une longueur à respecter pour la source du recorset (alors qu'une variable string peut faire 2 milliards et des poussières de caractères) et comment gruger ACCESS pour qu'il accepte ma requête ?

Je précise que pour une raison qui m'échappe, je ne peux pas écrire rs.source = <nom d'une requête enregistré> et que je suis obligé de faire rs.source = <Select _ FROM _ etc...> ou <Variable string contenant la requête>

J'envoie le code dans le message suivant.
Merci d'avance.

8 réponses

ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 97
25 nov. 2008 à 10:34
Private Sub EXL_Click()
Dim rs As New Recordset
Dim sql As String

sql = "SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo]"
sql = sql & " FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible]"
sql = sql & ".[num_plante]) ON [sous_lot].[num_ss_lot]=[plante_disponible].[num_ss_lot]"
sql = sql & " WHERE [plante_disponible].[année_dispo] = [Forms]![FRM_EXCEL]![annee].Caption"
sql = sql & " ORDER BY [plante].[nom_plante_latin];"

rs.ActiveConnection = CurrentProject.Connection
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Source = sql
rs.Open EN GENERAL C'EST ICI QUE CA BLOQUE

Dim i As Long
i = 0
While Not rs.EOF SINON CA CONSIDERE QUE C'EST UN RS VIDE ET CA VA VERS LE WEND
MsgBox rs![nom_plante_latin]
i = i + 1
rs.MoveNext
Wend
End Sub
0
Hello!
est-il possible de voir la requête prise en compte par rs.source ? est-elle entière ou déjà tronquée ?
est-il possible de mettre en place des
if err.number <> 0 then msgbox err.description
après les instructions essentielles du traitement de ta requête ?
0
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 97
25 nov. 2008 à 10:58
Salut, merci de ta réponse rapide,
la msgbox d'erreur affiche "Aucune valeur donnée pour un ou plusieurs des paramètres requis" à rs.open

Si dans le WHERE de la requête, je sors [Forms]![FRM_EXCEL]![annee].caption des guillemets pour faire une concaténation ( =" & [Forms]![FRM_EXCEL]![annee].caption), le script s'execute jusqu'au WHILE NOT.EOF passe à la msgbox d'erreur et n'affiche rien

La source tronquée est :
"SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo] FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible].[num_plante]) ON [sous_lot].[num_ss_lot]=

J'ai beau essayé de passer en contournant, j'ai toujours un problème quelque part.
C'est frustrant !
0
Ca va t'énerver...
j'ai collé ta requête tronquée dans un éditeur de texte... le texte fait 256 car !!! soit la taille maxi d'une chaine des époques reculées ;-)
=> la propriété source de ton recordset est limité à 256 car (ça fait un peu foutage de g....)
donc tu as très certainement une autre méthode utilisable pour transmettre ta requête au moteur... mais je suis bien incapable de t'aider car je ne connais rien à Access.

1. Est-ce que par hasard, les chaines dans ton pgm seraient pas limitées à 256 car... genre je travaille en octets alors que tout le monde préfère l'unicode depuis 10ans.
2. Est-ce que la requete tronquée que tu affiches vient de la propriété source du recordset ou est-ce la chaine calculée ?
2bis si juste avant rs.source = sql tu glisses un msgbox len(sql), aurais-tu un affichage "256"
=> oui, la nature des chaines que tu utilises qui te bride
=> non, c'est access qui limite les chaines et il va te falloir trouver l'option ou l'instruction pour utiliser des chaines vastes (les 4Gb dont tu parlais initialement).

Sur ce, je te laisse car je vais me coucher. bon courage !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blux Messages postés 26009 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
25 nov. 2008 à 11:28
Salut,

un recordset se définit avec une instruction set, généralement.

Je te suggère donc la syntaxe suivante :
Set Rs = CurrentDb.OpenRecordset(sql, dbOpenTable, dbReadOnly)
while not rs.EOF...
--

A+ Blux           
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 97
25 nov. 2008 à 11:37
Merci Blux mais...

"Argument non valide" au niveau du SET

Mais d'un point de vue général, je ne me rappelle pas avoir réussi à définir un NEW RECORDSET avec un SET
0
blux Messages postés 26009 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289 > ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009
25 nov. 2008 à 12:24
voui, t'as raison, j'avais pas fait attention au new recordset :-)

Je viens de tester chez moi (en access 2002, avec une autre requête), ça marche parfaitement...

J'ai du mal à saisir...
0
blux Messages postés 26009 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289 > blux Messages postés 26009 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024
25 nov. 2008 à 12:31
tu peux essayer de créer retaper ta requête en tant que requête 'normale' pour voir si elle est exécutée ?
0
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 97 > blux Messages postés 26009 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024
25 nov. 2008 à 14:56
Salut,
J'ai RE essayé en requête "normale" en passant par l'assistant création et tout le tintouin (cette fois-ci je l'ai enregistré comme ça je peux toujours la vérifier) et elle marche correctement, s'execute et me renvoie les dix enregistrements prévus.

C'EST CA, LE PLUS FRUSTRANT !!!!!!!!

Donc je me résume, ma déclaration de variable est bonne, ma déclaration de recorset est bonne, ma requête est bonne, conclusion :
J'oublie tout le barda et je réinvente la casserole à pression... Non ! J'ai obligation de réussite donc je cherche encore.

Merci de tes efforts.
0
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 97
25 nov. 2008 à 11:32
Tcho,

1. Les chaines ne sont pas limité à 256 c. (d'après l'aide sur la variables string, mais je commence à doute de l'aide)
2. La requête tronquée vient de la propriétés source mais si je met un espion sur la variable sql, la requête est tronquée exactement au même endroit, j'en déuis donc que c'est l'affichage de l'espion qui est limité à 256 c. d'autant plus que :
2bis. msgbox len(sql) = 402 =>Access limite ....

Merci de ton aide, bonne nuit
0
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 97
4 déc. 2008 à 14:33
Salut,
RéSOLUTION DU PROBLèME ::::::::::::::::::::::::::

sql = "SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo]"
sql = sql & " FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible]"
sql = sql & ".[num_plante]) ON [sous_lot].[num_ss_lot]=[plante_disponible].[num_ss_lot]"
sql = sql & " WHERE [plante_disponible].[année_dispo] =" & [Forms]![FRM_EXCEL]![annee].Caption
sql = sql & " ORDER BY [plante].[nom_plante_latin];"

Ce code SQL, bien que parfaitement correct dans l'assistant requête de ACCESS, est aussi parfaitement incorect en dynamique par VBA à cause du format STRING du champs [plante_disponible]![année_dispo].
Il faut donc faire apparaitre des guillements à l'intérieur de la variable sql.

Ce qui donne (la modification est en gras) :

sql = "SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo]"
sql = sql & " FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible]"
sql = sql & ".[num_plante]) ON [sous_lot].[num_ss_lot]=[plante_disponible].[num_ss_lot]"
sql = sql & " WHERE [plante_disponible].[année_dispo] =""" &[Forms]![FRM_EXCEL]![annee].Caption
sql = sql & """
ORDER BY [plante].[nom_plante_latin];"

C'est un problème qui n'aurait pas eu lieu d'être si j'avais pu faire rs.source = <nom de la requête>.
0
Jeffjefferson
27 févr. 2009 à 15:12
Mdr je cherche sur internet des infos et j'tombe sur ton pseudo ash... xD
0
ashtheking Messages postés 223 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 7 avril 2009 97
2 mars 2009 à 08:59
Yo Jeff,
0