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

un regroupement dans une requête

1 réponse
Avatar
Gundt
Re bonjour avec une nouvelle question.

J'ai besoin de savoir comment résoudre le problème suivant :

Je recherche comment éditer des factures mensuelles par client.
Il faudrait ceci :
client toto a passé 3 commandes en Février et a reçu ses 3 commandes en
février ==> 1 facture pour les 3 BL avec un total correspondant aux 3 BL
et avec le détail des articles livrés mais regroupés par désignation.
client titi 4 commandes en février : idem avec 1 facture qui regroupe
les 4 BL.
etc pour chaque client.

Comme il y a souvent les mêmes articles qui reviennent dans les lignes
articles des BL, il faut que le même article soit affiché une seule fois
dans la facture mais avec la quantité cumulée (ex : l'article A est
acheté le même article 3 fois sur le BL1, 2 fois sur le BL2 et 4 fois
sur le BL3 de toto, il faudrait que l'état affiche 9 fois l'article en
question).
J'ai donc fait un regroupement dans l'état factures.
Il m'affiche bien dans l'état une seule ligne pour le même article. Mais
il me calcule faux seulement pour le total factures.
Par contre, la requête affiche autant de lignes que le total des lignes
des BL.

Quand je lance l'édition de l'état factures, il m'affiche bien une seule
facture mais avec un total de 3 fois la somme des 3 BL ou pour titi le
montant de 4 fois la somme des 4 BL : en fait, l'explication vient du
fait qu'il crée autant de factures que de BL mais avec un total
multiplié par le nombre de BL.

En fait, la requête basée sur l'état factures liste bien tous les
articles à facturer par client mais les met bien ligne par ligne, ce qui
fausse le calcul du total facture.

Il faudrait un regroupement sur les articles achetés par chaque client
par mois.

Le ctrl total facture dans l'état factures est bien :
=Somme([Quantité]*[Prix unitaire])

Fonctionnement du programme :
l'utilisateur saisit le mois et l'année pour lequel il veut éditer les
factures : donc un forms pour saisir mois et année, fonction numfacture
(qui ouvre aussi une autre requête BL1 chrono) qui calcule un numéro
automatique de facture, puis ouverture de l'état factures basé sur la
requête ci-dessous :

La requête de l'état factures :
PARAMETERS [Forms]![Choix_fact_perso]![Mois] Byte,
[Forms]![Choix_fact_perso]![Année] Short;
SELECT DISTINCTROW FACTURES.Numfacture, FACTURES.Emission,
FACTURES.Mois, FACTURES.Année, FACTURES.CodeClient, FACTURES.Codetab,
FACTURES.Typefact, FACTURES.Codeservice, ETABLISSEMENTS.[Nom
Etablissement], ETABLISSEMENTS.Rue, ETABLISSEMENTS.[Suite Rue],
ETABLISSEMENTS.CodePostal, ETABLISSEMENTS.Ville, SERVICES.[Nom du
service], [BL TEMP].[N°BL_temp], [BL TEMP].date, CLIENTS.Nom,
CLIENTS.Prénom, CLIENTS.Monsieur, Format([date],"mm") AS Moissortie,
Format([date],"yyyy") AS Annéesortie, [LIGNES BL TEMP].[Code article],
[LIGNES BL TEMP].Désignation, [LIGNES BL TEMP].Quantité, [LIGNES BL
TEMP].[Prix unitaire], [LIGNES BL TEMP].[Code unité]
FROM ETABLISSEMENTS INNER JOIN ((SERVICES INNER JOIN (CLIENTS INNER JOIN
FACTURES ON CLIENTS.Codeclient = FACTURES.CodeClient) ON
SERVICES.Codeservice = CLIENTS.[Code service]) INNER JOIN ([BL TEMP]
INNER JOIN [LIGNES BL TEMP] ON [BL TEMP].[N°BL_temp] = [LIGNES BL
TEMP].[N°BL_temp]) ON CLIENTS.Codeclient = [BL TEMP].CodeClient) ON
ETABLISSEMENTS.Codetab = CLIENTS.Codetab
WHERE (((Format([date],"mm"))=[Forms]![Choix_fact_perso]![Mois]) AND
((Format([date],"yyyy"))=[Forms]![Choix_fact_perso]![Année]));

requête BL1 chrono quui sélectionne les BL :
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;

questions :

1) revoir l'analyse ou pb de requête pour créer les factures ?
2) faut-il passer par une analyse croisée pour faire un regroupement des
articles et faire un sous-état ?
3) faire un regroupement sur une requête sans analyse croisée vu le
nombre de champs dans la requête ?
4) faire le regroupement sur la désignation article ou sur la quantité ?


J'espère que ma question est suffisamment claire pour vous, vu la
longueur du mail.


Merci d'avance.

Gundt

1 réponse

Avatar
Gundt
Bonsoir à tous,

Comme je n'ai pas eu de réponse à mon précédent mail, je pense qu'il
était peut-être trop long et trop compliqué.

Je vais donc vous expliquer mon problème autrement et plus succinctement.
Pour Access 97 :

Au départ, j'ai un formulaire de saisie qui demande à l'utilisateur de
saisir un mois puis l'année de facturation, ensuite, le bouton aperçu
avant impression déclenche le code du numéro automatique de la facture,
puis l'aperçu de l'état factures.
L'état correspond bien à la facture mais le total n'est pas bon (s'il y
a 4 BL pour la facture1, j'ai un total de 4 fois le montant de la facture).
Mon code crée 4 factures s'il y a 4 BL au lieu de 1 facture pour les 4 BL.

Je ne sais pas si l'erreur vient du code de création du numéro de la
facture ou si cela vient de la requête.

Pour le regroupement, j'ai fait comme marqué ici :
http://groups.google.fr/group/microsoft.public.fr.access/browse_thread/thread/e0f6bae92efe259f/79d2e945af370406?lnk=gst&q=regroupement+dans+une+requ%C3%AAte%2Bfacture&rnum=3#79d2e945af370406

Mais je n'arrive pas à avoir le regroupement : j'ai dans le résultat de
la requête, autant de lignes de détail, avec en face le même N° de
facture répété.

----------------------------------------------------------------
Code pour le numéro automatique de la facture :
Function Numfacture()
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)
' 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


If Not r.BOF Then r.MoveFirst

codecli1 = r!CodeClient

On Error Resume Next

Do While Not r.EOF
If Format(r!date, "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!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
End If

r.MoveNext
Loop

End Function

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

----------------------------------------------------

Est-ce que l'erreur viendrait de la requête ou du code qui créerait trop
de factures ?

Je ne sais plus dans quelle direction chercher ?

Merci de votre aide.

Gundt