[Base] Débuter à partir d'une application exemple commentée

Venez découvrir tous les tutoriels, modèles et autres foires aux questions afin de maîtriser rapidement votre suite bureautique favorite.

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Cette section est faite pour présenter les tutoriels. Si vous avez une question sur l'installation, le fonctionnement ou l'utilisation, vous devez poster dans la section du module où se produit le problème.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

[Base] Débuter à partir d'une application exemple commentée

Message par Pierre-Yves Samyn »

Préambule

Ce fil a pour objet de donner des exemples répondant à des questions fréquentes sur la mise en oeuvre de Base.

Il n'a pas vocation à se substituer aux tutoriels plus complets figurant sur le forum.

Les exemples portent sur certains aspects de la gestion de commande. Il va de soi qu'il ne s'agit que d'exemples restreints sans aucune réalité fonctionnelle. Se reporter par exemple aux ressources pour une utilisation professionnelle.

Les exemples présentés ici n'utilisent volontairement aucune macro, ces questions étant abordées dans la section macro du forum.

Terminons ce préambule en indiquant que d'autres solutions ou techniques peuvent être employées : l'exhaustivité n'est pas visée ici... De même, la présentation n'est abordée que lorsque nécessaire et n'est aucunement "travaillée" (couleurs, taille, alignement des contrôles, etc.).

Présentation des données

L'application repose sur les tables et relations suivantes :

Image

Ce modèle peut s'énoncer ainsi :
- Un client peut passer plusieurs commandes
- Une commande peut comprendre plusieurs lignes de commande
- Une ligne de commande porte sur un produit

Ces relations sont relativement compréhensibles.

En revanche nous voulons "modéliser" que :
- Un fournisseur peut fournir plusieurs produits
- Un produit peut être fourni par plusieurs fournisseurs.

Nous sommes ici dans le cas d'une relation "plusieurs-plusieurs". Dans les cas précédents, un client peut passer plusieurs commandes mais une commande est passée par un seul client...

Ces relations "plusieurs-plusieurs" se gèrent par la création d'une table "supplémentaire". Ici il s'agit de la table FournisseursProduits.

Cette table dispose de son propre identifiant, d'un champ RéfFournisseur, et d'un champ RéfProduit.

Elle permettra de gérer plusieurs fournisseurs pour un même produit.

Par exemple si trois fournisseurs (F1, F2, F3) fournissent le produit P1, nous aurons dans cette table trois enregistrements :
0, F1,P1
1, F2,P1
2, F3,P1

Par exemple si un fournisseur (F4) fournit trois produits (P1, P5, P7) nous aurons trois enregistrements :
3, F4, P1
4, F4, P5
5, F4, P7

Le nombre figurant en tête est bien sûr l'identifiant de la table FournisseursProduits.


Saisie des commandes

Le formulaire sera relativement complexe car nous devons mettre à jour des données dans la table Commandes et la table DétailsCommande. Par ailleurs nous devrons calculer le total pour chaque ligne (quantité de produits commandés multipliée par le prix unitaire) et le total de la commande (somme de tous les produits commandés).

Pour cela nous fondons le formulaire sur la table Commandes.
Nous aurons un sous-formulaire fondé sur la table DétailsCommande. Il nous servira à saisir chaque produit et quantité commandé.
Nous aurons enfin un autre sous-formulaire permettant de visualiser toutes les lignes de commande. Il sera fondé sur une requête dans laquelle nous pourrons faire les calculs.

Le formulaire comprend deux "barres de navigation" : une pour les commandes, une pour les lignes. En effet, lors de la saisie nous devrons enregistrer la commande (champs RéfCommande, DateCommande et Client) avant de pouvoir saisir les "détails" de la commande : rappelons que les tables sont liées sur le champ "Identifiant" et que celui doit donc avoir été créé et enregistré. L'intérêt de la barre de navigation est de disposer de boutons enregistrer, supprimer, etc.

La deuxième barre de navigation (partie "lignes de commande") permettra en outre de naviguer de ligne en ligne.

Ci-dessous le résultat que nous voulons obtenir :

Image


Nous aurons besoin d'une requête pour les calculs, commençons donc par là.

La table DétailsCommande ne comprend que la référence du produit. Une première requête va nous servir à relier cette table avec la table Produits pour aller "rechercher" les autres informations : libellé et prix unitaire.

Nous pourrons ainsi calculer le total par ligne : quantité multipliée par le prix unitaire :

Image

Pour obtenir le total de la commande une autre requête fait la somme du total de chaque ligne par commande :

Image

Une troisième requête nous reliera l'ensemble :

Image


L'assistant ne permettant pas la création de plusieurs sous-formulaires, nous créerons de toute pièce ce formulaire en mode ébauche et commençons donc avec une page vide.

Nous aurons besoin des barres d'outils Contrôles de formulaire et Conception Ebauche de formulaire. Dans cette barre cliquer sur "Navigateur de formulaires". Ce navigateur affichera la liste des formulaires, sous-formulaires et contrôles.

Faire un clic droit puis Nouveau puis Formulaire

Image

Ceci créera notre formulaire principal... mais "visuellement" il ne se passe rien, hormis l'apparition de "Standard" dans le navigateur sous "Formulaires".

Levons une ambiguïté : nous avons créé un formulaire (qui ressemble à un document traitement de texte) dans lequel nous créons... un formulaire qui n'apparaît pas !

Le document "formulaire" (document ouvert dans l'interface writer) peut comprendre toute sorte de choses : du texte, des dessins... des formulaires, qui comprendront des contrôles.

Dans OOo, contrairement à Access par exemple, les formulaires ne sont pas visualisés en tant que tels : il n'ont pas de propriétés "couleur de fond" par exemple. Ils sont en quelque sorte des containers qui regrouperont les contrôles. Ils ont quand même des propriétés, comme leur nom ("Standard" ici, mais lorsque le formulaire est créé par l'assistant ce sera "MainForm") et une autre propriété fondamentale : la source des données qui leur est associée.

Faire un clic droit dans le navigateur sur "Standard" puis "Propriétés". Dans l'onglet Données, Type de contenu choisir Table et Contenu choisir "Commandes".

Cliquer dans la barre d'outils ConceptionEbauche de formulaire sur "Ajouter un champ". Ceci affiche dans une nouvelle fenêtre les champs disponibles avec la source de données que nous venons de sélectionner.

Depuis cette fenêtre il est possible de glisser-déposer un champ vers le formulaire. Ceci insére dans le formulaire un contrôle par défaut adapté au type de champ ainsi qu'une étiquette associée. Nous pouvons par exemple insérer ainsi le champ RéfCommande.

Image

Nota :
  • Le navigateur comprend maintenant deux contrôles supplémentaires (le champ de saisie/visualisation et l'étiquette)
  • Un clic sur le champ dans le formulaire entraîne par défaut la sélection du champ et de l'étiquette. Pour ne sélectionner qu'un des deux il suffit de faire un ctrl+Clic
  • Pour que la fenêtre "Ajout de champ" affiche une liste de champs, il faut avoir sélectionné un formulaire dans le navigateur. En effet un document peut comprendre plusieurs formulaires et sous-formulaires, chacun lié à une source de données différentes ; la fenêtre "Ajout de champ" n'affiche que les champs du formulaire (et donc de la source de données) sélectionné.
  • Une conséquence que nous emploierons ci-après est qu'il faut avoir sélectionné le formulaire auquel on désire rattacher un contrôle avant de dessiner celui-ci.
Pour les autres champs (Date commande et Client) nous voulons des contrôles particuliers (calendrier et liste déroulante) et procéderons autrement.

Date commande :
  • Cliquer dans le navigateur sur "Standard",
  • Cliquer dans la barre d'outils "Contrôles de formulaires" sur "Autres contrôles".
  • Dans la nouvelle barre sélectionner l'outil "Champ date" puis dessiner le contrôle dans le formulaire.
  • Si la fenêtre des propriétés a été fermée, faire un clic droit sur le nouveau contrôle puis "Contrôle"
  • Sélectionner l'onglet Général et pour la propriété Déroulante choisir Oui. Ceci aura pour effet de gérer un "calendrier" dans lequel il suffira de cliquer pour choisir la date.
  • Dans l'onglet Données choisir le champ "DateCommande"
Champ Client :
  • Cliquer dans le navigateur sur "Standard",
  • Dans la barre d'outils "Contrôles de formulaires" vérifier que le dernier bouton à droite "(Dés)activation des assistants" est enfoncé
  • Cliquer dans la barre d'outils "Contrôles de formulaires" sur "Zone de Liste".
  • Dessiner le contrôle dans le formulaire.
  • L'assistant prend la main. Choisir la table Clients, puis "Nom" pour le champ d'affichage, puis sélectionner les champs "RéfClient" dans les deux colonnes des champs devant "coïncider" : la liste permettra de visualiser les noms, et lors de la sélection c'est le champ RéfClient qui sera stocké.
    La propriété "Contenu" généré est donc :

    Code : Tout sélectionner

    SELECT "Nom", "RéfClient" FROM "Clients"
    
  • Seul le nom sera affiché, or nous voudrions en plus disposer du prénom.
    Pour cela modifier l'instruction comme ceci :

    Code : Tout sélectionner

    SELECT "Nom" || ' '  ||  "Prénom"  as "Client" ,"RéfClient" FROM "Clients"
    
    Une seule colonne étant disponible en affichage nous "concaténons" le nom et le prénom avec un espace entre les deux. L'opérateur pour cela est "||". Cet opérateur impose de modifier la propriété "Type de contenu" : choisir SQL Natif.

Barre de navigation :
  • Dans la barre d'outils "Autres Contrôles" sélectionner "Barre de navigation"
  • Dessiner le contrôle dans le formulaire.

Sous-formulaire "Ligne"
  • Cliquer dans le navigateur sur "Standard",
  • Faire un clic droit puis Nouveau puis Formulaire. Le nouveau formulaire est rattaché au formulaire "principal" comme le montre le navigateur :

    Image
  • Clic droit sur Standard puis onglet Général
  • Remplacer le nom Standard par "UneLigne" afin d'éviter de confondre avec le formulaire principal
  • Onglet Données choisir la table DétailsCommande. Il reste à indiquer quels champs permettent, dans les deux tables, de les relier.
  • Cliquer sur le bouton [...] à droite de "Etablir un lien depuis".
  • Choisir RéfCommande dans chaque table
Produit : Le choix du produit doit être fait dans une liste
  • Vérifier que le sous-formulaire "UneLigne" est sélectionné dans le navigateur.
  • Cliquer dans la barre d'outils "Contrôles de formulaires" sur "Zone de Liste".
  • Dessiner le contrôle dans le formulaire.
  • L'assistant prend la main. Choisir la table Produits, puis "NomProduit" pour le champ d'affichage, puis sélectionner les champs "RéfProduit" dans les deux colonnes des champs devant "coïncider".
Le champ Quantité peut être "glissé-déposé" depuis la fenêtre "Ajouter un champ".

Ajouter la barre de navigation comme précédemment (en ayant sélectionné le sous-formulaire "UneLigne" dans le navigateur).

Sous-Formulaire de visualisation de toutes les lignes
  • Cliquer dans le navigateur sur le formulaire principal "Standard"
  • Faire un clic droit puis Nouveau puis Formulaire. Le nouveau formulaire est rattaché au formulaire "principal" au même niveau que le sous-formulaire "UneLigne".
  • Clic droit sur Standard puis onglet Général
  • Remplacer le nom Standard par "ToutesLesLignes" afin d'éviter de confondre avec le formulaire principal
  • Onglet Données choisir la requête RTotalGénéralCommande. Il reste à indiquer quels champs permettent de relier le sous-formulaire avec le formulaire principal.
  • Cliquer sur le bouton [...] à droite de "Etablir un lien depuis".
  • Choisir RéfCommande dans chaque table
Visualisation des lignes :
  • Vérifier que le sous-formulaire "ToutesLesLignes" est sélectionné dans le navigateur.
  • Cliquer dans la barre d'outils "Autres Contrôles" sur "Contrôle table".
  • Dessiner le contrôle dans le formulaire.
  • L'assistant prend la main. Choisir les champs NomProduit, PrixUnitaire, Quantité, TotalLigne, Total.
  • Par défaut les champs Prix, Total ligne et Total sont affichés dans des contrôles numériques. Nous allons les remplacer par des contrôles monétaires : clic droit sur l'en-tête de colonne puis "Remplacer par / champ monétaire".
  • Nous pouvons aussi améliorer le titre des colonnes : onglet général, propriété Nom.
Actualisation des lignes : lors de la saisie, si nous modifions une ligne les modifications ne sont pas immédiatement répercutées dans la liste. Nous ajoutons donc un bouton qui permettra de forcer l'actualisation.
  • Vérifier que le sous-formulaire "ToutesLesLignes" est sélectionné dans le navigateur.
  • Cliquer dans la barre d'outils "Contrôles de formulaire" sur "Bouton".
  • Dessiner le contrôle dans le formulaire.
  • Onglet Général modifier le titre Bouton en Actualiser
  • Dans cet onglet choisir comme "Action" : Actualiser le formulaire.

Couleur de fond

Comme le montre la copie d'écran il est possible de matérialiser à l'écran les différentes composantes : commande, une ligne, toutes les lignes.

Une solution est de recourir aux couleurs. Ceci doit être fait avec précaution, notamment dans le choix et le nombre des couleurs : ne pas abuser, éviter les couleurs "criardes", penser aux problèmes de perception, etc. D'autres techniques de mise en page existent qui ne sont pas l'objet de ce document.

Un formulaire est un document "traitement de textes" : nous utiliserons la notion de section particulièrement adaptée pour ce que nous voulons faire.
  • Cliquer dans le formulaire ailleurs que sur un contrôle. Le curseur se positionne en haut à gauche.
  • Créer des paragraphes avec la touche Entrée pour "descendre" jusqu'en bas du formulaire (il est possible d'afficher les marques de paragraphe par Affichage / Caractères non imprimables ou Ctrl+F10)
  • Sélectionner du haut jusqu'à la première barre de navigation et lancer Insertion / Section.
  • Modifier éventuellement le nom "Section1" par "Commande"
  • Onglet Arrière-plan choisir une couleur puis cliquer sur Insérer
  • Sélectionner les paragraphes correspondant à la partie "une ligne" et procéder de même.
  • Pour le bas du formulaire (partie de visualisation des lignes) il est inutile d'insérer une section : il suffit de définir un arrière-plan à la page par Format / Page.


Formulaires de saisie pour la table FournisseursProduits

1) Formulaire / Sous-Formulaire

Le formulaire "Fournisseur" de la base exemple a été construit au départ avec l'assistant formulaire en fondant le formulaire principal sur la table Fournisseur et le sous-formulaire sur la table FournisseursProduits, cette dernière utilisant un "contrôle de table" pour afficher plusieurs lignes.

Dans cette liste nous n'avons pas besoin de visualiser le champ IDFournisseursProduits. Pour cela, il suffit de faire un clic sur l'en-tête de la colonne puis choisir Masquer. Idem pour la colonne RéfFournisseur.

Il nous reste la colonne RéfProduit. Il ne serait pas facile de saisir à partir de cet identifiant. Le mieux serait d'avoir une liste déroulante dans laquelle serait affiché le libellé du produit. Après avoir sélectionné un produit, il faudrait que ce soit le code correspondant qui soit stocké...

Pour cela il suffit de "remplacer" le contrôle RéfProduit par une liste : clic droit sur l'en-tête de colonne puis "Remplacer par" puis "Zone de Liste". Il nous reste à définir les propriétés de cette liste.

Dans l'onglet Données des propriétés, choisir "Type de contenu" : SQL et "Contenu de liste" indiquer :

Code : Tout sélectionner

SELECT "NomProduit", "RéfProduit" FROM "Produits"

Dans le "Champ lié" indiquer 1

Autrement dit, nous demandons que la liste affiche le NomProduit (premier champ = champ affiché) et nous stockons RéfProduit (champ lié = 1 sachant que le premier est numéroté zéro).

2) Formulaire en liste

Une deuxième solution pour mettre à jour la table FournisseursProduits consiste à fonder un formulaire directement sur cette table. Comme dans la solution précédente, nous utiliserons simplement des listes pour sélectionner les fournisseurs et les produits.

Le formulaire FournisseursProduits de la base exemple est fondé sur ce principe. Il affiche les données de la table dans un contrôle Table.

Le champ IDFournisseursProduits peut être masqué comme indiqué plus haut.

Nous remplaçons le champ RéfFournisseur par une liste dont la source sera :

Code : Tout sélectionner

SELECT "NomFournisseur", "RéfFournisseur" FROM "Fournisseurs"
Nous remplaçons le champ RéfProduit par une liste dont la source sera :

Code : Tout sélectionner

SELECT "NomProduit", "RéfProduit" FROM "Produits"
Consultations

Recherche par date de commande :

Image
  • Le principe est d'avoir un formulaire principal fondé sur la liste des dates de commande saisies.

    La source du formulaire sera de Type "Instruction SQL"
    La source du formulaire principal sera :

    Code : Tout sélectionner

    select distinct DateCommande from Commandes
    
  • Le choix d'une date affiche à gauche la liste des commandes passées à cette date.

    Le sous-formulaire sera donc fondé sur la table Commandes et relié au formulaire principal sur le champ "DateCommande"
  • Le choix d'une commande affiche à droite le détail de la commande

    Le sous-formulaire sera donc un sous-formulaire du sous-formulaire Commandes et relié à celui-ci sur sur le champ "RéfCommande"
Consultation par "période" de date ou nom de client

Image
  • Le principe est d'avoir un formulaire principal fondé sur une requête paramétrée. A l'ouverture OOo demande à l'utilisateur de saisir les paramètres : date de début, date de fin ou Nom du client.
  • La requête sous-jacente au formulaire principal sera :

    Image

    [Edit]En version 3 le mot COMME doit être remplacer par son équivalent anglais LIKE

    Elle permettra de sélectionner uniquement les commandes passées entre les dates indiquées ou celles portant sur le client saisi.

    Pour le nom du client la syntaxe "Comme :Nom" permettra de saisir par exemple Du% pour obtenir les commandes passées par tous les clients dont le nom commence par "Du".

    Comme pour le formulaire précédent, la sélection d'une commande provoque l'affichage des détails dans le sous-formulaire mitoyen.
Base exemple : https://forum.openoffice.org/fr/ci-join ... 030554.odb



Toute question relative à ce tutoriel est à poster dans la section Bases de données du forum . Merci.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: [Base] Débuter à partir d'une application exemple commen

Message par Pierre-Yves Samyn »

Apport de la version 3.3

Cette version a vu la résolution de l'Issue 53377 permettant désormais les mises à jour de données aux requêtes reliant plusieurs tables.

Ceci nous permet de simplifier notre formulaire de saisie de commandes :
FormCommande.png
Le sous-formulaire pour la saisie des lignes sera fondé sur une requête reliant les tables DétailsCommande et Produit :

Code : Tout sélectionner

SELECT "DétailsCommande"."RéfDétailCommande", "DétailsCommande"."RéfCommande", "DétailsCommande"."RéfProduit" AS "RéfProduitDétail", "DétailsCommande"."Quantité", "Produits"."PrixUnitaire", "Produits"."RéfProduit", "Quantité" * "PrixUnitaire" AS "Total" FROM "DétailsCommande", "Produits" WHERE "DétailsCommande"."RéfProduit" = "Produits"."RéfProduit"
Pour que la requête autorise la mise à jour il est nécessaire d'y faire figurer les champs identifiants des deux tables ("DétailsCommande"."RéfDétailCommande" et "Produits"."RéfProduit").

Le produit sera choisi en liste, le prix unitaire sera "récupéré" par la requête. La quantité sera saisie directement dans la ligne et le total par ligne sera calculé automatiquement.

Le total général sera un sous-formulaire relié au formulaire principal. Il sera calculé de la même manière que précédemment.

Les prix et quantité pouvant être modifiés directement dans le contrôle table on ajoute un bouton "Maj total" dont l'action sera le rafraîchissement du formulaire principal (provoquera l'actualisation du calcul).

Pour "peaufiner" le nouveau formulaire dispose d'un bouton [...] à droite de la liste Clients afin d'amener directement sur un formulaire de saisie permettant d'ajouter de nouveaux clients. L'actualisation de la liste se fera par le bouton actualiser de la barre de navigation.
FormClient.png
FormClient.png (10.6 Kio) Consulté 108539 fois
Le formulaire Client dispose d'un bouton "Retour" permettant de revenir à la saisie des commandes. Aucune macro n'est nécessaire pour gérer cette "navigation" commande/client : des sections ont été insérées dans le formulaire (cf. version précédente) et les boutons sont simplement des hyperliens pointant vers ces sections et insérés sous forme de boutons.

On pourrait paramétrer le formulaire Clients pour l'ajout uniquement mais je considère souvent cela comme anti-ergonomique : ne permet pas le "retour" sur ce que l'on vient de saisir...
BaseExempleTutorielForum33.odb
(63.54 Kio) Téléchargé 9485 fois
Toute question relative à ce tutoriel est à poster dans la section Bases de données du forum . Merci.
Répondre