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

Un numéro automatique de facture dans un état

18 réponses
Avatar
Gundt
bonjour à tous,

Config : access 97 et appli : facturation

Je cherche à mettre un numéro automatique unique (pour imprimer sur les
factures).
Je m'explique :
j'ai fait les formulaires, les états d'une application de gestion de
commandes et de livraison qui tourne depuis 10 ans.
Maintenant, on me demande que l'application gère en plus la facturation.
Il faut donc créer et imprimer les factures.
J'arrive à créer un état factures qui récapitule l'ensemble des Bl pour
un mois donné et pour une personne ou un établissement donné. Mais je
n'arrive pas à créer un numéro de facture (unique)qui doit être créé au
moment de l'impression. J'ai parcouru l'onglet macros mais je ne trouve
rien qui me permette de trouver une solution. La solution est sûrement
dans la section modules mais je ne sais pas comment faire.

Je pensais créer une table temporaire FACTURES TEMP pour ne créer qu'une
seule fois la facture mais pour le numéro, je ne vois vraiment pas
comment faire pour le numéro automatique de facture.

Auriez-vous une idée ou un script ?

Existe-il une archive des mails de ce forum ? Peut-être que j'y
trouverai le problème déjà évoqué par quelqu'un ?

Merci d'avance.

Gundt

8 réponses

1 2
Avatar
Eric
.../...
Problème d'indentation, de frappe et quelques omissions: (s.MoveLast et
un End If)

suivnum1 = "A"
numero=1
IF s.BOF then
suivnum=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
suivnum=fNouveauNumero(suivnum1)
End If
f!test = nouvnum
End If



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Eric
re, :-(

Faut mettre f!test = nouvnum après le dernier End If et me suis mélangé
les pinceaux dans les variables nouvnum et suivnum.
Il s'agit de nouvnum=fNouveauNumero(suivnum1) au lieu de
suivnum=fNouveauNumero(suivnum1)

En espérant ne plus me tromper, ça donne:

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

que tu peux améliorer si un numéro existe déjà pour la période:
s.MoveLast
suivnum=s!numfacture
If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
numero = Val(Mid(suivnum, 8, 3)) + 1
nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
& Format(numero, "000")
Else
nouvnum=fNouveauNumero(suivnum1)
End If

Courage !
--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Gundt
bonsoir à tous,

[...]

Courage !
merci bien.

Bon, il y a du progrès : je n'ai plus de message d'erreur si la table
est vide.

Mais les résultats sont faux : je m'explique et j'espère que ce sera
clair pour vous.

1er problème : Tout d'abord, à la création des factures, la procédure
prend en compte la totalité des enregistrements de la table BL TEMP au
lieu de prendre seulement en compte les enregistrements de février par
exemple (choix du mois et de l'année dans dans le forms!Choix_fact_perso).

2ème problème (qui découle sûrement du 1er) :
Les factures qui appartiennent à mars sont aussi affectées du mois de
février (champ mois de la table FACTURES) si j'ai saisi 02 dans le ctrl
du forms. Même problème aussi sans doute pour année, je suppose.

Je ne sais pas si l'erreur est à attribuer au code ou à la requête BL1
chrono.

Quand je lance la requête BL1 chrono (qui ne filtre pas sur une période
demandée), elle m'affiche 91 enregistrements (c'est-à-dire la totalité
des enregistrements dans BL TEMP).

Si je regarde dans la table FACTURES, je trouve aussi 91 enregistrements
alors que la procédure a affecté des factures pour la période demandée
par exemple, février 2007.

Si je regarde les états factures, par contre, ici, je trouve uniquement
les factures de février 2007 ou du mois demandé.

Pour rappel, voici le sql de BL1 chrono qui se trouve dans le code plus
bas :
SELECT DISTINCTROW [BL TEMP].*, 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]
FROM (SERVICES INNER JOIN CLIENTS ON SERVICES.Codeservice =
CLIENTS.[Code service]) INNER JOIN [BL TEMP] ON CLIENTS.Codeclient = [BL
TEMP].CodeClient
ORDER BY [BL TEMP].CodeClient, [BL TEMP].date;

Ci-dessous mon code actuel dans le module (en plus de la procédure
donnée par Eric)

' ouvre la requête BL1 chrono
Set r = db.OpenRecordset("BL1 chrono", 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

' que tu peux améliorer si un numéro existe déjà pour la période:
' s.MoveLast
' suivnum = s!Numfacture
' If Mid(suivnum, 2, 4) = f!Année And Mid(suivnum, 6, 2) = f!Mois Then
' numero = Val(Mid(suivnum, 8, 3)) + 1
' nouvnum = suivnum1 & Mid(suivnum, 2, 6) _
' & Format(numero, "000")
' Else
' nouvnum = fNouveauNumero(suivnum1)
' End If
'
'
'
' ---------------------------------------

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

On Error Resume Next

Do While Not r.EOF

s.AddNew
s!Numfacture = nouvnum
s!CodeClient = r!CodeClient
s!Codetab = r!Codetab
s!Codeservice = r![Code service]
s!Mois = Format(f!Mois, "00")
s!Année = 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
r.MoveNext
Loop

End Function

Merci d'avance.

merci à Eric qui m'a dépanné de l'erreur.

Gundt

Avatar
Eric
re,

Soit tu modifies ta requête pour avoir que les enregsitrements du mois
et de l'année correspondante, soit tu fais un test dans ta boucle
Do While Not r.EOF ... Loop du genre:
Do While Not r.EOF
if Year(r!Date) = f!Année and Month(r!date)= f!Mois Then
' le traitement
end if
r.movenext
Loop


Bon, il y a du progrès : je n'ai plus de message d'erreur si la table
est vide.

Mais les résultats sont faux : je m'explique et j'espère que ce sera
clair pour vous.

1er problème : Tout d'abord, à la création des factures, la procédure
prend en compte la totalité des enregistrements de la table BL TEMP au
lieu de prendre seulement en compte les enregistrements de février par
exemple (choix du mois et de l'année dans dans le forms!Choix_fact_perso).

2ème problème (qui découle sûrement du 1er) :
Les factures qui appartiennent à mars sont aussi affectées du mois de
février (champ mois de la table FACTURES) si j'ai saisi 02 dans le ctrl
du forms. Même problème aussi sans doute pour année, je suppose.

Je ne sais pas si l'erreur est à attribuer au code ou à la requête BL1
chrono.

Quand je lance la requête BL1 chrono (qui ne filtre pas sur une période
demandée), elle m'affiche 91 enregistrements (c'est-à-dire la totalité
des enregistrements dans BL TEMP).

Si je regarde dans la table FACTURES, je trouve aussi 91 enregistrements
alors que la procédure a affecté des factures pour la période demandée
par exemple, février 2007.



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Gundt
Bonsoir à tous,


Soit tu modifies ta requête pour avoir que les enregsitrements du mois
et de l'année correspondante, soit tu fais un test dans ta boucle
Do While Not r.EOF ... Loop du genre:
Do While Not r.EOF
if Year(r!Date) = f!Année and Month(r!date)= f!Mois Then
' le traitement
end if
r.movenext
Loop


J'ai d'abord essayé de paramétrer la requête (BL1 chrono): elle
fonctionne correctement et n'affiche pas d'erreur si je la lance
manuellement.

Maintenant, si j'exécute la création des factures par le forms de choix
de date, il m'affiche une erreur "Trop peu de paramètres, 2 attendus".
Pour indication, cette erreur s'affiche avant que nouvnum ne soit
affiché dans le ctrl test du formulaire donc, dès la première boucle.

Eric, tu proposais aussi une autre solution : modifier le code comme ceci :
Do While Not r.EOF
if Year(r!Date) = f!Année and Month(r!date)= f!Mois Then
' le traitement
end if
r.movenext
Loop

Mais à quel endroit mettre cette boucle ?


Pour info, je redonne le code de numfacture :
------------------- début du code de Numfacture ----------------------
Set db = DBEngine(0)(0)
Set r = db.OpenRecordset("BL1 chrono", 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
s.AddNew
s!Numfacture = nouvnum
s!CodeClient = r!CodeClient
s!Codetab = r!Codetab
s!Codeservice = r![Code service]
s!Mois = Format(f!Mois, "00")
s!Année = 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
r.MoveNext
Loop

End Function

--------- fin du code -------------------------------

Encore merci.

Gundt

Avatar
Gundt
Re bonsoir,

J'ai oublié de donner le code sql de la requête BL1 chrono.
Le voici produit depusi l'interface et convertie en sql par Access :

SELECT DISTINCTROW [BL TEMP].*, 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([date],"mm") AS Mois,
Format([date],"yyyy") AS Année
FROM (SERVICES INNER JOIN CLIENTS ON SERVICES.Codeservice =
CLIENTS.[Code service]) INNER JOIN [BL TEMP] ON CLIENTS.Codeclient = [BL
TEMP].CodeClient
WHERE (((Format([date],"mm"))=[Forms]![Choix_fact_perso]![Mois]) AND
((Format([date],"yyyy"))=[Forms]![Choix_fact_perso]![Année]))
ORDER BY [BL TEMP].CodeClient, [BL TEMP].date;

Et pourtant, la requête fonctionne bien quand je clique sur l'icône
exécuter.

Merci pour ceux qui se dévouent à consacrer leur temps à aider.

Gundt
Avatar
Eric
Bonjour,

Tu remplaces ton Do While Not r.EOF ... Loop par

Do While Not r.EOF
if Year(r!Date) = f!Année and Month(r!date)= f!Mois Then ' ****
s.AddNew
s!Numfacture = nouvnum
s!CodeClient = r!CodeClient
s!Codetab = r!Codetab
s!Codeservice = r![Code service]
s!Mois = Format(f!Mois, "00")
s!Année = 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 ' Utilité ?
end if
r.movenext
Loop

'**** ou encore le test suivant:
If Format(r!Date,"yyyymm")= Format(f!Année, "0000") & Format(f!Mois,
"00") then


Bonsoir à tous,
...

Eric, tu proposais aussi une autre solution : modifier le code comme ceci :
Do While Not r.EOF
if Year(r!Date) = f!Année and Month(r!date)= f!Mois Then
' le traitement
end if
r.movenext
Loop

Mais à quel endroit mettre cette boucle ?

Encore merci.

Gundt


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Gundt
bonjour à tous,

[...]
'**** ou encore le test suivant:
If Format(r!Date,"yyyymm")= Format(f!Année, "0000") & Format(f!Mois,
"00") then


Oui, ça marche avec cette formule (et avec l'autre, cela marchait
peut-être aussi mais j'ai vu après, qu'il y avait des enregistrements de
tests orphelins).
Je m'aperçois que les résultats de la requête qui calcule les factures
sont faux car j'ai besoin de faire un regroupement dans une requête
sélection.

Mais ceci fera peut-être l'objet d'un autre post. En attendant, je
continue mes recherches sur vos sites et sur les archives du forum.

Un grand merci à tous ceux qui m'ont aidé et à Eric qui a persévéré.

Gundt

1 2