I. Introduction▲
Pour les factures importantes le client peut souvent effectuer plusieurs paiements étalés dans le temps. L'objectif est donc de vous aider à créer une application permettant de gérer pour chaque facture les différents paiements réalisés, et d'avoir une vision globale des factures non payées avec les montants restants.
Pour cela, nous présenterons la structure générale de l'application exemple et décrirons ensuite la composition de ses principaux objets et de leurs éléments, dans l'ordre de leur création. Le code proposé dans cet article est valable pour toutes les versions d'Access. Nous proposerons à ce titre, à la fin de l'article, des fichiers compatibles avec toutes les versions d'Access.
II. Structure générale de l'application▲
L'application comporte :
Par la suite, nous allons décrire dans l'ordre les différents objets de l'application.
III. Tables▲
III-A. T_Facture▲
La table contenant les données relatives aux factures : référence, désignation, client…
Nom du champ |
Type du champ |
Description |
---|---|---|
IdFacture |
Entier long |
Identifiant de la facture ou numéro de facture (1, 2, 3..) |
DateFacture |
Date/heure |
Date de la facture |
IdClient |
Entier long |
Identifiant du client relié au champ IdClient de la table T_Client |
IdChantier |
Entier long |
Identifiant du chantier relié au champ IdChantier de la table T_Chantier |
DesignationFacture |
Texte |
Désignation de la facture |
ConditionReglement |
Entier long |
Condition de règlement de la facture |
III-B. T_DetailFacture▲
Elle contient les informations détaillant la facture : les produits, leur quantité, prix unitaire et montant HT.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdDetailFacture |
Entier long |
Identifiant du détail de la facture |
IdFacture |
Entier long |
Identifiant de la facture |
IdArticle |
Entier long |
Identifiant de l'article relié au champ IdArticle de la table T_Article |
Quantite |
Numérique |
Quantité d'articles facturée |
PrixUnitaire |
Monétaire |
Prix unitaire de l'article |
TauxTVA |
Numérique |
Taux de TVA appliqué à l'article |
III-C. T_DetailPaiement▲
Elle contient les données détaillant les paiements de la facture : date de paiement, mode de paiement, référence, montant.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdDetailPaiement |
Entier long |
Identifiant du détail des paiements |
IdFacture |
Entier long |
Identifiant de la facture |
MntPaiement |
Monétaire |
Montant du paiement |
ModePaiement |
Entier long |
Identifiant du mode de paiement |
III-D. T_Article▲
Elle permet d'enregistrer les données relatives aux produits.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdArticle |
Entier long |
Identifiant de l'article |
RefArticle |
Texte |
Référence de l'article |
DesignationArticle |
Texte |
Désignation de l'article |
PrixUnitaire |
Monétaire |
Prix unitaire de l'article |
TauxTVA |
Numérique |
Taux de TVA appliqué à l'article |
GroupeArticle |
Texte |
Groupe de l'article |
FamilleArticle |
Texte |
Famille de l'article |
SousFamilleArticle |
Texte |
Sous-famille de l'article |
III-E. T_Client▲
Elle contient les données relatives aux clients.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdClient |
Entier long |
Identifiant du client |
NomClient |
Texte |
Nom du client |
PrenomClient |
Texte |
Prénom du client |
Adresse1 |
Texte |
Adresse principale |
ComplementAdresse |
Texte |
Complément d'adresse |
CodePostal |
Texte |
Code postal du client |
Ville |
Texte |
Ville du client |
Telephone |
Texte |
Téléphone du client |
Telecopie |
Texte |
Fax du client |
|
Texte |
E-mail du client |
III-F. T_Chantier▲
Elle permet d'enregistrer les données relatives aux chantiers.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdChantier |
Entier long |
Identifiant du chantier |
RefChantier |
Texte |
Référence du chantier |
NomChantier |
Texte |
Nom du chantier |
Adresse1 |
Texte |
Adresse principale |
ComplementAdresse |
Texte |
Complément d'adresse |
CodePostal |
Texte |
Code postal de la ville du chantier |
Ville |
Texte |
Ville du chantier |
Etat |
Texte |
État d'avancement du chantier |
IV. Requêtes▲
Nous présenterons dans cette section les différentes requêtes et leur code SQL.
Pour accéder à l'éditeur SQL, dans Access 2010, il faut passer par le menu Affichage, puis cliquer sur Mode SQL :
Le code SQL des requêtes utilise la commande SELECT, pour les débutants en voici une structure simplifiée :
SELECT
champ1 [, champ2 ...]
FROM
source1 [, source2 ...]
WHERE
conditions
ORDER
BY
champ1 [, champ2 ...]
;
- champ1 [, champ2…] : désigne les noms des champs des tables ou des requêtes à afficher, ce peut être aussi des champs calculés ;
- source1 [, source2…] : représentent les sources de données, à savoir des tables ou des requêtes séparées par des virgules ;
- conditions : des expressions conditionnelles faisant intervenir les champs des tables ou des requêtes et permettant de filtrer les données ;
Une version avec regroupement :
SELECT
champ1 [, champ2 ...]
FROM
source1 [, source2 ...]
WHERE
conditions
GROUP
BY
champ1 [, champ2 ...]
HAVING
conditions
ORDER
BY
champ1 [, champ2 ...]
;
Enfin, une version avec jointure :
SELECT
champ1 [, champ2 ...]
FROM
source1 JOIN
source2 ON
source1.champ1=
source2.champ2
WHERE
conditions
ORDER
BY
champ1 [, champ2 ...]
;
Pour plus de détails, n'hésitez pas à consulter comprendre les jointures dans Accesscomprendre les jointures dans Access.
IV-A. R_Facture▲
Source du formulaire F_Facture, elle affiche les informations sur la facture.
SELECT
T_Facture.*
, "F-"
&
Format
(
[IdFacture]
,"0000000"
)
AS
RefFacture, , CCur(
Nz(
DSum(
"TotalLigne"
,"R_DetailFacture"
,"IdFacture="
&
Nz(
[IdFacture]
,0
))
,0
))
AS
TotalHT, CCur(
Nz(
DSum(
"[TotalLigne]*TauxTVA"
,"R_DetailFacture"
,"IdFacture="
&
Nz(
[IdFacture]
,0
))
,0
))
AS
TotalTVA, [TotalHT]
+
[TotalTVA]
AS
TotalTTC, CCur(
Nz(
DSum(
"MntPaiement"
,"T_DetailPaiement"
,"IdFacture="
&
Nz(
[IdFacture]
,0
))
,0
))
AS
TotalPaiement, Nz(
DSum(
"TotalLigne*(1+TauxTVA)"
,"R_DetailFacture"
,"IdFacture="
&
Nz(
[IdFacture]
,0
))
,0
)-
Nz(
DSum(
"MntPaiement"
,"T_DetailPaiement"
,"IdFacture="
&
Nz(
[IdFacture]
,0
))
,0
)
AS
Reste, [Reste]
=
0
AS
Payee
FROM
T_Facture;
Gros plan sur les champs calculés :
RefFacture
:
"F-"
&
Format
(
[IdFacture];"0000000"
) ' Affiche la référence de la facture
TotalHT
:
CMonnaie
(
Nz
(
SomDom
(
"TotalLigne"
;"R_DetailFacture"
;"IdFacture="
&
Nz
(
[IdFacture];0
));0
)) ' Affiche la somme des montants d'une même facture
TotalTVA
:
CMonnaie
(
Nz
(
SomDom
(
"[TotalLigne]*TauxTVA"
;"R_DetailFacture"
;"IdFacture="
&
Nz
(
[IdFacture];0
));0
)) ' Affiche le total de TVA pour une même facture
TotalTTC
:
[TotalHT]+
[TotalTVA] ' Affiche le total TTC en fonction du total HT et du total de TVA
TotalPaiement
:
CMonnaie
(
Nz
(
SomDom
(
"MntPaiement"
;"T_DetailPaiement"
;"IdFacture="
&
Nz
(
[IdFacture];0
));0
)) ' Affiche le total des paiements pour une même facture
' Calcule le solde restant à payer (TotalTTC - TotalPaiement)
Reste
:
Nz
(
SomDom
(
"TotalLigne*(1+TauxTVA)"
;"R_DetailFacture"
;"IdFacture="
&
Nz
(
[IdFacture];0
));0
)-
Nz
(
SomDom
(
"MntPaiement"
;"T_DetailPaiement"
;"IdFacture="
&
Nz
(
[IdFacture];0
));0
)
Payee
:
[Reste]=
0
' Indique si la facture est payée (Reste=0) ou pas.
IV-B. R_DetailFacture▲
Source des sous-formulaires SF_DetailFacture et SE_DetailFacture, elle affiche le détail de la facture.
SELECT
T_DetailFacture.*
, (
[Quantite]
*
[PrixUnitaire]
)
AS
TotalLigne
FROM
T_DetailFacture;
Gros plan sur le champ calculé :
TotalLigne
:
[Quantite]*
[PrixUnitaire] ' Montant total pour la ligne du détail
IV-C. R_DetailPaiement▲
Source du sous-formulaire SF_DetailPaiement, elle affiche le détail des paiements.
SELECT
"Paiement n°"
&
DCount(
"IdDetailPaiement"
,"T_DetailPaiement"
,"IdFacture="
&
[T_DetailPaiement]
.[IdFacture]
&
" and IdDetailPaiement<"
&
[T_DetailPaiement]
.[IdDetailPaiement]
)+
1
AS
NumPaiement, T_DetailPaiement.DatePaiement, T_DetailPaiement.IdFacture, T_DetailPaiement.MntPaiement, T_DetailPaiement.ModePaiement, DSum(
"[ToTalLigne]*(1+[TauxTVA])"
,"R_DetailFacture"
,"IdFacture="
&
[T_DetailPaiement]
.[IdFacture]
)-
DSum(
"[MntPaiement]"
,"T_DetailPaiement"
,"IdFacture="
&
[T_DetailPaiement]
.[IdFacture]
&
" and IdDetailPaiement<="
&
[IdDetailPaiement]
)
AS
Reste
FROM
T_DetailPaiement;
Gros plan sur les champs calculés :
NumPaiement
:
"Paiement n°"
&
CpteDom
(
"IdDetailPaiement"
;"T_DetailPaiement"
;"IdFacture="
&
[T_DetailPaiement].
[IdFacture] &
" and IdDetailPaiement<"
&
[T_DetailPaiement].
[IdDetailPaiement])+
1
' N° de la ligne du paiement
' Calcule le solde restant à payer après ce paiement
Reste
:
SomDom
(
"[ToTalLigne]*(1+TauxTVA)"
;"R_DetailFacture"
;"IdFacture="
&
[T_DetailPaiement].
[IdFacture])-
SomDom
(
"[MntPaiement]"
;"T_DetailPaiement"
;"IdFacture="
&
[T_DetailPaiement].
[IdFacture] &
" and IdDetailPaiement<="
&
[IdDetailPaiement])
IV-D. R_TotalFacture▲
Cette requête de regroupement calcule le total HT et TTC par facture. Basée sur la requête R_DetailFacture, elle réalise un regroupement sur le champ IdFacture et une somme sur le champ TotalLigne.
SELECT
idFacture, Sum
(
ToTalLigne)
AS
TotalHT, CCur(
Sum
(
[ToTalLigne]
*(
1
+
[TauxTVA]
)))
AS
TotalTTC
FROM
R_DetailFacture
GROUP
BY
idFacture;
IV-E. R_TotalPaiement▲
Cette requête regroupement calcule le total des paiements par facture. Basée sur la requête R_DetailPaiement, elle réalise un regroupement sur le champ IdFacture et une somme sur le champ MntPaiement.
SELECT
IdFacture, Sum
(
MntPaiement)
AS
TotalPaiement
FROM
T_DetailPaiement
GROUP
BY
IdFacture;
IV-F. R_ListeFacture▲
Cette requête affiche le montant TTC, le total des paiements et le solde par facture. Elle relie entre elles les tables T_Facture, T_Client et T_CategorieClient, ainsi que les requêtes R_TotalFacture et R_TotalPaiement sur les champs de liaison.
SELECT
T_Facture.IdFacture, "F-"
&
Format
(
[T_Facture]
.[IdFacture]
,"0000000"
)
AS
RefFacture, T_Facture.DateFacture, T_Facture.IdChantier, T_Facture.IdClient, T_Client.NomClient, T_CategorieClient.CategorieClient, T_Client.Telephone AS
TelephoneClient, [R_TotalFacture]
.TotalTTC AS
MontantTTC, [R_TotalFacture]
.[TotalTTC]
-
Nz(
[R_TotalPaiement]
.[TotalPaiement]
,0
)
AS
Reste, [R_TotalPaiement]
.TotalPaiement, (
[Reste]
=
0
)
AS
Payee
FROM
(((
T_Facture LEFT
JOIN
T_Client ON
T_Facture.[IdClient]
=
T_Client.[IDClient]
)
LEFT
JOIN
T_CategorieClient ON
T_Client.CategorieClient =
T_CategorieClient.IdCategorieClient)
LEFT
JOIN
R_TotalPaiement ON
T_Facture.IdFacture =
R_TotalPaiement.IdFacture)
LEFT
JOIN
R_TotalFacture ON
T_Facture.IdFacture =
R_TotalFacture.IdFacture;
Gros plan sur les champs calculés :
MontantTTC
:
[R_TotalFacture].
[TotalTTC] ' Total TTC des factures
' Calcule le solde restant à payer pour chaque facture
Reste
:
[R_TotalFacture].
[TotalTTC]-
Nz
(
[R_TotalPaiement].
[TotalPaiement];0
)
Payee
:
[Reste]=
0
' Indique si la facture est payée (Reste=0) ou pas.
V. Formulaires de l'application▲
V-A. Formulaire F_Facture▲
Il permet de gérer les factures et leurs paiements. Il est basé sur la requête R_Facture et comporte trois onglets :
- un pour l'en-tête de facture comportant les références de la facture ;
- un autre pour le détail de la facture ;
- un enfin pour le détail des paiements.
V-A-1. Zones de texte dans l'en-tête de formulaire▲
Zones de texte permettant d'afficher la date, la référence, le client et le montant total de la facture.
V-A-2. Boutons de commande et liste déroulante à droite du formulaire▲
Ces boutons permettent de revenir à la liste des factures, d'actualiser ou d'imprimer la facture.
V-A-2-a. Bouton de commande cmdListeFactures▲
Permet de revenir à la liste des factures.
Private
Sub
CmdListeFactures_Click
(
)
DoCmd.Close
acForm, Me.Name
' Ferme le formulaire
DoCmd.OpenForm
"F_ListeFacture"
' Ouvre le formulaire F_ListeFacture
End
Sub
V-A-2-b. Bouton de commande cmdActualiser▲
Permet d'actualiser le formulaire.
Private
Sub
CmdActualiser_Click
(
)
Me.Refresh
' Actualise le formulaire
End
Sub
V-A-2-c. Bouton de commande CmdImprimer▲
Permet d'imprimer l'état positionné sur le même enregistrement.
Private
Sub
CmdImprimer_Click
(
)
Me.Refresh
' Actualise le formulaire
' Imprime l'état correspondant à la facture affichée sur le formulaire
DoCmd.OpenReport
"E_Facture"
, acViewPreview, , "IdFacture="
&
Nz
(
Me.IdFacture
, 0
), acWindowNormal
End
Sub
V-A-2-d. Liste déroulante CmbRechercherFacture▲
Permet de rechercher la facture choisie sur la liste.
SELECT
T_Facture.IdFacture, "F-"
&
Format
(
[IdFacture]
,"0000000"
)
AS
[Réf Facture]
, T_Client.NomClient AS
Client
FROM
T_Client INNER
JOIN
T_Facture ON
T_Client.[IDClient]
=
T_Facture.[IdClient]
ORDER
BY
T_Facture.IdFacture;
Private
Sub
CmbRechercherFacture_AfterUpdate
(
)
Me.Filter
=
""
' Vide le filtre
With
Me.RecordsetClone
.FindFirst
"IdFacture="
&
Nz
(
Me.CmbRechercherFacture
, 0
) ' Recherche la facture correspondant à l'identifiant saisi dans la liste
If
Not
(
.NoMatch
) Then
' Si un enregistrement a été trouvé
Me.Bookmark
=
.Bookmark
' On se positionne sur l'enregistrement correspondant
Else
' Sinon
MsgBox
(
"Facture absente !"
) ' On affiche un message d'alerte
Me.CmbRechercherFacture.Undo
' On annule le choix fait dans la liste
End
If
End
With
End
Sub
V-A-3. Boutons de commande et zone de texte dans le pied du formulaire▲
Ces boutons permettent d'ajouter une facture, d'annuler les changements, de supprimer la facture ou de fermer.
V-A-3-a. Bouton de commande CmdAjouter▲
Permet d'ajouter une facture dans la base en se positionnant sur un nouvel enregistrement.
Private
Sub
CmdAjouter_Click
(
)
If
MsgBox
(
"Souhaitez-vous créer une nouvelle facture ?"
, vbYesNo
+
vbQuestion
, "Validation"
) =
vbYes
Then
' Si on confirme la demande de création de facture
If
Nz
(
Me.TxtDateFacture
) =
""
Then
' Si la date de la facture n'est pas saisie
MsgBox
(
"Choisir une date de facture !"
) ' Affiche un message pour le faire
Me.TxtDateFacture.SetFocus
' Positionne le focus sur la zone de texte TxtDateFacture
Exit
Sub
End
If
If
Nz
(
Me.TxtRefFacture
) =
""
Then
' Si la référence de la facture n'est pas saisie
MsgBox
(
"Saisir une référence de facture !"
) ' Affiche un message pour le faire
Me.TxtRefFacture.SetFocus
' Positionne le focus sur la zone de texte TxtRefFacture
Exit
Sub
End
If
If
Nz
(
Me.TxtIdClient
) =
""
Then
' Si le client n'est pas saisi
MsgBox
(
"Choisir un Client !"
) ' Affiche un message pour le faire
Me.TxtIdClient.SetFocus
' Positionne le focus sur la zone de texte TxtIdClient
Exit
Sub
End
If
DoCmd.GoToRecord
acDataForm, Me.Name
, acNewRec ' Se positionne sur un nouvel enregistrement
End
If
End
Sub
V-A-3-b. Bouton de commande CmdAnnuler▲
Annule les modifications effectuées sur le formulaire.
Private
Sub
CmdAnnuler_Click
(
)
Me.Undo
' Annule les modifications apportées au formulaire
DoCmd.Close
acForm, Me.Name
' Ferme le formulaire
End
Sub
V-A-3-c. Bouton de commande CmdSupprimer▲
Supprime l'enregistrement courant du formulaire.
ExécuterCommandeMenu
Commande SupprimerEnregistrement
V-A-3-d. Bouton de commande CmdFermer▲
Permet de fermer le formulaire.
Private
Sub
CmdFermer_Click
(
)
DoCmd.Close
acForm, Me.Name
' Ferme le formulaire
End
Sub
V-A-3-e. Zone de texte TxtTotalTTC▲
Affiche dans le pied du formulaire le total de TTC de la facture en faisant référence au total HT et au taux de TVA.
=
[TxtTotalHT]+
[txtTotalTVA])
V-A-4. Onglet En-tête de facture▲
Affiche le détail du client et du chantier, ainsi que la désignation de la facture accompagnée d'un commentaire.
V-A-4-a. Contrôle sous-formulaire SF_Client▲
Affiche le détail du client sur la facture.
V-A-4-b. Contrôle sous-formulaire SF_Chantier▲
Affiche le détail du chantier sur la facture.
V-A-5. Onglet Détail de facture▲
Comprend un contrôle sous-formulaire SF_DetailFacture pour afficher le détail de la facture et des zones de texte pour les totaux de la facture.
V-A-5-a. Contrôle sous-formulaire SF_DetailFacture▲
Affiche le détail de la facture en mode feuille de données. Le sous-formulaire est relié à la requête R_DetailFacture.
V-A-5-a-i. Liste déroulante CmbIdArticle▲
Permet de choisir l'article à facturer et de copier son prix unitaire dans la zone de texte TxtPrixUnitaire.
SELECT
[IDArticle]
, [DesignationArticle]
, PrixUnitaire, TauxTVA FROM
T_Article ORDER
BY
[DesignationArticle]
;
Private
Sub
cmbIdArticle_AfterUpdate
(
)
Me!TxtPrixUnitaire =
Me!cmbIDArticle.Column
(
2
) ' Copie le prix unitaire (3e colonne de la liste) dans la zone de texte TxtPrixUnitaire
Me!TxtTauxTVA =
Me!cmbIDArticle.Column
(
3
) ' Copie le taux de TVA (4e colonne de la liste) dans la zone de texte TxtTauxTVA
End
Sub
V-A-5-a-ii. Zone de texte TxtTotalHT▲
Affiche dans le pied du sous-formulaire le total HT du détail de la facture en effectuant la somme des montants HT par ligne.
=
Nz
(
Somme
(
[TotalLigne]);0
)
V-A-5-a-iii. Zone de texte TxtTotalTVA▲
Affiche dans le pied du sous-formulaire le total TVA du détail de la facture en effectuant la somme des produits des montants HT par le taux de TVA.
=
Nz
(
Somme
(
[TotalLigne]*
TauxTVA);0
)
V-A-5-b. Zone de texte TxtTotalHT▲
Affiche sur l'onglet le total HT du détail de la facture en faisant référence à la zone de texte TxtTotalHT située dans le pied du sous-formulaire SF_DetailFacture.
=
Nz
(
[SF_DetailFacture].
[Formulaire]![TxtTotalHT];0
)
V-A-5-c. Zone de texte TxtTotalTVA▲
Affiche sur l'onglet le total de TVA à ajouter au total HT.
=
Nz
(
[SF_DetailFacture].
[Formulaire]![TxtTotalTVA];0
)
V-A-6. Onglet Détail des paiements▲
Comprend un contrôle sous-formulaire SF_DetailPaiement pour afficher le détail des paiements et des zones de texte pour le total des paiements et le solde de la facture.
V-A-6-a. Contrôle sous-formulaire SF_DetailPaiement▲
Affiche le détail des paiements en mode feuille de données. Le sous-formulaire est relié à la requête R_DetailPaiement.
V-A-6-a-i. Zone de texte TxtTotalPaiement▲
Affiche dans le pied du sous-formulaire le total du détail des paiements en effectuant la somme des montants par ligne.
=
Somme
(
[MntPaiement])
V-A-6-b. Zone de texte TxtTotalPaiement▲
Affiche sur l'onglet le total du détail des paiements en faisant référence à la zone de texte TxtTotalPaiement située dans le pied du sous-formulaire SF_DetailPaiement.
=
Nz
(
[SF_DetailFacture].
[Formulaire]![TxtTotalPaiement];0
)
V-A-6-c. Zone de texte TxtReste▲
Affiche sur l'onglet le solde restant à payer en faisant référence aux zones de texte TxtTotalTTC et TxtTotalPaiement.
=
[TxtTotalTTC]-
[TxtTotalPaiement]
V-B. Formulaire F_ListeFacture▲
Il s'agit du formulaire de recherche multicritère, il permet d'avoir une vision globale des factures en cours et en attente de paiement, un peu comme sur un relevé de factures, et de faire des recherches par date, client…
Critères de recherche :
- Filtre des factures payées/non payées ;
- Recherche par client ;
- Recherche par téléphone ;
- Recherche par numéro de facture.
V-B-1. Boutons de commande situés dans l'en-tête▲
Ces boutons permettent d'ajouter une facture, d'accéder aux fiches clients, d'exporter, imprimer ou actualiser la liste des factures.
V-B-1-a. Bouton de commande CmdAjouter▲
Utilisé pour ouvrir le formulaire F_Facture en mode ajout.
Private
Sub
CmdAjouter_Click
(
)
DoCmd.OpenForm
"F_Facture"
, , , , acFormAdd ' Ouvre le formulaire en mode ajout.
End
Sub
V-B-1-b. Bouton de commande CmdClients▲
Permet d'ouvrir le formulaire F_Client en mode édition.
Private
Sub
CmdClients_Click
(
)
DoCmd.OpenForm
"F_Client"
' Ouvre le formulaire F_Client
End
Sub
V-B-1-c. Bouton de commande CmdExporter▲
Permet d'exporter sous Excel la liste des factures filtrées.
Déroulé de la fonction de génération du code SQL appliqué à la requête d'exportation :
- ajout des conditions successives dans une chaîne de caractères à copier après la clause Where du code SQL ;
- constitution de la chaîne SQL avec les conditions définies précédemment ;
- renvoi de la chaîne SQL constituée.
Private
Sub
CmdExporter_Click
(
)
Dim
db As
DAO.Database
' Variable faisant référence à la base de données
Dim
req As
DAO.QueryDef
' Variable faisant référence à la requête
Set
db =
CurrentDb ' Référence à la base courante
Set
req =
db.QueryDefs
(
"R_Export_ListeFacture"
) ' Référence à la requête d'exportation
req.sql
=
SQLListeFactures ' Assignation du code SQL à la requête
' Libération des variables
Set
req =
Nothing
Set
db =
Nothing
' Exécution de la commande d'exportation de la requête vers Excel
DoCmd.OutputTo
acOutputQuery, "R_Export_ListeFacture"
, "ExcelWorkbook(*.xlsx)"
, ""
, True
, ""
, , acExportQualityPrint
End
Sub
V-B-1-d. Bouton de commande CmdImprimer▲
Exporte sous Excel la liste des factures filtrée pour l'imprimer.
Private
Sub
CmdImprimer_Click
(
)
If
MsgBox
(
"Les données seront imprimées dans Excel !"
, vbOKCancel
) =
vbOK
Then
' Si validation
CmdExporter_Click ' On lance la procédure d'exportation qui va ouvrir la feuille Excel en vue de l'imprimer
End
If
End
Sub
V-B-1-e. Bouton de commande CmdActualiser▲
Permet d'actualiser la liste des factures.
Private
Sub
CmdActualiser_Click
(
)
Me.SF_ListeFacture.Requery
' Rafraîchit la liste
End
Sub
V-B-1-f. Bouton de commande CmdFermer▲
Utilisé pour fermer le formulaire F_ListeFacture.
Private
Sub
CmdFermer_Click
(
)
DoCmd.Close
acForm, Me.Name
' Ferme le formulaire
End
Sub
V-B-2. Listes déroulantes et groupe d'options pour le filtrage des données▲
Ces contrôles permettent de filtrer la liste des factures suivant différents critères.
V-B-2-a. Procédure générique RefreshListeFactures▲
Elle permet de filtrer la liste des factures en fonction des critères définis dans le formulaire F_ListeFacture.
Déroulé de la fonction :
- ajout des conditions successives dans une chaîne de caractères à copier après la clause Where du code SQL ;
- constitution de la chaîne SQL avec les conditions définies précédemment ;
- affectation de la chaîne SQL à la propriété RecordSource du sous-formulaire SF_ListeFacture.
V-B-2-b. Liste déroulante CmbRechercherClient▲
Affiche la liste des clients liés aux factures et permet leur recherche par le nom du client.
Code SQL permettant l'affichage des noms des clients :
SELECT
"[Tous]"
as
f, 1
as
position
FROM
T_LigneVierge
UNION
SELECT
DISTINCT
NomClient as
f, 2
as
position
FROM
R_ListeFacture ORDER
BY
position
, f;
Ce code SQL permet d'afficher le mot « [Tous] » en haut de la liste pour permettre d'afficher les factures de tous les clients. La technique employée est décrite dans la FAQfaq.
Code VBA pour filtrer les données sur le client choisi :
Private
Sub
CmbRechercherClient_AfterUpdate
(
)
RefreshFacture ' Actualise le sous-formulaire SF_ListeFacture en fonction des filtres de recherche
End
Sub
V-B-2-c. Liste déroulante CmbRechercherTelephone▲
Permet de rechercher une facture en fonction du téléphone du client.
Code SQL permettant l'affichage des téléphones des clients :
SELECT
"[Tous]"
as
f, 1
as
position
FROM
T_LigneVierge
UNION
SELECT
DISTINCT
TelephoneClient as
f, 2
as
position
FROM
R_ListeFacture where
Not
IsNull
(
TelephoneClient)
ORDER
BY
position
, f;
Procédure VBA permettant de filtrer les données sur le téléphone du client :
Private
Sub
CmbRechercherTelephone_AfterUpdate
(
)
RefreshFacture ' Actualise le sous-formulaire SF_ListeFacture en fonction des filtres de recherche
End
Sub
V-B-2-d. Liste déroulante CmbRechercherFacture▲
Permet de rechercher une facture avec sa référence.
Code SQL permettant l'affichage des références des factures :
SELECT
"[Toutes]"
as
f, 1
as
position
FROM
T_LigneVierge
UNION
SELECT
DISTINCT
RefFacture as
f, 2
as
position
FROM
R_ListeFacture where
Not
IsNull
(
RefFacture)
ORDER
BY
position
, f;
Procédure VBA permettant de filtrer les données en fonction de la référence choisie :
Private
Sub
CmbRechercherFacture_AfterUpdate
(
)
RefreshFacture ' Actualise le sous-formulaire SF_ListeFacture en fonction des filtres de recherche
End
Sub
V-B-2-e. Liste déroulante CmbRechercherDateFacture▲
Permet de rechercher une facture en fonction d'une période (Ce mois, Le mois dernier…).
On affiche dans la liste les différents choix de périodes pour le filtrage ([Tous], Ce mois, Le mois dernier…)
Code SQL permettant l'affichage des périodes utilisées pour le filtrage :
SELECT
ParamDate
FROM
T_ParamDates
ORDER
BY
IdParamDate;
Procédure VBA permettant de filtrer les données en fonction de la période choisie :
Private
Sub
CmbRechercherFacture_AfterUpdate
(
)
RefreshFacture ' Actualise le sous-formulaire SF_ListeFacture en fonction des filtres de recherche
End
Sub
V-B-2-f. Groupe d'options OptEtatFacture▲
Permet de filtrer les factures payées ou non payées.
Procédure VBA pour filtrer les données en fonction du choix effectué :
Private
Sub
OptEtatFacture_AfterUpdate
(
)
RefreshFacture ' Actualise le sous-formulaire SF_ListeFacture en fonction des filtres de recherche
End
Sub
V-B-2-g. Zone de texte TxtDateDebut▲
Permet de choisir la date du début de la période de recherche des factures.
Procédure VBA pour filtrer les données en fonction de la date saisie :
Private
Sub
TxtDateDebut_AfterUpdate
(
)
RefreshFacture ' Actualise le sous-formulaire SF_ListeFacture en fonction des filtres de recherche
End
Sub
V-B-2-h. Zone de texte TxtDateFin▲
Permet de choisir la date de fin de la période de recherche des factures.
Procédure VBA pour filtrer les données en fonction de la date saisie :
Private
Sub
TxtDateFin_AfterUpdate
(
)
RefreshFacture ' Actualise le sous-formulaire SF_ListeFacture en fonction des filtres de recherche
End
Sub
V-B-3. Contrôle sous-formulaire SF_ListeFacture▲
Il est basé sur la requête R_ListeFacture et est mis à jour au moyen de la procédure MajListeFacture.
Il affiche les champs principaux de la requête R_ListeFacture.
V-B-3-a. Zone de texte txtRefFacture▲
La procédure exécutée sur l'événement double-clic de cette zone de texte permet d'ouvrir le formulaire F_Facture sur le bon enregistrement.
Private
Sub
txtRefFacture_DblClick
(
Cancel As
Integer
)
DoCmd.OpenForm
"F_Facture"
, , , "IdFacture="
&
Nz
(
Me.IdFacture
, 0
), , , "C"
' Ouvre le formulaire F_Facture sur l'enregistrement correspondant.
End
Sub
C'est le même principe pour les autres zones de texte du sous-formulaire.
VI. État pour impression▲
VI-A. État E_Facture▲
Il est destiné à imprimer la facture depuis le formulaire F_Facture.
VI-A-1. Contrôle sous-formulaire SE_Client▲
Il affiche les données relatives au client avec une liaison sur les champs IDClient.
VI-A-2. Contrôle sous-formulaire SE_DetailFacture▲
Il affiche le détail de la facture avec une liaison sur les champs IDFacture. Le sous-formulaire est relié à la requête R_DetailFacture.
VI-A-3. Zones de texte affichant les totaux en bas de page▲
Elles servent à afficher les totaux HT, TVA et TTC de la facture, mais aussi le total des paiements et du solde.
Nom de la zone de texte |
Champ de la requête R_Facture |
Description |
---|---|---|
TxtTotalHT |
TotalHT |
Affiche le total HT de la facture |
TxtTotalTVA |
TotalTVA |
Affiche le total de la TVA |
TxtTotalTTC |
TotalTTC |
Affiche le total TTC de la facture |
TxtTotalPaiement |
TotalPaiement |
Affiche le total des paiements sur la facture |
TxtReste |
Reste |
Affiche le solde de la facture |
VII. Les bases de données à télécharger▲
Les bases jointesgestion-multipaiements.zip sont aux formats mdb et accdb.
VIII. Remerciements▲
Je tiens à remercier Laurent Ott, chrtophe et tee_grandbois pour m'avoir conseillé dans la réalisation de cet article, ainsi que Claude Leloup et winjerome pour leur relecture.