Date: prev next · Thread: first prev next last
2018 Archives by date, by thread · List index


Hello Jean-François,

Moi, ce qui m'intéresserait est de savoir où tu vas pêcher tout ça ! Car, là, ça ne s'improvise 
plus…

;-)

Thierry



Le 29 mars 2018 à 23:00, Jean-Francois Nifenecker <jean-francois.nifenecker@laposte.net> a écrit :

Bonsoir,

(j'ai un pb avec les listes : je reçois les messages avec un "certain" retard...)

Le 29/03/2018 à 15:13, jmpniort@laposte.net a écrit :
Bonjour,
Une autre possibilité, insérer des champs d'une Base de données dans la
quelle ont été entrées les coordonnées des Maitres d'ouvrage.
Documents 1, 2 etc sont connectés à cette Base de données.
Pour afficher l'enregistrement d'un chantier particulier, faire Ctrl+F4
pour visualiser la Table, sélectionner l'enregistrement puis imprimer
(après avoir éventuellement cliqué sur l"icône Données dans les champs
si on veut être sûr de sa sélection).


... et je n'ai toujours pas reçu votre message cité par Jean-Mi...

Bonjour,
merci pour votre réponse. Celle ci sous entends d'utiliser la programmation
dans libreoffice.
Dans ma question, j'ai précisé la manière de créer les variables via le
menu Champs, Variables, définir une variable, dans Writer, et je souhaite
ne pas avoir à programmer, simplement déclarer une variable.
Un exemple :
dans le document 1, crée à partir d'un modèle contenant une variable
"maitredouvrage" et une variable "adrMO", je définie la valeur de
"maitredouvrage à  "M Duchemole", et celle de "adrMO" à "Av Gen de Gaulle
Paris" et je souhaite que dans le document 2 , créer à partir d'un autre
modèle qui contient aussi ces variables, les voir prendre pour valeur "M
Duchemole" et "Av Gen de Gaule Paris".
Si cela n'est pas possible sans programmer, mais possible en programmant,
je suis aussi preneur ! (en langage libreoffice ou python).

Argh ! Je n'avais pas bien lu /o\

En dehors de la proposition de Jean-Michel, je ne vois qu'une macro pour injecter les champs 
d'utilisateur (c'est comme ça que ça s'appelle) d'un document vers un autre.

Voici les primitives que j'utilise (la doc est dans le code) :

8< -----------------------------------------------------

Public Const MFLD_USERSERVICE  = "com.sun.star.text.fieldmaster.User."
Public Const MFLD_USERINSTANCE = "com.sun.star.text.fieldmaster.User"

'masterfield type identifiers
Public Const MFLD_TYPEUSERID  = ".User."

'------------------

Function ExportMasterFields(ByRef pTargetDoc As Object, Optional pSourceDoc As Object) As Boolean
'Exports user fields to some other Writer document.
'Input:
'-- pTargetDoc: the target Writer document
'-- pSourceDoc: (optional) the source document.
'               Defaults to the current document.
'Output: True if the process went well, otherwise False

      Dim lo_MastersSrc As Object             'the masterfields container in the source document
      Dim l_MasterName As String              'the current masterfield name
      Dim l_Value As Variant                  'the current masterfield value
      Dim l_OK As Boolean                             'the process flag
      Dim i As Long
      
      l_OK = False
      If IsMissing(pSourceDoc) Then pSourceDoc = ThisComponent

      On Local Error Goto FuncEnd:

      lo_MastersSrc = pSourceDoc.TextFieldMasters
      For i = LBound(lo_MastersSrc.ElementNames()) To UBound(lo_MastersSrc.ElementNames())
              l_MasterName = lo_MastersSrc.ElementNames(i)
              'we just export users' masterfields (but not sequence fields)
              If IsMasterFieldUser(l_MasterName) Then
                      'read the masterfield name in the source document
                      l_MasterName = GetMasterFieldNameOnly(l_MasterName)
                      'get its value
                      l_Value = GetMasterFieldValue(l_MasterName, pSourceDoc)
                      'create it within the target document
                      CreateMasterField(l_MasterName, l_Value, pTargetDoc)
              End If
      Next
      l_OK = True
      
      FuncEnd:
      ExportMasterFields = l_OK
End Function 'ExportMasterFields

Function CreateMasterField(ByRef pFieldName As String, Optional pValue As Variant, Optional pDoc 
As Object) As Boolean
'Creates a user field (aka MasterField in a Writer document).
'Input:
'-- pFieldName: the master field name
'-- pValue: if provided, sets the initial value for the created master field.
'-- pDoc: the document in which the master field is to be created.
'   If not specified, the current document is assumed.
'Output: True if the operation was successful otherwise False.

      Dim lo_Masters As Object        'the masterfields in the target document
      Dim lo_Master As Object         'a masterfield
      Dim l_OK As Boolean                     'the process flag
      
      l_OK = False
      If IsMissing(pDoc) Then pDoc = ThisComponent

      On Local Error Goto ErrHandler
      lo_Masters = pDoc.TextFieldMasters
      If Not lo_Masters.hasByName(MFLD_USERSERVICE & pFieldName) Then
              lo_Master = pDoc.createInstance(MFLD_USERINSTANCE)
              lo_Master.Name = pFieldName
      End If
      
      If Not IsMissing(pValue) Then
              lo_Master = lo_Masters.getByName(MFLD_USERSERVICE & pFieldName)
              lo_Master.Content = pValue
      End If

      ErrHandler:
              l_OK = Not Err
      
      CreateMasterField = l_OK
End Function 'CreateMasterField

Function GetMasterFieldNameOnly(ByRef pMasterName As String) As String
'Returns the field name alone, as seen in the UI.
'Input:
'-- pMasterName: the full field name (incl. the MFLD_SERSERVICE part)
'Output: the name alone.

      Dim l_Name As String
      Dim l_arrParts() As String
      
      l_Name = ""
      'we look for the last part of the passed name (separator is a dot)
      l_arrParts = Split(pMasterName, ".")
      l_Name = l_arrParts(UBound(l_arrParts))
      
      GetMasterFieldNameOnly = l_Name
End Function 'GetMasterFieldNameOnly

Function GetMasterFieldValue(ByRef pFieldName As String, Optional pDoc As Object) As Variant
'returns the value of a master field or Nothing if the field is not found.
'Input:
'-- pFieldName: the master field name
'-- pDoc: the document in which the master field is searched.
'   If not specified, the current document is assumed.
'Output: the value of the field or Nothing if not found.

      Dim lo_Masters As Object
      Dim lo_Master As Object
      Dim l_Result As Variant

      l_Result = Nothing
      If IsMissing(pDoc) Then pDoc = ThisComponent
      
      lo_Masters = pDoc.TextFieldMasters
      lo_Master = lo_Masters.getByName(MFLD_USERSERVICE & pFieldName)
      IF Not IsNull(lo_Master) Then
              l_Result = lo_Master.Content
      End If

      GetUserFieldValue = l_Result
End Function 'GetMasterFieldValue

Function IsMasterFieldUser(ByRef pMasterFieldName As String) As Boolean
'Checks whether a masterfield is a user one or not.
'Input:
'-- pMasterFieldName: the masterfield name to check
'Output: True is its name contents a ".User." part, otherwise False

      Dim l_IsUser As Boolean
      
      l_IsUser = (InStr(pMasterFieldName, MFLD_TYPEUSERID) > 0) 'other possibility is: 
"SetExpression"

      IsMasterFieldUser = l_IsUser
End Function 'IsMasterFieldUser

------------------------------------------------------------- >8

La fonction à appeler est ExportMasterFields() en lui passant, a minima, l'objet document cible 
(par défaut le document source est le document courant).

Les autres sous-programmes sont appelés par ExportMasterFields().

Attention : ce code n'est pas complètement à l'épreuve des balles... Je sais 2-3 endroits où des 
vérifications seraient utiles mais pas le temps de les ajouter pour le moment.


Conseil de nommage des champs d'utilisateur à exporter : vous pouvez améliorer/sécuriser les 
choses en adoptant une convention de nommage de vos champs d'utilisateur, en les préfixant de 
façon uniforme. De cette manière, vous pourriez ne recopier que ceux qui vous intéressent en 
vérifiant les préfixes lors de l'export (-> modifiez ExportMasterFields() en conséquence).


Bien cordialement,
-- 
Jean-Francois Nifenecker, Bordeaux


-- 
Envoyez un mail à users+unsubscribe@fr.libreoffice.org pour vous désinscrire
Les archives de la liste sont disponibles à https://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être 
supprimés


-- 
Envoyez un mail à users+unsubscribe@fr.libreoffice.org pour vous désinscrire
Les archives de la liste sont disponibles à https://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être 
supprimés

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.