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 
> <[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_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 à [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


-- 
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 à