IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Créer un logiciel de caisse enregistreuse avec Access

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

Niveau requis : intermédiaire, avancé.

Commentez cet article : 28 commentaires Donner une note à l´article (5)

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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

Image non disponible
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é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 :

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 :

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_DetailOperationT_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_OperationT_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
Sélectionnez
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
Sélectionnez
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
Sélectionnez
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
Sélectionnez
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
Sélectionnez
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
Sélectionnez
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).

Image non disponible
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.

Image non disponible
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.

Image non disponible
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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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.

Image non disponible
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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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.

Image non disponible
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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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é.

Image non disponible
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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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.

Image non disponible
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
Sélectionnez
'------------------------------------------------------------------------------------------
' 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.

Image non disponible
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 :
 
Sélectionnez
=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 :
 
Sélectionnez
=[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 :

 
Sélectionnez
=[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 :

 
Sélectionnez
=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 :

 
Sélectionnez
=[SF_DetailOperation].[Formulaire].[txtTotalRemise]

La formule appliquée au contrôle txtTotalRemise situé dans le pied du sous-formulaire SF_DetailOperation est :

 
Sélectionnez
=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 :

 
Sélectionnez
=[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 :

 
Sélectionnez
=[SF_DetailOperation].[Formulaire].[txtNbLignes]

La formule appliquée au contrôle txtNbLignes situé dans le pied du sous-formulaire SF_DetailOperation est :

 
Sélectionnez
=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 :

 
Sélectionnez
=[SF_DetailOperation].[Formulaire].[txtNbLignes]

La formule appliquée au contrôle txtNbProduits situé dans le pied du sous-formulaire SF_DetailOperation est :

 
Sélectionnez
=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.

Image non disponible
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 :

 
Sélectionnez
=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 :

 
Sélectionnez
=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 :

 
Sélectionnez
=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 :

 
Sélectionnez
=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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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 :

Image non disponible
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.

Image non disponible
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.

Image non disponible
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.

Image non disponible
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électionnez
'----------------------------------------------------------------------------------------
' 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.

Image non disponible
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
Sélectionnez
'------------------------------------------------------------------------------------------------
' 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.

Image non disponible
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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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.

Image non disponible
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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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.

Image non disponible
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
Sélectionnez
'-------------------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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
Sélectionnez
'----------------------------------------------------------------------------------------
' 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

Image non disponible
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 :

 
Sélectionnez
=[txtTotalPaiement]-Formulaires!F_Operation!txtTotalTTC

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

Image non disponible
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 :

 
Sélectionnez
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.

 
Sélectionnez
Private Sub cmdAnnuler_Click()
    Me.txtTotalPaiement.Value = Null ' Vide la zone de texte
End Sub

VII. État nécessaire

VII-A. État E_Ticket

Image non disponible
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 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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2017 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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. Droits de diffusion permanents accordés à Developpez LLC.