[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.
Jeff1
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 22 avr. 2007 13:26

Ouverture formulaire avec passage paramètre

Message par Jeff1 »

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

OOo 2.0.2 sous Linux / 2.2 sous windows