pb de code pour ajouter condition dans requête ajout
Le
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
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

Poser une question


& "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/Red...326db58273
"Gundt" 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
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
Je suis bien sous Access 97 que j'avais oublié de mentionner.
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
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/Red...326db58273
"Gundt" 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
|
|
|
|
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).
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