[Base] Ouverture et fermeture de formulaire

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.
Répondre
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

[Base] Ouverture et fermeture de formulaire

Message par Dude »

Ouverture et fermeture de formulaire

J'ai repris l'excellent travail de Serge que j'ai légèrement modifié pour qu'il soit plus simple et auquel j'ai ajouté un peu de code de PYS.

Cette base de données contient un formulaire fmMenuGénéral qui permet de lancer via des boutons quatre autres formulaires. Sur chaque formulaire appelé, un bouton permet également de le fermer.

http://user.services.openoffice.org/fr/ ... 050515.odb


Attention : depuis la 3.1, la gestion de l'ouverture des formulaires a été simplifié. Reportez-vous en bas de ce fil.

:idea:
Dernière modification par Dude le 07 juil. 2009 16:04, modifié 2 fois.
jpfor17
Fraîchement OOthentifié
Messages : 3
Inscription : 23 nov. 2007 13:56

[Base] Ouvrir un formulaire

Message par jpfor17 »

Bonjour,

Je suis maintenant capable d'ouvrir un formulaire grâce à l'aide que j'ai obtenue de Dude ManitOOou.

Voici une procédure détaillée pour ouvrir un formulaire.

http://user.services.openoffice.org/fr/ ... 020428.pdf


Merci Dude
Version 2.3
Windows XP
Avatar de l’utilisateur
Domm
Membre lOOyal
Membre lOOyal
Messages : 44
Inscription : 22 sept. 2006 19:52
Localisation : Lille (59)
Contact :

Re: [Base] Ouverture et fermeture de formulaire

Message par Domm »

Bonjour à tous,

Je me permets de proposer aussi ma méthode pour un Menu Général entièrement AUTOMATIQUE dans Base :
Un formulaire nommé "MENU GENERAL" qui va chercher AUTOMATIQUEMENT TOUS les formulaires existants et les affiche sous forme de boutons contenant leurs noms.
On clique sur le bouton/formulaire désiré et il s'ouvre.

L'intérêt premier est de ne pas devoir refaire ce formulaire MENU GENERAL, à chaque fois que l'on ajoute un nouveau formulaire : il s'ajoute tout seul.

Le code est encore à revoir, à nettoyer même, mais il fonctionne:

Code : Tout sélectionner

option explicit

Private FormulR(100)
Private formulr As String

Sub MENUChoix
rem -----Plein écran------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "FullScreen"
args1(0).Value = true
dispatcher.executeDispatch(document, ".uno:FullScreen", "", 0, args1())


'ListeFormulaires()
	Dim odoc As object
	Dim odrawpage As object
	Dim button_shape As object	
	Dim button_model As object
	Dim monDbContext As Object, maSource As Object, dbDoc2 As Object
	Dim monFormulaire As Object, lesFormulaires As Object
	Dim oListBox as object
	Dim oForm as object
	Dim oContext as object
	Dim TabNomSources as variant
	Dim mNameList( 100 ) As String
	Dim  momChamp As String  
	Dim OdbOpt(0) as new com.sun.star.beans.PropertyValue
	Dim adrOdb As String, nomFormulaire As String
	Dim f As Long, k As Long, x As Long, unCtrl As Object
	Dim aPos as new com.sun.star.awt.Point
	Dim aSize as new com.sun.star.awt.Size
	Const nomSource = "SOCIETE"
	
'se connecte à la base "SOCIETE"
monDbContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
maSource = monDbContext.getByName(nomSource)
dbDoc2 = maSource.DatabaseDocument
adrOdb = dbDoc2.URL
OdbOpt(0).Name = "Hidden"
OdbOpt(0).Value = True
dbDoc2 = StarDesktop.loadComponentFromURL(adrOdb, "_blank", 0, OdbOpt())
LesFormulaires = dbDoc2.FormDocuments

ReDim FormulR(lesFormulaires.Count -1)
' Nombre de formulaires à afficher dans le Menu
ReDim mNameList(lesFormulaires.Count -1)

' Trouve les formulaires et les place dans le tableau FormulR(f)
' sauf "00 OoGestComm MENU PRINCIPAL" et le répertoire "futurs formulaires"
x=0
for f= 0 to lesFormulaires.Count -1
  monFormulaire = lesFormulaires(f)
  nomFormulaire = monFormulaire.Name
  If nomFormulaire <> "futurs formulaires" AND nomFormulaire <> "00 OoGestComm MENU PRINCIPAL" THEN
  FormulR(f)=nomFormulaire
  mNameList(x)=FormulR(f)
  x=x+1
  
    'Crée et affiche les boutons contenant le nom de chaque formulaire de la base
odoc = thisComponent
odrawpage = odoc.drawPage
oform = odrawpage.forms.getByName("Standard")

button_shape = odoc.createInstance("com.sun.star.drawing.ControlShape")
aPos.X = 200
aPos.Y = (500 + x*600)
button_shape.Position = aPos
aSize.Width = 4800
aSize.Height = 500
button_shape.Size = aSize
button_shape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
button_model = odoc.createInstance("com.sun.star.form.component.CommandButton")
button_model.Name = "PushButton"

button_model.Label = FormulR(f)
button_shape.Control = button_model
oform.insertByIndex(0, button_model)
odrawpage.add(button_shape)
Dim sListenerInterfaceName as String
sListenerInterfaceName = "com.sun.star.awt.XActionListener"
Dim sListenerMethodName as String  
sListenerMethodName = "actionPerformed"

'affecte la macro Lanceformulaire au bouton en cours
Dim sMacroLocation as String
sMacroLocation = "document:Standard.Module1.Lanceformulaire"
Dim oEvent as new com.sun.star.script.ScriptEventDescriptor
oEvent.ListenerType = sListenerInterfaceName
oEvent.EventMethod =  sListenerMethodName
oEvent.ScriptType = "StarBasic"
oEvent.ScriptCode = sMacroLocation
oform.registerScriptEvent(0, oEvent )
  'print FormulR(f)  
  Else Endif
next
End Sub

sub Lanceformulaire ( oEvent as new com.sun.star.script.ScriptEventDescriptor)
	dim  monDocument   As Object
	dim  monForm       As Object
	oEvent.Source.Model.Label  ' ou .Name ou .Tag   Récupère le nom du bouton pressé
	formulr = oEvent.Source.Model.Label
	monDocument = ThisComponent
   monForm = monDocument.DrawPage.Forms.getByName("Standard")
OpenForm( oEvent.Source.Model.Parent.ActiveConnection.Parent.DatabaseDocument.FormDocuments,oEvent.Source.Model.Parent.ActiveConnection, formulr)
End Sub
  
' L'ouverture des formulaires se fait par appel d'une fonction OpenForm
Function OpenForm( formContainer as variant, oConnection as variant, sFormName as string, optional strMode as string ) as variant
Dim aProp(1) As New com.sun.star.beans.PropertyValue
dim openMode as string
   if ismissing( strMode ) then
      openMode = "open"
   else
      openMode = strMode
      endif
    aProp(0).Name = "ActiveConnection"
    aProp(0).Value = oConnection
    aProp(1).Name = "OpenMode"
    aProp(1).Value = strMode
    OpenForm = formContainer.loadComponentFromURL(sFormName,"_blank",0,aProp())
End Function
Il faut que la base soit enregistrée dans Open Office et sous le nom "SOCIETE".
Il faut également créer le formulaire "00 OoGestComm MENU PRINCIPAL" dans lequel intégrer la macro présentée ci-dessus et l'assigner dans propriétés du document à l'ouverture du document.
Je vais essayer de simplifier et rendre plus universel ces dernières manipulations.

Pour consultation, voir le fichier joint qui est un exemple simple (attention : encore à améliorer).
Je l'ai également intégré dans ma base en cours (Gestion Commerciale). voir ci-dessous.

Domm
Pièces jointes
switchboard.odb
(29.39 Kio) Téléchargé 2795 fois
Dernière modification par Domm le 31 mai 2008 06:07, modifié 5 fois.
Oo 3.0
Win xp Pro sp2
Access 2000

Projet de gestionnaire de Contacts d'après le carnet d'adresses : http://user.services.openoffice.org/fr/ ... 058#p60058
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 12:29
Localisation : Les Corbières
Contact :

Re: [Base] Ouverture et fermeture de formulaire

Message par ThierryM »

Bonjour,
Voici le code (à associer par exemple à un bouton sur l'évènement "Lors du déclenchement") permettant d'enregistrer et fermer un formulaire (voir le fil suivant pour plus de détail : http://user.services.openoffice.org/fr/ ... =8&t=11810) .
Ce code a été trouvé sur http://www.oooforum.org/forum/viewtopic ... 290#272290 fourni par Evgenych.

Code : Tout sélectionner

    REM  *****  BASIC  *****
    option explicit

    Function curFormName (o as object) as string
    'Fonction qui permet de récupérer le nom du formulaire
           Dim args as object, i as integer
           args = o.getArgs
           for i = lBound(args) to uBound(args)
              if args(i).name = "DocumentTitle" then
                 curFormName = args(i).value
                 exit for
              end if
           next
    End Function

    Sub FermerFormulaireDansBase(oEvent)
    oEvent.source.model.parent.updateRow 'met à jour l'enregistrement
    thisComponent.parent.FormDocuments.getByName(curFormName (thisComponent)).dispose()'ferme le formulaire
    end sub
À bientôt,

Thierry
Dernière modification par Oukcha le 06 juil. 2009 12:05, modifié 1 fois.
Raison : Suppression citation modérateur
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 12:29
Localisation : Les Corbières
Contact :

Re: [Base] Ouverture et fermeture de formulaire

Message par ThierryM »

Bonjour,
Je viens de découvrir avec la mouture 3.1 un moyen beaucoup plus simple d'ouvrir un formulaire dans Base. Il suffit d'une ligne (sans avoir recours à une macro tierce comme l'habituelle fonction "OpenForm") !

Code : Tout sélectionner

ThisDatabaseDocument.FormDocuments.getByName( "NomFormulaire" ).open 
Même chose pour fermer un formulaire :

Code : Tout sélectionner

ThisDatabaseDocument.FormDocuments.getByName( "NomFormulaire" ).close 
Quelle simplification ! Attention ce n'est valable que depuis la version 3.1 d'OOo !
Dernière modification par Oukcha le 14 août 2009 21:47, modifié 2 fois.
Raison : Suppression citation modérateur
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 18:31
Localisation : Orleans / France

Re: [Base] Ouverture et fermeture de formulaire

Message par sebmdp »

Bonjour,

Voici encore une autre solution pour ouvrir un formulaire par macro.

Il faut au préalable renseigné le nom du formulaire dans les propriétés du bouton qui déclenche la macro, dans le champ complément d'information.
Si votre formulaire est "logé" dans un dossier de formulaire le champ sera renseigné ainsi : NomDuDossier/NomDuFormulaire, sinon ce sera tout simplement : NomDuFomulaire

Code : Tout sélectionner

Sub openFormByTag(oEv) 

REM OOo3.0: Reads the form name from a calling control's tag 
cWhat = com.sun.star.sdb.application.DatabaseObject.FORM 
oModel = oEv.Source.getModel() 
sName = oModel.Tag 
oView = oModel.Parent.Parent.Parent.Parent.getCurrentController() 
oView.loadComponent(cWhat, sName, FALSE) 
End Sub 
Source du code : http://www.oooforum.org/forum/viewtopic.phtml?p=312729#312729
Dernière modification par Bidouille le 11 sept. 2009 14:42, modifié 4 fois.
Open Office 3.2.1
Mac OS 10.5.8
cathala
Membre hOOnoraire
Membre hOOnoraire
Messages : 133
Inscription : 12 déc. 2007 14:42

Re: [Base] Ouverture et fermeture de formulaire

Message par cathala »

Salut, j'ai amelioré la base SWITCHBOARD.
En ajoutant la liste des rapports en plus des formulaires avec l'ouverture du menu au lancement de la base(penser à l'enregister dans openoffice)
switchboard_form&report.odb
Modif de SWITCHBOARD
(250.72 Kio) Téléchargé 2423 fois

Comme indiqué sur le bandeau rouge en haut de la page :
Toute question relative à ce sujet devra obligatoirement être posée en section MACROS ET API et non à la suite de ce message.
Dernière modification par Bidouille le 11 sept. 2009 14:43, modifié 1 fois.
Raison : Insertion citation
Windows 7 PRO Libre Office 4.1.3.2
Si je peu aider je n'hésite pas
DjangoSwing
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 15 déc. 2009 10:33

Re: [Base] Ouverture et fermeture de formulaire

Message par DjangoSwing »

Bonjour, je sais que ceci pourra aider d'autres personnes qui ne connaissent pas grand chose à la programmtion dans BASE. Pour les personnes désirant cr'éer une base avec plusieurs formulaires, lorsque l'on crée un bouton pour naviguer d'un fomulaire à un autre, l'ouverture se fait mais souvent on se retrouve avec plusieurs formulaires ouverts en second plan. Il serait alors utile de coupler dans la même macro l'ouverture du nouveau formulaire ainsi que la fermeture du formulaire de départ. Pour ma part je procède ainsi :

Code : Tout sélectionner

Sub OuvertureFermeture( oEvent as variant )

	ThisDatabaseDocument.FormDocuments.getByName( "nom_du_formulaire_à_ouvrir" ).open
 	ThisDatabaseDocument.FormDocuments.getByName("nom_du_formulaire_à_fermer").close
 	
end sub
J'éspère que cela pourra aider certains utilisateurs de OooBase !
Openoffice 3.0 sous Windows XP SP3
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

Principe d'ouverture et fermeture de formulaire

Message par Piaf »

Ce post ne fait que récapituler différentes méthodes expliquées dans le forum.
Il s'adresse aux personnes qui débutent avec le module Base.
La fonctionnalité du code a été vérifiée sous les versions officielles OpenOffice 3.3.0 et LibreOffice 3.4.5
En partant du principe que l'on travaille sur une base de données embarquée
et que celle-ci est enregistrée.

La base exemple ne contient que deux formulaires.
Les macros sont toutes déclenchées à l'évènement Exécuter l'action des différents Boutons
Formulaire1.png
La première rangée de Boutons utilise la méthode la plus simple
Elle nécessite que le nom du Formulaire soit nommé dans la macro, ce qui peut être utile lors de la relecture du code.
Le bouton Ouvrir ouvre un second formulaire.
Le bouton Fermer ferme le formulaire en cours.
Le bouton Ouvrir et Fermer ouvre un second formulaire et ferme celui en cours.

Code : Tout sélectionner

Sub OuvrirFormulaireA
'Ouvre le formulaire nommé
	ThisDatabaseDocument.FormDocuments.getByName( "Formulaire2" ).open
End Sub

Sub FermerFormulaireA
'Ferme le formulaire nommé
	ThisDatabaseDocument.FormDocuments.getByName( "Formulaire1" ).close
End Sub

Sub OuvrirFermer
'combinaison des deux commandes précédentes
	ThisDatabaseDocument.FormDocuments.getByName( "Formulaire2" ).open
	ThisDatabaseDocument.FormDocuments.getByName( "Formulaire1" ).close	
End Sub
Le bouton Ouvrir par Tag utilise une méthode différente.
Elle nécessite que le nom du Formulaire à ouvrir soit nommé dans la propriété "Complément d'information"(Tag) du Bouton.
L'avantage de ce procédé est qu'il peut être l'utiliser sans avoir à retaper du code.

Code : Tout sélectionner

Sub OuvrirParTag(oEv as Object)
Dim NouveauFormulaire as Object, NomFormulaire As	String
'Va récupérer le nom du formulaire dans Complément d'information du bouton appelant la macro
	NomFormulaire = oEv.Source.Model.Tag
'Appel la fonction OuvrirFormulaire avec le nom du formulaire en paramètre	
	NouveauFormulaire= OuvrirFormulaire(NomFormulaire)
End sub

Function OuvrirFormulaire(NomFormulaire as String ) as Object
Dim NouveauFormulaire as Object
'Vérifie que le formulaire appelé existe bien dans la base
	If  ThisDatabaseDocument.FormDocuments.hasbyname(NomFormulaire) then 
's'il existe le défini par son nom	
		NouveauFormulaire = ThisDatabaseDocument.FormDocuments.getbyname(NomFormulaire)
	Else
'si non affiche un message	
		msgbox("La Base n'a pas de formulaire nommé " & NomFormulaire,64,"Ouverture fermeture formulaire")
'et stop la procédure		
		End
	End If
'Si Oui ouvre le formulaire
	OuvrirFormulaire = NouveauFormulaire.open
end function
Le Bouton Ouvrir et Fermer par Tag reprend la méthode précédente,
il la complète par la fermeture du formulaire courant.
Elle nécessite que le nom du formulaire à ouvrir et celui du formulaire à fermer
soient nommés dans la propriété "Complément d'information"(Tag) du Bouton
séparés pour l'exemple par un point virgule.
Pour plus d'information voir la fonction Split dans l'aide en ligne

Code : Tout sélectionner

Sub OuvrirFermerFormulaire(oEv As Object)
Dim lesFormulaires As Object, leFormulaire As Object
Dim bouton As Object, appel As String, courant as String
'Bouton ayant déclenché l'action
	bouton = oEv.Source
'Voir la fonction split dans l'aide en ligne
'cherche dans complément d'information du bouton le nom du formulaire à ouvrir(avant le point virgule)	et le défini à appel
	appel = split(bouton.Model.tag,";",2)(0)
'cherche dans complément d'information du bouton le nom du formulaire à fermer(après le point virgule)	et le défini à courant	
	if instr(1,bouton.Model.tag,";") then courant = split(bouton.Model.tag,";",2)(1)
'ouvre le formulaire appel s'il existe	
	lesFormulaires = ThisDatabaseDocument.FormDocuments
	if lesFormulaires.hasByName(appel)  then
		leFormulaire = lesFormulaires.getByName(appel)
		leFormulaire.open
	else
	  	MsgBox("La Base n'a pas de formulaire nommé " & appel,64,"Ouverture fermeture formulaire")
	  	exit sub
	end if
'si le nom du formulaire à fermer existe, appel la procédure FermerFormulaire avec courant en paramètre	
	if thisDatabaseDocument.FormDocuments.hasByName(courant) then FermerFormulaire(courant)	
	
End Sub

Sub FermerFormulaire(NomFormulaire) '*** appelée par OuvrirFermerFormulaire
'ferme le formulaire dont le nom est passé en paramètre
	thisDataBaseDocument.FormDocuments.getByName(NomFormulaire).close
End sub
Le Bouton Fermer sans macro (comme son nom l'indique) ferme le formulaire sans faire appel à une macro.
Propriété du Bouton
Action > Ouvrir la page web
URL > .uno:closewin

Précision sur la fermeture des formulaires.
Pour une application normale, c'est à dire avec des formulaires présentant des données.
Fermeture par macro
Si les données ont été modifiées et pas enregistrées, la boite de dialogue de confirmation d'enregistrement s'affiche
Si la structure du formulaire a été modifiée, la boite de dialogue de confirmation d'enregistrement s'affiche
même comportement que le clic sur la croix de la fenêtre
Fermeture sans macro
Si les données ont été modifiées et pas enregistrées, la boite de dialogue de confirmation d'enregistrement s'affiche
Si la structure du formulaire a été modifiée, la boite de dialogue de confirmation d'enregistrement ne s'affiche pas
Faire attention donc en phase de développement.
Ouverture automatique.png
Pour l'ouverture automatique d'un formulaire au lancement de la base
Assigner la macro OuvertureBase dans le menu Outils > Personnaliser > Ouvrir un document
Enregistrer dans OuvertureFermeture.odb

Code : Tout sélectionner

Sub OuvertureBase
'sur Outils personnaliser ouvrir un document enregistrer dans OuvertureFermeture.odb
dim NomFormulaire as Object,maConnexion as Object
'Utilise la connexion courante
 	ThisDatabaseDocument.CurrentController.connect("","")
	maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	NomFormulaire=OuvrirFormulaire("Formulaire1")
End sub
Quelques liens pour approfondir la question:
viewtopic.php?f=15&t=6355
viewtopic.php?f=8&t=31953
viewtopic.php?f=8&t=31895
viewtopic.php?f=8&t=29822
A+
Pièces jointes
OvertureFermeture.odb
(20.92 Kio) Téléchargé 1690 fois
Dernière modification par Piaf le 20 févr. 2012 11:50, modifié 1 fois.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

Ouverture d'un formulaire sur un enregistrement

Message par Piaf »

Bonjour
La grande majorité des exemples de ce post est une adaptation pour l'ouverture d'un second formulaire
du code de P.Y. SAMYN dans son tutoriel [Base]Sélectionner un enreg. avec une liste déroulante
Il s'adresse aux personnes qui débutent avec le module Base.
La fonctionnalité du code a été vérifiée sous les versions officielles OpenOffice 3.3.0 et LibreOffice 3.4.5
en partant du principe que l'on travaille sur une base de données embarquée
et que celle-ci est enregistrée.

La base exemple ne contient que deux formulaires.
Les macros sont toutes déclenchées à l'évènement Exécuter l'action des différents Boutons
La fonction OuvrirFormulaire est la même que dans le post précédent.
Précisions au sujet des noms de formulaires
Dans base, le terme "formulaire" recouvre deux notions distinctes :
  • - le document formulaire proprement dit.
    Ce premier objet est celui affiché dans la fenêtre Formulaires de la base de données.
    Il dispose des propriétés d'un document texte(SwXTextDocument) à ce niveau le formulaire est une page Writer.
  • - à l'intérieur de ce document, la couche logique assurant l'interface entre les contrôles et la table sous-jacente.
    Ce deuxième objet est celui que l'on explore par clic-droit sur contrôle -> Formulaire (ou via l'explorateur de formulaire dans la barre d'outils Ébauche de formulaire).
    Il dispose des propriétés d'un document Formulaire(com.sun.star.comp.forms.ODatabaseForm)
    On parle aussi de la Vue du formulaire.
Ces deux objets portent en général des noms différents. Ainsi, la "couche logique" porte par défaut le nom "Standard" ou "MainForm".
Dans la base exemple, les deux objets portent le même nom.
Ce qui simplifie le code puisque le nom est récupéré dans le complément d'information(Tag) du bouton Appelant la macro.
La ligne

Code : Tout sélectionner

NouveauFormulaire = NouveauFormulaire.DrawPage.Forms.getByName(nomFormulaire)
Permet de passer du premier Objet au second
Merci à spYre pour les explications techniques
Formulaire1.png
Le bouton Par requête.
Construit une requête sur les enregistrements du formulaire à ouvrir
ne contenant que l'enregistrement correspondant à la sélection dans la liste.
Le formulaire une fois ouvert ne contient qu'un enregistrement.

Code : Tout sélectionner

Sub PositionParRequete(oEv as Object)
Dim oForm as Object, ctrlListeChoix as Object, NouveauFormulaire as Object
Dim ValeurChoix as String, sqlSelect as String, nomFormulaire As String
'Le formulaire actif en l'occurrence fForm1
	oForm = oEv.Source.Model.Parent
'Le contrôle Zone de liste Choix de l'enregistrement	
	ctrlListeChoix = oForm.getByName("lstChoix")
'vérifie qu'une entrée soit sélectionnée dans la zone de liste
	If ctrlListechoix.currentvalue<>"" then
'Récupère la valeur sélectionnée	
		ValeurChoix = ctrlListechoix.CurrentValue
	Else
		msgbox ("Vous devez sélectionner une entrée dans la Zone de liste",64,"Ouverture formulaire sur enregistrement")
		Exit sub
	End If		
'Instruction SQL sélectionnant l'enregistrement de la table tenregistrements correspondant au critère	
	sqlSelect = "SELECT tEnregistrement.* FROM tEnregistrement WHERE Enregistrement ='" & ValeurChoix & "'"
'Va récupérer le nom du formulaire dans Complément d'information du bouton appelant la macro
	nomFormulaire = oEv.Source.Model.Tag
'Appel la fonction OuvrirFormulaire avec le nom du formulaire en paramètre	
	NouveauFormulaire= OuvrirFormulaire(nomFormulaire)
	NouveauFormulaire = NouveauFormulaire.DrawPage.Forms.getByName(nomFormulaire)
'défini le type de contenu du formulaire à instruction SQL
'la commande est utile car par défaut le type de contenu est sur Table
		NouveauFormulaire.Commandtype = 2 
'défini le contenu du formulaire (la requête SELECT)		
		NouveauFormulaire.Command = sqlSelect		
End Sub
Le bouton Par filtre.
Filtre le formulaire à ouvrir sur le champ correspondant à la liste
avec comme valeur la sélection de la liste.
Le formulaire une fois ouvert contient tous les enregistrements mais est verrouillé sur celui de la sélection.
On ne peut donc pas naviguer dans les enregistrements sans supprimer le filtre.
Pour le vérifier il suffit de supprimer le filtre.

Code : Tout sélectionner

Sub PositionParFiltre(oEv as Object)
'La récupération des différentes variables est la même que dans la procédure précédente
Dim oForm as Object, ctrlListeChoix as Object, NouveauFormulaire as Object
Dim ValeurChoix as String, nomFormulaire As String
	oForm = oEv.Source.Model.Parent	
	ctrlListeChoix = oForm.getByName("lstChoix")
	If ctrlListechoix.CurrentValue<>"" then		
		ValeurChoix = ctrlListeChoix.CurrentValue
	Else
		msgbox ("Vous devez sélectionner une entrée dans la Zone de liste",64,"Ouverture formulaire sur enregistrement")
		Exit sub
	End If		
	nomFormulaire = oEv.Source.Model.Tag
	NouveauFormulaire= OuvrirFormulaire(nomFormulaire)
		with NouveauFormulaire.drawpage.forms.getbyname(nomFormulaire)
'Défini le champ à filtrer et le filtre à appliquer		
			.Filter="""Enregistrement"" ='" & ValeurChoix & "'"
'Applique le filtre			
			.Applyfilter = True
			if  .isloaded = false then 
				.load
			else 
				.reload
			end if
		end with
'rend visible le bouton supprimer le filtre	
	NouveauFormulaire = NouveauFormulaire.DrawPage.Forms.getByName(nomFormulaire)
	NouveauFormulaire.getByname("cmdSupFiltre").EnableVisible = true
end sub
Le masquage du bouton Supprimer le filtre

Code : Tout sélectionner

sub SupprimerFiltre(oEv)
'Supprime le filtre et cache le bouton Supprimer filtre
dim oForm as object
	oForm = oEv.Source.Model.Parent
	oForm.ApplyFilter = False
	oForm.getByname("cmdSupFiltre").EnableVisible = False
	oForm.reload()
end sub
Le Bouton Par signet.
Créer une copie(resultset) des enregistrements du formulaire à ouvrir.
Recherche la valeur sélectionnée dans le champs de la copie correspondant à la liste.
Une fois trouvé, défini le signet du formulaire à celui de l'enregistrement de la copie.
Le formulaire une fois ouvert contient tous les enregistrements et permet la navigation.

Code : Tout sélectionner

Sub PositionParSignet(oEv as Object)
Dim oForm as Object, ctrlListeChoix as Object, NouveauFormulaire as Object
Dim ValeurChoix as String, nomFormulaire As String
Dim Enregistrements as Object, EnregistrementEnCours as object
dim Cherche as String, Trouve as Boolean
	oForm = oEv.Source.Model.Parent	
	ctrlListeChoix = oForm.getByName("lstChoix")
	If ctrlListechoix.CurrentValue<>"" then		
		ValeurChoix = ctrlListeChoix.CurrentValue
	Else
		msgbox ("Vous devez sélectionner une entrée dans la Zone de liste",64,"Ouverture formulaire sur enregistrement")
		Exit sub
	End If		
	nomFormulaire = oEv.Source.Model.Tag
	NouveauFormulaire = OuvrirFormulaire(nomFormulaire)
	NouveauFormulaire = NouveauFormulaire.DrawPage.Forms.getByName(nomFormulaire)
'attend que le nouveau formulaire soit ouvert	
	Do while NouveauFormulaire.isLoaded = false
	Loop
'Créer un clone(resultset) des enregistrement du formulaire	
	Enregistrements = NouveauFormulaire.createResultSet()
'défini le critère de recherche	
	Cherche = ValeurChoix
'se déplace avant le premier enregistrement	
	Enregistrements.beforeFirst
'Précise qu'il n'a pas trouvé	
	Trouve = false
'Boucle sur les enregistrements du resultset
'tant qu'il existe des enregistrements et que le critère n'est pas trouvé dans la colonne Enregistrement	
	do while Enregistrements.next() and Trouve = false
		EnregistrementEnCours = Enregistrements.columns.getByName("Enregistrement")
's'il trouve l'enregistrement précise qu'il a trouve		
		if EnregistrementEnCours.String = Cherche then
			Trouve = true
'Sort de la boucle			
			exit do
		end if	
	loop
'si l'enregistrement a été trouvé aligne le signet du formulaire sur celui du resultset	
	if Trouve = true then
		NouveauFormulaire.moveToBookmark(Enregistrements.Bookmark)
	else
'si à la fin de la boucle, l'enregistrement n'est pas trouvé affiche un message	
		msgbox("Enregistrement non trouvé", 64, "Ouverture formulaire sur enregistrement")
	end if	
end sub
Le Bouton Nouvel enregistrement.
Positionne le jeu d'enregistrements du formulaire sur un Nouvel enregistrement.

Code : Tout sélectionner

Sub PositionNouveau(oEv as Object)
Dim NouveauFormulaire as Object
Dim nomFormulaire As String
'même procédé pour ouvrir le formulaire
	nomFormulaire = oEv.Source.Model.Tag
	NouveauFormulaire = OuvrirFormulaire(nomFormulaire)
	NouveauFormulaire = NouveauFormulaire.DrawPage.Forms.getByName(nomFormulaire)
'attend que le formulaire soit chargé	
	Do while NouveauFormulaire.isLoaded = false
	Loop
		with NouveauFormulaire
'se positionne sur un nouvel enregistrement		
		.moveToInsertRow
	End with
end sub
Quelques liens pour aller plus loin.
http://user.services.openoffice.org/fr/ ... 29&t=14662
http://user.services.openoffice.org/fr/ ... =15&t=6367
OuvertureFormSurEnr.odb
(24.35 Kio) Téléchargé 2133 fois
A+


Comme indiqué sur le bandeau rouge en haut de la page :
Toute question relative à ce sujet devra obligatoirement être posée en section MACROS ET API et non à la suite de ce message.
Répondre