ACCES, Recordset et requête SQL
Résolu
ashtheking
Messages postés
223
Date d'inscription
Statut
Membre
Dernière intervention
-
ashtheking Messages postés 223 Date d'inscription Statut Membre Dernière intervention -
ashtheking Messages postés 223 Date d'inscription Statut Membre Dernière intervention -
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.
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.
A voir également:
- ACCES, Recordset et requête SQL
- Acces rapide - Guide
- Accès refusé - Guide
- Trousseau d'accès iphone - Guide
- Accès presse papier - Guide
- Je n'ai plus acces a ma boite mail gmail - Guide
8 réponses
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
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
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 ?
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 ?
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 !
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 !
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 !
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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
un recordset se définit avec une instruction set, généralement.
Je te suggère donc la syntaxe suivante :
A+ Blux
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"
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.
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.
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
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
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>.
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>.