4D & Word 2004 OSX
Date de publication : Août 2005
Par
Christophe KEROMEN (Cabinet de Consultants CKTI)
Contrairement à son homologue sur Windows, la dernière version d'Office sur OSX n'offre que peu de solutions de collaborations avec 4D. Cette note technique aborde le pilotage d'une application Office par AppleScript depuis 4D, le support du langage de scripts d'Apple ayant été notablement amélioré depuis la version 2004 d'Office.
I.
Introduction
II.
Technologie employée
Définir les variables de documents
Afficher dans des champs
Modification des valeurs
Exemple d'interface d'ajout de champs
III.
Piloter Word par AppleScript
Savoir ouvrir un dictionnaire
Script de pilotage de Word
Rendre le script dynamique
IV.
Les méthodes utilisées côté 4D
Méthode principale : demo
Méthode demo_LiaisonWord
Méthode ZDOC_TraiterBalises
Méthode LPE_appleScript_Exec
V.
Commande shell osascript
Méthode ZDOC_pathClassicTopathOSX
Description d’osascript
VI.
Conclusion
VII. Base exemple
I.
Introduction
Contrairement à son homologue sur Windows, la dernière version d'Office sur OSX n'offre que peu de solutions de collaborations avec 4D. Trois axes principaux sont envisageables :
-
L'utilisation de plugins comme 4D Office, mais déboguage et pérennité peuvent inquiéter et le coût des licences peut rebuter ;
-
Pilotage d'une application Office par AppleScript depuis 4D, le support du langage de scripts d'Apple ayant été notablement amélioré depuis la version 2004 d'Office
-
Export de données depuis 4D et utilisation des possibilités de liaisons de données.
Nous allons explorer le deuxième axe afin de construire un document dynamique Word en liaison avec des données 4D.
Nous mettrons encore une fois en œuvre la nouvelle commande magique de 4D 2004 : LANCER PROCESS EXTERNE
Nous reprenons le même exemple que dans la Note technique « 4D, XML & Word 2003 Windows ». Le cahier des charges, la structure de données sont identiques, ainsi que le formulaire où nous retrouvons le bouton 'Courrier' qui provoque la génération du document Word.
II.
Technologie employée
Nous utilisons un document Word de référence, ici « modelesWord/sampleMac.doc ». Ce modèle, très simple dans notre exemple, contient des champs qui afficheront les données provenant de 4D comme dans la note technique décrivant la liaison sur PC. Cependant, le type des champs diffère, nous utilisons ici des champs DOCVARIABLE :
 Figure 1 – les codes des champs d'affichage des données
Ces champs permettent d'afficher le contenu de variables de documents. Nous procédons en trois étapes :
-
Définir les variables de document dans le document de référence
-
Afficher des valeurs de ces variables grâce à des champs
-
Modifier la valeur de ces variables d'après les valeurs de l'enregistrement courant dans 4D.
Définir les variables de documents
Un peu de code VBA (Visual Basic for Application) est nécessaire, voici une fonction qui initialise les variables nécessaires à notre exemple en leur donnant des valeurs par défaut :
Sub initDocVars()
CK_NewVariable "assurePrenom", "Emile"
CK_NewVariable "assureNom", "Zola"
CK_NewVariable "assureAdresse", "1, rue j'accuse"
CK_NewVariable "assureCPVille", "Ile du Diable"
End Sub |
Le code de la fonction CK_NewVariable, qui vérifie avant d'ajouter une variable qu'elle n'est pas déjà présente :
Sub CK_NewVariable(varName As String, varValue As String)
For Each aVar In ActiveDocument.Variables
If aVar.Name = varName Then num = aVar.Index
Next aVar
If num = 0 Then
ActiveDocument.Variables.Add Name:=varName, Value:=varValue
Else
ActiveDocument.Variables(num).Value = varValue
End If
End Sub |
Afficher dans des champs
Les techniques d'ajout de champs sont les mêmes que pour les champs INCLUDETEXT décrits dans la note technique précédente. Par exemple la commande "Insertion/champ..." provoque l'affichage du dialogue suivant :
Il y a cependant moins d'option à renseigner que pour les champs INCLUDETEXT puisqu'il suffit que le mot-clé DOCVARIABLE soit suivi du nom de la variable à afficher, mis entre guillemets double. La seule option disponible consiste à conserver ou non la mise en forme à chaque mise à jour, option cochée par défaut.
Attention cependant à respecter l'ordre présenté ici : il n'est pas possible de définir un champ sans avoir défini au préalable la variable de document et son contenu !
Modification des valeurs
Notez que jusqu'ici rien n'est spécifique à la plate forme Mac : cette solution fonctionne également pour Windows.
Nous retrouvons à cette étape le cœur du problème : comment piloter Word depuis 4D ? Réponse en utilisant les possibilités d'AppleScript sur OSX, de VBScript sur Windows.
Exemple d'interface d'ajout de champs
Avant d'aborder la phase de scripting, précisons qu'il est tout à fait possible au moyen des USerForms de VBA de fournir une interface graphique permettant à l'utilisateur d'insérer les champs au bon endroit du document :
 Version Windows
 Version OSX
La sélection d'une ligne dans la drop-down list insère un nouveau champ à l'emplacement du point d'insertion dans le document.
Un autre type d'interface pourrait permettre aux utilisateurs finaux de rajouter des champs au moment de l'édition de leur document. Il suffit que l'ensemble des variables correspondantes aient été définies dans le document avant son ouverture.
Ici, cependant, nous devons mentionner une différence de fonctionnement entre le Mac et le PC : sur Mac ce genre de dialogue est malheureusement toujours modal, ce qui oblige à le refermer après chaque choix de l'utilisateur.
III.
Piloter Word par AppleScript
Savoir ouvrir un dictionnaire
Le support d'AppleScript dans MS Office a été très nettement amélioré en version 2004. Vous trouverez plus d'information sur la partie du site Microsoft dédié à Office sur MacOS : Mactopia.
Si le langage AppleScript ne présente guère de difficulté en lui-même, il ne tire sa puissance que par les modèles objets (classes, propriétés, méthodes) exposés par les applications scriptables. En effet, une application peut se contenter de respecter la « required suite » minimale préconisée par Apple. Le modèle exposé par l'application scriptable se nomme le dictionnaire et se consulte (menu Fichier/Ouvrir un dictionnaire...) depuis l'éditeur de scripts fourni par Apple « Script Editor ».
Voici par exemple le dictionnaire de 4D Server :
 Figure 2 – dictionnaire de 4D Server
Et un extrait de celui de Word 2004 qui nous concerne particulièrement puisqu'il décrit la classe Field :
 Figure 3 – extrait du dictionnaire de MS Word
Malheureusement, Word n'est pas « enregistrable » au sens Applescript, c'est-à-dire qu'au contraire des macros, il n'est pas possible de déclencher la génération automatique d'un script par l'enregistrement d'une séquence d'actions.
Nous devons donc étudier le dictionnaire et programmer !
Script de pilotage de Word
Voici le résultat de cette phase de recours à la matière grise, le script suivant met à jour deux variables de document assurePrenom et assureNom puis rafraîchit les champs liés aux variables :
tell application "Microsoft Word"
set myDoc to
"Proxima:Users:ckeromen:Altair:CKTI_Informatique:4D_NT_CK:NT_Word4D:demoMac
_WordScripting:modeleWord:sample2.doc"
open myDoc
-- maj des valeurs des variables dynamiques
set variable value of variable "assurePrenom" of active document to "Victor"
set variable value of variable "assureNom" of active document to "Hugo"
-- provoquer le raffraichissement de l'affichage des champs lies aux variables
set fieldsNumber to count of fields of active document
repeat with i from 1 to fieldsNumber
set uField to update field field i of active document
end repeat
-- enregistrement du doc sous un autre nom
save as document myDoc file name
"Proxima:Users:ckeromen:Altair:CKTI_Informatique:4D_NT_CK:NT_Word4D:demoMac
_WordScripting:modeleWord:sample2-B.doc"
end tell
Rendre le script dynamique
Cependant, ce script est statique, il ne présente pour l'instant aucun lien avec 4D. Pour cela nous allons recourir aux balises proposées par 4D depuis la version 6.5 pour rendre dynamiques les pages HTML. Voici le résultat, toutes les infos statiques du script précédent ont été remplacées par des balises faisant référence à des variables process 4D :
tell application "Microsoft Word"
-- ouverture du modèle
set myDoc to "<!--#4DVAR DEMO_vt_docWord_path-->"
open myDoc
-- maj des valeurs des variables dynamiques
set variable value of variable "assurePrenom" of active document to "<!--#4DVAR demo_vt_assurePrenom-->"
set variable value of variable "assureNom" of active document to "<!--#4DVAR demo_vt_assureNom-->"
set variable value of variable "assureAdresse" of active document to "<!--#4DVAR demo_vt_assureAdresse-->"
set variable value of variable "assureCPVille" of active document to "<!--#4DVAR demo_vt_assureCPVille-->"
set variable value of variable "assureNoDossier" of active document to "<!--#4DVAR demo_vt_assureNoDossier-->"
-- provoquer le raffraichissement de l'affichage des champs liés aux variables
set fieldsNumber to count of fields of active document
repeat with i from 1 to fieldsNumber
set uField to update field field i of active document
end repeat
-- enregistrement du doc sous un autre nom
save as document myDoc file name "<!--#4DVAR demo_vt_pathNewDocWord-->"
end tell
Une seule commande permettra de traiter ce modèle de script pour remplacer les balises par les valeurs en mémoire dans 4D : TRAITER BALISES HTML.
IV.
Les méthodes utilisées côté 4D
Méthode principale : demo
C_ENTIER LONG(<>demo_vl_process)
Au cas ou
: (Nombre de parametres=0)
Si (<>demo_vl_process>0)
PASSER AU PREMIER PLAN(<>demo_vl_process)
Sinon
<>demo_vl_process:=Nouveau process("demo";64*1024;"Démo";"liaison Word";*)
Fin de si
Sinon
TOUT SELECTIONNER([PATIENT])
TRIER([PATIENT])
FORMULAIRE ENTREE([PATIENT];"Entrée")
FORMULAIRE SORTIE([PATIENT];"Liste")
MODIFIER SELECTION([PATIENT];*)
<>demo_vl_process:=0
Fin de cas
Le script du bouton 'Courrier' dans le format [PATIENT];"Entrée" est le suivant :
Si (Numero dans selection([ACTE])#0)
CHARGER ENREGISTREMENT([ACTE])
CHERCHER([MEDECIN_TRAITANT];[MEDECIN_TRAITANT]PK_Medecin=[ACTE]FK_medecin_traitant)
CHERCHER([CHIRURGIEN];[CHIRURGIEN]PK_chirurgien=[ACTE]FK_chirurgien)
demo_liaisonWord
Sinon
ALERTE("Veuillez sélectionner un acte au préalable")
Fin de si
Méthode demo_LiaisonWord
C_BOOLEEN($_vb_siOk)
$_vb_siOk:=Vrai
` charger les données de la base ds les variables de fusion
demo_getData
C_TEXTE(DEMO_vt_docWord_path) `var process reprise ds le modèle de script
DEMO_vt_docWord_path:=<>DEMO_vt_docWord_path
demo_vt_pathNewDocWord:=Remplacer chaine(DEMO_vt_docWord_path;".doc";"-B.doc")
Si (Tester chemin acces(demo_vt_pathNewDocWord)=Est un document )
SUPPRIMER DOCUMENT(demo_vt_pathNewDocWord)
Fin de si
C_TEXTE($_vt_pathNewScript)
$_vt_pathNewScript:=Remplacer chaine(<>DEMO_vt_script_path;".applescript";"-new.applescript")
Si (Tester chemin acces($_vt_pathNewScript)=Est un document )
SUPPRIMER DOCUMENT($_vt_pathNewScript)
Fin de si
` traite un document disque contenant des balises 4D
$_vb_siOk:=ZDOC_TraiterBalises (<>DEMO_vt_script_path;$_vt_pathNewScript)
Si ($_vb_siOk) `appliquer le script
C_TEXTE($error)
$error:=LPE_appleScript_Exec ($_vt_pathNewScript) ` exécute un appleScript $1 par LANCER
` PROCESS EXTERNE
Si (ok=1)
`le document est ouvert et présente les champs de fusion à jour
Sinon
ECRIRE TEXTE DANS PRESSE PAPIERS($error)
ALERTE("Echec de la commande "+$error)
Fin de si
Fin de si
Méthode ZDOC_TraiterBalises
C_BOOLEEN($0)
C_TEXTE($1;$_vt_pathScript)
$_vt_pathScript:=$1
C_TEXTE($2;$_vt_NewScript)
Si (Nombre de parametres=1) `on écrase le fichier de départ
$_vt_NewScript:=$1
Sinon `on enregistre ds un nouveau fichier
$_vt_NewScript:=$2
Fin de si
C_BLOB($_vx_BLOB)
DOCUMENT VERS BLOB($_vt_pathScript;$_vx_BLOB)
$0:=(ok=1)
Si ($0)
TRAITER BALISES HTML($_vx_BLOB;$_vx_BLOB)
`pbme remplace les caractères accentués par des entités HTML
$0:=(ok=1)
Si (Faux)
ECRIRE TEXTE DANS PRESSE PAPIERS(BLOB vers texte($_vx_BLOB;Texte sans longueur ))
Fin de si
Fin de si
Méthode LPE_appleScript_Exec
C_TEXTE($0)
C_TEXTE($1;$_vt_pathScript)
$_vt_pathScript:=$1
C_TEXTE($in;$out;$error)
$in:=""
$out:=""
$error:=""
ok:=1
LANCER PROCESS EXTERNE("osascript \""+ZDOC_pathClassicTopathOSX ($_vt_pathScript)+"\"";$in;$out;$error)
$0:=$error
V.
Commande shell osascript
Dans cette méthode, nous appelons la commande SHELL osascript, cette commande attend un chemin d'accès au format UNIX. La fonction ZDOC_pathClassicTopathOSX transforme un chemin d'accès MacOS « Classic », tel que 4D les gère sous MacOS, en chemin d'accès UNIX.
Méthode ZDOC_pathClassicTopathOSX
C_TEXTE($1;$_vt_Racine)
$_vt_Racine:=$1
C_TEXTE($0;$_vt_PathUnix)
$_vt_PathUnix:=Remplacer chaine($_vt_Racine;zdoc_get_separateur ;"/") `les : par /
$_vt_PathUnix:=Remplacer chaine($_vt_PathUnix;" ";"\\ ") `pour échapper les espaces
`puis on rajoute "/Volumes"
$_vt_PathUnix:="/Volumes/"+$_vt_PathUnix
$0:=$_vt_PathUnix
Description d’osascript
osascript exécute le fichier de script indiqué ou l'input standard si aucun fichier n'est indiqué. Les scripts peuvent être en texte ou compilés.
Pour plus d'information, consulter l'aide via le Terminal. Voici un extrait de ce que l'on obtient en tapant man osascript dans le terminal :
OSASCRIPT(1) BSD General Commands Manual OSASCRIPT(1)
NAME
osascript - execute AppleScripts and other OSA language scripts
SYNOPSIS
osascript [-l language] [-e command] [-s flags] [programfile]
VI.
Conclusion
Au travers de ces deux notes techniques, nous avons présenté des moyens de rendre des documents Word dynamiques, rafraîchissant les données présentées dans des champs avant d'afficher le résultat à l'utilisateur.
Nous avons étudié plus particulièrement dans cette deuxième note une technique aux 2/3 multi plate forme, seule la partie scripting différant : recours à VBScript sur Windows et Applescript sur OSX.
VII. Base exemple
__________________________________________________
Copyright © 1985-2008 4D SA - Tous droits réservés
Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible.
Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte.
L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs
utilisateurs que des tiers.
Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière engager
4D SA. La fourniture du logiciel décrit dans ce document est régie par un octroi de licence dont les termes sont précisés par ailleurs dans la
licence électronique figurant sur le support du Logiciel et de la Documentation afférente. Le logiciel et sa documentation ne peuvent être
utilisés, copiés ou reproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux termes de cette
licence.
Aucune partie de ce document ne peut être reproduite ou recopiée de quelque manière que ce soit, électronique ou mécanique, y compris par
photocopie, enregistrement, archivage ou tout autre procédé de stockage, de traitement et de récupération d'informations, pour d'autres buts
que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D SA.
4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension ®, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des marques
enregistrées de 4D SA.
Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation.
Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées ou des noms commerciaux de Apple Computer,Inc.
Mac2Win Software Copyright © 1990-2002 est un produit de Altura Software,Inc.
4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,Trumbull,CT,USA.
XTND Copyright 1992-2002 © 4D SA. Tous droits réservés.
XTND Technology Copyright 1989-2002 © Claris Corporation.. Tous droits réservés ACROBAT © Copyright 1987-2002, Secret
Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'Adobe Systems Inc.
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires
respectifs.
__________________________________________________
 
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|