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/ ... 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
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