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

pb de code pour ajouter condition dans requête ajout

12 réponses
Avatar
Gundt
bonjour à tous,

Je viens de découvrir un bug dans mon appli de facturation que je
croyais avoir terminé.

Voici ce qui se passe :
A la création des factures, le 1er mois : tout s'est bien passé. Le
programme a créé les factures de mars début avril. Les factures de mars
sont exactes.
Celles d'avril : le programme crée les factures d'avril avec l'en-tête
et les lignes de factures (je passe les détails). Celles-ci sont bonnes
en avril mais par contre, en même temps le code ajoute les lignes
factures d'Avril dans les lignes factures de mars pour chaque client qui
a eu une facture en mars.

Je pense que la requête ne doit simplement ajouter les lignes factures
que pour le mois sélectionné, l'année sélectionnée ou par le numéro de
facture.

Comment corriger cela en sachant que la création de la facture est créée
par le code et la création des lignes de facture par une requête ajout
dans ce même code ?

Je vous joins à la fin du mail le code et la requête sql.

J'ai essayé d'ajouter à la requête ajout cette ligne en récupérant le
numéro de facture de la variable :
& "WHERE [FACTURES].Numfacture = & nouvnum & ;"

Mais cela ne change rien.
Ci-dessous les codes et la requête ajout avant la modif que j'ai essayé.

J'espère que mon mail sera suffisamment clair malgré la longueur.

Merci d'avance.

Gundt

--------------------------------------------
voici le code de la création de facture :
--------------------------------------------
' procédure de création de numéro automatique de facture
Dim db As Database
Dim r As Recordset, s As Recordset, f As Form
Dim suivnum1 As String, suivnum2 As String, suivnum As String, nouvnum
As String
Dim numero As Long
Dim codecli1 As Long
' codecli2 As Long
Dim mm As Byte
Dim yyyy As Long
Dim sql1 As String

Set db = DBEngine(0)(0)

sql1 = "SELECT DISTINCTROW [BL TEMP].CodeClient, CLIENTS.Codetab, " _
& "CLIENTS.[Code service], SERVICES.[Nom du service],
SERVICES.Factureindividuelle, CLIENTS.Nom, " _
& "CLIENTS.Monsieur, CLIENTS.Prénom, CLIENTS.Adresse, CLIENTS.Ville,
CLIENTS.[Code Postal], " _
& "Format([DateSortie_temp],'mm') AS MoisBL,
Format([DateSortie_temp],'yyyy') " _
& "AS AnnéeBL, [BL TEMP].CodeClient FROM SERVICES " _
& "INNER JOIN (CLIENTS INNER JOIN [BL TEMP] ON CLIENTS.Codeclient =
[BL TEMP].CodeClient) " _
& "ON SERVICES.Codeservice = CLIENTS.[Code service] " _
& "GROUP BY [BL TEMP].CodeClient, CLIENTS.Codetab, CLIENTS.[Code
service], " _
& "SERVICES.[Nom du service], SERVICES.Factureindividuelle,
CLIENTS.Nom, CLIENTS.Monsieur, CLIENTS.Prénom, " _
& "CLIENTS.Adresse, CLIENTS.Ville, CLIENTS.[Code Postal],
Format([DateSortie_temp],'mm'), " _
& "Format([DateSortie_temp],'yyyy'), [BL TEMP].CodeClient " _
& "HAVING 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] & " ORDER BY [BL
TEMP].CodeClient;"

Set r = db.OpenRecordset(sql1, DB_OPEN_DYNASET)
Set s = db.OpenRecordset("Factures", DB_OPEN_DYNASET)
' formulaire pour choix de facture
Set f = Forms![Choix_cli_fact_perso]

' On ajoute la lettre A au numéro de facture pour indiquer que les
factures appartiennent à l'Atelier

' numérotation avec A

If Not s.EOF Then s.MoveLast
suivnum1 = "A"
numero = 1
If s.BOF Then
nouvnum = fNouveauNum(suivnum1)
Else
s.MoveLast
suivnum = s!Numfacture
If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
& Format(Val(Mid(suivnum, 8, 3)) + 1, "000")
numero = Val(Mid(nouvnum, 8, 3))
Else
nouvnum = fNouveauNum(suivnum1)
End If
End If
f!test = nouvnum

If Not r.BOF Then r.MoveFirst
codecli1 = r!CodeClient

On Error Resume Next

Do While Not r.EOF
If Format(r!DateSortie_temp, "yyyymm") = Format(f!Année, "0000") &
Format(f!Mois, "00") Then

s.AddNew
s!Numfacture = nouvnum
s!CodeClient = r!CodeClient
s!Codetab = r!Codetab
s!Codeservice = r![Code service]
s!Moisfact = Format(f!Mois, "00")
s!Annéefact = Format(f!Année, "0000")
s.Update
numero = numero + 1
nouvnum = suivnum1 & Format(f!Année, "0000") & Format(f!Mois,
"00") & Format(numero, "000")
codecli1 = r!CodeClient
End If

r.MoveNext
Loop

------------------- fin du code création de facture -------------

---- requête ajout des lignes factures avant ma modif ---------

' Requête ajout pour ajouter les lignes de BL TEMP dans LIGNES FACTURES

' nouvelle requête sql2
sql2 = "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];"

' on execute la rqt ajout
CurrentDb.Execute sql2

10 réponses

1 2
Avatar
Raymond [mvp]
Bonjour.

& "WHERE [FACTURES].Numfacture = & nouvnum & ;"
sauf si tu es en version 2007 tu ne peux pas appeler directement une
variable par une requête, il faut passer par une fonction public qui te
renverra la valeur.

pour ta requête il faut d'abord que tu vérifies les valeurs que tu récupères
en mettant des points d'arrêt dans ta procédure et ensuite que tu affiches
le contenu de sql1 par debug.print pour vérifier s'il n'y a pas une erreur.


--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/
Non Stop Mix '07 - Paris. La nouvelle scène web fête la créativité !
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"Gundt" a écrit dans le message de news:
4656f584$0$9719$
| bonjour à tous,
|
| Je viens de découvrir un bug dans mon appli de facturation que je
| croyais avoir terminé.
|
| Voici ce qui se passe :
| A la création des factures, le 1er mois : tout s'est bien passé. Le
| programme a créé les factures de mars début avril. Les factures de mars
| sont exactes.
| Celles d'avril : le programme crée les factures d'avril avec l'en-tête
| et les lignes de factures (je passe les détails). Celles-ci sont bonnes
| en avril mais par contre, en même temps le code ajoute les lignes
| factures d'Avril dans les lignes factures de mars pour chaque client qui
| a eu une facture en mars.
|
| Je pense que la requête ne doit simplement ajouter les lignes factures
| que pour le mois sélectionné, l'année sélectionnée ou par le numéro de
| facture.
|
| Comment corriger cela en sachant que la création de la facture est créée
| par le code et la création des lignes de facture par une requête ajout
| dans ce même code ?
|
| Je vous joins à la fin du mail le code et la requête sql.
|
| J'ai essayé d'ajouter à la requête ajout cette ligne en récupérant le
| numéro de facture de la variable :
| & "WHERE [FACTURES].Numfacture = & nouvnum & ;"
|
| Mais cela ne change rien.
| Ci-dessous les codes et la requête ajout avant la modif que j'ai essayé.
|
| J'espère que mon mail sera suffisamment clair malgré la longueur.
|
| Merci d'avance.
|
| Gundt
|
| --------------------------------------------
| voici le code de la création de facture :
| --------------------------------------------
| ' procédure de création de numéro automatique de facture
| Dim db As Database
| Dim r As Recordset, s As Recordset, f As Form
| Dim suivnum1 As String, suivnum2 As String, suivnum As String, nouvnum
| As String
| Dim numero As Long
| Dim codecli1 As Long
| ' codecli2 As Long
| Dim mm As Byte
| Dim yyyy As Long
| Dim sql1 As String
|
| Set db = DBEngine(0)(0)
|
| sql1 = "SELECT DISTINCTROW [BL TEMP].CodeClient, CLIENTS.Codetab, " _
| & "CLIENTS.[Code service], SERVICES.[Nom du service],
| SERVICES.Factureindividuelle, CLIENTS.Nom, " _
| & "CLIENTS.Monsieur, CLIENTS.Prénom, CLIENTS.Adresse, CLIENTS.Ville,
| CLIENTS.[Code Postal], " _
| & "Format([DateSortie_temp],'mm') AS MoisBL,
| Format([DateSortie_temp],'yyyy') " _
| & "AS AnnéeBL, [BL TEMP].CodeClient FROM SERVICES " _
| & "INNER JOIN (CLIENTS INNER JOIN [BL TEMP] ON CLIENTS.Codeclient | [BL TEMP].CodeClient) " _
| & "ON SERVICES.Codeservice = CLIENTS.[Code service] " _
| & "GROUP BY [BL TEMP].CodeClient, CLIENTS.Codetab, CLIENTS.[Code
| service], " _
| & "SERVICES.[Nom du service], SERVICES.Factureindividuelle,
| CLIENTS.Nom, CLIENTS.Monsieur, CLIENTS.Prénom, " _
| & "CLIENTS.Adresse, CLIENTS.Ville, CLIENTS.[Code Postal],
| Format([DateSortie_temp],'mm'), " _
| & "Format([DateSortie_temp],'yyyy'), [BL TEMP].CodeClient " _
| & "HAVING 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] & " ORDER BY [BL
| TEMP].CodeClient;"
|
| Set r = db.OpenRecordset(sql1, DB_OPEN_DYNASET)
| Set s = db.OpenRecordset("Factures", DB_OPEN_DYNASET)
| ' formulaire pour choix de facture
| Set f = Forms![Choix_cli_fact_perso]
|
| ' On ajoute la lettre A au numéro de facture pour indiquer que les
| factures appartiennent à l'Atelier
|
| ' numérotation avec A
|
| If Not s.EOF Then s.MoveLast
| suivnum1 = "A"
| numero = 1
| If s.BOF Then
| nouvnum = fNouveauNum(suivnum1)
| Else
| s.MoveLast
| suivnum = s!Numfacture
| If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
| nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
| & Format(Val(Mid(suivnum, 8, 3)) + 1, "000")
| numero = Val(Mid(nouvnum, 8, 3))
| Else
| nouvnum = fNouveauNum(suivnum1)
| End If
| End If
| f!test = nouvnum
|
| If Not r.BOF Then r.MoveFirst
| codecli1 = r!CodeClient
|
| On Error Resume Next
|
| Do While Not r.EOF
| If Format(r!DateSortie_temp, "yyyymm") = Format(f!Année, "0000") &
| Format(f!Mois, "00") Then
|
| s.AddNew
| s!Numfacture = nouvnum
| s!CodeClient = r!CodeClient
| s!Codetab = r!Codetab
| s!Codeservice = r![Code service]
| s!Moisfact = Format(f!Mois, "00")
| s!Annéefact = Format(f!Année, "0000")
| s.Update
| numero = numero + 1
| nouvnum = suivnum1 & Format(f!Année, "0000") & Format(f!Mois,
| "00") & Format(numero, "000")
| codecli1 = r!CodeClient
| End If
|
| r.MoveNext
| Loop
|
| ------------------- fin du code création de facture -------------
|
| ---- requête ajout des lignes factures avant ma modif ---------
|
| ' Requête ajout pour ajouter les lignes de BL TEMP dans LIGNES FACTURES
|
| ' nouvelle requête sql2
| sql2 = "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];"
|
| ' on execute la rqt ajout
| CurrentDb.Execute sql2
Avatar
Gundt
Bonjour.

& "WHERE [FACTURES].Numfacture = & nouvnum & ;"
sauf si tu es en version 2007 tu ne peux pas appeler directement une
variable par une requête, il faut passer par une fonction public qui te
renverra la valeur.

pour ta requête il faut d'abord que tu vérifies les valeurs que tu récupères
en mettant des points d'arrêt dans ta procédure et ensuite que tu affiches
le contenu de sql1 par debug.print pour vérifier s'il n'y a pas une erreur.


Effectivement, j'ai oublié de dire que je suis sous Access 97 et j'ai
oublié qu'il existait le debug.print pour vérifier.

J'essaie demain matin. J'aurai les idées plus claires.

merci et à demain pour la suite.

Gundt

Avatar
Gundt
bonjour à tous,

& "WHERE [FACTURES].Numfacture = & nouvnum & ;"
sauf si tu es en version 2007 tu ne peux pas appeler directement une
variable par une requête, il faut passer par une fonction public qui
te renverra la valeur.
?? Je ne sais pas et ne comprend pas ce que tu veux dire exactement.


Je suis bien sous Access 97 que j'avais oublié de mentionner.

pour ta requête il faut d'abord que tu vérifies les valeurs que tu
récupères en mettant des points d'arrêt dans ta procédure et ensuite
que tu affiches le contenu de sql1 par debug.print pour vérifier s'il
n'y a pas une erreur.


Effectivement, j'ai oublié de dire que je suis sous Access 97 et j'ai
oublié qu'il existait le debug.print pour vérifier.
quand je crée les factures du mois d'avril :


Et il me met un message d'erreur qu'il n'y a pas de données (quand on
arrive à l'exécution de sql2).

Il me crée bien les numéros de factures avec sql1 (cad les
enregistrements de la tables FACTURES) mais la requête ajout sql2 pour
la table LIGNES FACTURES ne fonctionne pas correctement (message
d'information qu'il n'y a pas d'enregistrements).
J'ai mis un debug.print et il me donne comme valeur pour la variable la
dernière facture qui vient d'être créée : A200704096.

Je vais redonner le code qui est à remplacer par celui d'aujourd'hui car
hier, j'ai donné le code (à peu près similaire) d'un autre formulaire.

La rqt sql1 fonctionne bien mais le problème survient sur la rqt sql2
qui est mal paramétrée.
Il faudrait que la requête sql2 ajoute des lignes factures seulement
pour les factures qui viennent d'être crées par sql1 : par exemple, je
crée les factures d'avril et donc, les lignes factures qui sont crées ne
doivent être ajoutées que pour les factures qui viennent d'être créées
(donc avril).
J'avais ajouté & " & AND FACTURES.Numfacture=" & nouvnum & "; " mais
peut-être faudrait-il ajouter quelque chose comme [LIGNES
FACTURES].numfacture = [FACTURES].numfacture d'avril qui viennent d'être
créées.
J'attends votre avis et savoir comment écrire ce genre de critère.

J'espère que ce mail malgré sa longueur sera clair tout de même.
merci d'avance.

Gundt


Voici le code :

' création du numéro automatique de facture
' Call Numfacture
' remplacement de la fonction Numfacture qui est maintenant intégrée
dans ce module
' -----------------------------------------------------------
Dim db As Database
Dim r As Recordset, s As Recordset, f As Form
Dim suivnum1 As String, suivnum2 As String, suivnum As String, nouvnum
As String
Dim numero As Long
Dim codecli1 As Long
Dim mm As Byte
Dim yyyy As Long
Dim sql1 As String

Set db = DBEngine(0)(0)
sql1 = "SELECT DISTINCTROW [BL TEMP].CodeClient, CLIENTS.Codetab," _
& "CLIENTS.[Code service], SERVICES.[Nom du service],
SERVICES.Factureindividuelle, CLIENTS.[Nom], " _
& "CLIENTS.Monsieur, CLIENTS.Prénom, CLIENTS.Adresse, CLIENTS.Ville,
CLIENTS.[Code Postal], " _
& "Format([DateSortie_temp], 'mm') AS MoisBL, Format([DateSortie_temp],
'yyyy') " _
& "AS AnnéeBL FROM (SERVICES INNER JOIN CLIENTS ON SERVICES.Codeservice
= CLIENTS.[Code service]) " _
& "INNER JOIN [BL TEMP] ON CLIENTS.Codeclient = [BL TEMP].CodeClient
GROUP BY [BL TEMP].CodeClient, " _
& "CLIENTS.Codetab, CLIENTS.[Code service], SERVICES.[Nom du service], " _
& "SERVICES.Factureindividuelle, CLIENTS.[Nom], CLIENTS.Monsieur,
CLIENTS.Prénom, " _
& "CLIENTS.Adresse, CLIENTS.Ville, CLIENTS.[Code Postal],
Format([DateSortie_temp],'mm'), " _
& "Format([DateSortie_temp],'yyyy') " _
& "HAVING Format([DateSortie_temp], 'mm') =" &
[Forms]![Choix_fact_perso]![Mois] & " And " _
& "Format([DateSortie_temp], 'yyyy') =" &
[Forms]![Choix_fact_perso]![Année] & " ORDER BY [BL TEMP].CodeClient ;"

Debug.Print sql1

Set r = db.OpenRecordset(sql1, DB_OPEN_DYNASET)
Set s = db.OpenRecordset("Factures", DB_OPEN_DYNASET)
' formulaire pour choix de facture
Set f = Forms![Choix_fact_perso]

If Not s.EOF Then s.MoveLast
suivnum1 = "A"
numero = 1
If s.BOF Then
nouvnum = fNouveauNumero(suivnum1)
Else
s.MoveLast
suivnum = s!Numfacture
If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
& Format(Val(Mid(suivnum, 8, 3)) + 1, "000")
numero = Val(Mid(nouvnum, 8, 3))
Else
nouvnum = fNouveauNumero(suivnum1)
End If
End If
f!test = nouvnum

If Not r.BOF Then r.MoveFirst

codecli1 = r!CodeClient

On Error Resume Next

Do While Not r.EOF
If Format(r!DateSortie_temp, "yyyymm") = Format(f!Année, "0000") &
Format(f!Mois, "00") Then

s.AddNew
s!Numfacture = nouvnum
s!CodeClient = r!CodeClient
s!Codetab = r!Codetab
s!Codeservice = r![Code service]
s!Moisfact = Format(f!Mois, "00")
s!Annéefact = Format(f!Année, "0000")
s.Update
numero = numero + 1
nouvnum = suivnum1 & Format(f!Année, "0000") & Format(f!Mois,
"00") & Format(numero, "000")
codecli1 = r!CodeClient
End If

r.MoveNext
Loop

' ------------------------------------------------------
' Requête ajout pour ajouter les lignes de BL TEMP dans LIGNES
FACTURES
' --------------------------------------------------

sql2 = "INSERT INTO [LIGNES FACTURES] " _
& "( Numfacture, [Code article], Désignation, [Prix unitaire], " _
& "[Code unité], Quantité, [Total ligne], DateBL, [N°BL] ) " _
& "SELECT DISTINCTROW FACTURES.Numfacture, " _
& "[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] " _
& "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 Format([DateSortie_temp], 'mm')=" &
[Forms]![Choix_fact_perso]![Mois] & " " _
& "AND Format([DateSortie_temp], 'yyyy') =" &
[Forms]![Choix_fact_perso]![Année] & " " _
& " & AND FACTURES.Numfacture=" & nouvnum & "; "

Debug.Print sql2

CurrentDb.Execute sql2


Avatar
Raymond [mvp]
pourquoi ce code vba entre deux requêtes ?
bien sûr qu'il faut un test sur la première requête pour limiter au mois et
à l'année. mais ensuite il n'y a plus de test à faire car les relations des
tables font que ta requête1 commande tout le reste et par relation la
requête2 ne doit prendre que le détail des factures sélectionnées par la
requête1. Ou alors les relations entre tes tables ne sont pas bonnes.

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/
Non Stop Mix '07 - Paris. La nouvelle scène web fête la créativité !
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"Gundt" a écrit dans le message de news:
46580ceb$0$14245$
| bonjour à tous,
|
| >> & "WHERE [FACTURES].Numfacture = & nouvnum & ;"
| >> sauf si tu es en version 2007 tu ne peux pas appeler directement une
| >> variable par une requête, il faut passer par une fonction public qui
| >> te renverra la valeur.
| ?? Je ne sais pas et ne comprend pas ce que tu veux dire exactement.
| Je suis bien sous Access 97 que j'avais oublié de mentionner.
|
| >> pour ta requête il faut d'abord que tu vérifies les valeurs que tu
| >> récupères en mettant des points d'arrêt dans ta procédure et ensuite
| >> que tu affiches le contenu de sql1 par debug.print pour vérifier s'il
| >> n'y a pas une erreur.
| >
| > Effectivement, j'ai oublié de dire que je suis sous Access 97 et j'ai
| > oublié qu'il existait le debug.print pour vérifier.
| quand je crée les factures du mois d'avril :
|
| Et il me met un message d'erreur qu'il n'y a pas de données (quand on
| arrive à l'exécution de sql2).
|
| Il me crée bien les numéros de factures avec sql1 (cad les
| enregistrements de la tables FACTURES) mais la requête ajout sql2 pour
| la table LIGNES FACTURES ne fonctionne pas correctement (message
| d'information qu'il n'y a pas d'enregistrements).
| J'ai mis un debug.print et il me donne comme valeur pour la variable la
| dernière facture qui vient d'être créée : A200704096.
|
| Je vais redonner le code qui est à remplacer par celui d'aujourd'hui car
| hier, j'ai donné le code (à peu près similaire) d'un autre formulaire.
|
| La rqt sql1 fonctionne bien mais le problème survient sur la rqt sql2
| qui est mal paramétrée.
| Il faudrait que la requête sql2 ajoute des lignes factures seulement
| pour les factures qui viennent d'être crées par sql1 : par exemple, je
| crée les factures d'avril et donc, les lignes factures qui sont crées ne
| doivent être ajoutées que pour les factures qui viennent d'être créées
| (donc avril).
| J'avais ajouté & " & AND FACTURES.Numfacture=" & nouvnum & "; " mais
| peut-être faudrait-il ajouter quelque chose comme [LIGNES
| FACTURES].numfacture = [FACTURES].numfacture d'avril qui viennent d'être
| créées.
| J'attends votre avis et savoir comment écrire ce genre de critère.
|
| J'espère que ce mail malgré sa longueur sera clair tout de même.
| merci d'avance.
|
| Gundt
|
|
| Voici le code :
|
| ' création du numéro automatique de facture
| ' Call Numfacture
| ' remplacement de la fonction Numfacture qui est maintenant intégrée
| dans ce module
| ' -----------------------------------------------------------
| Dim db As Database
| Dim r As Recordset, s As Recordset, f As Form
| Dim suivnum1 As String, suivnum2 As String, suivnum As String, nouvnum
| As String
| Dim numero As Long
| Dim codecli1 As Long
| Dim mm As Byte
| Dim yyyy As Long
| Dim sql1 As String
|
| Set db = DBEngine(0)(0)
| sql1 = "SELECT DISTINCTROW [BL TEMP].CodeClient, CLIENTS.Codetab," _
| & "CLIENTS.[Code service], SERVICES.[Nom du service],
| SERVICES.Factureindividuelle, CLIENTS.[Nom], " _
| & "CLIENTS.Monsieur, CLIENTS.Prénom, CLIENTS.Adresse, CLIENTS.Ville,
| CLIENTS.[Code Postal], " _
| & "Format([DateSortie_temp], 'mm') AS MoisBL, Format([DateSortie_temp],
| 'yyyy') " _
| & "AS AnnéeBL FROM (SERVICES INNER JOIN CLIENTS ON SERVICES.Codeservice
| = CLIENTS.[Code service]) " _
| & "INNER JOIN [BL TEMP] ON CLIENTS.Codeclient = [BL TEMP].CodeClient
| GROUP BY [BL TEMP].CodeClient, " _
| & "CLIENTS.Codetab, CLIENTS.[Code service], SERVICES.[Nom du service], " _
| & "SERVICES.Factureindividuelle, CLIENTS.[Nom], CLIENTS.Monsieur,
| CLIENTS.Prénom, " _
| & "CLIENTS.Adresse, CLIENTS.Ville, CLIENTS.[Code Postal],
| Format([DateSortie_temp],'mm'), " _
| & "Format([DateSortie_temp],'yyyy') " _
| & "HAVING Format([DateSortie_temp], 'mm') =" &
| [Forms]![Choix_fact_perso]![Mois] & " And " _
| & "Format([DateSortie_temp], 'yyyy') =" &
| [Forms]![Choix_fact_perso]![Année] & " ORDER BY [BL TEMP].CodeClient ;"
|
| Debug.Print sql1
|
| Set r = db.OpenRecordset(sql1, DB_OPEN_DYNASET)
| Set s = db.OpenRecordset("Factures", DB_OPEN_DYNASET)
| ' formulaire pour choix de facture
| Set f = Forms![Choix_fact_perso]
|
| If Not s.EOF Then s.MoveLast
| suivnum1 = "A"
| numero = 1
| If s.BOF Then
| nouvnum = fNouveauNumero(suivnum1)
| Else
| s.MoveLast
| suivnum = s!Numfacture
| If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
| nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
| & Format(Val(Mid(suivnum, 8, 3)) + 1, "000")
| numero = Val(Mid(nouvnum, 8, 3))
| Else
| nouvnum = fNouveauNumero(suivnum1)
| End If
| End If
| f!test = nouvnum
|
| If Not r.BOF Then r.MoveFirst
|
| codecli1 = r!CodeClient
|
| On Error Resume Next
|
| Do While Not r.EOF
| If Format(r!DateSortie_temp, "yyyymm") = Format(f!Année, "0000") &
| Format(f!Mois, "00") Then
|
| s.AddNew
| s!Numfacture = nouvnum
| s!CodeClient = r!CodeClient
| s!Codetab = r!Codetab
| s!Codeservice = r![Code service]
| s!Moisfact = Format(f!Mois, "00")
| s!Annéefact = Format(f!Année, "0000")
| s.Update
| numero = numero + 1
| nouvnum = suivnum1 & Format(f!Année, "0000") & Format(f!Mois,
| "00") & Format(numero, "000")
| codecli1 = r!CodeClient
| End If
|
| r.MoveNext
| Loop
|
| ' ------------------------------------------------------
| ' Requête ajout pour ajouter les lignes de BL TEMP dans LIGNES
| FACTURES
| ' --------------------------------------------------
|
| sql2 = "INSERT INTO [LIGNES FACTURES] " _
| & "( Numfacture, [Code article], Désignation, [Prix unitaire], " _
| & "[Code unité], Quantité, [Total ligne], DateBL, [N°BL] ) " _
| & "SELECT DISTINCTROW FACTURES.Numfacture, " _
| & "[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] " _
| & "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 Format([DateSortie_temp], 'mm')=" &
| [Forms]![Choix_fact_perso]![Mois] & " " _
| & "AND Format([DateSortie_temp], 'yyyy') =" &
| [Forms]![Choix_fact_perso]![Année] & " " _
| & " & AND FACTURES.Numfacture=" & nouvnum & "; "
|
| Debug.Print sql2
|
| CurrentDb.Execute sql2
|
|
|
|
Avatar
Gundt
pourquoi ce code vba entre deux requêtes ?
Ah, le code vba entre les 2 requêtes était une fonction que l'on

appelait auparavant depuis ce module. Mais comme le code faisait
référence à une variable dans une fonction ( se trouvant dans l'onglet
modules), la ligne & " & AND FACTURES.Numfacture=" & nouvnum & "; " ne
renseignait rien. Je l'ai donc inséré dans cette procédure.

Quand j'ai créé l'appli, le code a été créé (grâce aux membres de ce
forum que je remercie) pour générer un numéro de facture sans aucune
saisie et ainsi que l'ajout des données dans la table FACTURES ( par
sql1 et le code suivant).

bien sûr qu'il faut un test sur la première requête pour limiter au mois et
à l'année. mais ensuite il n'y a plus de test à faire car les relations des
tables font que ta requête1 commande tout le reste et par relation la
requête2 ne doit prendre que le détail des factures sélectionnées par la
requête1. Ou alors les relations entre tes tables ne sont pas bonnes.
J'ai mis (dès le début de la création de l'appli) des relations entre

Numfacture des 2 tables sans intégrité référentielle. Dois-je faire
autrement ( c'est le 1 qui est coché dans jointure) ?

Comment faire justement pour ne prendre que le détail des factures
sélectionnées par sql1 et les ajouter avec sql2 dans la tables lignes
factures ?

Merci

Gundt

Avatar
Raymond [mvp]
Bonjour.

| Comment faire justement pour ne prendre que le détail des factures
| sélectionnées par sql1 et les ajouter avec sql2 dans la tables lignes
| factures ?

il n'y a rien à faire, la table détail étant en relation avec la requête
sql1 par le numéro de facture.
il faut simplement verifier la relation dans la requête qui doit être de
type 1. tu dis qu'elle est de type 1, donc tu ne peux pas avoir de détail de
factures qui n'a pas de facture, donc l'erreur provient de la sql1. Si tu
exécutes la sql1, as-tu bien les bonnes factures ?

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/
Non Stop Mix '07 - Paris. La nouvelle scène web fête la créativité !
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"Gundt" a écrit dans le message de news:
46584f31$0$858$
|
| > bien sûr qu'il faut un test sur la première requête pour limiter au mois
et
| > à l'année. mais ensuite il n'y a plus de test à faire car les relations
des
| > tables font que ta requête1 commande tout le reste et par relation la
| > requête2 ne doit prendre que le détail des factures sélectionnées par la
| > requête1. Ou alors les relations entre tes tables ne sont pas bonnes.
| J'ai mis (dès le début de la création de l'appli) des relations entre
| Numfacture des 2 tables sans intégrité référentielle. Dois-je faire
| autrement ( c'est le 1 qui est coché dans jointure) ?
|
| Comment faire justement pour ne prendre que le détail des factures
| sélectionnées par sql1 et les ajouter avec sql2 dans la tables lignes
| factures ?
|
| Merci
|
| Gundt
Avatar
Gundt
Bonjour,

Bonjour.

| Comment faire justement pour ne prendre que le détail des factures
| sélectionnées par sql1 et les ajouter avec sql2 dans la tables lignes
| factures ?

il n'y a rien à faire, la table détail étant en relation avec la requête
sql1 par le numéro de facture.
il faut simplement verifier la relation dans la requête qui doit être de
type 1. tu dis qu'elle est de type 1, donc tu ne peux pas avoir de détail de
factures qui n'a pas de facture, donc l'erreur provient de la sql1. Si tu
exécutes la sql1, as-tu bien les bonnes factures ?



Je viens de refaire le test pour la création des factures d'Avril.
Il y a un détail que je n'avais pas vu hier.
La requête sql1 crée bien les enregistrements dans la table Factures
(qui proviennent de l'ajout d'enregistrements de la table BL temp et de
la création du numéro auto de facture sans saisie par le code). La
dernière facture créée porte le numéro A200704096.

La requête sql2 n'ajoute pas les enregistrements de la table lignes bl
temp dans la table lignes factures.

Et quand je regarde avec le debug.print sql2 :
il me donne comme valeur de dernière facture : A200704097 alors que la
dernière créée a le n° A200704096.
Il y a un décalage de +1 entre le [FACTURES].Numfacture et la variable
nouvnum.

Merci d'avance.

Gundt

Avatar
Raymond [mvp]
ça veut dire que tu as un +1 de trop dans ta procédure pour le nouvnum. suit
le cheminement de ta procédure entre les deux requêtes.

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/
Non Stop Mix '07 - Paris. La nouvelle scène web fête la créativité !
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"Gundt" a écrit dans le message de news:
4659b124$0$3285$
| Bonjour,
|
| > Bonjour.
| >
| > | Comment faire justement pour ne prendre que le détail des factures
| > | sélectionnées par sql1 et les ajouter avec sql2 dans la tables lignes
| > | factures ?
| >
| > il n'y a rien à faire, la table détail étant en relation avec la requête
| > sql1 par le numéro de facture.
| > il faut simplement verifier la relation dans la requête qui doit être de
| > type 1. tu dis qu'elle est de type 1, donc tu ne peux pas avoir de
détail de
| > factures qui n'a pas de facture, donc l'erreur provient de la sql1. Si
tu
| > exécutes la sql1, as-tu bien les bonnes factures ?
|
|
| Je viens de refaire le test pour la création des factures d'Avril.
| Il y a un détail que je n'avais pas vu hier.
| La requête sql1 crée bien les enregistrements dans la table Factures
| (qui proviennent de l'ajout d'enregistrements de la table BL temp et de
| la création du numéro auto de facture sans saisie par le code). La
| dernière facture créée porte le numéro A200704096.
|
| La requête sql2 n'ajoute pas les enregistrements de la table lignes bl
| temp dans la table lignes factures.
|
| Et quand je regarde avec le debug.print sql2 :
| il me donne comme valeur de dernière facture : A200704097 alors que la
| dernière créée a le n° A200704096.
| Il y a un décalage de +1 entre le [FACTURES].Numfacture et la variable
| nouvnum.
|
| Merci d'avance.
|
| Gundt
Avatar
Gundt
ça veut dire que tu as un +1 de trop dans ta procédure pour le nouvnum. suit
le cheminement de ta procédure entre les deux requêtes.


Ben oui, mais le problème, c'est que je ne comprends pas tout dans ce
code. Je ne comprends pas bien ce que fait le code.

Le code appelle une fonction que voici :
Function fNouveauNumero(UneChaine As String) As String

Dim f As Form
Set f = Forms![Choix_fact_perso]

fNouveauNumero = UneChaine _
& Format(f!Année, "0000") _
& Format(f!Mois, "00") & "001"
End Function


Le code proprement dit :

' création du numéro automatique de facture
' Call Numfacture
' remplacement de la fonction Numfacture qui est maintenant intégrée
dans ce module
' -----------------------------------------------------------
Dim db As Database
Dim r As Recordset, s As Recordset, f As Form
Dim suivnum1 As String, suivnum2 As String, suivnum As String, nouvnum
As String
Dim numero As Long
Dim codecli1 As Long
Dim mm As Byte
Dim yyyy As Long

Set db = DBEngine(0)(0)

sql1 = "SELECT DISTINCTROW [BL TEMP].CodeClient, CLIENTS.Codetab," _
... "
Debug.Print sql1

Set r = db.OpenRecordset(sql1, DB_OPEN_DYNASET)
Set s = db.OpenRecordset("Factures", DB_OPEN_DYNASET)
' formulaire pour choix de facture
Set f = Forms![Choix_fact_perso]

If Not s.EOF Then s.MoveLast
suivnum1 = "A"
numero = 1
If s.BOF Then
nouvnum = fNouveauNumero(suivnum1)
Else
s.MoveLast
suivnum = s!Numfacture
If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
& Format(Val(Mid(suivnum, 8, 3)) + 1, "000")
numero = Val(Mid(nouvnum, 8, 3))
Else
nouvnum = fNouveauNumero(suivnum1)
End If
End If

f!test = nouvnum

If Not r.BOF Then r.MoveFirst

codecli1 = r!CodeClient

On Error Resume Next

Do While Not r.EOF
If Format(r!DateSortie_temp, "yyyymm") = Format(f!Année, "0000") &
Format(f!Mois, "00") Then

s.AddNew
s!Numfacture = nouvnum
s!CodeClient = r!CodeClient
s!Codetab = r!Codetab
s!Codeservice = r![Code service]
s!Moisfact = Format(f!Mois, "00")
s!Annéefact = Format(f!Année, "0000")
s.Update
numero = numero + 1
nouvnum = suivnum1 & Format(f!Année, "0000") & Format(f!Mois,
"00") & Format(numero, "000")
codecli1 = r!CodeClient
End If

r.MoveNext
Loop

' ------------------------------------------------------
' Requête ajout pour ajouter les lignes de BL TEMP dans LIGNES FACTURES
' --------------------------------------------------

sql2 = "INSERT INTO [LIGNES FACTURES] " _
" ....


Merci à Raymond pour sa persévérance.

Merci pour la suite à venir

Gundt

Avatar
Raymond [mvp]
dans cette portion je trouve bizarre:

If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
& Format(Val(Mid(suivnum, 8, 3)) + 1, "000")
numero = Val(Mid(nouvnum, 8, 3))
Else
nouvnum = fNouveauNumero(suivnum1)
End If
End If

je remplacerais numero = Val(Mid(nouvnum, 8, 3)) par
numero = Val(Mid(nouvnum, 8, 3)) + 1

résultat non garanti.

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/
Non Stop Mix '07 - Paris. La nouvelle scène web fête la créativité !
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"Gundt" a écrit dans le message de news:
4659c79e$0$21033$
| > ça veut dire que tu as un +1 de trop dans ta procédure pour le nouvnum.
suit
| > le cheminement de ta procédure entre les deux requêtes.
|
| Ben oui, mais le problème, c'est que je ne comprends pas tout dans ce
| code. Je ne comprends pas bien ce que fait le code.
|
| Le code appelle une fonction que voici :
| Function fNouveauNumero(UneChaine As String) As String
|
| Dim f As Form
| Set f = Forms![Choix_fact_perso]
|
| fNouveauNumero = UneChaine _
| & Format(f!Année, "0000") _
| & Format(f!Mois, "00") & "001"
| End Function
|
|
| Le code proprement dit :
|
| ' création du numéro automatique de facture
| ' Call Numfacture
| ' remplacement de la fonction Numfacture qui est maintenant intégrée
| dans ce module
| ' -----------------------------------------------------------
| Dim db As Database
| Dim r As Recordset, s As Recordset, f As Form
| Dim suivnum1 As String, suivnum2 As String, suivnum As String, nouvnum
| As String
| Dim numero As Long
| Dim codecli1 As Long
| Dim mm As Byte
| Dim yyyy As Long
|
| Set db = DBEngine(0)(0)
|
| sql1 = "SELECT DISTINCTROW [BL TEMP].CodeClient, CLIENTS.Codetab," _
| ... "
| Debug.Print sql1
|
| Set r = db.OpenRecordset(sql1, DB_OPEN_DYNASET)
| Set s = db.OpenRecordset("Factures", DB_OPEN_DYNASET)
| ' formulaire pour choix de facture
| Set f = Forms![Choix_fact_perso]
|
| If Not s.EOF Then s.MoveLast
| suivnum1 = "A"
| numero = 1
| If s.BOF Then
| nouvnum = fNouveauNumero(suivnum1)
| Else
| s.MoveLast
| suivnum = s!Numfacture
| If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
| nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
| & Format(Val(Mid(suivnum, 8, 3)) + 1, "000")
| numero = Val(Mid(nouvnum, 8, 3))
| Else
| nouvnum = fNouveauNumero(suivnum1)
| End If
| End If
|
| f!test = nouvnum
|
| If Not r.BOF Then r.MoveFirst
|
| codecli1 = r!CodeClient
|
| On Error Resume Next
|
| Do While Not r.EOF
| If Format(r!DateSortie_temp, "yyyymm") = Format(f!Année, "0000") &
| Format(f!Mois, "00") Then
|
| s.AddNew
| s!Numfacture = nouvnum
| s!CodeClient = r!CodeClient
| s!Codetab = r!Codetab
| s!Codeservice = r![Code service]
| s!Moisfact = Format(f!Mois, "00")
| s!Annéefact = Format(f!Année, "0000")
| s.Update
| numero = numero + 1
| nouvnum = suivnum1 & Format(f!Année, "0000") & Format(f!Mois,
| "00") & Format(numero, "000")
| codecli1 = r!CodeClient
| End If
|
| r.MoveNext
| Loop
|
| ' ------------------------------------------------------
| ' Requête ajout pour ajouter les lignes de BL TEMP dans LIGNES FACTURES
| ' --------------------------------------------------
|
| sql2 = "INSERT INTO [LIGNES FACTURES] " _
| " ....
|
|
| Merci à Raymond pour sa persévérance.
|
| Merci pour la suite à venir
|
| Gundt
1 2