Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Insertion d'une table à une autre
Dans cette
formation Access , nous apportons la solution pour valider la
facture d'un client , sans utiliser le
code VBA . L'astuce va consister à exécuter une
requête Action insérant tous les enregistrements d'une table temporaire dans la table archivant les commandes.
Dans la formation précédente, grâce à une
requête Ajout exécutée par une
action de macro , nous étions parvenus à construire la
commande du client sur le
formulaire .
Source et présentation de la problématique
Nous devons commencer par récupérer ces travaux.
Cette base de données est constituée d'un certain nombre d'objets comme l'indique le volet sur la gauche de l'écran. Dans la formation précédente, nous avons exploité les
tables Clients ,
Produits et
Com_Temp . Cette dernière reçoit tous les articles achetés par le client. Comme nous les disions, ces enregistrements sont ajoutés tour à tour, au clic sur un
bouton du formulaire , exécutant une
requête Ajout .
Désormais, pour valider la facture d'un client, nous allons devoir exploiter les
tables Commandes et
Detail_commandes . La première synthétise chaque commande avec sa date et son montant total. Bien sûr, elle rappelle le numéro du client pour établir la relation avec la
table Clients .
La seconde offre le détail de chacune de ces
commandes . La liaison est établie grâce au numéro de commande de la table précédente (com_det). Ainsi, pour un même numéro de commande, sont énumérées les références et quantités des produits achetés.
Pour
valider la facture , l'enjeu va donc consister à ajouter les éléments de synthèse dans la première table et le détail dans la seconde. L'une des problématiques consistera à récupérer le numéro de commande auto-incrémenté, pour établir la liaison entre les deux tables.
Le
formulaire est donc l'interface graphique à partir de laquelle nous devons gérer les
commandes des clients .
Dans le volet de gauche, double cliquer sur le formulaire Cli_Com pour l'exécuter,
Avec la première liste déroulante, choisir un numéro de client,
Comme vous le remarquez, les informations dépendantes sur le nom et le prénom sont instantanément extraites, dans les zones de saisie dédiées.
Avec la seconde liste déroulante, choisir une référence produit ,
Là aussi, les données dépendantes sur la désignation et le prix sont rapatriées dans les zones de texte situées sur la même ligne. Comme ces informations sont issues d'une autre table, la
table Produits , nous avions mis en avant une astuce tout à fait intéressante pour établir la relation. La solution avait consisté à exploiter la
fonction Access RechDom .
Saisir un nombre entier dans la zone Qté achetée et cliquer sur le bouton Ajouter ,
Comme vous le constatez, toutes les informations de l'article s'inscrivent dans le sous formulaire. C'est ainsi, au fur et à mesure des achats, que nous construisons la
commande du client .
Sélectionner une nouvelle référence,
Puis, taper une autre quantité et cliquer sur le bouton Ajouter ,
Le détail associé s'insère automatiquement dans la commande, en dessous du précédent. La requête exécutée, ajoute chaque enregistrement dans la
table Com_Temp . Et c'est un
champ calculé de la
requête Com_Req qui livre le total hors taxes par article. C'est donc elle qui est utilisée comme source du
sous formulaire .
Certes à ce stade, il n'existe pas de garde-fou pour vérifier que la quantité saisie est bien un nombre entier. De même, aucun
contrôle n'est réalisé par rapport aux stocks . Mais ce n'est pas la vocation de ces formations, d'autant que nous avions apporté ces solutions dans d'autres cas pratiques.
Créer la commande du client
Désormais, au clic sur le
bouton Valider , la
facture du client ainsi construite doit être archivée dans les
tables Commandes et
Detail_commandes . Nous proposons d'apporter les solutions par étapes en réalisant l'implémentation de la
table Commandes dans un premier temps. Les informations requises sont sommaires. Le numéro de commande (num_com) se crée automatiquement. Nous devons inscrire le numéro du client (cli_com), la date de facturation (date_com) et le montant de la commande (montant_com). Le champ de la date est paramétré pour inscrire la date du jour par défaut. Le numéro de client est rappelé par la première
liste déroulante du
formulaire . Seule l'indication sur le montant total de la commande est manquante. Elle consiste à sommer toutes les valeurs du
champ THT de la
requête Com_Req . Et comme cette information est utile, nous proposons de l'afficher sur le
formulaire .
Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans la liste, choisir Mode création ,
Nous basculons ainsi en conception du formulaire.
Déplacer les boutons Ajouter et Valider sur la droite du formulaire,
Sélectionner la zone de saisie de la quantité avec son étiquette,
Les copier (CTRL + C) puis les coller (CTRL + V),
Les positionner à droite sur la même horizontale,
Modifier le texte de l'étiquette dupliquée par : Montant total ,
Sélectionner la zone de saisie dupliquée,
Activer l'onglet Toutes de sa feuille de propriétés,
Dans la zone Nom, saisir : Tot_Com et valider par Entrée,
Un nom d'objet explicite est toujours important. C'est par ce nom que nous piloterons le contrôle lorsqu'il s'agira d'insérer les données dans la
table Commandes .
Activer l'onglet Données de sa feuille de propriétés,
Dans sa propriété Source contrôle , saisir l'expression suivante :
=RechDom('Sum(THT)';'Com_Req')
Il s'agit de la
fonction Access que nous avons présentée lors du premier de ces trois volets. Elle permet d'extraire une valeur de champ à passer en premier paramètre, issue d'un enregistrement de la table passée en second paramètre (Com_Req). Le troisième argument est facultatif. Il permet de poser le critère pour isoler l'enregistrement en question. Cette condition n'est pas nécessaire ici puisque nous réalisons une opération de synthèse sur le
champ THT , grâce à la
fonction Access Sum ou Somme en français. Il en résulte forcément un unique enregistrement.
Activer l'onglet Format de sa feuille de propriétés,
Régler sa propriété Format sur Monétaire et Décimales sur 2 ,
Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
Nous récupérons les traces de notre ancienne commande de test. Et instantanément, vous remarquez la présence du précieux résultat de synthèse sur le total de la commande en cours de construction. Si vous ajoutez un nouvel article, vous remarquez que son montant est comptabilisé puisque le
total de la commande s'actualise automatiquement.
Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans la liste, choisir Mode création ,
Avant de nous soucier de la
requête Ajout , sur notre lancée, nous allons créer un autre contrôle précieux. Chaque nouvelle commande est identifiée par un numéro de commande auto-incrémenté qu'il nous faut réceptionner. C'est lui que nous devrons inscrire dans la
table Detail_commandes pour établir le lien. L'astuce consiste à extraire le plus grand numéro sur ce champ. Et à l'instar de la
fonction RechDom ,
Access propose la
fonction MaxDom . Son utilisation est similaire. Elle requiert le nom du champ en premier paramètre, et le nom de la table en second.
Ajouter une zone de texte sur le formulaire, par exemple au-dessus des boutons,
Activer l'onglet Toutes de sa feuille de propriétés,
Dans la zone Nom, saisir : Num_Com et valider par Entrée,
Activer l'onglet Données de sa feuille de propriétés,
Dans sa propriété Source contrôle , saisir l'expression suivante :
=MaxDom('num_com';'Commandes')
Enregistrer les modifications et exécuter le formulaire,
L'identifiant de la dernière commande archivée est parfaitement restitué. Vous pouvez constater sa cohérence en consultant la
table Commandes en mode feuille de données. Nous devrons nous assurer qu'il s'actualise à chaque création de nouvelle commande.
Il est temps de construire la
requête permettant d'ajouter les informations de synthèse dans la
table Commandes . Comme nous le disions, il s'agit du
numéro de client choisi dans la première liste déroulante et du
montant total calculé par la
fonction RechDom , dans le
contrôle Tot_Com .
En haut de la fenêtre Access, cliquer sur l'onglet Créer pour activer son ruban,
Dans la section Requêtes du ruban, cliquer sur le bouton Création de requête ,
Dans la boîte de dialogue qui suit, cliquer sur le bouton Fermer pour n'ajouter aucune table,
Dans le ruban Créer, cliquer sur le bouton Ajout ,
Dans la zone Ajouter à de la boîte de dialogue qui suit, choisir la table Commandes ,
Puis, cliquer sur le bouton Ok pour valider,
Nous venons de transformer la requête sélection en requête action. Et à ce titre, dans la grille de requête, vous notez l'apparition d'une zone nommée
Ajouter à .
Dans la première colonne, choisir le champ cli_com ,
Dans la seconde, choisir le champ montant_com ,
Pour réaliser l'insertion dynamique, nous devons bâtir les expressions de correspondances dans les zones Champ respectives.
Cliquer droit dans la zone Champ de la première colonne,
Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression ,
Dans la liste de gauche, déployer l'arborescence des formulaires jusqu'à sélectionner le formulaire Cli_Com ,
Dans la liste centrale, double cliquer sur le contrôle ref_cli pour établir la correspondance,
Puis, valider par Ok,
L'expression apparaît désormais dans la zone Champ pour le
champ cli_com de réception :
Formulaires![Cli_Com]![ref_cli]
Elle indique explicitement que la valeur choisie dans la liste déroulante du formulaire doit être insérée dans le
champ cli_com de la
table Commandes .
Cliquer droit dans la zone Champ de la deuxième colonne,
Dans le menu contextuel, choisir Créer ,
Dans la liste de gauche, déployer l'arborescence des formulaires jusqu'à sélectionner le formulaire Cli_Com ,
Dans la liste centrale, double cliquer sur le contrôle Tot_Com pour établir la relation,
L'expression ainsi construite indique que la valeur calculée dans le champ Tot_Com sera ajoutée dans le
champ montant_com de la
table Commandes .
Valider cette expression en cliquant sur le bouton Ok,
De retour sur l'éditeur de requête, réaliser le raccourci CTRL + S pour l'enregistrer,
La nommer Com_valide et cliquer sur Ok,
Puis, cliquer sur la croix de son onglet pour la fermer,
Revenir sur le formulaire en mode conception,
Nous devons désormais exécuter cette
requête . Nous devons donc déclencher l'
exécution d'une macro au clic sur le
bouton Valider . Cette macro doit appeler la
requête Com_Valide . Mais comme il s'agit d'une
requête Ajout , des alertes système se déclenchent automatiquement. Pour les neutraliser, nous devons programmer une action spécifique en amont.
Cliquer sur le bouton Valider pour le sélectionner,
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 ,
Dans la boîte de dialogue qui suit, choisir générateur de macro et valider par Ok,
Nous basculons ainsi dans l'
éditeur de macro Access . Il permet d'empiler les actions les unes en-dessous des autres grâce à la liste déroulante de choix.
Dans le ruban Création, cliquer sur le bouton Afficher toutes les actions ,
Dès lors, nous avons accès aux commandes spécifiques dont celle permettant de neutraliser les alertes.
Dans la liste déroulante au centre de l'écran choisir l'action Avertissements ,
Conserver son attribut Avertissements actifs sur non,
Dans la liste déroulante du dessous, choisir l'action OuvrirRequête ,
Dans la zone Nom de la requête, choisir la requête Ajout Com_Valide ,
Puis, régler le mode de données sur Lecture seule ,
Cette
macro Access devra être complétée. Souvenez-vous, il s'agira d'implémenter la
table Detail_commandes sur le numéro de la commande créé par la
requête Ajout . Il est temps de réaliser un premier test.
Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, réaliser le raccourci CTRL + S pour l'enregistrer à son tour,
Si la
table Commandes est ouverte, vous devez la fermer. La requête doit en effet y accéder en mode exclusif.
Enfoncer la touche F5 du clavier pour exécuter le formulaire,
Cliquer sur le bouton Valider pour ajouter la précédente commande,
A priori, rien ne se produit. En effet, nous avons coupé les messages d'alerte. Mais l'insertion a bien eu lieu.
Ouvrir la table Commandes en mode feuille de données,
La nouvelle commande a bien été créée. Nous y retrouvons le numéro du client choisi ainsi que le total calculé. Le numéro attribué a été incrémenté. Mais il n'a pas été réceptionné sur le
formulaire . Nous devons ajouter une action permettant d'actualiser les données.
Ajouter tous les enregistrements d'une table
Nous devons désormais ajouter toutes les références achetées avec leur quantité dans la
table Detail_commandes . A l'instar d'une
boucle VBA , nous allons exploiter une technique de
syntaxe Sql pour parcourir tous les enregistrements à insérer. Il s'agit d'imbriquer une
requête SQL SELECT dans une
requête Ajout INSERT INTO . Nous pourrions même en imbriquer une seconde afin de réceptionner en même temps le numéro de commande créé. Mais la
CLAUSE UNION fonctionne mal avec
Access . C'est la raison pour laquelle nous avons pris soin de créer le
contrôle Num_Com sur le formulaire, afin de récupérer cette valeur. Nous allons donc procéder en deux temps.
En haut de la fenêtre Access, cliquer sur l'onglet Créer pour activer son ruban,
Dans la section Requêtes du ruban, cliquer sur le bouton Création de requête ,
Dans la boîte de dialogue qui suit, cliquer sur Fermer pour ne sélectionner aucune table,
Dans la section Résultats du ruban Créer, cliquer sur la flèche du bouton Affichage ,
Dans la liste, choisir Mode SQL ,
Nous basculons ainsi dans l'
éditeur SQL pour construire la syntaxe de la
requête Ajout multi-enregistrements.
Saisir la syntaxe SQL suivante :
INSERT INTO Detail_commandes (ref_det,qute_det) SELECT produit_ref,qte_achat FROM Com_Temp;
Nous insérons (INSERT INTO) dans les champs ref_det et qute_det de la
table Detail_commandes , tous les enregistrements (SELECT produit_ref,qte_achat) de la
table Com_Temp (FROM Com_Temp).
Enregistrer cette requête (CTRL + S) sous le nom Det_Valide ,
Puis, cliquer sur la croix de son onglet pour fermer l'éditeur SQL,
Revenir sur le formulaire en mode conception,
Sélectionner le bouton Valider ,
Puis, cliquer sur le bouton de son évènement Au clic dans sa feuille de propriétés,
Nous revenons ainsi dans l'
éditeur de macro pour ajouter de nouvelles actions à la suite. Comme nous le disions précédemment, nous devons commencer par
actualiser les données après l'exécution de la première
requête Ajout . L'objectif est de réceptionner le nouveau numéro de commande dans le contrôle prévu à cet effet. Ensuite, nous devons exécuter la seconde
requête Ajout , celle dont nous avons bâti la syntaxe SQL.
Avec la liste déroulante, ajouter l'action AfficherTousEnreg ,
Puis, ajouter l'action OuvrirRequête ,
Dans la zone Nom de la requête, choisir la requête Ajout Det_Valide ,
Régler le mode de données sur Lecture seule ,
Des actions sont encore à prévoir. Mais il est temps de tester le fonctionnement à ce stade.
Dans le ruban Création, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, l'enregistrer à son tour,
Puis, l'exécuter à l'aide de la touche F5 du clavier,
Ajouter un nouvel article à la commande en cours afin de faire varier son total,
Puis, cliquer sur le bouton Valider ,
En ouvrant la
table Commandes , vous constatez comme précédemment que l'insertion s'est parfaitement déroulée.
Si vous ouvrez la
table Detail_commandes , vous notez la présence de tous les articles avec leur quantité. En revanche et comme nous le disions, une information fondamentale est manquante. Il s'agit du numéro de commande de la
table parent Commandes . C'est lui qui permet d'établir le lien pour restituer toutes les informations d'une commande passée par un client.
Sélectionner ces enregistrements par les étiquettes de ligne,
Puis, enfoncer la touche Suppr du clavier pour les éliminer,
Valider le message de confirmation et fermer la table,
La requête que nous devons désormais exécuter est une
requête de mise à jour (UPDATE). Dans l'enchaînement de la
requête Ajout , elle doit remplacer tous les zéros du
champ Com_det , par la valeur mémorisée dans le
contrôle Num_Com du formulaire. A ce titre, grâce à l'
action AfficherTousEnreg , vous constatez qu'il s'est parfaitement actualisé.
En haut de la fenêtre Access, cliquer sur l'onglet Créer ,
Dans la section Requêtes du ruban, cliquer sur le bouton Création de requête ,
Dans la boîte de dialogue qui suit, choisir la table Detail_commandes ,
Ajouter le champ Com_det à la grille de requête,
Dans le ruban Créer, cliquer sur le bouton Mise à jour ,
De fait, la ligne Mise à jour apparaît dans la grille de requête. Cette actualisation doit intervenir pour remplacer toutes les valeurs définies à zéro dans le
champ Com_det .
Dans la zone Critères, taper le chiffre 0,
Et cette mise à jour doit insérer le numéro de commande inscrit dans le champ Num_Com du formulaire. Nous allons donc de nouveau exploiter le
générateur d'expression pour établir la correspondance.
Réaliser un clic droit dans la zone Mise à jour ,
Dans la liste de gauche du générateur d'expression, sélectionner le formulaire Cli_Com ,
Dans la liste centrale, double cliquer sur le contrôle Num_Com ,
Nous bâtissons ainsi l'expression de correspondance pour la
mise à jour des données sur la
table Detail_commandes :
Formulaires![Cli_Com]![Num_Com]
Cliquer sur le bouton Ok pour valider l'expression,
Enregistrer la requête sous le nom Det_Maj ,
Nous aurions aussi pu la créer directement par l'
éditeur SQL . Si vous l'affichez, il donne la syntaxe de la requête ainsi construite :
UPDATE Detail_commandes SET Detail_commandes.com_det =[Formulaires]![Cli_Com]![Num_Com] WHERE (((Detail_commandes.com_det)=0));
Vous pouvez noter la présence de la clause WHERE pour respecter le critère posé.
Nous devons désormais exécuter cette requête dans l'enchaînement des actions de la macro.
Cliquer sur la croix de son onglet pour fermer la requête,
Revenir sur le formulaire en mode conception,
Sélectionner le bouton Valider ,
Cliquer sur le bouton de son évènement Au clic pour rejoindre l'éditeur de macro,
Ajouter l'action OuvrirRequête ,
Dans la zone Nom de la requête, choisir la requête Update Det_Maj ,
Régler le mode de données sur Lecture seule ,
Dans le ruban, cliquer sur le bouton Enregistrer puis sur le bouton Fermer ,
De retour sur le formulaire, l'enregistrer à son tour puis l'exécuter,
Ajouter un article à la commande puis cliquer sur le bouton Valider ,
Aucune alerte n'intervient. Le dernier numéro de commande s'actualise sur le formulaire.
Si vous ouvrez la
table Detail_commandes , vous constatez que tous les enregistrements ont parfaitement été insérés. Et cette fois, grâce à la
requête de mise à jour , ils sont liés au numéro de commande de la table parente Commandes.
Pour parfaire l'application, il conviendrait d'exécuter une dernière
requête à la suite des actions. Une fois la facture validée, il convient en effet de vider la
table Com_Temp . Il s'agit d'une requête Suppression à la
syntaxe SQL fort simple :
DELETE * FROM Com_Temp;
Quoiqu'il en soit, l'objectif de cette formation est atteint. Il consistait à démontrer qu'il était possible d'insérer tous les enregistrements d'une table dans une autre, par
requêtes Sql , afin de contourner le code VBA.