Contenu

# SFDocuments. Service Form

Le service Form fournit des méthodes et des propriétés pour gérer les formulaires dans les documents LibreOffice. Ce service prend en charge les formulaires dans les documents Base, Calc et Writer et permet de :

- Ouvrir et activer des formulaires.

- Naviguer à travers des enregistrements affichés par le formulaire.

- Avoir accès aux contrôles dans le formulaire.

- Avoir accès aux sous-formulaires d'un formulaire parent.

Le service SFDocuments.Form est disponible à partir de LibreOffice 7.2.

Les formulaires sont généralement utilisés dans les documents LibreOffice pour créer des interfaces utilisateur connectées à des bases de données relationnelles. Par conséquent, le service Form fournit un accès rapide à la base de données liée via le service SFDatabases.Database.

Le service SFDocuments.Form est étroitement lié au service SFDocuments.FormControl.

## Définitions

### FormDocument

Les formulaires sont généralement créés dans les documents Base, mais ils peuvent également être ajoutés aux documents Writer et Calc.

Dans Base, chaque formulaire que vous créez à l'aide de la fonctionnalité Insérer - Formulaire ou via l'Assistant de formulaire est en fait un FormDocument qui peut être géré avec le service Form. Les documents de base peuvent contenir un nombre illimité de documents de formulaire.

Ci-dessous, un exemple montrant la hiérarchie de tous les éléments impliqués dans l'accès aux formulaires et sous-formulaires dans un document Base. Supposons que vous ayez un fichier Base nommé Employees.odb et qu'à l'intérieur vous ayez créé un document de formulaire pour ajouter de nouveaux employés à la base de données. Le document de formulaire contient un formulaire principal nommé EmployeeData qui donne accès à une table. Il existe également un sous-formulaire WorksAtPlant qui permet d'associer le nouvel employé à l'une des usines de l'entreprise.

        Employees.odb (document Base)
         |
         |-- AddEmployee (FormDocument)
              |
              |-- EmployeeData (formulaire principal)
                   |
                   |-- WorksAtPlant (SubForm)

Un FormDocument peut être considéré comme un ensemble de formulaires permettant d'accéder à des ensembles de données tels que des tables de base de données et des requêtes à partir de documents LibreOffice. Les noms des formulaires et des sous-formulaires à l'intérieur d'un FormDocument sont accessibles à l'aide du Navigateur de formulaires.

### Formulaires et sous-formulaires

Un document de formulaire est composé d'un ou plusieurs formulaires qui, à leur tour, peuvent également contenir n'importe quel nombre de sous-formulaires. Un formulaire est un ensemble abstrait de contrôles liés à une source de données spécifiée, qui peut être une table de base de données, une requête ou une instruction SQL SELECT.

Dans les documents Calc et Writer, chaque formulaire peut être lié à des ensembles de données situés dans différentes bases de données. En revanche, dans les documents Base, la base de données contenue dans le document est commune à tous les formulaires.

Pour invoquer le service SFDocuments.Form reportez-vous aux méthodes Forms(), FormDocuments() et OpenFormDocument() du service SFDocuments.Document

## Invocation du service

Avant d'utiliser le service Form, la bibliothèque ScriptForge doit être chargée ou importée :

• Les macros Basic nécessitent de charger la bibliothèque ScriptForge à l'aide de l'instruction suivante :
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Les scripts Python nécessitent un import depuis le module scriptforge :
from scriptforge import CreateScriptService

### Dans les documents Writer

L'extrait de code ci-dessous montre comment accéder au formulaire nommé Form1 qui se trouve dans un fichier Writer :

          Dim oDoc As Object, myForm As Object, ui as Object
          Set ui = CreateScriptService("UI")
          Set oDoc = ui.OpenDocument("/home/user/Documents/MyForm.odt")
          Set myForm = oDoc.Forms("Form1")

##### En Python

         from scriptforge import CreateScriptService
         ui = CreateScriptService('UI')
         doc = ui.OpenDocument('/home/user/Documents/MyForm.odt')
         my_form = doc.Forms('Form1')

Les formulaires sont accessibles par leurs noms ou par leurs indices, comme indiqué ci-dessous :

         Set myForm = oDoc.Forms(0)

##### En Python

         my_form = doc.Forms(0)

Si vous essayez d'accéder à un FormDocument qui est actuellement ouvert en Mode Ébauche une exception sera déclenchée.

### Dans les documents Calc

Un formulaire dans un fichier Calc doit avoir un nom unique dans sa feuille. Par conséquent, la méthode Forms nécessite deux arguments, le premier indiquant le nom de la feuille et le second spécifiant le nom du formulaire.

          Dim oDoc As Object, myForm As Object, ui as Object
          Set ui = CreateScriptService("UI")
          Set oDoc = ui.OpenDocument("/home/user/Documents/MyForms.ods")
          Set myForm = oDoc.Forms("Sheet1", "Form1")

Ceci est réalisé de manière identique en utilisant Python :

         ui = CreateScriptService('UI')
         doc = ui.OpenDocument('/home/user/Documents/MyForms.ods')
         my_form = doc.Forms('Sheet1', 'Form1')

### Dans les documents Base

Un FormDocument à l'intérieur d'un document Base est accessible par son nom. L'exemple suivant ouvre le document de formulaire nommé thisFormDocument et accède au formulaire MainForm :

          Dim oDb As Object, myForm As Object
          Set oDb = CreateScriptService("SFDocuments.Document", ThisDatabaseDocument)
          ' L'instruction ci-dessous n'est nécessaire que si le formulaire n'a pas encore été ouvert
          oDb.OpenFormDocument("thisFormDocument")
          Set myForm = oDoc.Forms("thisFormDocument", "MainForm")
          ' Ou, alternativement, pour accéder au formulaire par son index...
          Set myForm = oDb.Forms("thisFormDocument", 0)

Pour effectuer une action sur un formulaire à l'aide du service Form, le FormDocument doit avoir été ouvert manuellement par l'utilisateur ou par programmation dans un script utilisateur. Cette ouverture peut être effectuée en appelant la méthode OpenFormDocument du service Base .

Pour accéder à un sous-formulaire donné d'un formulaire, utilisez la méthode SubForms. Notez que dans l'exemple ci-dessous mySubForm est une nouvelle instance du service Form.

         Dim mySubForm As Object
         Set mySubForm = myForm.SubForms("mySubForm")

Les exemples précédents se traduisent en Python par :

         db = CreateScriptService('SFDocuments.Document', XSCRIPTCONTEXT.getDocument())
         # L'instruction ci-dessous n'est nécessaire que si le formulaire n'a pas encore été ouvert
         form_doc = db.OpenFormDocument('thisFormDocument')
         form = form_doc.Forms('thisFormDocument', 'MainForm')
         #   Ou, alternativement, pour accéder au formulaire par son index...
         form = form_doc.Forms('thisFormDocument', 0)
         sub_form = form.SubForms('mySubForm')

### Dans les événements Form

Pour invoquer les service Form lorsqu'un événement de formulaire prend place :

          Sub OnEvent(ByRef poEvent As Object)
              Dim myForm As Object
              Set myForm = CreateScriptService("SFDocuments.FormEvent", poEvent)
              '(...)
          End sub

##### En Python

         def OnEvent(event: uno):
             form = CreateScriptService('SFDocuments.FormEvent', event)
             pass

Le service FormEvent est utilisé exclusivement pour créer des instances des services SFDocuments.Form et SFDocuments.FormControl lorsqu'un événement de formulaire ou de contrôle a lieu.

Il est recommandé de libérer des ressources après utilisation du service Form.

         myForm.Dispose() ' Basic

         form.Dispose()  # Python

Cette opération est effectuée implicitement lorsqu'un document de formulaire est fermé avec la méthode CloseFormDocument() décrite ci-dessous.

## Propriétés

Nom | Lecture seule | Type | Description
--- | --- | --- | ---
AllowDeletes | Non | Boolean | Spécifie si le formulaire autorise la suppression d'enregistrements.
AllowInserts | Non | Boolean | Spécifie si le formulaire autorise l'ajout d'enregistrements.
AllowUpdates | Non | Boolean | Spécifie si le formulaire autorise l'actualisation des enregistrements.
BaseForm | Oui | String | Spécifie le nom hiérarchique du formulaire Base contenant le formulaire réel.
Bookmark | Non | Variant | Spécifie de manière unique l'enregistrement actuel de la table, de la requête ou de l'instruction SQL sous-jacente du formulaire.
CurrentRecord | Non | Long | Identifie l'enregistrement actuel dans l'ensemble de données affiché sur un formulaire. Si le numéro de ligne est positif, le curseur se déplace vers le numéro de ligne donné par rapport au début du jeu de résultats. Le nombre de lignes commence à 1. Si le numéro de ligne donné est négatif, le curseur se déplace vers une position de ligne absolue par rapport à la fin du jeu de résultats. La ligne -1 fait référence à la dernière ligne du jeu de résultats.
Filter | Non | String | Spécifie un sous-ensemble d'enregistrements à afficher sous la forme d'une clause SQL WHERE sans le mot-clé WHERE.
LinkChildFields | Oui | String | Spécifie comment les enregistrements d'un sous-formulaire enfant sont liés aux enregistrements de son formulaire parent.
LinkParentFields | Oui | String | Spécifie comment les enregistrements d'un sous-formulaire enfant sont liés aux enregistrements de son formulaire parent.
Name | Oui | String | Le nom du formulaire actif.
OrderBy | Non | String | Spécifie dans quel ordre les enregistrements doivent être affichés en tant que clause SQL ORDER BY sans les mots clés ORDER BY.
Parent | Oui | Object | Le parent du formulaire actuel. Il peut s'agir d'un objet SFDocuments.Form ou d'un objet SFDocuments.Document.
RecordSource | Non | String | Spécifie la source des données, sous la forme d'un nom de table, d'un nom de requête ou d'une instruction SQL.
XForm | Oui | Objet UNO | L'objet UNO représentant les interactions avec le formulaire. Reportez-vous à XForm et DataForm dans la documentation de l'API pour des informations détaillées.

## Propriétés de l'événement

Les propriétés ci-dessous renvoient ou définissent des chaînes URI qui définissent le script déclenché par l'événement.

Nom | Lecture seule | Description Basic EDI
--- | --- | ---
OnApproveCursorMove | Non | Avant le changement d'enregistrement
OnApproveParameter | Non | Remplir les paramètres
OnApproveReset | Non | Avant de rétablir
OnApproveRowChange | Non | Avant l'action d'enregistrement
OnApproveSubmit | Non | Avant l'envoi
OnConfirmDelete | Non | Confirmer la suppression
OnCursorMoved | Non | Après le changement d'enregistrement
OnErrorOccurred | Non | Erreur survenue
OnLoaded | Non | Lors du chargement
OnReloaded | Non | Lors du rechargement
OnReloading | Non | Avant le rechargement
OnResetted | Non | Après le rétablissement
OnRowChanged | Non | Après l'action d'enregistrement
OnUnloaded | Non | Lors du déchargement
OnUnloading | Non | Avant le déchargement

Pour en savoir plus sur les chaînes URI, reportez-vous à la Spécification de l'URI du cadre de script.

Liste des méthodes dans le service Form
Activate CloseFormDocument Controls GetDatabase | MoveFirst MoveLast MoveNext MoveNew | MovePrevious Requery SubForms

## Activate

Définit le focus sur l'instance actuelle de Form. Renvoie True si la mise au point a réussi.

Le comportement de la méthode Activate dépend du type de document où se trouve le formulaire :

- Dans les documents Writer : définit le focus sur ce document.

- Dans les documents Calc : définit le focus sur la feuille à laquelle appartient le formulaire.

- Dans les documents Base : définit le focus sur FormDocument auquel Form fait référence.

### Syntaxe :

svc.Activate(): bool

### Exemple :

L'exemple suivant suppose que vous souhaitez activer le formulaire nommé FormA situé dans Sheet1 du fichier Calc actuellement ouvert. Il obtient d'abord l'accès au document à l'aide du service Document et de ThisComponent, puis active le formulaire.

         'Prend en main le formulaire qui sera activé
         Dim oDoc as Object, myForm as Object
         Set oDoc = CreateScriptService("Document", ThisComponent)
         Set myForm = oDoc.Forms("Sheet1", "FormA")
         'Active le formulaire
         myForm.Activate()

##### En Python

         doc = CreateScriptService('Document', XSCRIPTCONTEXT.getDocument())
         form = doc.Forms('Sheet1', 'FormA')
         form.Activate()

ThisComponent s'applique aux documents Calc et Writer. Pour les documents Base, utilisez ThisDataBaseDocument.

## CloseFormDocument

Ferme le document de formulaire contenant l'instance réelle de Form. L'instance Form est supprimée.

### Syntaxe :

svc.CloseFormDocument(): bool

### Exemple :

          myForm.CloseFormDocument() ' Basic

##### En Python

          form.CloseFormDocument()  # Python

Cette méthode ne ferme que les documents de formulaire situés dans les documents Base. Si le formulaire est stocké dans un document Writer ou Calc, appeler CloseFormDocument n'aura aucun effet.

## Controls

La valeur renvoyée par la méthode Controls dépend des arguments fournis :

- Si la méthode est appelée sans arguments, alors elle retourne la liste des champs contenus dans le formulaire. Sachez que la liste renvoyée ne contient aucun contrôle de sous-formulaire.

- Si l'argument facultatif ControlName est fourni, la méthode renvoie une instance de classe FormControl faisant référence au contrôle spécifié.

### Syntaxe :

svc.Controls(opt controlname: str): any

### Paramètres :

controlname : un nom de contrôle valide sous forme de chaîne sensible à la casse. S'il est absent, la liste des noms de contrôle est renvoyée sous la forme d'une matrice de base zéro.

### Exemple :

          Dim myForm As Object, myList As Variant, myControl As Object
          Set myForm = myDoc.Forms("myForm")
          myList = myform.Controls()
          Set myControl = myform.Controls("myTextBox") ' SFDocuments.FormControl

##### En Python

          form = doc.Forms('myForm')
          form_names = form.Controls()
          form_control = form.Controls('myTextBox')  # SFDocuments.FormControl

## GetDatabase

Renvoie une instance SFDatabases.Database donnant accès à l'exécution des commandes SQL sur la base de données à laquelle le formulaire actif est connecté et/ou qui est stocké dans le document Base actif.

Chaque formulaire a sa propre connexion à la base de données, sauf dans les documents Base où ils partagent tous la même connexion.

### Syntaxe :

svc.GetDatabase(opt user: str, opt password: str): svc

### Paramètres :

user, password : Les paramètres optionnels de connexion (par défaut = "").

### Exemple :

          Dim myDb As Object ' SFDatabases.Database
          Set myDb = oForm.GetDatabase()

##### En Python

          db = form.GetDatabase()  # SFDatabases.Database

## MoveFirst

Le curseur de formulaire est positionné sur le premier enregistrement. Renvoie True en cas de succès.

### Syntaxe :

svc.MoveFirst(): bool

### Exemple :

          myForm.MoveFirst() ' Basic

##### En Python

          form.MoveFirst()  # Python

## MoveLast

Le curseur de formulaire est positionné sur le dernier enregistrement. Renvoie True en cas de succès.

### Syntaxe :

svc.MoveLast(): bool

### Exemple :

          myForm.MoveLast() ' Basic

##### En Python

          form.MoveLast()  # Python

## MoveNew

Le curseur de formulaire est positionné sur la nouvelle zone d'enregistrement. Renvoie True en cas de succès.

### Syntaxe :

svc.MoveNew(): bool

### Exemple :

          myForm.MoveNew() ' Basic

##### En Python

          form.MoveNew()  # Python

## MoveNext

Le curseur de formulaire est positionné sur l'enregistrement suivant. Renvoie True en cas de succès.

### Syntaxe :

svc.MoveNext(opt offset: int): bool

### Paramètres :

offset : le nombre d'enregistrements à avancer (par défaut = 1).

### Exemple :

          myForm.MoveNext() ' Basic

##### En Python

          form.MoveNext()  # Python

## MovePrevious

Le curseur de formulaire est positionné sur l'enregistrement précédent. Renvoie True en cas de succès.

### Syntaxe :

svc.MovePrevious(opt offset: int): bool

### Paramètres :

offset : le nombre d'enregistrements à reculer (par défaut = 1).

### Exemple :

          myForm.MovePrevious() ' Basic

          form.MovePrevious()  # Python

## Requery

Recharge les données actuelles de la base de données et actualise le formulaire. Le curseur est positionné sur le premier enregistrement. Renvoie True en cas de succès.

### Syntaxe :

svc.Requery(): bool

### Exemple :

          myForm.Requery() ' Basic

##### En Python

          form.Requery()  # Python

## Subforms

La valeur renvoyée par la méthode Subforms dépend des arguments fournis :

- Si la méthode est appelée sans aucun argument, alors elle renvoie la liste des sous-formulaires contenus dans le formulaire ou l'instance de sous-formulaire en cours.

- Si l'argument facultatif subform est fourni, la méthode renvoie une nouvelle instance SFDocuments.Form basée sur le nom ou l'index du formulaire/sous-formulaire spécifié.

### Syntaxe :

svc.Subforms(): str[0..*]

svc.Subforms(subform: str): svc

svc.Subforms(subform: int): svc

### Paramètres :

sous-formulaire : un sous-formulaire stocké dans l'instance actuelle de la classe Form donnée par son nom ou son index.

Lorsque cet argument est absent, la méthode renvoie une liste des sous-formulaires disponibles sous la forme d'une matrice de base zéro. Si le formulaire a un seul sous-formulaire, vous pouvez définir subform = 0 pour y accéder.

### Exemple :

          Dim myForm As Object, myList As Variant, mySubform As Object
          myList = myform.Subforms()
          Set mySubform = myForm.Subforms("mySubform") ' SFDocuments.Form

##### En Python

          subform_names = form.Subforms()
         subform = form.Subforms('mySubform')  # SFDocuments.Form

Toutes les routines ou identifiants de base ScriptForge qui sont préfixés par un caractère de soulignement "_" sont réservés à un usage interne. Ils ne sont pas destinés à être utilisés dans des macros de base ou des scripts Python.

Rubriques connexes

SFDatabases.Database

Service SFDocuments.Document

Service ScriptForge.UI