Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Editer la facture Client
Généralement après avoir facturé un client par le biais d'une interface de gestion, le logiciel doit être en mesure de produire et d'éditer la
facture . Dans l'application précédente, nous avons été en mesure de
facturer un client en fonction des articles achetés et de mettre à jour les stocks dans la base de données .
Au clic sur le
bouton Valider la facture , un
code VBA archive cette dernière dans la table Commandes en la rattachant au numéro du client issu de la table Clients. Ce même code VBA inscrit tous les articles achetés dans la table Detail_commandes en rattachant ces derniers au numéro de la commande ainsi créée. Bref, nous exploitons la puissance d'un
système de gestion de base de données relationnelle . Et c'est ce principe fondamental qui va aujourd'hui nous permettre de produire la
facture prête à éditer , en regroupant toutes les données selon leurs dépendances, soit pour un client le montant total de sa commande avec le détail de tous ses achats.
La facturation Client
Les objectifs principaux sont donc d'éditer la facture suite à la validation du caissier et de l'envoyer par mail à l'adresse du destinataire. Nous allons devoir construire un
état capable de réunir toutes ces informations en isolant le client et sa commande du reste des informations contenues dans la
base de données . Comme la tâche est relativement conséquente, nous partons de la base de données précédente pour laquelle l'
interface de facturation est fonctionnelle.
Nous retrouvons l'interface présentée par la capture ci-dessus. Pour rappel, la première liste déroulante permet de choisir un client à facturer et recensé en base de données. S'il n'est pas encore connu, il peut être créé à la volée grâce au
bouton Créer le client . Ensuite, la seconde liste déroulante permet de sélectionner les références des articles pour ce client, en les ajoutant tour à tour à la facture grâce au bouton dédié. Une fois la commande complétée, le dernier bouton permet de valider cette dernière en l'archivant dans la base de données.
C'est précisément sur ce bouton que nous devons intervenir. En même temps que nous validons la
facture , nous devons désormais en produire une
édition . Nous notons à ce titre la présence de deux contrôles essentiels en haut à droite du formulaire. Ils mémorisent respectivement le
numéro du client et le
numéro de la commande . Ils détiennent les informations capitales qui permettront de faire le lien avec l'
état Access afin de définir les données devant être éditées.
Ces contrôles sont des zones de texte et se nomment respectivement n_client et n_commande.
Regrouper les informations par requêtes
Les données à éditer sont nombreuses. Elles sont issues de quatre tables reliées entre elles. Si nous cliquons sur le
bouton Relations du ruban
Outils de base de données , nous obtenons la vue schématisée des relations, présentée par la capture ci-dessous.
Un client qui passe une commande est inscrit dans la
table Clients . Les commandes qu'il passe sont archivées dans la
table Commandes qui lui est liée. Le détail de chacune de ces commandes est listé dans la
table Detail_commandes . Et chacun de ces détails fait référence à des articles qui sont recensés dans la
table Catalogue .
Nous devons créer deux
requêtes . La première doit regrouper les tables Clients et Commandes. La seconde doit regrouper les tables Detail_commandes et Catalogue. Ainsi en bâtissant un état sur ces deux
requêtes , nous serons en mesure de proposer le détail complet d'une facture dont les articles sont issus du catalogue pour une commande précise passée par le client.
Activer le ruban Créer en cliquant sur son onglet en haut de la fenêtre Access,
Dans la section Requêtes, cliquersur le bouton Création de requête ,
Dans la boîte de dialogue qui suit, sélectionner les tables Clients et Commandes à l'aide de la touche CTRL par exemple,
Puis cliquer sur le bouton Ajouter et sur le bouton Fermer ,
Ajouter tous les champs de la table Clients sur la grille de requête, sauf le champ mail_client,
Ajouter de même tous les champs de la table Commandes sauf le champ cli_com,
Cette requête permet de regrouper sur une même vue l'information des clients et de leurs commandes associées, reliées par la
clé primaire . Le détail de ces commandes sera fourni par l'autre requête reliant les
tables Detail_commandes et Catalogues . C'est encore une fois le jeu des
relations qui permettra d'assurer ces dépendances. Toutes deux vont permettre de construire le rapport final destiné à proposer l'édition de la facture du client. Et justement, nous devons restreindre leurs sélections dynamiquement. Elles doivent en effet n'afficher que les informations de la commande demandée pour le client sélectionné à l'instant, depuis le formulaire de facturation.
Nous avions appris à faire cette
relation entre une requête et les zones de texte d'un formulaire , de manière à construire un
critère dynamique . Concrètement ici, la requête ne doit afficher que les informations pour lesquelles le numéro de client est égal à la valeur du
contrôle n_client sur le formulaire, et plus précisément pour la commande dont le numéro est égal à la valeur de la
zone de texte n_commande . Cette correspondance doit se faire sur les
champs num_client et num_com de la requête.
Cliquer avec le bouton droit de la souris dans la zone Critères du champ num_client ,
Dans la liste, choisir Créer ,
Nous affichons ainsi le
générateur d'expression d'Access . Il va nous aider à établir la relation de correspondance entre le champ de requête et le contrôle de formulaire.
Dans les éléments d'expression, dérouler la liste jusqu'à afficher Tous les formulaires ,
Puis, sélectionner le formulaire Validation_commande ,
Double cliquer alors sur le champ n_client dans les catégories d'expression,
L'expression résultante s'affiche alors dans la partie supérieure du générateur de requête comme l'illustre la capture ci-dessous.
Cliquer sur Ok pour valider l'expression de correspondance,
L'expression apparaît désormais dans la zone de critères pour le
champ num_client . Elle indique ([Formulaires]![Validation_commande]![n_client]) qu'il doit être égal à la valeur du
champ n_client du
formulaire Vaidation_commande .
Nous devons faire de même pour le
champ num_com afin de filtrer la sélection sur le numéro de commande désigné par le formulaire de facturation.
Cliquer avec le bouton droit de la souris dans la zone Critères du champ num_com ,
Dans la liste, choisir Créer ,
Dans les éléments d'expression, dérouler la liste jusqu'à afficher Tous les formulaires ,
Puis, sélectionner le formulaire Validation_commande ,
Double cliquer alors sur le champ n_commande dans les catégories d'expression,
Cliquer sur le bouton Ok pour valider cette deuxième expression de correspondance,
Enregistrer cette requête (CTRL + S) sous le nom Clients-Commandes ,
Si nous exécutons la requête en l'état, la sélection retournée est bien sûr vide puisqu'aucune valeur n'a été définie, ni pour le client, ni pour la commande. En revanche, si nous créons une nouvelle commande attachée à un client depuis le formulaire Validation_commande et que nous validons la facture, la requête isole le client et la commande en cours.
Fermer la requête Clients-Commandes en cliquant sur la croix de son onglet,
Dans le ruban Créer, cliquer de nouveau sur le bouton Création de requête ,
Avec la boîte de dialogue qui suit, ajouter les tables Detail_commandes et Catalogue ,
Ajouter tous les champs de la table Detail_commandes sauf les champs com_det et ref_det,
com_det est en effet la
clé externe permettant d'établir le lien avec la
clé primaire de la table Commandes. Or la clé
primaire num_com a déjà été ajoutée dans l'autre requête. ref_det est quant à elle la clé externe de la clé primaire Code_article de la table Catalogue que nous allons ajouter.
Ajouter ensuite tous les champs de la table Catalogue sauf le champ Quantite,
En effet, la quantité définie dans la table Catalogue est celle du stock. Pour la commande du client, celle qui nous intéresse est la quantité achetée (qute_det). Nous pourrions ajouter un champ calculé qui se chargerait de calculer le montant total par article en fonction du prix unitaire et de la quantité achetée. Mais cette opération peut être réalisée directement depuis l'état.
Enregistrer la requête (CTRL + S) sous le nom Detail-Catalogue ,
Puis fermer la requête en cliquant sur la croix de son onglet,
Si nous exécutons la requête en l'état, elle offre une vue des détails de toutes les commandes.
Mais lorsque nous l'utiliserons conjointement avec la
requête Clients-Commandes pour la construction de l'état, par le jeu des relations notamment sur la clé primaire num_com, elle n'affichera plus que le détail de la commande isolée.
Rapport dynamique - Etat Access de la facture
Au clic sur le
bouton Valider la facture , l'objectif désormais, en même temps que la nouvelle commande est archivée, est de
présenter une vue organisée et ordonnée de la facture . L'objet Access permettant ce rendu est l'état. Il s'agit d'un rapport pour lequel l'emplacement des éléments a judicieusement été pensé afin de proposer une édition conforme aux attentes. Un état conçu sur les requêtes que nous venons de créer sera capable de réceptionner en temps réel les paramètres transmis par le formulaire afin de ne proposer que l'édition de la commande définie pour le client sélectionné.
Cliquer sur l'onglet Créer en haut de la fenêtre Access pour activer son ruban,
Dans la section Etats, cliquer sur le bouton Assistant état ,
Dans la boîte de dialogue qui suit, choisir la requête Clients-Commandes à l'aide de la liste déroulante, comme première source de données,
Cliquer sur le bouton à deux flèches (>>) pour ajouter tous les champs de la requête dans la construction de la vue du rapport,
Avec la même liste déroulante, choisir désormais la requête Detail-Catalogue ,
Cliquer une fois encore sur le bouton à deux flèches (>>) pour ajouter tous les champs,
Cliquer sur le bouton Suivant de l'assistant pour passer à la prochaine étape,
Dans la liste des champs, sélectionner num_com et cliquer sur le bouton à une flèche (>),
Nous créons ainsi un
niveau de regroupement sur le
champ num_com pour toutes les données issues des requêtes Clients-Commandes et Catalogue-Detail. En d'autres termes, nous affichons ensemble toutes les informations appartenant à la même commande, repérée par son numéro de commande (num_com). Généralement ces niveaux de regroupement sont importants dans la conception d'état comme nous l'avions vu dans le
cas pratique Access pour bâtir une facturation . Ils permettent d'organiser les données et de les éditer sur des pages explicitement séparées. Ici, le tri sera réalisé en amont par les informations du numéro de client et du numéro de commande transmis dynamiquement par le formulaire. Néanmoins, pour respecter la philosophie du
gestionnaire de base de données qu'est Access , nous jugeons essentiel de reproduire ce recoupement sur la donnée qui permet de séparer les informations.
Cliquer de nouveau sur le bouton Suivant pour progresser dans les étapes de l'assistant,
Il s'agit de l'étape permettant d'organiser les données en définissant un ordre de tri.
A l'aide de la première liste déroulante, choisir le champ Code_article ,
Puis cliquer sur le bouton Suivant ,
Dans cette nouvelle étape, conserver les propositions de présentation par défaut, soit Echelonné et portrait, puis cliquer sur Suivant ;
Enregistrer l'état sous le nom ClientsCommandes et cliquer sur le bouton Terminer ,
Access n'est pas encore en mesure de produire la vue demandée, issue des deux requêtes. Il ne connaît ni le numéro du client ni le numéro de la commande pour ce client. Ces deux informations seront fournies par le formulaire au moment de la validation et récupérées par la requête permettant de construire ce rapport. C'est la raison pour laquelle, comme l'illustre la capture ci-dessous, une invite demande de confirmer ce numéro de commande, pour l'instant inconnu.
Cliquer sur le bouton Annuler,
L'état apparaît désormais en mode création. Un travail fastidieux demeure afin de produire une facture présentable. Il s'agit d'organiser la disposition des contrôles.
Comme nous l'avions appris dans la formation Access sur les états, il s'agit ici d'appliquer des techniques de mise en page afin de formater les contrôles, de les disposer entre eux, notamment à l'aide des
rubans Organiser et Format . Comme l'objectif de cette application est surtout de produire le lien entre le formulaire et le rapport, nous allons passer ces notions rapidement. Libre à chacun de concevoir la présentation qui lui convient.
Dans l'étiquette de l'entête d'état , saisir un nom de société comme Société BuroNet +,
Dans l'entête de page , réaliser une présentation comme le propose la capture ci-dessous :
Une première étiquette doit afficher le texte
Facture N° . Le
champ num_com doit être déplacé et positionné juste à côté. Le
bouton Aligner du ruban Organiser s'avère précieux pour des ajustements précis des contrôles les uns par rapport aux autres. Une seconde étiquette doit afficher le texte
Paris le : . Une zone de texte doit être placée et alignée juste à sa droite. A l'aide de la propriété
Source contrôle de l'
onglet Données de sa feuille de propriétés, la formule
=Date() permet d'afficher la date du jour pour la facturation. Le
ruban Format permet non seulement de modifier l'apparence des contrôles (Police, taille, couleur) mais aussi de modifier la couleur de fond de chacune des sections pour préférer un
remplissage plus sombre.
Dans la section En-tête de groupe num_com, ne conserver que deux étiquettes formatées pour afficher les informations Facturer à : et Montant de la facture : ,
Elles serviront ainsi de titre à l'ensemble des informations détaillées qui seront listées en-dessous, soit le détail de la commande. Là encore le ruban Format est utile pour influer sur les tailles et couleurs de police. De même, la première étiquette doit posséder un alignement à gauche tandis que la seconde doit posséder un alignement à droite.
Toutes les informations uniques, comme les coordonnées du client, doivent être disposées dans la section de regroupement (num_com),
Comme le propose la capture ci-dessous, placer les champs civilite_client, nom_client et prenom_client les uns sous les autres et alignés à gauche avec l'étiquette Facturer à ,
Placer le champ montant_com sous l'étiquette Montant de la facture et aligné à droite avec cette dernière,
Placer le champ num_client arbitrairement au milieu de la zone et régler sa propriété Visible sur Non ,
En effet, bien que le numéro de client soit essentiel pour construire la facture dans la liaison des éléments notamment, il s'agit d'un indice futile pour le destinataire. Enfin, il faut encore une fois ne pas hésiter à exploiter les boutons du ruban Format pour faire ressortir les informations en couleur, en gras et avec des tailles différentes.
Toujours dans la section de l'en-tête de groupe, en dessous des précédents contrôles, ajouter une étiquette Votre commande : sur la largeur de la page,
En dessous de ce titre, disposer les étiquettes des contrôles Code_article , Designation , Qute_det et Prix_unitaire_HT sur la même ligne,
Il s'agit des titres uniques pour chaque colonne définissant le détail de la commande que nous allons précisément définir dans la section Détail. C'est elle qui va permettre de lister les achats.
Dans la section Détail , disposer les contrôles correspondant aux étiquettes sous chacune d'elles respectivement,
Il est utile de réduire la largeur de certains champs comme
Code_article et
Qute_det en raison de leur contenu. Pour les raisons inverses, il est utile d'augmenter la largeur du
champ Designation . Comme toujours le bouton Aligner du ruban Organiser est précieux pour disposer les contrôles sur la même horizontale. Il s'agit d'ailleurs de fonctionnalités empruntées Ã
PowerPoint que nous avions démontrées dans la formation pour apprendre à maîtriser les outils de dessin .
A droite du champ Prix_unitaire_HT, ajouter une zone de texte avec son étiquette au-dessus, remplie du texte Total,
Sélectionner la zone de texte seule et activer l'onglet Données de sa feuille de propriétés,
Dans sa propriété Source contrôle, saisir l'expression =[qute_det]*[Prix_unitaire_HT] ,
Nous créons ainsi un
champ calculé qui livrera dynamiquement les résultats des achats par article selon le prix unitaire et la quantité achetée par le client.
Toujours à l'aide de la feuille de propriétés onglet Format, attribuer un format monétaire à deux décimales à ce champ calculé ainsi qu'au contrôle Prix_unitaire_HT,
Enregistrer les modifications et fermer l'état en cliquant sur la croix de son onglet,
Des ajustements et améliorations seront certainement à prévoir pour parfaire la présentation notamment par rapport à la hauteur des sections.
Lier un état au formulaire - Produire la facture dynamiquement
Nous avions appris dans d'autres formations, par le biais de
clauses WHERE créées par les
macros ou le
code VBA Access , à définir dynamiquement la source de données d'un état afin de relier l'affichage en cohérence avec les données manipulées depuis le formulaire. Mais ici, le plus dur est déjà construit dans la mesure où l'état est conçu sur des requêtes qui attendent les informations du formulaire. Nous n'avons donc plus qu'à ajouter le
code VBA qui commande l'ouverture de l'état au clic sur le
bouton Valider la facture . Les requêtes récupèreront dynamiquement les valeurs inscrites sur le formulaire au moment de l'appel par le code.
Ouvrir le formulaire Validation_commande en mode création,
Sélectionner le bouton Valider la facture ,
Activer l'onglet Evénement de sa feuille de propriétés,
Cliquer sur le petit bouton à l'extrémité de son événement Au Clic ,
Comme un code est déjà associé au bouton, aucune boîte de dialogue ne se déclenche pour définir l'association. Nous basculons directement dans l'éditeur de code entre les bornes de la
procédure valider_facture_Click . Il s'agit du
code VBA Access que nous avions écrit dans la formation précédente pour archiver en base de données, la commande avec son détail rattachée au client. Nous souhaitons ajouter la ligne donnant l'ordre d'afficher la facture prête à éditer. Il suffit donc de commander l'affichage de l'
état ClientsCommandes pour lequel tous les paramétrages ont été prédéfinis.
Dans l'instruction conditionnelle If, juste après l'appel de la procédure purger_table et donc juste avant le End If, ajouter l'instruction permettant de commander l'affichage de l'état en mode Aperçu avant impression :
DoCmd.OpenReport "ClientsCommandes", acViewPreview
Comme nous l'avions appris dans la
formation sur l'interaction des objets Access , la
méthode OpenReport de l'
objet VBA Access DoCmd permet d'ouvrir l'état dont le nom lui est passé en premier paramètre. En deuxième paramètre nous définissons le mode d'affichage (acViewPreview). Selon les indications de l'aide en ligne, nous proposons ici un aperçu avant impression, soit normalement, la facturation du client prête à éditer.
Enregistrer les modifications et basculer sur le formulaire,
Enfoncer la touche F5 du clavier pour l'exécuter,
Dans la première liste déroulante, choisir par exemple le client numéro 7,
A l'aide de la seconde liste déroulante, ajouter tour à tour les références b002, b004, b006 et b008 avec les quantités respectives 1, 1, 2 et 5,
Puis, cliquer sur le bouton Valider la facture ,
Comme nous le constatons, grâce à la
méthode OpenReport de l'
objet DoCmd , l'état s'affiche en mode Aperçu avant impression. Il propose une vue de la commande qui vient d'être validée depuis le formulaire, pour le client sélectionné, grâce aux critères dynamiques récupérés par les requêtes qui servent de construction pour cet état. Pour rappel, grâce au code conçu lors de la formation précédente, cette commande est archivée dans la base de données.
Fermer l'état ainsi que le formulaire.
Editer la facture au format PDF
L'
objet DoCmd propose de nombreuses méthodes. L'une d'entre elles permet notamment d'exporter un rapport au
format PDF . Nous proposons d'archiver cette édition dans un sous dossier de l'application et de l'inscrire dans la base de données, reliée à la commande. Ainsi l'administrateur en cas de besoin n'aura qu'à afficher le client depuis un formulaire conçu à cet effet, pour retrouver une facture et l'afficher par simple clic.
Dans le dossier de l'application Access, créer un sous dossier archives_factures ,
Dans le volet des objets Access, cliquer avec le bouton droit sur la table Commandes ,
Dans la liste, choisir Mode création ,
Créer le champ facture_com en texte court à la suite des autres champs,
Enregistrer les modifications et fermer la table en cliquant sur la croix de son onglet,
Partant du principe que nous connaissons le dossier d'archivage des factures, nous n'avons plus qu'à enregistrer le nom du fichier dans le champ que nous venons de créer. Un code VBA pourra se charger de reconstruire le chemin pour que l'utilisateur puisse afficher la facture sur demande.
Afficher l'état ClientsCommandes en mode création,
Activer l'onglet Evénement de sa feuille de propriétés,
Cliquer sur le petit bouton de son événement Sur activé ,
Dans la boîte de dialogue, choisir Générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur de code Visual Basic Access , entre les bornes de la
procédure événementielle Report_Activate . Cet événement déclenche un code une fois que l'état est complètement chargé. Il est important de positionner les lignes d'instruction dans cette procédure sous peine de ne pas atteindre les données qui ne sont pas encore disponibles. Nous avons besoin d'une variable de type string pour mémoriser le chemin complet afin d'enregistrer l'archive de la facturation.
Dans les bornes de la procédure, ajouter la déclaration suivante :
Dim fichier As String
Nous devons attribuer un nom de fichier unique pour ne pas risquer d'écraser les archives. Les numéros de commandes sont uniques, tels que définis dans la base de données. Ainsi, nous proposons d'enregistrer le
fichier PDF dans le sous dossier archives_factures sous le nom :facture_numeroCommande.pdf. Et c'est le champ num_com de l'état qui contient cette information.
A la suite du code, ajouter l'instruction suivante :
fichier = Application.CurrentProject.Path & "\archives_factures\facture_" & num_com.Value & ".pdf"
La
propriété dérivée Path de la
propriété CurrentProject de l'
objet VBA Access Application renvoie le chemin d'accès au dossier de la base de données. Nous le concaténons (&) avec le nom du sous dossier (\archives_factures\), suivi du nom de la facture, lui-même constitué d'une partie fixe (facture_) concaténée (&) à la variable du numéro de commande.
A la suite du code, ajouter l'instruction suivante :
DoCmd.OutputTo acOutputReport, "", acFormatPDF, fichier, False
La méthode OutputTo de l'objet DoCmd permet de créer une exportation de la vue passée en paramètre (acOutputReport). Le troisième argument permet de spécifier une conversion de sortie au format PDF (acFormatPDF).
Enregistrer les modifications et basculer sur l'application Access,
Double cliquer sur le formulaire Validation_commande pour l'exécuter,
Choisir le client numéro 5 par exemple à l'aide de la première liste déroulante,
A l'aide de la seconde liste déroulante, ajouter tour à tour les références b003, b004, b005, b006, b007 et b008 avec respectivement les quantités 1, 1, 1, 2, 3 et 5,
Puis, cliquer sur le bouton Valider la facture ,
L'état de la facturation client s'affiche instantanément résumant parfaitement le détail de la commande ainsi que le montant global.
Si vous ouvrez le sous dossier archives_factures du répertoire de la base de données Access, vous constatez la présence du fichier pdf nommé sur le numéro de la commande. Si vous ouvrez ce fichier, vous obtenez une vue identique à celle de l'état, mais archivée.
Le
fichier PDF est archivé mais le lien en base de données n'est pas créé. En même temps que l'exportation, nous devons accéder à la table Commandes (Requête Update) en modification pour ajouter le nom du fichier pdf de la facture, dans le
champ facture_com , pour l'enregistrement de la commande correspondante.
Fermer l'état et le formulaire,
Revenir dans l'éditeur de code entre les bornes de la procédure Report_Activate ,
Sous la déclaration de la variable fichier, ajouter les deux déclarations suivantes :
Dim base As Database: Dim requete As String
A chaque fois que nous avons besoin d'accéder aux données de tables pour les modifier, nous déclarons comme toujours une
variable de type Database pour manipuler la base de données en cours ainsi qu'une
variable de type String pour mémoriser la
syntaxe SQL de la requête Action . Il ne faut pas oublier que la référence à un objet Database est rendu possible par l'ajout de la
référence Microsoft ActiveX Data Objects . Comme nous avons récupéré la base de données du cas précédent qui accède régulièrement aux données, nous conservons le lien à la référence ADO.
Après la ligne de code de l'objet DoCmd, ajouter les instructions suivantes :
Set base = Application.CurrentDb
requete = "UPDATE Commandes SET facture_com = 'facture_" & num_com.Value & ".pdf' WHERE num_com=" & num_com.Value
base.Execute requete
base.Close
Set base = Nothing
Nous initialisons (Set) notre objet de base de données, grâce à la
méthode CurrentDb de l'
objet Application . Nous mémorisons la syntaxe SQL de la requête de mise à jour (UPDATE) dans la variable requete. Le mot clé SET permet de lister les champs concernés par la modification. Ici, nous inscrivons le nom de la facture pdf dans le
champ facture_com . Notez la présence des simples côtes à côté des doubles côtes car l'égalité est réalisée sur un champ textuel. La
clause WHERE bien sûr permet de restreindre cette modification pour les enregistrements correspondant au critère, en l'occurrence ici, seulement pour celui de la commande en cours fort logiquement. Comme toujours la
méthode héritée Execute de l'
objet Database lance l'exécution de la requête Action, puis nous fermons les
connexions à la base .
Enregistrer les modifications et exécuter le formulaire Validation_commande ,
Choisir un client à l'aide de la première liste déroulante,
Ajouter tour à tour des articles avec des quantités différentes,
Enfin, cliquer sur le bouton Valider la facture ,
Nous constatons premièrement l'affichage du rapport de facture instantanément. Nous remarquons que le
fichier pdf a correctement été archivé dans le sous dossier de l'application. Enfin, si nous ouvrons la
table Commandes , nous notons l'inscription de la facture convertie en PDF dans le champ de l'enregistrement concerné.
Cette indication permettra de savoir, sur l'ensemble des commandes inscrites, celles qui ont effectivement été validées. A terme, avec un formulaire adapté, l'administrateur pourra avoir accès à l'ensemble des factures d'un client.
Joindre un fichier par Mail en VBA
Pour finaliser l'application, l'objectif est d'envoyer au client par courrier électronique, une copie de la facture au format PDF. Pour réaliser une telle opération par le code, un
client de messagerie tel que
Outlook doit être installé sur votre ordinateur. C'est lui en effet qui se charge de communiquer avec les serveurs permettant les transferts et la gestion des messages. Si le client de messagerie est installé, alors nous pouvons ajouter la référence nécessaire à la classe permettant de piloter ces objets.
Fermer le formulaire et la table Commandes,
Revenir dans l'éditeur de code, entre les bornes de la procédure de l'état,
En haut de la fenêtre de l'éditeur, dérouler le menu Outils et choisir Références dans la liste,
Dans la boîte de dialogue qui suit, cocher la case Microsoft Outlook 16.0 Object Library ,
Désormais nous pouvons déclarer les objets de programmation capables d'instancier cette classe.
Dans la partie déclarative de la procédure, ajouter les déclarations suivantes :
Dim client_msg As New Outlook.Application
Dim message As Outlook.MailItem
Dim adresse As String :Dim ligne as Recordset
Nous déclarons la
variable client_msg en instanciant la classe du client de messagerie. Elle hérite ainsi des propriétés et méthodes qui permettront notamment de configurer le message et de l'envoyer. C'est la raison pour laquelle nous déclarons dans la foulée la
variable message comme un
Outlook.MailItem . Pour envoyer ce message, nous aurons besoin de récupérer le mail du client (variable adresse) grâce à une requête sélection (Variable ligne de type Recordset) sur la table Clients.
Juste après l'exécution de la requête Update et juste avant l'instruction base.Close, ajouter les lignes de code suivantes :
Set ligne = base.OpenRecordset("SELECT mail_client FROM Clients WHERE num_client=" & num_client.Value, dbOpenDynaset)
ligne.MoveFirst
adresse = ligne.Fields("mail_client").Value
ligne.Close
La
méthode héritée OpenRecordset de l'
objet Database permet d'initialiser notre
objet ligne pour qu'il accède aux enregistrements, selon la syntaxe de la
requête SQL passée en paramètre de la méthode. Nous récupérons l'information du champ mail_client dans la table Clients (SELECT mail_client FROM Clients) mais seulement pour le client en cours (WHERE num_client=" & num_client.Value). Nous plaçons le pointeur de lecture sur l'enregistrement résultant (ligne.MoveFirst). Puis, la propriété Fields de l'objet Recordset permet de récupérer le contenu du champ passé en paramètre (ligne.Fields("mail_client").Value). Désormais, la variable adresse est censée contenir l'adresse mail du client.
La facture ne peut lui être envoyée que si l'adresse mail a bien été renseignée.
En conséquence, après l'instruction Set base = Nothing , ajouter le test suivant :
If (adresse <> "") Then
End If
De même, nus souhaitons demander confirmation à l'utilisateur avant l'envoi.
Dans les bornes du If, ajouter le second test suivant :
If (MsgBox("Joindre la facture par courrier électronique", vbYesNo) = 6) Then
End If
La boîte de dialogue MsgBox, si elle est accompagnée de boutons définis en paramètre (vbYesNo) renvoie une valeur numérique correspondant au clic de l'utilisateur sur l'un des boutons. C'est entre autres ce que nous avait appris la
formation VBA Excel pour gérer des critères . Si cette valeur vaut 6, nous savons que l'utilisateur a cliqué sur Oui et confirme l'envoi du courrier électronique. Dans ce cas nous devons exploiter la classe permettant de piloter le client de messagerie.
Entre les bornes de cette seconde instruction conditionnelle, ajouter le code suivant :
Set message = client_msg.CreateItem(olMailItem)
With message
.Recipients.Add adresse
.Subject = "Votre facture"
.Body ="Cher client, veuillez trouver votre facture en pièce jointe"
.Attachments.Add fichier
.Send
End With
Nous initialisons la variable message grâce à la
méthode CreateItem de l'objet de messagerie précédemment instancié. Nous lui passons le paramètre explicite indiquant qu'il s'agit de configurer un message de courrier électronique (olMailItem). Puis, dans un
bloc With permettant de regrouper toutes les propriétés de l'objet , nous listons chacun des paramètres à configurer. La
méthode Add de la
propriété Recipients de l'
objet message permet de définir l'adresse du destinataire. Vient ensuite le sujet du message grâce à l'affectation de la
propriété Subject . Puis la
méthode Add de la
propriété Attachments permet de définir en paramètre le chemin du fichier à joindre au courrier. Enfin, la
méthode Send commande l'envoi du message pour passer la main au client de messagerie qui gère la suite de la transaction.
Enregistrer les modifications puis exécuter le formulaire Validation_commande,
Choisir un client avec la première liste déroulante,
Ajouter tour à tour des articles avec des quantités différentes,
Puis, cliquer sur le bouton Valider la facture ,
Au message de confirmation du MsgBox, cliquer sur Oui,
Comme précédemment l'état apparaît en premier. La facture est bien archivée dans le sous dossier et son nom est inscrit en base de données, rattachée au numéro de commande. Dans les sentinelles de la barre des tâches de Windows, vous avez du remarquer l'apparition de l'icône du client de messagerie en train d'envoyer le courrier.
Si nous ouvrons les éléments envoyés de notre client de messagerie, nous constatons la présence d'un message adressé au client choisi depuis l'interface de facturation Access. Nous notons de même la présence de la facture en pièce jointe, qui peut être consultée à tout moment. Notre application d'édition et d'archivage de facture Client fonctionne parfaitement. Le code complet de la
procédure VBA Access est le suivant :
Private Sub Report_Activate()
Dim fichier As String
Dim base As Database: Dim requete As String
Dim client_msg As New Outlook.Application
Dim message As Outlook.MailItem
Dim adresse As String: Dim ligne As Recordset
fichier = Application.CurrentProject.Path & "\archives_factures\facture_" & num_com.Value & ".pdf"
DoCmd.OutputTo acOutputReport, "", acFormatPDF, fichier, False
Set base = Application.CurrentDb
requete = "UPDATE Commandes SET facture_com = 'facture_" & num_com.Value & ".pdf' WHERE num_com=" & num_com.Value
base.Execute requete
Set ligne = base.OpenRecordset("SELECT mail_client FROM Clients WHERE num_client=" & num_client.Value, dbOpenDynaset)
ligne.MoveFirst
adresse = ligne.Fields("mail_client").Value
ligne.Close
base.Close
Set base = Nothing
If (adresse <> "") Then
If (MsgBox("Joindre la facture par courrier électronique", vbYesNo) =6) Then
Set message = client_msg.CreateItem(olMailItem)
With message
.Recipients.Add adresse
.Subject = "Votre facture"
.Body = "Cher client, veuillez trouver votre facture en pièce jointe"
.Attachments.Add fichier
.Send
End With
End If
End If
End Sub