Grand merci à tous.
Je vais étudier ces macros et le langage macro par la même occasion ...

Belle journée.

François BRUYANT - Gestion commerciale et financière - 02 47 58 94 55
AMIANTE 37 - 9 rue des Cordeliers 37220 L’île Bouchard.

Le 29 mars 2018 à 23:00, Jean-Francois Nifenecker <
[email protected]> 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, [email protected] 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_Maste
> rName)
>                         '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 à [email protected] 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

Répondre à