Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Une requête sql ajout qui n'ajoute pas (en cause les & et ")

9 réponses
Avatar
Gundt
Bonsoir à tous,

J'ai dans le code d'un formulaire sur le bouton aperçu avant impression
qui exécute un code qui me crée un numéro de facture. Le code récupère
le numéro de facture dans une variable nommée nouvnum.
Je l'ai donc mis en critère (en plus du mois, de l'année, et du
Codeclient) dans la requête ajout : il n'y a pas de message de
compilation ni de message d'erreur à l'exécution du programme.

Simplement, la requête n'ajoute pas les enregistrements (je suis certain
qu'il y en a).

Voici cette requête sql :
sql1 = "INSERT INTO [LIGNES FACTURES] " _
& "( [Code article], Désignation, [Prix unitaire], " _
& "[Code unité], Quantité, [Total ligne], DateBL, [N°BL], Numfacture )" _
& "SELECT DISTINCTROW [LIGNES BL TEMP].[Code article], " _
& "[LIGNES BL TEMP].Désignation, [LIGNES BL TEMP].[Prix unitaire], " _
& "[LIGNES BL TEMP].[Code unité], [LIGNES BL TEMP].Quantité, " _
& "[LIGNES BL TEMP].[Total ligne], BL.DateSortie, BL.[N°BL], " _
& "FACTURES.Numfacture" _
& "FROM BL INNER JOIN ((((CLIENTS INNER JOIN FACTURES " _
& "ON CLIENTS.Codeclient = FACTURES.CodeClient) " _
& "INNER JOIN ([BL TEMP] INNER JOIN [LIGNES BL TEMP] " _
& "ON [BL TEMP].[N°BL_temp] = [LIGNES BL TEMP].[N°BL_temp]) " _
& "ON FACTURES.CodeClient = [BL TEMP].CodeClient) " _
& "INNER JOIN ETABLISSEMENTS " _
& "ON (ETABLISSEMENTS.Codetab = CLIENTS.Codetab) " _
& "AND (FACTURES.Codetab = ETABLISSEMENTS.Codetab)) " _
& "INNER JOIN SERVICES ON FACTURES.Codeservice = SERVICES.Codeservice) " _
& "ON BL.[N°BL] = [BL TEMP].[N°BL_temp]" _
& " " & " WHERE FACTURES.Numfacture=[nouvnum] " _
& "AND Format([DateSortie_temp],'mm')=" &
[Forms]![Choix_cli_fact_perso]![Mois] & " AND
Format([DateSortie_temp],'yyyy')" _
& " " & [Forms]![Choix_cli_fact_perso]![Année] & " AND " _
& "[BL TEMP].CodeClient=" & [Forms]![Choix_cli_fact_perso]![CodeClient]
& ");"

Où est l'erreur ? Sans doute les & et des " :-(

Quelqu'un peut-il m'aider ?

Merci.

Gundt

9 réponses

Avatar
Fabien
Bonsoir à tous,

J'ai dans le code d'un formulaire sur le bouton aperçu avant impression
qui exécute un code qui me crée un numéro de facture. Le code récupère
le numéro de facture dans une variable nommée nouvnum.
Je l'ai donc mis en critère (en plus du mois, de l'année, et du
Codeclient) dans la requête ajout : il n'y a pas de message de
compilation ni de message d'erreur à l'exécution du programme.

Simplement, la requête n'ajoute pas les enregistrements (je suis certain
qu'il y en a).

Voici cette requête sql :
sql1 = "INSERT INTO [LIGNES FACTURES] " _
& "( [Code article], Désignation, [Prix unitaire], " _
& "[Code unité], Quantité, [Total ligne], DateBL, [N°BL], Numfacture )" _
& "SELECT DISTINCTROW [LIGNES BL TEMP].[Code article], " _
& "[LIGNES BL TEMP].Désignation, [LIGNES BL TEMP].[Prix unitaire], " _
& "[LIGNES BL TEMP].[Code unité], [LIGNES BL TEMP].Quantité, " _
& "[LIGNES BL TEMP].[Total ligne], BL.DateSortie, BL.[N°BL], " _
& "FACTURES.Numfacture" _
& "FROM BL INNER JOIN ((((CLIENTS INNER JOIN FACTURES " _
& "ON CLIENTS.Codeclient = FACTURES.CodeClient) " _
& "INNER JOIN ([BL TEMP] INNER JOIN [LIGNES BL TEMP] " _
& "ON [BL TEMP].[N°BL_temp] = [LIGNES BL TEMP].[N°BL_temp]) " _
& "ON FACTURES.CodeClient = [BL TEMP].CodeClient) " _
& "INNER JOIN ETABLISSEMENTS " _
& "ON (ETABLISSEMENTS.Codetab = CLIENTS.Codetab) " _
& "AND (FACTURES.Codetab = ETABLISSEMENTS.Codetab)) " _
& "INNER JOIN SERVICES ON FACTURES.Codeservice = SERVICES.Codeservice) " _
& "ON BL.[N°BL] = [BL TEMP].[N°BL_temp]" _
& " " & " WHERE FACTURES.Numfacture=[nouvnum] " _
& "AND Format([DateSortie_temp],'mm')=" &
[Forms]![Choix_cli_fact_perso]![Mois] & " AND
Format([DateSortie_temp],'yyyy')" _
& " " & [Forms]![Choix_cli_fact_perso]![Année] & " AND " _
& "[BL TEMP].CodeClient=" & [Forms]![Choix_cli_fact_perso]![CodeClient]
& ");"

Où est l'erreur ? Sans doute les & et des " :-(

Quelqu'un peut-il m'aider ?

Merci.

Gundt

Bonjour Gundt

Juste un 'truc' en passant
Lorsque tu as des requetes dans du code dont tu n'est pas trop sur.
Passe sur ta procédure en mode debug, arretes toi apres la derniére
instruction de génération de ta chaine. Passe dans la fenetre ligne de
commande et tape debug.print lenomdetavariablechainesql
Elle s'affiche alors.
Tu selectionnes, tu copie. Tu revient dans les requetes,nouvelles tu ne
choisit pas de table,Tu clic sur SQL (1er outils a gauche) et dans cette
fenetre tu copies ta chaine sql.
Déjà là tu saura si c'est ok ou pas.
Ensuite tu la fait tourner pour voir le resultat.
A 90% on, trouve où est l'erreur ;-)
Tente le coups !
@+
Fabien

Avatar
Gilles MOUGNOZ
Bonjour,
La réponse de Fabien est tout à fait pertinente.
Toutefois, cette requête me semble particulièrement figée et le fait de
l'écrire dans le code ne me semble pas apporter grand chose.
L'intéret d'écrire une requête SQL dans le code est de pouvoir créer une
requête complètement dynamique où l'on peut changer les tables, les champs
et les relations à sa guise.
Ici, je verrais plutôt une "vraie" requête enregistrée dans l'éditeur de
requête où, comme l'a dit Fabien, il est beaucoup plus facile de détecter
une erreur.
A moins que le but soit de minimiser le nombre de requêtes "visibles" par
les utilisateurs, auquel cas, il existe d'autres moyens comme masquer la
requête.
Espérant avoir fait avancer le débat...
--
Bonne continuation

PS: je crois que l'erreur se situe entre la 3ème et la 4ème ligne en partant
de la fin, il manque un signe "=" sur la vérification de l'année.
-------------------------------------------------------------------------------------------
http://www.mpfa.info : c'est bonheur pour ton ordinateur !
-------------------------------------------------------------------------------------------
Bonsoir à tous,
J'ai dans le code d'un formulaire sur le bouton aperçu avant impression
qui exécute un code qui me crée un numéro de facture. Le code récupère le
numéro de facture dans une variable nommée nouvnum.
Je l'ai donc mis en critère (en plus du mois, de l'année, et du
Codeclient) dans la requête ajout : il n'y a pas de message de
compilation ni de message d'erreur à l'exécution du programme.
Simplement, la requête n'ajoute pas les enregistrements (je suis certain
qu'il y en a).
Voici cette requête sql :
sql1 = "INSERT INTO [LIGNES FACTURES] " _
& "( [Code article], Désignation, [Prix unitaire], " _
& "[Code unité], Quantité, [Total ligne], DateBL, [N°BL], Numfacture )" _
& "SELECT DISTINCTROW [LIGNES BL TEMP].[Code article], " _
& "[LIGNES BL TEMP].Désignation, [LIGNES BL TEMP].[Prix unitaire], " _
& "[LIGNES BL TEMP].[Code unité], [LIGNES BL TEMP].Quantité, " _
& "[LIGNES BL TEMP].[Total ligne], BL.DateSortie, BL.[N°BL], " _
& "FACTURES.Numfacture" _
& "FROM BL INNER JOIN ((((CLIENTS INNER JOIN FACTURES " _
& "ON CLIENTS.Codeclient = FACTURES.CodeClient) " _
& "INNER JOIN ([BL TEMP] INNER JOIN [LIGNES BL TEMP] " _
& "ON [BL TEMP].[N°BL_temp] = [LIGNES BL TEMP].[N°BL_temp]) " _
& "ON FACTURES.CodeClient = [BL TEMP].CodeClient) " _
& "INNER JOIN ETABLISSEMENTS " _
& "ON (ETABLISSEMENTS.Codetab = CLIENTS.Codetab) " _
& "AND (FACTURES.Codetab = ETABLISSEMENTS.Codetab)) " _
& "INNER JOIN SERVICES ON FACTURES.Codeservice = SERVICES.Codeservice) "
_
& "ON BL.[N°BL] = [BL TEMP].[N°BL_temp]" _
& " " & " WHERE FACTURES.Numfacture=[nouvnum] " _
& "AND Format([DateSortie_temp],'mm')=" &
[Forms]![Choix_cli_fact_perso]![Mois] & " AND
Format([DateSortie_temp],'yyyy')" _
& " " & [Forms]![Choix_cli_fact_perso]![Année] & " AND " _
& "[BL TEMP].CodeClient=" & [Forms]![Choix_cli_fact_perso]![CodeClient] &
");"
Où est l'erreur ? Sans doute les & et des " :-(
Quelqu'un peut-il m'aider ?
Merci.
Gundt
Bonjour Gundt

Juste un 'truc' en passant
Lorsque tu as des requetes dans du code dont tu n'est pas trop sur. Passe
sur ta procédure en mode debug, arretes toi apres la derniére instruction
de génération de ta chaine. Passe dans la fenetre ligne de commande et
tape debug.print lenomdetavariablechainesql
Elle s'affiche alors.
Tu selectionnes, tu copie. Tu revient dans les requetes,nouvelles tu ne
choisit pas de table,Tu clic sur SQL (1er outils a gauche) et dans cette
fenetre tu copies ta chaine sql.
Déjà là tu saura si c'est ok ou pas.
Ensuite tu la fait tourner pour voir le resultat.
A 90% on, trouve où est l'erreur ;-)
Tente le coups !
@+
Fabien



Avatar
Gundt
[...]

Bonjour Gundt
Juste un 'truc' en passant
Lorsque tu as des requetes dans du code dont tu n'est pas trop sur.
Passe sur ta procédure en mode debug, arretes toi apres la derniére
instruction de génération de ta chaine.
J'ai tapé comme me l'a conseillé Eric debug.print sql1 mais cela ne

m'affiche rien.
Passe dans la fenetre ligne de
commande
C'est quoi et comment on fait ?

et tape debug.print lenomdetavariablechainesql
Elle s'affiche alors.
Je n'ai pas bien compris.

Tu selectionnes, tu copie. Tu revient dans les requetes,nouvelles tu ne
choisit pas de table,Tu clic sur SQL (1er outils a gauche) et dans cette
fenetre tu copies ta chaine sql.
Je faisais l'inverse jusqu'à présent. Je crée une requête en mode

création puis je passe en mode sql et je la copie dans la procédure sous
forme de chaîne de caractère. Mais le problème, c'est qu'une requête qui
fonctionne dans l'onglet requête ne fonctionne pas forcément dans la
procédure (c'est toujours là où je suis embêté).
Je voudrais bien essayer ce que tu me dis mais ma requête au départ
fonctionne dans l'onglet requête. C'est quand je passe en mode sql dans
la procédure qu'il faut ajouter des & et des " pour que cela se passe bien.
Déjà là tu saura si c'est ok ou pas.
Ensuite tu la fait tourner pour voir le resultat.
A 90% on, trouve où est l'erreur ;-)
Tente le coups !
@+
Fabien


Merci Fabien.

Gundt

Avatar
ze Titi
Salut Gundt !

On peut aussi, après la création de la chaîne SQL, l'afficher dans un
MsgBox et voir ce qu'il en est.

En ce jour exceptionnel du mardi 03/04/2007, tu nous as très
généreusement gratifié du message suivant:

[...]

Bonjour Gundt
Juste un 'truc' en passant
Lorsque tu as des requetes dans du code dont tu n'est pas trop sur. Passe
sur ta procédure en mode debug, arretes toi apres la derniére instruction
de génération de ta chaine.
J'ai tapé comme me l'a conseillé Eric debug.print sql1 mais cela ne m'affiche

rien.
Passe dans la fenetre ligne de
commande
C'est quoi et comment on fait ?

et tape debug.print lenomdetavariablechainesql
Elle s'affiche alors.
Je n'ai pas bien compris.

Tu selectionnes, tu copie. Tu revient dans les requetes,nouvelles tu ne
choisit pas de table,Tu clic sur SQL (1er outils a gauche) et dans cette
fenetre tu copies ta chaine sql.
Je faisais l'inverse jusqu'à présent. Je crée une requête en mode création

puis je passe en mode sql et je la copie dans la procédure sous forme de
chaîne de caractère. Mais le problème, c'est qu'une requête qui fonctionne
dans l'onglet requête ne fonctionne pas forcément dans la procédure (c'est
toujours là où je suis embêté).
Je voudrais bien essayer ce que tu me dis mais ma requête au départ
fonctionne dans l'onglet requête. C'est quand je passe en mode sql dans la
procédure qu'il faut ajouter des & et des " pour que cela se passe bien.
Déjà là tu saura si c'est ok ou pas.
Ensuite tu la fait tourner pour voir le resultat.
A 90% on, trouve où est l'erreur ;-)
Tente le coups !
@+
Fabien


Merci Fabien.

Gundt


--
Cordialement,
Ze Titi

Tout pour réussir avec Access :
http://www.mpfa.info


Avatar
Gundt
Bonjour,
La réponse de Fabien est tout à fait pertinente.
Toutefois, cette requête me semble particulièrement figée et le fait de
l'écrire dans le code ne me semble pas apporter grand chose.
L'intéret d'écrire une requête SQL dans le code est de pouvoir créer une
requête complètement dynamique où l'on peut changer les tables, les champs
et les relations à sa guise.
Ici, je verrais plutôt une "vraie" requête enregistrée dans l'éditeur de
requête où, comme l'a dit Fabien, il est beaucoup plus facile de détecter
une erreur.
A moins que le but soit de minimiser le nombre de requêtes "visibles" par
les utilisateurs, auquel cas, il existe d'autres moyens comme masquer la
requête.
Espérant avoir fait avancer le débat...
Bonjour Gilles et les autres,


En fait, le bouton aperçu avant impression provoque (grâce à la
procédure event) après la sélection de l'utilisateur (mois, année,
CodeClient) (s'il y a une facture à créer):
- la création d'un numéro automatique de facture sur un état
- la création pour cette fameuse requête ajout (dont on parle) des
lignes des bl dans la table LIGNES FACTURES
_ la suppression des bl et des lignes de bl (par 2 requêtes suppression
sql) dans les tables temporaires Bl temp et lignes bl temp.
- et enfin, l'ouverture d'un état correspondant à la facture créée

Nota : La requête n'est pas en propriété source du formulaire : je ne
peux pas la garder en mode visible dans l'onglet requête.

Espérant avoir éclairci le problème,

Merci d'avance.

Gundt

Avatar
Gilles MOUGNOZ
Bonjour, Gundt
Debug.Print envoie le texte en paramètre dans le fenêtre Exécution de
l'éditeur VBA. Le raccourci-clavier pour accéder à cette fenêtre est Ctrl+G.
Pour revenir sur ce que je te proposais:
Pour masquer ta requête: clic-droit, Propriétés et cocher l'attribut
"Masqué".
Pour éviter que les autres utilisateurs ne la voient, menu
OutilsOptions..., onglet Affichage, dans Afficher, décocher "Objets
masqués" (à faire sur les postes des utilisateurs uniquement, mieux vaut que
tu gardes cette option cochée sur le tien pour faire tes modifications)
--
Bonne continuation
-------------------------------------------------------------------------------------------
http://www.mpfa.info : c'est bonheur pour ton ordinateur !
-------------------------------------------------------------------------------------------
[...]

Bonjour Gundt
Juste un 'truc' en passant
Lorsque tu as des requetes dans du code dont tu n'est pas trop sur. Passe
sur ta procédure en mode debug, arretes toi apres la derniére instruction
de génération de ta chaine.
J'ai tapé comme me l'a conseillé Eric debug.print sql1 mais cela ne

m'affiche rien.
Passe dans la fenetre ligne de
commande
C'est quoi et comment on fait ?

et tape debug.print lenomdetavariablechainesql
Elle s'affiche alors.
Je n'ai pas bien compris.

Tu selectionnes, tu copie. Tu revient dans les requetes,nouvelles tu ne
choisit pas de table,Tu clic sur SQL (1er outils a gauche) et dans cette
fenetre tu copies ta chaine sql.
Je faisais l'inverse jusqu'à présent. Je crée une requête en mode création

puis je passe en mode sql et je la copie dans la procédure sous forme de
chaîne de caractère. Mais le problème, c'est qu'une requête qui fonctionne
dans l'onglet requête ne fonctionne pas forcément dans la procédure (c'est
toujours là où je suis embêté).
Je voudrais bien essayer ce que tu me dis mais ma requête au départ
fonctionne dans l'onglet requête. C'est quand je passe en mode sql dans la
procédure qu'il faut ajouter des & et des " pour que cela se passe bien.
Déjà là tu saura si c'est ok ou pas.
Ensuite tu la fait tourner pour voir le resultat.
A 90% on, trouve où est l'erreur ;-)
Tente le coups !
@+
Fabien


Merci Fabien.

Gundt



Avatar
Eric
Bonjour,

Je pense qu'il faut que tu sortes de ton sql [nouvnum] puisqu'il est
créé dans la procédure.
... & " WHERE FACTURES.Numfacture=" & nouvnum & "..."



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Gundt
Bonjour, Gundt
Debug.Print envoie le texte en paramètre dans le fenêtre Exécution de
l'éditeur VBA. Le raccourci-clavier pour accéder à cette fenêtre est Ctrl+G.
Oui, cette fois-ci, je viens de voir le fonctionnement de cette fenêtre.

En fait, il faut y revenir après avoir lancé le formulaire et regarder
la valeur des variables.
C'est comme cela que j'ai vu qu'il manquait un espace devant un FROM. A
cause des retours à la ligne, on ne se rend pas forcément compte qu'il
n'y a pas d'espace au bout de la ligne précédente.
Pour revenir sur ce que je te proposais:
Pour masquer ta requête: clic-droit, Propriétés et cocher l'attribut
"Masqué".
Pour éviter que les autres utilisateurs ne la voient, menu
OutilsOptions..., onglet Affichage, dans Afficher, décocher "Objets
masqués" (à faire sur les postes des utilisateurs uniquement, mieux vaut que
tu gardes cette option cochée sur le tien pour faire tes modifications)
Ok. Je ne savais pas.

Je l'enregistre dans un coin au cas où.

Merci.

Gundt

Avatar
Gundt
Bonjour,

Je pense qu'il faut que tu sortes de ton sql [nouvnum] puisqu'il est
créé dans la procédure.
... & " WHERE FACTURES.Numfacture=" & nouvnum & "..."


Je l'ai écrit comme tu le proposes et ça marche.

En fait, il y a avait ce problème d'écriture et un problème d'espace qui
manquait dans la rqt sql.

Un grand merci à tous ceux qui m'ont aidé.

Gundt