I. Introduction▲
Après avoir présenté le principe de fonctionnement de l'application donnée en exemple, on décrira sa structure générale et la composition de ses différents objets. Au cours de cette présentation, on détaillera également les parties réutilisables du logiciel, comme le pavé numérique ou les boutons associés aux catégories de produits.
Une fois que vous aurez visualisé la structure générale de l'application et compris comment réaliser ses différents éléments (objets et contrôles), vous devriez pouvoir créer votre propre logiciel de caisse sans trop de difficultés.
II. Principe de fonctionnement de la caisse▲
Principe de fonctionnement de la caisse
- On choisit la catégorie de produits en cliquant sur les boutons de commande situés en bas : boissons, boulangerie, charcuterie…
- Sur le formulaire qui s'ouvre, on choisit le produit de la catégorie.
- On saisit sur le pavé numérique la quantité, puis on clique sur le bouton de commande Quantité.
- On saisit éventuellement sur le pavé numérique la valeur de la remise, puis on appuie sur Remise.
- Enfin, on valide la saisie de la ligne en appuyant sur le bouton de commande R.
- On réitère la procédure pour chaque produit.
- On termine en cliquant sur Encaisser.
Voici la description du fonctionnement de la caisse au travers d'une petite vidéo :
Fonctionnement de la caisse en vidéoFonctionnement de la caisse
III. Structure générale du logiciel▲
On va se limiter aux fonctions essentielles de la caisse enregistreuse pour faciliter la compréhension de l'article.
Le formulaire principal F_OperationFormulaire F_Operation permettant de réaliser les opérations sur les produits comportera :
- un sous-formulaireContrôle sous-formulaire SF_DetailOperation pour afficher le détail de l'opération ;
- un groupe de boutons de commandeBoutons de commande pour afficher les produits par catégorie pour copier les références des produits dans le détail ;
- un pavé numériqueBoutons de commande pour effectuer les opérations pour saisir les valeurs ;
- un groupe de boutons de commandeBoutons de commande pour copier les valeurs dans le détail des opérations pour copier les valeurs dans le détail ;
- un en-tête de formulaireZones de texte pour afficher les totaux pour afficher les totaux du détail ;
- un pied de formulaireZones de texte au pied du formulaire pour saisir les informations relatives à l'opération.
Le formulaire principal permet d'enregistrer les opérations, et le sous-formulaire permet de sauvegarder le détail des opérations.
Le module du formulaire principal comportera des procédures génériques pour simplifier et rendre plus lisible le code VBA :
- une procédure génériqueProcédure générique appelée sur l'événement clic de chaque bouton du pavé numérique ;
- une procédure génériqueProcédure générique appelée sur l'événement clic de chaque bouton destinée à filtrer les produits par catégorie.
L'encaissement final se fera sur un formulaire à part.
Par la suite, nous allons décrire plus en détail les différents objets nécessaires, les contrôles des formulaires et les procédures VBA associées.
IV. Tables nécessaires▲
Elles vont permettre d'enregistrer les produits et opérations dans la base de données.
IV-A. T_ParametreCaisse▲
Table permettant d'enregistrer les différents paramètres de la caisse, comme le numéro de caisse ou l'identifiant du vendeur sur la caisse. Elle ne contient qu'une seule ligne.
Elle est indispensable pour sauvegarder automatiquement la référence du vendeur et de la caisse lors de la création d'une opération.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdParametre |
Entier long |
Numéro de paramétrage |
IdCaisse |
Entier long |
Identifiant de la caisse |
IdVendeur |
Entier long |
Identifiant du vendeur |
IV-B. T_Produit▲
On y sauvegarde les différents produits du magasin.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdProduit |
Entier long |
Identifiant du produit |
DesignationProduit |
Texte |
Désignation du produit |
IdCategorieProduit |
Entier long |
Identifiant de la catégorie du produit |
PrixUnitaire |
Monétaire |
Prix unitaire du produit |
TauxTVA |
Numérique |
Taux de TVA du produit |
IV-C. T_Operation▲
Elle contient les opérations effectuées par le vendeur et est reliée à la table T_DetailOperationT_DetailOperation par une relation 1 à plusieurs.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdOperation |
Entier long |
Identifiant de l'opération |
DateOperation |
Date/Heure |
Date d'enregistrement de l'opération |
HeureOperation |
Date/Heure |
Heure d'enregistrement de l'opération |
IdCaisse |
Entier long |
Identifiant de la caisse concernée par l'opération |
IdVendeur |
Entier long |
Identifiant du vendeur qui réalise l'opération |
TotalPaiement |
Monétaire |
Total reçu par le vendeur |
IV-D. T_DetailOperation▲
Elle permet d'enregistrer le détail des achats effectués sur les produits du magasin et est liée à la table T_OperationT_Operation sur le champ IdOperation.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdDetailOperation |
Entier long |
Identifiant du détail de l'opération |
IdOperation |
Entier long |
Clé étrangère liée à l'identifiant de l'opération |
DesignationProduit |
Texte |
Désignation du produit |
PrixUnitaire |
Monétaire |
Prix unitaire du produit |
TauxTVA |
Numérique |
Taux de TVA du produit |
Quantite |
Numérique |
Quantité de produit |
Remise |
Numérique |
Pourcentage de remise |
V. Requêtes nécessaires▲
Elles vont permettre de rassembler les données à afficher sur les formulaires.
V-A. R_DetailOperation▲
Cette requête permet d'afficher le détail des produits et le total par ligne dans le sous-formulaire SF_DetailOperation :
SELECT
T_DetailOperation.*
, DCount(
"*"
,"T_DetailOperation"
,"IdOperation="
&
[IdOperation]
&
" and IdDetailOperation<"
&
[IdDetailOperation]
)+
1
AS
IdLigne, [PrixUnitaire]
*
[Remise]
AS
RemiseU, IIf(
Not
IsNull
(
[T_DetailOperation]
.[Quantite]
)
And
Not
IsNull
(
[T_DetailOperation]
.[PrixUnitaire]
)
And
Not
IsNull
(
[Remise]
)
,(
[T_DetailOperation]
.[Quantite]
*
[T_DetailOperation]
.[PrixUnitaire]
)*(
1
-
[Remise]
)
,Null
)
AS
TotalLigne
FROM
T_DetailOperation;
L'expression du champ calculé IdLigne donne le numéro de la ligne du détail de l'opération :
IdLigne: CpteDom("*";"T_DetailOperation";"IdOperation=" & [T_Operation].[IdOperation] & " and IdDetailOperation<" & [IdDetailOperation])+1
L'expression du champ TotalLigne donne le montant total de la ligne du détail de l'opération :
TotalLigne: VraiFaux(Pas EstNull([T_DetailOperation].[Quantite]) Et Pas EstNull([T_DetailOperation].[PrixUnitaire]) Et Pas EstNull([Remise]);([T_DetailOperation].[Quantite]*[T_DetailOperation].[PrixUnitaire])*(1-[Remise]);Null)
V-B. R_Ticket▲
Cette requête permet d'afficher le détail des produits et le total par ligne sur le ticket :
SELECT
T_DetailOperation.*
, DCount(
"*"
,"T_DetailOperation"
,"IdOperation="
&
[T_Operation]
.[IdOperation]
&
" and IdDetailOperation<"
&
[IdDetailOperation]
)+
1
AS
IdLigne, [PrixUnitaire]
*
[Quantite]
*
[Remise]
AS
TotalRemise, IIf(
Not
IsNull
(
[T_DetailOperation]
.[Quantite]
)
And
Not
IsNull
(
[T_DetailOperation]
.[PrixUnitaire]
)
And
Not
IsNull
(
[Remise]
)
,(
[T_DetailOperation]
.[Quantite]
*
[T_DetailOperation]
.[PrixUnitaire]
)*(
1
-
[Remise]
)
,Null
)
AS
TotalLigne, T_Operation.TotalPaiement
FROM
T_Operation INNER
JOIN
T_DetailOperation ON
T_Operation.IdOperation =
T_DetailOperation.IdOperation;
L'expression du champ calculé IdLigne donne le numéro de la ligne du détail de l'opération :
IdLigne: IdLigne: CpteDom("*";"T_DetailOperation";"IdOperation=" & [T_Operation].[IdOperation] & " and IdDetailOperation<" & [IdDetailOperation])+1
L'expression du champ TotalLigne donne le montant total de la ligne du détail de l'opération :
TotalLigne: VraiFaux(Pas EstNull([T_DetailOperation].[Quantite]) Et Pas EstNull([T_DetailOperation].[PrixUnitaire]) Et Pas EstNull([Remise]);([T_DetailOperation].[Quantite]*[T_DetailOperation].[PrixUnitaire])*(1-[Remise]);Null)
VI. Formulaires nécessaires▲
VI-A. Formulaire F_Operation▲
Ce formulaire principal, en mode ajout, est basé sur la table T_OperationT_Operation et permet au vendeur d'enregistrer les différentes opérations avec leur détail grâce à différents contrôles. Il contient le sous-formulaire SF_DetailOperation, et différents éléments (boutons de commande et zones de texte).
VI-A-1. Contrôle sous-formulaire SF_DetailOperation▲
Il contient le sous-formulaire SF_DetailOperation basé sur la requête R_DetailOperation, qui affiche les différents champs du détail de l'opération.
Ses propriétés Champs pères et champs fils se réfèrent aux champs IdOperation des tables T_Operation et T_DetailOperation.
VI-A-2. Boutons de commande pour effectuer les opérations▲
Ces boutons permettent de copier les nombres dans la zone du résultat.
VI-A-2-a. Procédure générique▲
Une procédure générique placée sur l'événement Clic de ces boutons permet d'ajouter à la suite du contenu de la zone résultat, le chiffre du bouton cliqué.
Les étapes de la procédure sont les suivantes :
- On copie dans une variable le contenu de la légende du bouton cliqué (0, 1, …, 9) ;
- On place le focus sur la zone de texte txtResultat ;
- On ajoute à la fin de la zone de texte le chiffre contenu dans la variable ;
- On place le curseur à la fin du contenu de la zone de texte.
Le code complet :
'----------------------------------------------------------------------------------------
' Copie les chiffres affichés sur la légende des boutons à la suite dans la zone du résultat.
'----------------------------------------------------------------------------------------
Public
Sub
MajResultat
(
)
Dim
c As
String
On
Error
GoTo
err_MajResultat ' Gestion d'erreur
c =
Me.ActiveControl.Caption
' Copie dans une variable la légende du bouton de commande (0,1,2,3,4,5,6,7,8,9,..)
Me.txtResultat.SetFocus
' Positionne le focus dans la zone de texte txtResultat
Me.txtResultat.Value
=
(
Me.txtResultat.Text
+
c) ' Copie le chiffre à la suite du contenu de la zone de texte Resultat
Me.txtResultat.SelStart
=
Len
(
Me.txtResultat.Text
) +
1
' Positionne le curseur à la fin du contenu de la zone de texte Resultat
Exit
Sub
err_MajResultat
:
MsgBox
Err
.Description
' Affiche la description de l'erreur
End
Sub
Le pavé numérique et le code VBA associé peuvent être facilement réutilisés.
VI-A-2-b. Bouton de commande cmd0▲
Un clic sur ce bouton permet de copier 0 à la suite dans la zone de texte txtResultat.
'----------------------------------------------------------------------------------------
' Copie le chiffre 0 à la suite dans la zone du résultat.
'----------------------------------------------------------------------------------------
Private
Sub
cmd0_Click
(
)
MajResultat ' Exécution de la procédure de mise à jour du résultat
end
sub
VI-A-2-c. Bouton de commande cmd1▲
Un clic sur ce bouton permet de copier 1 à la suite dans la zone de texte txtResultat.
'----------------------------------------------------------------------------------------
' Copie le chiffre 1 à la suite dans la zone du résultat.
'----------------------------------------------------------------------------------------
Private
Sub
cmd1_Click
(
)
MajResultat ' Exécution de la procédure de mise à jour du résultat
end
sub
VI-A-2-d. Bouton de commande cmd2▲
Un clic sur ce bouton permet de copier 2 à la suite dans la zone de texte txtResultat.
'----------------------------------------------------------------------------------------
' Copie le chiffre 2 à la suite dans la zone du résultat.
'----------------------------------------------------------------------------------------
Private
Sub
cmd2_Click
(
)
MajResultat ' Exécution de la procédure de mise à jour du résultat
end
sub
C'est le même principe pour les autres chiffres du pavé numérique.
VI-A-2-e. Bouton de commande cmdP▲
Un clic sur ce bouton permet de copier « . » à la suite dans la zone de texte txtResultat.
'----------------------------------------------------------------------------------------
' Copie un point à la suite dans la zone du résultat.
'----------------------------------------------------------------------------------------
Private
Sub
cmdP_Click
(
)
MajResultat ' Exécution de la procédure de mise à jour du résultat
end
sub
VI-A-2-f. Bouton de commande cmdC▲
Un clic sur ce bouton permet d'effacer le contenu de la zone de texte txtResultat.
'----------------------------------------------------------------------------------------
' Efface le contenu de la zone du résultat.
'----------------------------------------------------------------------------------------
Private
Sub
cmdC_Click
(
)
Me.Resultat.Value
=
Null
' Efface le contenu de la zone de texte
end
sub
VI-A-2-g. Bouton de commande cmdR▲
Un clic sur ce bouton permet d'afficher le résultat dans la zone de texte txtResultat.
'----------------------------------------------------------------------------------------
' Affiche le résultat dans la zone du résultat.
'----------------------------------------------------------------------------------------
Private
Sub
cmdR_Click
(
)
Me.Resultat
=
Me.SF_DetailOperation.Form
!TotalLigne ' Affiche le total de la ligne du détail dans la zone du résultat
Me.SF_DetailOperation.SetFocus
' On donne le focus au sous-formulaire
DoCmd.GoToRecord
, , acLast ' On accède au dernier enregistrement du détail des opérations
DoCmd.GoToRecord
, , acNext ' On accède au nouvel enregistrement du détail des opérations
End
Sub
VI-A-3. Boutons de commande pour copier les valeurs dans le détail des opérations▲
Ces boutons permettent de copier les valeurs saisies dans le détail de l'opération.
VI-A-3-a. Bouton de commande cmdPrix▲
Un clic sur ce bouton permet de copier la valeur contenue dans la zone de texte txtResultat dans la colonne Prix Unitaire du sous-formulaire.
'----------------------------------------------------------------------------------------
' Copie la valeur du résultat dans la colonne Prix unitaire du sous-formulaire.
'----------------------------------------------------------------------------------------
Private
Sub
cmdPrix_Click
(
)
If
Not
IsNull
(
Me.Resultat.Value
) Then
Me.DateOperation
=
Date
' Copie la date courante dans la zone de texte DateOperation pour créer l'opération
Me.SF_DetailOperation.Form
!PrixUnitaire =
Me.Resultat
' Copie de la valeur
Me.Resultat
=
Null
' On efface le contenu du résultat
End
If
End
Sub
VI-A-3-b. Bouton de commande cmdQuantite▲
Un clic sur ce bouton permet de copier la valeur contenue dans la zone de texte txtResultat dans la colonne Quantité du sous-formulaire.
'----------------------------------------------------------------------------------------
' Copie la valeur du résultat dans la colonne Quantité du sous-formulaire.
'----------------------------------------------------------------------------------------
Private
Sub
CmdQuantite_Click
(
)
If
Not
IsNull
(
Me.txtResultat.Value
) Then
Me.DateOperation
=
Date
Me.SF_DetailOperation.Form
!Quantite =
Replace
(
Me.txtResultat
, "."
, ","
)
Me.txtResultat
=
Null
End
If
End
Sub
VI-A-3-c. Bouton de commande cmdRemise▲
Un clic sur ce bouton permet de copier la valeur contenue dans la zone de texte txtResultat dans la colonne Remise du sous-formulaire.
'----------------------------------------------------------------------------------------
' Copie la valeur du résultat dans la colonne Remise du sous-formulaire.
'----------------------------------------------------------------------------------------
Private
Sub
cmdRemise_Click
(
)
If
Not
IsNull
(
Me.Resultat.Value
) Then
Me.DateOperation
=
Date
' Copie la date courante dans la zone de texte DateOperation pour créer l'opération
Me.SF_DetailOperation.Form
!Remise =
Val
(
Me.Resultat
) /
100
' Copie de la valeur affichée en pourcentage
Me.Resultat
=
Null
' On efface le contenu du résultat
End
If
End
Sub
VI-A-3-d. Bouton de commande cmdEnlever▲
Un clic sur ce bouton permet de supprimer les lignes sélectionnées dans le sous-formulaire du détail de l'opération.
'----------------------------------------------------------------------------------------
' Supprime les lignes sélectionnées dans le sous-formulaire du détail de l'opération.
'----------------------------------------------------------------------------------------
Private
Sub
cmdEnlever_Click
(
)
DoCmd.SetWarnings
False
' Enlève les avertissements Access
DoCmd.RunSQL
(
"delete * from T_DetailOperation where IdOperation="
&
Nz
(
Me.IdOperation
, 0
) &
" and Selection;"
) ' Supprime les lignes sélectionnées dans le sous-formulaire
DoCmd.SetWarnings
True
' Remet les avertissements Access
Me.Refresh
' Actualise les données
End
Sub
VI-A-4. Boutons de commande pour afficher les produits par catégorie▲
Ces boutons permettent d'afficher la liste des produits par catégorie pour ensuite les choisir.
VI-A-4-a. Procédure générique▲
Une procédure générique placée sur l'événement Clic de ces boutons permet d'afficher la liste des produits filtrée en fonction de la légende du bouton cliqué correspondant à la catégorie de produits choisie.
Les étapes de la procédure sont les suivantes :
- On copie dans une variable le contenu de la légende du bouton correspondant à la catégorie de produits ;
- On ouvre le formulaire F_ListeProduit ;
- On génère le code SQL pour afficher la liste des produits de cette catégorie ;
- On copie la catégorie dans la liste déroulante CategorieProduit du formulaire ListeProduit ;
- On copie le code SQL sur la propriété RecordSource du sous-formulaire SF_ListeProduit.
Le code complet :
'----------------------------------------------------------------------------------------
' Affiche la liste des produits correspondant à la légende du bouton cliqué.
'----------------------------------------------------------------------------------------
Private
Sub
OuvrirListeProduits
(
)
Dim
CategorieProduit As
String
Dim
LeSQL As
String
On
Error
GoTo
err_OuvrirListeProduits ' Gestion d'erreur
CategorieProduit =
Me.ActiveControl.Caption
' Copie la légende du bouton cliqué correspondant à la catégorie de produits choisie
DoCmd.OpenForm
"F_ListeProduit"
' Ouvre le formulaire affichant la liste des produits
' Code SQL de la requête filtrant les produits en fonction de la variable CategorieProduit
LeSQL =
"select * from R_ListeProduit where NomCategorie like """
&
CategorieProduit &
""" order by NomCategorie, IdProduit;"
Forms!F_ListeProduit!cmbCategorieProduit.Value
=
CategorieProduit ' On copie la catégorie dans la zone de texte correspondante du formulaire F_ListeProduit
Forms!F_ListeProduit!SF_ListeProduit.Form.RecordSource
=
LeSQL ' On applique le code SQL à la source du sous-formulaire SF_ListeProduit
Exit
Sub
err_OuvrirListeProduit
MsgBox
(
Err
.Description
) ' Affiche la description de l'erreur
End
Sub
Vous pouvez facilement créer vos propres boutons de commande avec vos catégories de produits et y exécuter la procédure générique sur l'événement Clic.
VI-A-4-b. Bouton de commande cmdBoissons▲
Un clic sur ce bouton permet d'afficher la liste des produits appartenant à la catégorie Boissons.
'----------------------------------------------------------------------------------------
' Affiche la liste des produits du type Boissons.
'----------------------------------------------------------------------------------------
Private
Sub
cmdBoissons_Click
(
)
OuvrirListeProduits ' Exécute la procédure d'ouverture de la liste des produits de catégorie Boissons
End
Sub
VI-A-4-c. Bouton de commande cmdBoulangerie▲
Un clic sur ce bouton permet d'afficher la liste des produits appartenant à la catégorie Boulangerie.
'----------------------------------------------------------------------------------------
' Affiche la liste des produits du type Boulangerie.
'----------------------------------------------------------------------------------------
Private
Sub
cmdBoulangerie_Click
(
)
OuvrirListeProduits ' Exécute la procédure d'ouverture de la liste des produits de catégorie Boulangerie
End
Sub
VI-A-4-d. Bouton de commande cmdCharcuterie▲
Un clic sur ce bouton permet d'afficher la liste des produits appartenant à la catégorie Charcuterie.
'----------------------------------------------------------------------------------------
' Affiche la liste des produits du type Charcuterie.
'----------------------------------------------------------------------------------------
Private
Sub
cmdCharcuterie_Click
(
)
OuvrirListeProduits ' Exécute la procédure d'ouverture de la liste des produits de catégorie Charcuterie
End
Sub
C'est le même principe pour les autres boutons : il suffit de copier dans la légende du bouton le nom de la catégorie du produit pour afficher la liste correspondante.
VI-A-5. Zone de texte pour afficher les valeurs saisies▲
Zone de texte permettant d'afficher les valeurs saisies avec le clavier ou sur le pavé.
VI-A-5-a. Zone de texte txtResultat▲
Elle affiche les différentes valeurs intervenant dans les opérations.
'----------------------------------------------------------------------------------------
' Code pour limiter la saisie aux caractères numériques
'----------------------------------------------------------------------------------------
Private
Sub
txtResultat_KeyDown
(
KeyCode As
Integer
, Shift As
Integer
)
If
((
KeyCode >=
96
) And
(
KeyCode p<=
105
)) Or
(
KeyCode =
16
) Or
(
KeyCode =
110
) Or
(
KeyCode =
188
) Then
' Autorise la saisie pour les touches numériques
Else
KeyCode =
0
' Annule l'entrée du caractère
End
If
End
Sub
VI-A-6. Zone de texte pour gérer les codes-barres▲
Zone de texte permettant à partir du code-barres entré, de saisir le bon produit dans le détail.
Pour rappel la douchette (ou lecteur de codes-barres) est équivalente à une saisie clavier.
VI-A-6-a. Zone de texte txtCodeBarres▲
Si la zone de texte possède le focus, une simple saisie d'un code-barres dans cette zone au moyen d'une douchette déclenche la recherche du produit correspondant dans la base et la copie des références du produit dans le détail de l'opération.
'------------------------------------------------------------------------------------------
' Recherche le produit correspondant au code-barres dans la base, et copie de la désignation
' et du prix du produit dans le détail de l'opération.
'------------------------------------------------------------------------------------------
Private
Sub
txtCodeBarres_Change
(
)
Dim
db As
DAO.Database
'
Dim
rs As
DAO.Recordset
Set
db =
CurrentDb ' Référence à la base courante
Set
rs =
db.OpenRecordset
(
"T_Produit"
, dbOpenSnapshot) ' Ouverture du jeu d'enregistrements des produits
rs.FindFirst
"[CodeProduit] = '"
&
Me.txtCodeBarres.Text
&
"'"
' Recherche du produit correspondant au code saisi
If
Not
(
rs.NoMatch
) Then
Me!DateOperation =
Date
Me.SF_DetailOperation.Form
!DesignationProduit =
rs!DesignationProduit ' Copie de la désignation du produit dans la colonne correspondante du sous-formulaire
Me.SF_DetailOperation.Form
!PrixUnitaire =
rs!PrixUnitaire ' Copie du prix unitaire du produit dans la colonne correspondante du sous-formulaire
Else
MsgBox
(
"Produit introuvable !"
)
End
If
' libération des variables
rs.Close
Set
rs =
Nothing
Set
db =
Nothing
End
Sub
VI-A-7. Zones de texte pour afficher les totaux▲
Zones de texte permettant d'afficher les totaux des montants avant et après remise, le nombre de lignes et de produits.
Si vous souhaitez créer votre propre total en en-tête du formulaire, le principe est relativement simple :
- on crée une zone de texte txtTotal dans le pied du sous-formulaire SF_DetailOperation, elle va afficher la somme du champ (ici Montant) de la requête source, au moyen de la formule suivante placée sur la propriété Source Contrôle :
=
Somme
(
[Montant])
- on ajoute ensuite dans le formulaire principal une zone de texte txtTotal faisant référence au contrôle txtTotal du sous-formulaire au moyen de l'expression :
=
[SF_DetailOperation].
[Formulaire].
[txtTotal]
VI-A-7-a. Zone de texte txtTotalTTC▲
Elle affiche le total des montants.
La formule appliquée à la propriété Source contrôle fait référence à la zone de texte txtTotalTTC située dans le pied du sous-formulaire :
=
[SF_DetailOperation].
[Formulaire].
[txtTotalTTC]
La formule appliquée à la propriété Source contrôle de la zone de texte txtTotalTTC située dans le pied du sous-formulaire SF_DetailOperation est :
=
Nz
(
Somme
(
[Totalligne]);0
)
VI-A-7-b. Zone de texte txtTotalRemise▲
Elle affiche le total des remises.
La formule appliquée à la propriété Source contrôle fait référence à la zone de texte txtTotalTTC située dans le pied du sous-formulaire :
=
[SF_DetailOperation].
[Formulaire].
[txtTotalRemise]
La formule appliquée au contrôle txtTotalRemise situé dans le pied du sous-formulaire SF_DetailOperation est :
=
Nz
(
Somme
(
[Quantite]*
[RemiseU]);0
))
VI-A-7-c. Zone de texte txtTotalAvantRemise▲
Elle affiche le total des montants avant remise.
La formule appliquée à la propriété Source contrôle est :
=
[txtTotalTTC]-
[txtTotalRemise]
VI-A-7-d. Zone de texte txtNbLignes▲
Elle affiche le nombre total de lignes.
La formule appliquée à la propriété Source contrôle est :
=
[SF_DetailOperation].
[Formulaire].
[txtNbLignes]
La formule appliquée au contrôle txtNbLignes situé dans le pied du sous-formulaire SF_DetailOperation est :
=
Nz
(
Compte
(
[Totalligne]);0
)
VI-A-7-e. Zone de texte txtNbProduits▲
Elle affiche le nombre total de produits.
La formule appliquée à la propriété Source contrôle est :
=
[SF_DetailOperation].
[Formulaire].
[txtNbLignes]
La formule appliquée au contrôle txtNbProduits situé dans le pied du sous-formulaire SF_DetailOperation est :
=
Nz
(
Somme
(
[Quantite]);0
)
VI-A-8. Zones de texte au pied du formulaire▲
Zones de texte reliées aux champs de la requête source R_DetailOperation.
VI-A-8-a. Zone de texte txtIdCaisse▲
Elle est reliée au champ IdCaisse de la table T_Operation.
La formule appliquée à la propriété Valeur par défaut fait référence au champ IdCaisse de la table T_ParametreCaisse :
=
RechDom
(
"IdCaisse"
;"T_ParametreCaisse"
)
La formule permet de copier par défaut dans le champ IdCaisse de la table source, le numéro de caisse enregistré dans la table T_ParametreCaisse.
VI-A-8-b. Zone de texte txtIdOperation▲
Elle est reliée au champ numéro-auto IdOperation de la table T_Operation.
VI-A-8-c. Zone de texte txtDateOperation▲
Elle est reliée au champ DateOperation de la table T_Operation.
La formule appliquée à la propriété Valeur par défaut est la date d'aujourd'hui :
=
Date
(
)
La formule permet de copier par défaut dans le champ DateOperation de la table source, la date du jour de l'opération.
VI-A-8-d. Zone de texte txtHeureOperation▲
Elle est reliée au champ HeureOperation de la table T_Operation.
La formule appliquée à la propriété Valeur par défaut est l'heure du jour :
=
Time
(
)
La formule permet de copier par défaut dans le champ HeureOperation de la table source, l'heure du jour de l'opération.
VI-A-8-e. Zone de texte txtIdVendeur▲
Elle est reliée au champ IdVendeur de la table T_Operation.
La formule appliquée à la propriété Valeur par défaut fait référence au champ IdVendeur de la table T_ParametreCaisse :
=
RechDom
(
"IdVendeur"
;"T_ParametreCaisse"
)
La formule permet de copier par défaut dans le champ IdVendeur de la table source, l'identifiant du vendeur enregistré dans la table T_ParametreCaisse.
VI-A-8-f. Bouton de commande cmdEncaisser▲
Un clic sur ce bouton permet de valider l'opération courante et de passer à une nouvelle.
'----------------------------------------------------------------------------------------
' Valide l'opération courante et passe à la suivante.
'----------------------------------------------------------------------------------------
Private
Sub
cmdEncaisser_Click
(
)
' Ouvre le formulaire des encaissements
DoCmd.OpenForm
"F_Encaissement"
, , , "IdOperation="
&
Nz
(
Me.IdOperation
)
End
Sub
VI-B. Formulaire F_ParametreCaisse▲
Il est basé sur la table T_ParametreCaisse et permet de paramétrer la caisse en définissant la référence de la caisse et du vendeur.
On y accède depuis le formulaire F_Operation en cliquant sur le bouton cmdCaisse :
VI-B-1. Listes déroulantes pour choisir la caisse et le vendeur▲
Elles permettent de définir la caisse sur laquelle le vendeur effectuera les opérations.
VI-B-1-a. Liste déroulante cmbCaisse▲
Elle est liée au champ IdCaisse de la table T_ParametreCaisse et sa propriété Contenu fait référence à la table T_Caisse.
VI-B-1-b. Liste déroulante cmbVendeur▲
Elle est liée au champ IdVendeur de la table T_ParametreCaisse et sa propriété Contenu fait référence à la table T_Vendeur.
VI-C. Formulaire F_ListeProduit▲
Ce formulaire permet au vendeur de choisir un produit dans une liste filtrée par catégorie. Il contient le sous-formulaire SF_ListeProduit.
VI-C-1. Sous-formulaire SF_ListeProduit▲
Il est basé sur la requête R_ListeProduit présente dans le fichier exemple.
VI-C-1-a. Bouton de commande cmdSelectionner▲
Un clic sur ce bouton permet de copier la désignation et le prix du produit sur la ligne courante dans le détail de l'opération.
'----------------------------------------------------------------------------------------
' Sélectionne le produit et copie sa désignation et son prix dans le détail.
'----------------------------------------------------------------------------------------
Private
Sub
cmdSelectionner_Click
(
)
Forms!F_Operation!DateOperation =
Date
' Copie la date courante dans la zone de texte DateOperation pour créer l'opération
Forms!F_Operation!SF_DetailOperation!DesignationProduit =
Me.DesignationProduit
' Copie de la désignation du produit dans le détail
Forms!F_Operation!SF_DetailOperation!PrixUnitaire =
Me.PrixUnitaire
' Copie du prix unitaire dans le détail
Forms!F_Operation!SF_DetailOperation!TauxTVA =
Me.TauxTVA
' Copie du taux de TVA dans le détail
DoCmd.Close
acForm, Me.Parent.Name
End
Sub
VI-D. Formulaire F_Encaissement▲
Lié à la table T_Operation, il s'ouvre en cliquant sur le bouton Encaisser, et permet la saisie de l'argent donné par le client en utilisant des contrôles représentant les billets et pièces de monnaie.
VI-D-1. Procédure générique▲
Une procédure générique placée sur l'événement Clic des images et boutons de commande permet d'ajouter le montant du billet ou de la pièce, au montant déjà enregistré dans la zone de texte txtTotalPaiement.
Les étapes de la procédure sont les suivantes :
- On masque le contour de toutes les images ;
- Si le contrôle cliqué est une image, on affiche son contour ;
- On ajoute le montant du billet ou de la pièce au montant déjà présent dans la zone de texte txtTotalPaiement.
Le code complet :
'------------------------------------------------------------------------------------------------
' Ajoute le montant passé en argument au montant contenu dans la zone de texte txtTotalPaiement.
'------------------------------------------------------------------------------------------------
Public
Sub
MajEncaissement
(
m As
Currency)
' m : Argument de la routine correspondant au montant du billet ou de la pièce cliqué
On
error
goto
err_MajEncaissement
' On masque le contour de toutes les images
Me.Controls
(
"img1"
).BorderStyle
=
0
Me.Controls
(
"img2"
).BorderStyle
=
0
Me.Controls
(
"img5"
).BorderStyle
=
0
Me.Controls
(
"img10"
).BorderStyle
=
0
Me.Controls
(
"img20"
).BorderStyle
=
0
Me.Controls
(
"img50"
).BorderStyle
=
0
Me.Controls
(
"img100"
).BorderStyle
=
0
Me.Controls
(
"img200"
).BorderStyle
=
0
Me.Controls
(
"img500"
).BorderStyle
=
0
If
m >=
1
Then
' Si le contrôle cliqué est une image
Me.Controls
(
"img"
+
CStr
(
m)).BorderStyle
=
1
' Affiche son contour
End
If
' Ajoute le montant du billet ou de la pièce au montant déjà présent dans la zone de texte txtTotalPaiement
Me.txtTotalPaiement
=
Nz
(
Me.txtTotalPaiement
, 0
) +
m
exit
sub
err_MajEncaissement
:
Msgbox
(
err
.description
)
End
Sub
Le formulaire et le code VBA associé peuvent être facilement réutilisés si votre unité monétaire est l'euro.
VI-D-2. Les images représentant les billets et les pièces▲
Ces contrôles affichent les différents billets d'euros disponibles sur le marché, un clic sur ces images exécute la procédure générique permettant l'ajout du montant du billet ou de la pièce, au montant déjà enregistré dans la zone de texte txtTotalPaiement.
VI-D-2-a. Image img5▲
Un clic sur cette image permet d'ajouter 5 euros au montant affiché dans la zone de texte txtTotalPaiement
'----------------------------------------------------------------------------------------
' Ajoute 5 au montant donné par le client.
'----------------------------------------------------------------------------------------
Private
Sub
img5_Click
(
)
MajEncaissement (
5
) ' Ajoute 5 au montant affiché dans la zone de texte txtTotalPaiement
End
Sub
VI-D-2-b. Image img10▲
Un clic sur cette image permet d'ajouter 10 euros au montant affiché dans la zone de texte txtTotalPaiement
'----------------------------------------------------------------------------------------
' Ajoute 10 au montant donné par le client.
'----------------------------------------------------------------------------------------
Private
Sub
img10_Click
(
)
MajEncaissement (
10
) ' Ajoute 10 au montant affiché dans la zone de texte txtTotalPaiement
End
Sub
VI-D-3. Les boutons de commande pour les centimes▲
Ces contrôles représentant les pièces de 1, 2, 5, 10, 20 et 50 centimes, un clic sur ces boutons de commande exécute une procédure générique permettant l'ajout du montant de la pièce, au montant déjà enregistré dans la zone de texte txtTotalPaiement.
VI-D-3-a. Bouton de commande cmd1c▲
Un clic sur cette image permet d'ajouter 1 centime au montant affiché dans la zone de texte txtTotalPaiement
'----------------------------------------------------------------------------------------
' Ajoute 1 centime au montant donné par le client.
'----------------------------------------------------------------------------------------
Private
Sub
cmd1c_Click
(
)
MajEncaissement (
0
.01
) ' Ajoute 1 centime au montant affiché dans la zone de texte txtTotalPaiement
End
Sub
VI-D-3-b. Bouton de commande cmd2c▲
Un clic sur cette image permet d'ajouter 2 centimes au montant affiché dans la zone de texte txtTotalPaiement
'----------------------------------------------------------------------------------------
' Ajoute 2 centimes au montant donné par le client.
'----------------------------------------------------------------------------------------
Private
Sub
cmd2c_Click
(
)
MajEncaissement (
0
.02
) ' Ajoute 2 centimes au montant affiché dans la zone de texte txtTotalPaiement
End
Sub
VI-D-4. Boutons de commande pour composer le montant donné▲
Ces boutons permettent de copier les nombres dans la zone de texte txtTotalPaiement.
VI-D-4-a. Procédure générique▲
Une procédure générique placée sur l'événement Clic de ces boutons permet d'ajouter à la suite du contenu de la zone de texte txtTotalPaiement, le chiffre du bouton cliqué.
Les étapes de la procédure sont les suivantes :
- On copie dans une variable le contenu de la légende du bouton cliqué (0, 1, …, 9) ;
- On place le focus sur la zone de texte txtTotalPaiement ;
- On ajoute à la fin de la zone de texte le chiffre contenu dans la variable ;
- On place le curseur à la fin du contenu de la zone de texte.
Le code complet :
'-------------------------------------------------------------------------------------------------
' Copie les chiffres affichés sur la légende des boutons à la suite dans la zone txtTotalPaiement.
'-------------------------------------------------------------------------------------------------
Public
Sub
MajEncaisser
(
)
Dim
c As
String
On
Error
GoTo
err_MajEncaisser ' Gestion d'erreur
c =
Replace
(
Me.ActiveControl.Caption
, "."
, ","
) ' Copie dans une variable la légende du bouton de commande (0,1,2,3,4,5,6,7,8,9,..)
Me.txtTotalPaiement.SetFocus
' Positionne le focus dans la zone de texte txtTotalPaiement
Me.txtTotalPaiement.Value
=
(
Me.txtTotalPaiement.Text
+
c) ' Copie le chiffre à la suite du contenu de la zone de texte txtTotalPaiement
Me.txtTotalPaiement.SelStart
=
Len
(
Me.txtTotalPaiement.Text
) +
1
' Positionne le curseur à la fin du contenu de la zone de texte txtTotalPaiement
Exit
Sub
err_MajEncaisser
:
MsgBox
Err
.Description
' Affiche la description de l'erreur
End
Sub
Le pavé numérique et le code VBA associé peuvent être facilement réutilisés.
VI-D-4-b. Bouton de commande cmd0▲
Un clic sur ce bouton permet de copier 0 à la suite dans la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
' Copie le chiffre 0 à la suite dans la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
Private
Sub
cmd0_Click
(
)
MajEncaisser ' Exécution de la procédure de mise à jour de la zone de texte txtTotalPaiement
end
sub
VI-D-4-c. Bouton de commande cmd1▲
Un clic sur ce bouton permet de copier 1 à la suite dans la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
' Copie le chiffre 1 à la suite dans la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
Private
Sub
cmd1_Click
(
)
MajEncaisser ' Exécution de la procédure de mise à jour de la zone de texte txtTotalPaiement
end
sub
C'est le même principe pour les autres chiffres du pavé numérique.
VI-D-4-d. Bouton de commande cmdP▲
Un clic sur ce bouton permet de copier « . » à la suite dans la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
' Copie un point à la suite dans la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
Private
Sub
cmdP_Click
(
)
MajEncaisser ' Exécution de la procédure de mise à jour de la zone de texte txtTotalPaiement
end
sub
VI-D-4-e. Bouton de commande cmdC▲
Un clic sur ce bouton permet d'effacer le contenu de la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
' Efface le contenu de la zone de texte txtTotalPaiement.
'----------------------------------------------------------------------------------------
Private
Sub
cmdC_Click
(
)
Me.txtTotalPaiement.Value
=
Null
' Efface le contenu de la zone de texte
end
sub
VI-D-5. Zone de texte pour afficher le rendu▲
VI-D-5-a. Zone de texte txtRendu▲
La propriété Source contrôle de cette zone de texte fait référence au contrôle txtTotalTTC du formulaire F_Encaissement et au contrôle txtTotalTTC du formulaire F_Operation :
=[txtTotalPaiement]-Formulaires!F_Operation!txtTotalTTC
VI-D-6. Boutons de commande pour valider ou recommencer la saisie▲
VI-D-6-a. Bouton de commande cmdValider▲
Valide la saisie et donc l'encaissement, puis lance l'impression du ticket.
Les étapes de la procédure sont les suivantes :
- Enregistre la saisie sur le formulaire d'encaissement ;
- Lance l'impression du ticket de caisse ;
- Ferme le formulaire d'encaissement ;
- Place le focus sur le formulaire F_Operation ;
- Se positionne sur un nouvel enregistrement pour une nouvelle opération.
Le code complet :
Private
Sub
cmdValider_Click
(
)
Me.TotalPaiement
=
Nz
(
Me.txtTotalPaiement
, 0
) ' Copie du contenu de la zone de texte txtTotalPaiement dans le champ TotalPaiement
Me.Refresh
' Actualise le formulaire
DoCmd.OpenReport
"E_Ticket"
, acViewPreview, , "IdOperation="
&
Nz
(
Me!IdOperation, 0
) ' Lance l'impression du ticket de caisse
DoCmd.Close
acForm, Me.Name
' Ferme le formulaire d'encaissement.
Forms!F_Operation.SetFocus
' Place le focus sur le formulaire F_Operation
If
MsgBox
(
"Vous lui devez "
&
Format
(
Me.txtRendu
, "currency"
), vbOKCancel
, "Rendu"
) =
vbCancel
Then
' Possibilité encore d'annuler
Exit
Sub
End
If
DoCmd.GoToRecord
, , acLast
DoCmd.GoToRecord
, , acNext ' Se déplace sur un nouvel enregistrement
End
Sub
VI-D-6-b. Bouton de commande cmdAnnuler▲
Annule la saisie en vidant la zone de texte txtTotalPaiement.
Private
Sub
cmdAnnuler_Click
(
)
Me.txtTotalPaiement.Value
=
Null
' Vide la zone de texte
End
Sub
VII. État nécessaire▲
VII-A. État E_Ticket▲
Il est basé sur la requête R_Ticket et est imprimé à la fin du processus d'encaissement.
On a défini en mode création un regroupement sur le champ IdOperation et un tri sur le champ IdLigne.
VIII. Lien utile▲
Il faut désormais tenir compte de la loi obligeant à partir de 2018 l'utilisation d'un logiciel de caisse certifié, pour plus d'informations vous pouvez consulter cette page : Obligation d'utiliser des logiciels de caisse certifiés à partir de 2018
IX. Les bases de données à télécharger▲
Les bases jointesBD Caisse au format mdb et accdb.
X. Remerciements▲
Je tiens à remercier Pierre Fauconnier, chrtophe, et gaby277 pour m'avoir conseillé pour la réalisation de cet article, ainsi que Claude Leloup pour sa relecture.