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

[Base] Ouverture et fermeture de formulaire

Messagepar Dude » 14 Déc 2006 16:20

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/ci-joint/fichier/2007/07/20-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 édition par Dude le 07 Juil 2009 15:04, édité 2 fois.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20868
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

[Base] Ouvrir un formulaire

Messagepar jpfor17 » 30 Nov 2007 14:07

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/ci-joint/fichier/2007/11/30-020428.pdf


Merci Dude
Version 2.3
Windows XP
jpfor17
Fraîchement OOthentifié
 
Message(s) : 3
Inscrit le : 23 Nov 2007 13:56

Re: [Base] Ouverture et fermeture de formulaire

Messagepar Domm » 26 Mai 2008 00:57

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   AgrandirRéduire
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é 2272 fois
Dernière édition par Domm le 31 Mai 2008 05:07, édité 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
Avatar de l’utilisateur
Domm
Membre lOOyal
Membre lOOyal
 
Message(s) : 44
Inscrit le : 22 Sep 2006 18:52
Localisation : Lille (59)

Re: [Base] Ouverture et fermeture de formulaire

Messagepar ThierryM » 09 Sep 2008 12:02

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/forum/viewtopic.php?f=8&t=11810) .
Ce code a été trouvé sur http://www.oooforum.org/forum/viewtopic.phtml?p=272290#272290 fourni par Evgenych.

Code : Tout sélectionner   AgrandirRéduire
    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 édition par Oukcha le 06 Juil 2009 11:05, édité 1 fois.
Raison: Suppression citation modérateur
ThierryM
Membre cOOnverti
Membre cOOnverti
 
Message(s) : 383
Inscrit le : 26 Nov 2006 12:29
Localisation : Les Corbières

Re: [Base] Ouverture et fermeture de formulaire

Messagepar ThierryM » 06 Juil 2009 08:58

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   AgrandirRéduire
ThisDatabaseDocument.FormDocuments.getByName( "NomFormulaire" ).open

Même chose pour fermer un formulaire :
Code : Tout sélectionner   AgrandirRéduire
ThisDatabaseDocument.FormDocuments.getByName( "NomFormulaire" ).close

Quelle simplification ! Attention ce n'est valable que depuis la version 3.1 d'OOo !
Dernière édition par Oukcha le 14 Août 2009 20:47, édité 2 fois.
Raison: Suppression citation modérateur
LibreOffice Version: 6.0.7.3 version ubuntu / Ubuntu Trusty 18.04 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre cOOnverti
Membre cOOnverti
 
Message(s) : 383
Inscrit le : 26 Nov 2006 12:29
Localisation : Les Corbières

Re: [Base] Ouverture et fermeture de formulaire

Messagepar sebmdp » 14 Août 2009 10:04

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   AgrandirRéduire
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 édition par Bidouille le 11 Sep 2009 13:42, édité 4 fois.
Raison: Suppression citation modérateur
Open Office 3.2.1
Mac OS 10.5.8
sebmdp
Membre hOOnoraire
Membre hOOnoraire
 
Message(s) : 125
Inscrit le : 08 Juil 2008 17:31
Localisation : Orleans / France

Re: [Base] Ouverture et fermeture de formulaire

Messagepar cathala » 11 Sep 2009 12:41

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é 1965 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 édition par Bidouille le 11 Sep 2009 13:43, édité 1 fois.
Raison: Insertion citation
Windows 7 PRO Libre Office 4.1.3.2
Si je peu aider je n'hésite pas
cathala
Membre hOOnoraire
Membre hOOnoraire
 
Message(s) : 133
Inscrit le : 12 Déc 2007 14:42

Re: [Base] Ouverture et fermeture de formulaire

Messagepar DjangoSwing » 07 Jan 2010 13:48

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   AgrandirRéduire
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
DjangoSwing
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 17
Inscrit le : 15 Déc 2009 10:33

Principe d'ouverture et fermeture de formulaire

Messagepar Piaf » 17 Fév 2012 17:51

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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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:
http://user.services.openoffice.org/fr/forum/viewtopic.php?f=15&t=6355
http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=31953&p=175607&hilit=ouverture+formulaire#p175682
http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=31895&p=175379&hilit=ouverture+formulaire#p175333
http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=29822&p=166043&hilit=ouverture+formulaire#p163799
A+
Pièces jointes
OvertureFermeture.odb
(20.92 Kio) Téléchargé 1188 fois
Dernière édition par Piaf le 20 Fév 2012 11:50, édité 1 fois.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Piaf
GourOOu
GourOOu
 
Message(s) : 5622
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane

Ouverture d'un formulaire sur un enregistrement

Messagepar Piaf » 19 Fév 2012 12:05

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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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/forum/viewtopic.php?f=29&t=14662
http://user.services.openoffice.org/fr/forum/viewtopic.php?f=15&t=6367

OuvertureFormSurEnr.odb
(24.35 Kio) Téléchargé 1536 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.
Piaf
GourOOu
GourOOu
 
Message(s) : 5622
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane


Retour vers Suprême de code

Qui est en ligne ?

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