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


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 <thierry.jeanneret@gmail.com>:

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




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

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