Bonjour,

Un solution sans macros ?
ça sert à quoi que les documents maîtres se décarcassent :)

Je crée un document sans texte avec tous les champs que je veux et je le
nomme "champs.odt" (que je place dans le dossier avec tous les docs qui
doivent hériter...)
Je crée un document maître (Fichier - nouveau - document maitre) - j'y
insère en premier mon document "champs.odt" et je l'enregistre dans le
dossier.

En utilisant ce document maitre,
Les champs sont ainsi "partagés" par tous les documents qui utilisent ce
document maitre. la seule contrainte étant qu'on doive utiliser ce document
maitre.
Les champs restent modifiables de manière simple (en utilisant la méthode
de Jean-François sur les sections masquées, on peut même les afficher
explicitement dans le document "champs.odt" avec leur description et les
masquer dans le document maître. ).
La seule étant qu'on doivent enregistrer sous pour ne pas effacer ce
"modèle" ;) .

Yves

2018-03-30 11:07 GMT+02:00 Thierry Jeanneret <[email protected]>:

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



-- 
web site : http://www.molenbaix.com

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