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


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