Créer un logiciel de caisse enregistreuse avec Access

Denis Hulo

Objectif : apprendre à créer un logiciel de caisse enregistreuse avec Access.

Niveau requis : intermédiaire, avancé.

Commentez cet article : Commentez

- Titre : Créer un logiciel de caisse enregistreuse avec Access

- Auteur : Denis Hulo

- Parution : 1 septembre 2017

- Public visé :

- Licence : Copyright ® 2017 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Principe de fonctionnement de la caisse

- III. Structure générale du logiciel

- IV. Tables nécessaires

- IV-A. T_ParametreCaisse

- IV-B. T_Produit

- IV-C. T_Operation

- IV-D. T_DetailOperation

- V. Requêtes nécessaires

- V-A. R_DetailOperation

- V-B. R_Ticket

- VI. Formulaires nécessaires

- VI-A. Formulaire F_Operation

- VI-A-1. Contrôle sous-formulaire SF_DetailOperation

- VI-A-2. Boutons de commande pour effectuer les opérations

- VI-A-2-a. Procédure générique

- VI-A-2-b. Bouton de commande cmd0

- VI-A-2-c. Bouton de commande cmd1

- VI-A-2-d. Bouton de commande cmd2

- VI-A-2-e. Bouton de commande cmdP

- VI-A-2-f. Bouton de commande cmdC

- VI-A-2-g. Bouton de commande cmdR

- VI-A-3. Boutons de commande pour copier les valeurs dans le détail des opérations

- VI-A-3-a. Bouton de commande cmdPrix

- VI-A-3-b. Bouton de commande cmdQuantite

- VI-A-3-c. Bouton de commande cmdRemise

- VI-A-3-d. Bouton de commande cmdEnlever

- VI-A-4. Boutons de commande pour afficher les produits par catégorie

- VI-A-4-a. Procédure générique

- VI-A-4-b. Bouton de commande cmdBoissons

- VI-A-4-c. Bouton de commande cmdBoulangerie

- VI-A-4-d. Bouton de commande cmdCharcuterie

- VI-A-5. Zone de texte pour afficher les valeurs saisies

- VI-A-5-a. Zone de texte txtResultat

- VI-A-6. Zone de texte pour gérer les codes-barres

- VI-A-6-a. Zone de texte txtCodeBarres

- VI-A-7. Zones de texte pour afficher les totaux

- VI-A-7-a. Zone de texte txtTotalTTC

- VI-A-7-b. Zone de texte txtTotalRemise

- VI-A-7-c. Zone de texte txtTotalAvantRemise

- VI-A-7-d. Zone de texte txtNbLignes

- VI-A-7-e. Zone de texte txtNbProduits

- VI-A-8. Zones de texte au pied du formulaire

- VI-A-8-a. Zone de texte txtIdCaisse

- VI-A-8-b. Zone de texte txtIdOperation

- VI-A-8-c. Zone de texte txtDateOperation

- VI-A-8-d. Zone de texte txtHeureOperation

- VI-A-8-e. Zone de texte txtIdVendeur

- VI-A-8-f. Bouton de commande cmdEncaisser

- VI-B. Formulaire F_ParametreCaisse

- VI-B-1. Listes déroulantes pour choisir la caisse et le vendeur

- VI-B-1-a. Liste déroulante cmbCaisse

- VI-B-1-b. Liste déroulante cmbVendeur

- VI-C. Formulaire F_ListeProduit

- VI-C-1. Sous-formulaire SF_ListeProduit

- VI-C-1-a. Bouton de commande cmdSelectionner

- VI-D. Formulaire F_Encaissement

- VI-D-1. Procédure générique

- VI-D-2. Les images représentant les billets et les pièces

- VI-D-2-a. Image img5

- VI-D-2-b. Image img10

- VI-D-3. Les boutons de commande pour les centimes

- VI-D-3-a. Bouton de commande cmd1c

- VI-D-3-b. Bouton de commande cmd2c

- VI-D-4. Boutons de commande pour composer le montant donné

- VI-D-4-a. Procédure générique

- VI-D-4-b. Bouton de commande cmd0

- VI-D-4-c. Bouton de commande cmd1

- VI-D-4-d. Bouton de commande cmdP

- VI-D-4-e. Bouton de commande cmdC

- VI-D-5. Zone de texte pour afficher le rendu

- VI-D-5-a. Zone de texte txtRendu

- VI-D-6. Boutons de commande pour valider ou recommencer la saisie

- VI-D-6-a. Bouton de commande cmdValider

- VI-D-6-b. Bouton de commande cmdAnnuler

- VII. État nécessaire

- VII-A. État E_Ticket

- VIII. Lien utile

- IX. Les bases de données à télécharger

- X. Remerciements

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

Aperçu du formulaire F_Operation

Principe de fonctionnement de la caisse

1. On choisit la catégorie de produits en cliquant sur les boutons de commande situés en bas : boissons, boulangerie, charcuterie…

2. Sur le formulaire qui s'ouvre, on choisit le produit de la catégorie.

3. On saisit sur le pavé numérique la quantité, puis on clique sur le bouton de commande Quantité.

4. On saisit éventuellement sur le pavé numérique la valeur de la remise, puis on appuie sur Remise.

5. Enfin, on valide la saisie de la ligne en appuyant sur le bouton de commande R.

6. On réitère la procédure pour chaque produit.

7. 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éo

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_Operation permettant de réaliser les opérations sur les produits comportera :

- un sous-formulaire pour afficher le détail de l'opération ;

- un groupe de boutons de commande pour copier les références des produits dans le détail ;

- un pavé numérique pour saisir les valeurs ;

- un groupe de boutons de commande pour copier les valeurs dans le détail ;

- un en-tête de formulaire pour afficher les totaux du détail ;

- un pied de 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érique appelée sur l'événement clic de chaque bouton du pavé numérique ;

- une procé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.

T_ParametreCaisse

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.

T_Produit

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_DetailOperation par une relation 1 à plusieurs.

T_Operation

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_Operation sur le champ IdOperation.

T_DetailOperation

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 :

Code SQL de R_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 :

Champ calculé 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 :

Champ calculé TotalLigne

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 :

Code SQL de R_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 :

Champ calculé IdLigne

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 :

Champ calculé TotalLigne

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_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).

Aperçu du formulaire F_Operation en mode création

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.

Aperçu du sous-formulaire SF_DetailOperation en mode création

VI-A-2 - Boutons de commande pour effectuer les opérations

Ces boutons permettent de copier les nombres dans la zone du résultat.

Aperçu du pavé numérique

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 :

1. On copie dans une variable le contenu de la légende du bouton cliqué (0, 1, …, 9) ;

2. On place le focus sur la zone de texte txtResultat ;

3. On ajoute à la fin de la zone de texte le chiffre contenu dans la variable ;

4. On place le curseur à la fin du contenu de la zone de texte.

Le code complet :

procédure générique

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

Aperçu des boutons de copie des valeurs

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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

Aperçu des boutons de sélection des produits

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 :

1. On copie dans une variable le contenu de la légende du bouton correspondant à la catégorie de produits ;

2. On ouvre le formulaire F_ListeProduit ;

3. On génère le code SQL pour afficher la liste des produits de cette catégorie ;

4. On copie la catégorie dans la liste déroulante CategorieProduit du formulaire ListeProduit ;

5. On copie le code SQL sur la propriété RecordSource du sous-formulaire SF_ListeProduit.

Le code complet :

Procédure générique

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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é.

Aperçu de la zone de texte txtResultat

VI-A-5-a - Zone de texte txtResultat

Elle affiche les différentes valeurs intervenant dans les opérations.

procédure événementielle sur touche appuyée

'----------------------------------------------------------------------------------------
' 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.

Aperçu de la zone de texte txtCodeBarre

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.

procédure événementielle sur changement

'------------------------------------------------------------------------------------------
' 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.

Aperçu de la zone affichant les totaux

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.

Aperçu de la zone du pied du formulaire

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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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 :

Aperçu du formulaire F_ParametreCaisse accessible depuis F_Operation

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.

Aperçu du formulaire F_ParametreCaisse en mode création

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.

Aperçu du formulaire F_ListeProduit en mode création

VI-C-1 - Sous-formulaire SF_ListeProduit

Il est basé sur la requête R_ListeProduit présente dans le fichier exemple.

Aperçu du formulaire SF_ListeProduit en mode création

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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

Aperçu du formulaire F_Encaissement en mode création

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 :

1. On masque le contour de toutes les images ;

2. Si le contrôle cliqué est une image, on affiche son contour ;

3. 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 :

procédure générique

'------------------------------------------------------------------------------------------------
' 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.

Aperçu des images affichant les euros

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

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

Aperçu des images affichant les centimes

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

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

Aperçu du pavé numérique

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 :

1. On copie dans une variable le contenu de la légende du bouton cliqué (0, 1, …, 9) ;

2. On place le focus sur la zone de texte txtTotalPaiement ;

3. On ajoute à la fin de la zone de texte le chiffre contenu dans la variable ;

4. On place le curseur à la fin du contenu de la zone de texte.

Le code complet :

procédure générique

'-------------------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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.

procédure événementielle sur clic

'----------------------------------------------------------------------------------------
' 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

Aperçu de la zone de texte txtTotalPaiement

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

Aperçu des boutons de commandes

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 :

1. Enregistre la saisie sur le formulaire d'encaissement ;

2. Lance l'impression du ticket de caisse ;

3. Ferme le formulaire d'encaissement ;

4. Place le focus sur le formulaire F_Operation ;

5. 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

Aperçu de l'état en mode création

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 jointes 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.