Page 1 sur 1

[Résolu][Base] Enregistrer et fermer un formulaire

Publié : 05 sept. 2008 21:52
par ThierryM
Bonjour à tous,
Je travaille avec une base de données. J'utilise une table qui me permet de stocker des paramètres, il n'y donc qu'un seul enregistrement dans cette table. J'interagis sur cette table via un formulaire. Je veux une fois que j'ai modifié un paramètre (valeur d'un champ) pouvoir enregistrer et fermer ce formulaire via un seul bouton. Actuellement je suis obliger d'utiliser la croix de fermeture et évidemment une boîte de dialogue s'ouvre me demandant si je veux enregistrer les modifications, ce que je fais : ce n'est vraiment pas ergonomique.
J'ai donc créé un bouton auquel je voulais assigner une action du type "valider" (comme dans une boîte de dialogue) mais ce type d'action n'existe pas. Il faut donc que j'y assigne une macro combinant l'action "enregistrer" puis "fermer". Je sais fermer un formulaire par contre comment faire pour l'enregistrer ?
J'ai cherché sur le web et je n'ai trouvé aucune macro qui pourrait convenir (il y a eu une question similaire sur le forum en 2006 mais sans réponse : http://user.services.openoffice.org/fr/ ... 651#p18651).
Pourriez-vous m'éclairer ?
Merci pour vos réponses.

Thierry

Re: [Base] Macro pour enregistrer et fermer un formulaire

Publié : 06 sept. 2008 11:19
par Pierre-Yves Samyn
Bonjour

Code : Tout sélectionner

option explicit

Sub PysFermer(PysEvent)

PysEvent.source.model.parent.updateRow
thiscomponent.currentController.Frame.close(true)

End Sub

Re: [Base] Macro pour enregistrer et fermer un formulaire

Publié : 06 sept. 2008 11:29
par ThierryM
Merci Pierre-Yves,
Je viens de trouver dans la partie "Suprême de code" un post de Dude concernant l'ouverture et la fermeture de formulaire : http://user.services.openoffice.org/fr/ ... =15&t=6355 mais il semblerait qu'il manque la macro permettant justement de quitter un formulaire dans la base exemple de Dude.
J'applique (une fois de plus) ta macro et te tiens au courant.
À bientôt,

Thierry

Rajout : il semblerait que cela soit une issue http://user.services.openoffice.org/en/ ... =20&t=7750

Re: [Base] Macro pour enregistrer et fermer un formulaire

Publié : 06 sept. 2008 11:50
par ThierryM
Resalut Pierre-Yves,
Je viens de tester ta macro. Pas de problème au premier enregistrement. Par contre quand je réouvre mon formulaire "Paramétrage", j'ai mes zones de listes qui ont leur contenu écrit avec des caractères sur un fond bleu et lorsque je clique à nouveau sur le bouton, j'obtiens un message d'erreur comme quoi il n'y a pas de script (No Script).
Ci-joint une base exemple simplifiée :
BD_Ecole_simplifiée_quitterForm.odb

Re: [Base] Macro pour enregistrer et fermer un formulaire

Publié : 06 sept. 2008 13:45
par ThierryM
Je viens de trouver quelques éclaircissements ici : http://www.oooforum.org/forum/viewtopic ... 564#288564.
En fait, il semblerait qu'il y ait un problème avec ThisComponent...
Voilà le code proposé sur le lien ci-dessus (à adapter et à tester) :

Code : Tout sélectionner

function OpenForm( formContainer as variant, oConnection as variant, sFormName as string) as variant
   Dim aProp(1) As New com.sun.star.beans.PropertyValue
   aProp(0).Name = "ActiveConnection"
   aProp(0).Value = oConnection
   aProp(1).Name = "OpenMode"
   aProp(1).Value = "open"

   OpenForm = formContainer.loadComponentFromURL(sFormName,"_blank",0,aProp())
end function

function getFormsTC() as variant
   getFormsTC = thisComponent.Parent.getFormDocuments
end function

function getConnectionTC() as variant
   getConnectionTC = thisComponent.Drawpage.Forms(0).ActiveConnection
end function

sub OpenClienten ( oev as variant )
     sFormName = "Cliënten"
   OpenForm( getFormsTC, getConnectionTC, sFormName )
   thisComponent.parent.FormDocuments.getByName(curFormName (thisComponent)).dispose()
end sub

sub OpenRelaties ( oev as variant )
     sFormName = "Relaties"
   OpenForm( getFormsTC, getConnectionTC, sFormName )
   thisComponent.parent.FormDocuments.getByName(curFormName (thisComponent)).dispose()
end sub


sub OpenFinancien ( oev as variant )
     sFormName = "Financiën"
   OpenForm( getFormsTC, getConnectionTC, sFormName )
   thisComponent.parent.FormDocuments.getByName(curFormName (thisComponent)).dispose()
end sub


sub OpenInstellingen ( oev as variant )
     sFormName = "Instellingen"
   OpenForm( getFormsTC, getConnectionTC, sFormName )
   thisComponent.parent.FormDocuments.getByName(curFormName (thisComponent)).dispose()
end sub
Si on regarde chaque macro ouvre un formulaire (à l'aide de 3 fonctions définies en premier)... et elle le ferme aussi (ce que je ne comprends pas) avec

Code : Tout sélectionner

thisComponent.parent.FormDocuments.getByName(curFormName (thisComponent)).dispose()
 Ajout :  En fait,

Code : Tout sélectionner

thisComponent.parent.FormDocuments.getByName(curFormName (thisComponent)).dispose()
est à dissocier de la macro d'ouverture du formulaire.

J'ai trouvé la fonction "curFormName" manquante :

Code : Tout sélectionner

function curFormName (o as object) as string
   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 
Thierry 

Re: [Base] Macro pour enregistrer et fermer un formulaire

Publié : 06 sept. 2008 16:33
par Bidouille
On vous rappelle que le terme "Macro" est implicite et n'a pas besoin d'être mentionné.

Merci de ne pas poster plusieurs messages à la suite !
Le bouton "Editer" à la droite du message permet d'y remédier.

Re: [Base] Enregistrer et fermer un formulaire

Publié : 06 sept. 2008 18:40
par ThierryM
Ça y est j'ai pu contourner le problème.
En fait en fermant le formulaire par le biais du currentcontroller.frame, il y a un problème lorsque l'on recharge le formulaire fermé de cette façon.
Voici donc le code 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
Peut-être pourrait-on le mettre en "suprême de code" ?
À bientôt,

Thierry

Re: [Résolu][Base] Enregistrer et fermer un formulaire

Publié : 03 juin 2016 12:23
par tiago972
Bonjour à tous,

Je rencontre un petit problème avec la macro présentée par Thierry : quand j'utilise

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 = "PECM" then 
              curFormName = args(i).value
                 exit for
              end if
           next
    End Function
J'ai une erreur qui s'affiche me disant que "l'argument n'est pas facultatif" en me sélectionnant le args= 0.getArgs

Quelqu'un aurait une idée?

Merci beaucoup,

Tiago

Re: [Résolu][Base] Enregistrer et fermer un formulaire

Publié : 03 juin 2016 12:27
par MrPropre
Ami fossoyeur,

Pas de déterrage, surtout d'un fil marqué résolu.