Page 1 sur 1

[Base] Ouverture et fermeture de formulaire

MessagePublié: 14 Déc 2006 16:20
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/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:

[Base] Ouvrir un formulaire

MessagePublié: 30 Nov 2007 14:07
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/ci-joint/fichier/2007/11/30-020428.pdf


Merci Dude

Re: [Base] Ouverture et fermeture de formulaire

MessagePublié: 26 Mai 2008 00:57
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   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

Re: [Base] Ouverture et fermeture de formulaire

MessagePublié: 09 Sep 2008 12:02
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/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

Re: [Base] Ouverture et fermeture de formulaire

MessagePublié: 06 Juil 2009 08:58
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   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 !

Re: [Base] Ouverture et fermeture de formulaire

MessagePublié: 14 Août 2009 10:04
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   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

Re: [Base] Ouverture et fermeture de formulaire

MessagePublié: 11 Sep 2009 12:41
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é 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.

Re: [Base] Ouverture et fermeture de formulaire

MessagePublié: 07 Jan 2010 13:48
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   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 !

Principe d'ouverture et fermeture de formulaire

MessagePublié: 17 Fév 2012 17:51
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   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+

Ouverture d'un formulaire sur un enregistrement

MessagePublié: 19 Fév 2012 12:05
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   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.