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