[Résolu][Base] Ouvrir formulaire sur enregistrement défini

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
greb
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 02 janv. 2019 10:24

[Résolu][Base] Ouvrir formulaire sur enregistrement défini

Message par greb »

Bonjour,

N'ayant pas beaucoup plus d'expérience que depuis hier (cf mon post d'hier résolu), je bloque maintenant sur un nouveau problème, variante de celui d'hier je pense.
À partir d'un bouton d'un formulaire 1, associé à une routine 1, j'ouvre un formulaire 2. Une routine 2 est associé à l'événement 'Ouvrir le document', qui vise à afficher le formulaire sur un enregistrement spécifié. Je souhaite (mais ça peut être autrement bien sûr) que ce soit via l'ID (qui correspond au numéro de ligne dans la table), renseigné par une boîte de dialogue (inputBox).
Voilà mes routines:

Code : Tout sélectionner

'------------------------BOUTON 'GO TO A SPECIFIC FARMER'
' opens the Farmer form
Sub FarmerSpecific_open
	oForm1 = ThisDatabaseDocument.FormDocuments.getByName("Formulaire1")
	oForm = ThisDatabaseDocument.FormDocuments.getByName("Formulaire2")
	oForm.open
	oForm1.close
end sub

' while opening form, positions at a specified record with ID
Sub FarmerSpecific_Record
	oForm = ThisDatabaseDocument.FormDocuments.getByName("Formulaire2")
	Dim IDspecific As Integer
	IDspecific=InputBox("Enter survey ID","Go to recorded farmer")
	'Le formulaire s'ouvre à l'enregistrement numéro IDspecific
	'...
end sub
Les '...' dans la seconde routine montrent là où je bloque... Je ne sais pas si c'est possible, mais existe-t-il un moyen d'aller plus avant dans la "structure" du/des docs concernés, pour dire que le formulaire2 se positionne là où le 'datafield' ID de la table = IDspecific ?

Un exemple en pièce jointe:
test.odb
J'ai vu notamment dans le forum une solution proposée par Piaf, mais n'ai pas réussi à la prendre en main (encore aussi quasi débutant qu'hier) et l'implémenter pour mon cas...

Merci d'avance pour votre aide !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par greb le 03 janv. 2019 10:21, modifié 2 fois.
LibreOffice Version: 6.1.3.2 | Lubuntu 18.04
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Ouvrir formulaire sur un enregistrement défini

Message par Piaf »

Bonjour
Tu peux tester

Code : Tout sélectionner

Sub FarmerSpecific_Record
	oForm = ThisDatabaseDocument.FormDocuments.getByName("Formulaire2")

	Dim IDspecific As Long
	IDspecific=InputBox("Enter survey ID","Go to recorded farmer")
	'Le formulaire s'ouvre à l'enregistrement numéro IDspecific
	oForm.Component.DrawPage.Forms.getByIndex(0).absolute(IDspecific)
end sub
Mais il faudrait quand même vérifier que la saisie dans l'inputBox soit numérique et corresponde à un identifiant existant.
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
greb
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 02 janv. 2019 10:24

Re: [Base] Ouvrir formulaire sur un enregistrement défini

Message par greb »

Bonjour Piaf,

Encore une fois, merci beaucoup pour ta réponse, rapide et qui fonctionne !
Si ça fonctionne, j'imagine que la saisie dans l'InputBox est effectivement numérique (quelle est la différence entre une déclaration de variable "As Long" plutôt que "As Integer" ? il s'agit du nombre de chiffres permis dans la variable ?).
Et oui, il faut que je planche pour ajouter un petit message d'erreur dans le cas où on rentre un ID qui n'existe pas dans la table...

Mais ma question est résolue, je mets donc le sujet en résolu.

Juste une question, que signifient ce "getByIndex(0)" (déjà fourni par ta réponse à mon post d'hier) et ce "absolute"...?
Existe-t-il peut-être à ce sujet une documentation en ligne qui explique la décomposition des objets (Component, DrawPages, Forms, ...) ? Bien qu'en n'ayant cherché que brièvement, je n'ai pas trouvé grand chose...
Merci d'avance!
LibreOffice Version: 6.1.3.2 | Lubuntu 18.04
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Résolu][Base] Ouvrir formulaire sur enregistrement défi

Message par Piaf »

Re
greb a écrit :Encore une fois, merci beaucoup pour ta réponse, rapide et qui fonctionne !
Non, cela a l'air de fonctionner parce que les numéros de ligne correspondent aux identifiants.
Ça ne fonctionnerait plus s'ils étaient différents.
Tu devrais relire le fil envoyé dans ton fil précédent qui fourni des explications.
Un petit exemple en pièce jointe.
Pour ce qui est de la décomposition des objets, utilise Xray.
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
greb
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 02 janv. 2019 10:24

Re: [Résolu][Base] Ouvrir formulaire sur enregistrement défi

Message par greb »

Re,

Ok, merci pour les précisions.
Merci aussi pour le nouvel exemple, c'est aussi une alternative qui peut me convenir.

Je vais regarder tout ça de plus près.
à+
LibreOffice Version: 6.1.3.2 | Lubuntu 18.04
greb
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 02 janv. 2019 10:24

Re: [Résolu][Base] Ouvrir formulaire sur enregistrement défi

Message par greb »

Re,

J'ai encore une question par rapport au dernier exemple envoyé du fichier test(1).
C'est peut-être idiot comme question, mais je ne vois pas où est appelée la routine 2...
Je ne vois pas de macro lancée associée à un événement pour le formulaire 2..., le bouton du formulaire 1 ne semble lancer que la routine 1..., et il ne me semble pas que la routine 2 soit appelée dans la routine 1...
Qu'ai-je loupé ?

Merci d'avance !
LibreOffice Version: 6.1.3.2 | Lubuntu 18.04
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Résolu][Base] Ouvrir formulaire sur enregistrement défi

Message par Piaf »

Re
greb a écrit :Je ne vois pas de macro lancée associée à un événement pour le formulaire 2
assignation.png
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
greb
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 02 janv. 2019 10:24

Re: [Résolu][Base] Ouvrir formulaire sur enregistrement défi

Message par greb »

Merci. Je n'avais pas été voir ici, mais dans Outils > Personnaliser > onglet Événements...

à+
LibreOffice Version: 6.1.3.2 | Lubuntu 18.04
greb
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 02 janv. 2019 10:24

Re: [Résolu][Base] Ouvrir formulaire sur enregistrement défi

Message par greb »

Bonjour,

La solution proposée hier par Piaf, avec une zone de liste, m'intéresse particulièrement. J'ai réussi à la mettre en oeuvre dans ma base, mais j'aimerais aller plus loin pour n'avoir qu'une seule routine, appelée depuis le bouton du formulaire 1 (menu), plutôt que deux routines (une appelée depuis le bouton formulaire 1, et une appelée au chargement du formulaire 2).
En effet, dans l'idéal, j'aimerais pouvoir accéder à mon formulaire 2 pour différentes opérations, et donc routines.

Voilà le code, très simpliste, de combiner les deux routines :

Code : Tout sélectionner

'------------------------BOUTON 'GO TO A SPECIFIC FARMER'
' opens the Farmer form & positions to a specified record
Global Identifiant as Integer

Sub FarmerSpecific_open(oEv as Object)
Dim oForm1 as Object, oForm as Object, oForm2 as Object
	oForm1 = oEv.Source.Model.Parent
	If isEmpty(oForm1.getByName("lstTest").CurrentValue) Then
		MsgBox "Vous devez séléctionner une entrée dans la liste déroulante"
		Exit Sub
	End If	
	Identifiant = oForm1.getByName("lstTest").CurrentValue
	oForm = ThisDatabaseDocument.FormDocuments.getByName("Formulaire2")
	oForm.open
	ThisDatabaseDocument.FormDocuments.getByName("Formulaire1").close
	
	oForm2 = thisComponent.DrawPage.Forms.getByName("Formulaire")
	If Identifiant > 0 Then
		With oForm2
			.Filter = """ID"" =" & Identifiant      
			.Applyfilter = True
			.reload
		End With	
	End If
End Sub
J'ai une erreur :
Erreur d'exécution Basic.
Une exception s'est produite.
Type: com.sun.star.container.NoSuchElementException.
Message:.

Le problème vient je pense de la déclaration de oForm2 : "thisComponent" semble faire appel au formulaire de base de données du formulaire 1, et non du formulaire 2.
Y a-t-il un moyen du coup d' "activer" le "component" lié au formulaire 2, plutôt que le formulaire 1 ?
Ou un autre moyen de faire fonctionner l'ensemble ?

La base en ex:
test2.odb
Merci d'avance !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice Version: 6.1.3.2 | Lubuntu 18.04
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12231
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Résolu][Base] Ouvrir formulaire sur enregistrement défi

Message par Bidouille »

greb a écrit :mais j'aimerais aller plus loin
Ce fil est résolu pour la question indiquée dans le titre.
Allez plus loin en ouvrant une nouvelle question avec un titre explicite et en rapport avec ce nouveau problème.