[Base] passage de paramètre entre deux formulaires

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

Ouverture formulaire avec passage paramètre

Messagepar Jeff1 » 08 Mai 2007 13:07

Bonjour,

Ci-joint, un exemple de base de donnée avec "passage de paramètre" entre deux formulaires. Pour cet exemple, j'ai pris un cas "classique" : une base de donnée avec une table "Adherents" et une table "Cotisations" (sachant que un adhérent peut avoir plusieurs cotisations...).

http://user.services.openoffice.org/fr/ci-joint/fichier/2007/05/08-020524.odb

Intérêt :
Cette macro fait exactement la même chose que ce qui se passe lorsqu'on insère un sous-formulaire dans un formulaire principal. Le problème, c'est qu'un formulaire n'est pas "extensible" à l'infini (en tout cas c'est pas pratique de naviguer avec les ascensceurs !). Du coup, on est vite tenté de "déporter" certaines informations dans des "sous-formulaires externes", appelés par un bouton. C'est l'objet de cette macro.

Principe :
Il ne s'agit pas vraiment d'un "passage de paramètre". La macro fonctionne en 3 temps :
- 1) On récupère dans le formulaire en cours l'identifiant de l'enregistrement concerné
- 2) On ouvre le second formulaire
- 3) On ne sélectionne que les enregistrements correspondant à l'identifiant relevé au point 1

Préalables :
- 1) Il faut tout d'abord créé vos 2 formulaires
Le premier est simplement un formulaire basé sur la "première" table.
Par contre le second formulaire (le "sous-formulaire externe") n'est pas basé sur la seconde table comme on pourrait le penser, mais également sur la première table. La seconde table y est insérée comme sous-formulaire. A noter : cette possibilité n'est offerte par l'assistant "Création de formulaire" que si vous avez correctement définit la relation entre les 2 tables ("Outils/Relations").

- 2) Il faut ensuite modifier le premier formulaire
Coller les macros dans un module lié à ce formulaire
Insérer un bouton et lui donner le nom exact de l'autre formulaire (par "Propriétés"). Attention, il sagit du "nom", pas du "titre" (qui correspond à ce qui s'affiche). Assigner à ce bouton la macro "OnClickOuvrirFormulaire".
Relever le nom exact du champs contenant l'identifiant : clic sur l'identifiant, puis "dissocier" pour séparer l'étiquette de la zone de texte, puis clic sur le zone de texte, et relever le nom. C'est lui qui est utilisé sans la macro.
Faire "Propriétés" (grâce au navigateur de formulaire par exemple), puis "Données" et dans "Type de contenu", il faut enlever "Table" et mettre "Instruction SQL", puis taper en dessous dans "Contenu" : "SELECT * FROM "Adherents" WHERE "idAdherent"='1'
A adapter bien sur en fonction du nom de votre table et de l'identifiant.
La valeur '1' n'a aucune importance, elle sera modifiée à chaque ouverture du formulaire par la macro.

Voilà !
En espérant qu'à l'avenir les programmeurs de OOo nous fasse un petit menu déroulant sympa pour faire tout ça !
Jeff

Code : Tout sélectionner   AgrandirRéduire

REM  *****  BASIC  *****

Option Explicit

Sub onClickOuvrirFormulaire(oEvent as variant )
      OuvrirFormulaire(OEvent.Source.Model.Parent.ActiveConnection.Parent.DatabaseDocument.FormDocuments, OEvent.Source.Model.Parent.ActiveConnection, OEvent.Source.Model.Name)
end sub

Sub OuvrirFormulaire(lesFormulaires as Variant, laConnection as variant, nomFormulaireCible as String) as variant

   Dim formulaireEnCours as Object
   Dim interfaceFormulaireEnCours as Object
   Dim controleId as Object
   Dim idEnCours as String
   

   Dim optFichier(1) As New com.sun.star.beans.PropertyValue
   Dim formulaireCible As Object
   Dim interfaceFormulaireCible as Object
   
   '1 On recupere l'identifiant de l'enregistrement en cours de visualisation
   formulaireEnCours = ThisComponent
   interfaceFormulaireEnCours = formulaireEnCours.DrawPage.Forms.getByName("MainForm")   
   controleId = interfaceFormulaireEnCours.GetByName("fmtidAdherent")
   idEnCours = controleId.CurrentValue
   

   '2 On ouvre le formulaire cible
   optFichier(0).Name = "ActiveConnection"
   optFichier(0).Value = laConnection

   formulaireCible= lesFormulaires.loadComponentFromURL(nomFormulaireCible,"_blank",0, optFichier())
   interfaceFormulaireCible = formulaireCible.DrawPage.Forms.getByName("MainForm")

   
   '3 On exécute la requête qui sélectionne les résultats en fonction de notre paramètre
      interfaceFormulaireCible.Command = "SELECT * FROM ""Adherents"" WHERE ""idAdherent"" = '"& idEnCours & "'"
   interfaceFormulaireCible.reload()
   
End Sub

OOo 2.0.2 sous Linux / 2.2 sous windows
Jeff1
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 10
Inscrit le : 22 Avr 2007 14:26

Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)