PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → publipostage sous Open Office.
publipostage sous Open Office.
Débuté par Pierre-Louis, 04 juil. 2014 14:18 - 27 réponses
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 04 juillet 2014 - 14:18
Bonjour,

Le sujet a déjà été débattu, mais je n'ai pas trouvé de réponses probantes.
Alors que je réalise des publipostages vers Word sans problème, je ne sais pas comment réaliser la même chose vers OpenOffice (ou libre Office). Les exemples livrés avec Windev ne me sont pas d'une grande aide non plus.
Quelqu'un a-t-il réussi (et comment) a faire du publipostage avec Open Office ?

Merci.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 04 juillet 2014 - 15:36
Je me réponds à moi même :)
J'ai réussi à faire fonctionner le publipostage de l'exemple fourni avec Windev 'Pilotage de Open Office Writer' qui pilote aussi bien Libre Office Writer.
Mon problème, pour l'instant, c'est que, si cela fait bien du publipostage, cela ne fait pas de fusion (comme facilement réalisable avec la classe cWord), donc, au lieu d'avoir un seul document avec autant de pages que de clients (par exemple), j'ai autant de documents réalisés que de clients.
Je vois mal l'utilisateur final ouvrir mille fois un document Open office pour imprimer les fiches publipostées de ses mille clients.

Quelqu'un peut-il me rassurer en me disant qu'il a réussi à la fois le publipostage et la fusion via Libre Office (ou open office, il semble que cela soit pareil) ?

Merci.
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 06 juillet 2014 - 03:08
hello,
le publipostage dans l'exemple WD Pilotage de OpenOffice Writer n'est pas un véritable publipostage. Il utilise une substitution de balises par les données de la source de données. Pour un véritable publipostage dans OpenOffice il faut utiliser le service MailMerge. Il est assez difficile à mettre en oeuvre par programme par rapport à celui de Word. Je me suis inspiré du code qui se trouve dans cette série de messages :
http://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/101878-wd12-publipostage-open-office/read.awp
pour réaliser un publipostage avec LibreOffice 4.1.6. Je suis parti du fichier Modele.sxw de l'exemple WD Pilotage que j'ai transformé en .odt :



J'ai modifié les champs des données pour qu'ils correspondent à ma source de données :



La base de données de l'exemple je l'ai transformé en fichier csv ( MesClients.csv) :
N° Enr.;IDClients;Civilite;Nom;Prenom;Adresse;Codepostal;Ville;Telephone
1;1;Mr;DUPONT;Cedric;1, rue des fleurs;34000;Montpellier;00.00.00.00.00
2;2;Mr;MARTIN;Albert;5 allée du bonheur;34000;Montpellier;00.00.00.00.00
3;3;Mlle;PLUH;Sarah;2bis, Technopolis;34000;Montpellier;00.00.00.00.00

Voici ce que cela donne comme code :
// Publipostage d'un document LibreOffice Writer à partir d'une source csv
// J.P Juillet 2014
LOCAL
MonDocument est une chaîne = "F:\Modele.odt"
PathURL est une chaîne
oSM est un objet automation dynamique
oDesktop est un objet automation dynamique
oPublipostage est un objet automation dynamique
oDatacontext est un objet automation dynamique
oDocument est un objet automation dynamique
oDocBase est un objet automation dynamique
dsInstance est un objet automation dynamique
arg_LdDoc est un tableau de 1 objet automation dynamique
arg_DbArgs est un tableau de 1 objet automation dynamique
arg_InfoBase est un tableau de 6 objet automation dynamique
arg_MyProps est un tableau de 0 Variants //Tableau des Propriétés de MailMerge pour la fusion
vdl est un entier
// Démarrage du service si il existe
QUAND EXCEPTION DANS
// Création d'un service LibreOffice si nécessaire
oSM = allouer un objet automation("com.sun.star.ServiceManager")
oDesktop = oSM>>createInstance("com.sun.star.frame.Desktop")
FAIRE
FinProgramme("LibreOffice n'est pas installé sur votre poste.")
FIN
SI fFichierExiste(MonDocument) ALORS
// on prépare les arguments pour la fonction LoadComponentFromURL
arg_LdDoc[1] = OOValeurNommée(oSM,"Hidden",Vrai)
// Ouverture du fichier dans OpenOffice Writer en mode caché
oDocument = oDesktop>>LoadComponentFromURL( OOFichier(MonDocument), "_blank", 0, arg_LdDoc)
// On écrase le dernier paramètre transmis pour éviter un crash en sortie de procédure
Transfert(&arg_LdDoc[1],&vdl,Dimension(vdl))
SI oDocument<>Null ALORS
// création d'une instance de base de données
oDatacontext = oSM>>createInstance("com.sun.star.sdb.DatabaseContext")
// on déférence Clients si il existe déjà
SI oDatacontext>>hasByName("Clients") ALORS oDatacontext>>revokeObject("Clients")
dsInstance = oDatacontext>>createInstance()
oDocBase = dsInstance>>DatabaseDocument
arg_DbArgs[1] = OOValeurNommée(oSM,"Overwrite","true")
// On créé le fichier de base de données MaDataSource.odb qui contiendra la table MesClients
oDocBase>>storeAsURL(OOFichier("F:\MaDataSource.odb"),arg_DbArgs)
// On écrase le dernier paramètre transmis pour éviter un crash en sortie de procédure
Transfert(&arg_DbArgs[1],&vdl,Dimension(vdl))
// on référence Clients
oDatacontext>>registerObject("Clients", dsInstance)
// endroit où se trouvent les fichiers csv qui serviront de tables
// Dans ce répertoire j'ai un fichier MesClients.csv qui se transformera en table MesClients
PathURL = "sdbc:flat:"+ OOFichier("F:\Temp\csvFiles")
dsInstance>>URL= PathURL
arg_InfoBase[1] = OOValeurNommée(oSM,"Extension","csv")
arg_InfoBase[2] = OOValeurNommée(oSM,"CharSet","ISO-8859-15")
arg_InfoBase[3] = OOValeurNommée(oSM,"HeaderLine",True)
arg_InfoBase[4] = OOValeurNommée(oSM,"FieldDelimiter",";")
arg_InfoBase[5] = OOValeurNommée(oSM,"StringDelimiter","'")
arg_InfoBase[6] = OOValeurNommée(oSM,"DecimalDelimiter",".")
dsInstance>>Info = arg_InfoBase
// On importe les fichiers csv dans MaDataSource.odb
oDocBase>>store()
// On écrase les derniers paramètres transmis pour éviter un crash en sortie de procédure
POUR x = 1 A 6
Transfert(&arg_InfoBase[x],&vdl,Dimension(vdl))
FIN
// Publipostage
// création d'une instance de publipostage
oPublipostage = oSM>>createInstance("com.sun.star.text.MailMerge")
oPublipostage>>DataSourceName="Clients" // Nom de la source de données
oPublipostage>>DocumentURL = OOFichier("F:\Modele.odt") // Fichier modèle
oPublipostage>>CommandType=0 // O=table - 1=requête - 2=commande
oPublipostage>>Command="MesClients" //nom de la table (fichier .csv)
oPublipostage>>OutputType=2 //1=édition, 2=fichier
oPublipostage>>OutputUrl= OOFichier("F:\") // répertoire de sortie
oPublipostage>>FileNameFromColumn=False
oPublipostage>>FilenamePrefix="Fusion.odt" //préfixe du document fusionné , un numéro est rajouté
oPublipostage>>SaveAsSingleFile=True //1 seul fichier
oPublipostage>>Execute(arg_MyProps)
oPublipostage>>Dispose()
// on déréférence Clients si besoin
//oDatacontext>>revokeObject("Clients")
dsInstance>>Dispose()
oDatacontext>>Dispose()
oDocument>>Close(Vrai)
oDesktop>>Terminate()
Libérer oSM
SINON
Erreur("Document non ouvert")
FIN
FIN
CAS EXCEPTION:
Erreur("Exception LibreOffice")
Libérer oSM


La procédure OOValeurNommée :
Procedure OOValeurNommée(oSM est un objet automation dynamique, cName est une chaîne, uvalue est un Variant)
PropertyValue est un objet automation dynamique
PropertyValue = oSM>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
PropertyValue>>Name = cName
PropertyValue>>Value = uvalue
RENVOYER PropertyValue


La procédure OOFichier :
Procedure OOFichier(Fichier est une chaîne)
RENVOYER "file:///"+Remplace(Fichier,"\","/")


et voici le résultat :





--
Ami calmant, J.P
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 07 juillet 2014 - 10:36
Bonjour et merci J.P ! :)
Je travaille dans une administration, et celle-ci a décidé (pour faire des économies de bouts de chandelle) de ne plus acheter de pack Microsoft office pour quel que poste que ce soit (d'ailleurs elle ne veut plus de Windev non plus ;(, mais là, je fais de la résistance }:(). Je vais être contraint de basculer mes publipostages vers Word (qui fonctionnent très bien) vers des publipostages vers libre office.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 08 juillet 2014 - 12:05
Bonjour J.P

Help ! Au secours J.P ! :o

Je tente de mettre en oeuvre ton code, et rencontre quelques difficultés.
Le programme créer bien le fichier MadataSource.odb dans lequel je retrouve le fichier clients. :merci:
Par contre, au lieu de me créer un fichier Fusion0.odt, le programme me créer un fichier word Fusion0.doc !!! ;(
Ensuite, le programme se plante à l'instruction oPublipostage>>Execute(arg_MyProps).

Aurais-tu une petite idée du pourquoi de tout cela ?

Merci encore.
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 08 juillet 2014 - 16:49
hello,
c'est parce que dans les options tu dois être en : Document Texte / Enregistrer systématiquement en Microsoft Word

dans Outils/Options/ Chargement/enregistrement / Général dans Format de fichier par défaut et paramètrage ODF il faut mettre pour type de document/document texte -> Texte ODF

--
Ami calmant, J.P
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 08 juillet 2014 - 17:15
Hello, J.P !

Merci, tu me sauves par tes explications. :merci:

Pour les champs de fusion dans le modèle, c'est bien en faisant dans LO "insertion>champs>autres>champ de mailing>clients>mesclients>nom de la rubrique" qu'on les réalise ?

Car, hormis le fait que le programme plante, le fichier fusion, s'il contient bien autant de pages que de clients, n'a aucune donnée de fusionnée.
Par exemple, au lieu d'avoir 3 pages avec Dupont, Durant et Martin, j'obtiens 3 pages avec <nom>, <nom>, et encore <nom>. ;(

Je vais voir si le fait d'enregistrer en Odt change quelque chose.

Je nage, je nage.

Merci
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 08 juillet 2014 - 17:25
Re Hello J.P !

Tu as raison pour les options d'enregistrement. Maintenant mon programme enregistre bien un document de fusion en odt (je n'ai jamais touché à OO que depuis hier pour excuse)... Et, cerise sur le gâteau, la fusion fonctionne ! (j'ai bien Dupont, Durant et Martin) :) :)

Par contre, le programme se plante toujours à la ligne oPublipostage>>Execute(arg_MyProps)

Une idée ?

Merci merci.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 08 juillet 2014 - 17:28
re re Hello J.P !

Plus exactement, le plantage est le suivant, à la ligne oPublipostage>>Execute(arg_MyProps) :

Erreur à la ligne 77 du traitement Clic sur BTN_OOLO.
Une erreur système inattendue est survenue.
Si cet incident se produit de manière systématique lorsque vous exécutez les mêmes manipulations, il est conseillé de transmettre au Support Technique Gratuit :
- une description des circonstances de l'incident
- les lignes de code, une fenêtre ou un projet permettant de reproduire le problème
- les informations techniques suivantes

Détails techniques :

Module : kernel32.dll
Adresse de base : 768A0000
Erreur système : Access violation (GPF)
EIP = 768B13A8
OS : Windows 2008 R2 Service Pack 1(6.1.7601)

----- Informations techniques -----

Projet : OOLO

Appel WL :
Traitement de 'Clic sur BTN_OOLO' (FEN_CLIENTS.BTN_OOLO), ligne 77, thread 0

Que s'est-il passé ?
Une erreur système inattendue est survenue.
Si cet incident se produit de manière systématique lorsque vous exécutez les mêmes manipulations, il est conseillé de transmettre au Support Technique Gratuit :
- une description des circonstances de l'incident
- les lignes de code, une fenêtre ou un projet permettant de reproduire le problème
- les informations techniques suivantes

Détails techniques :

Module : kernel32.dll
Adresse de base : 768A0000
Erreur système : Access violation (GPF)
EIP = 768B13A8
OS : Windows 2008 R2 Service Pack 1(6.1.7601)

Code erreur : 1020
Niveau : erreur fatale (EL_FATAL)

Dump de l'erreur du module 'wd180vm.dll' (18.0.150.7).
Identifiant des informations détaillées (.err) : 1020
Informations de débogage :

Détails techniques :

Module : kernel32.dll
Adresse de base : 768A0000
Erreur système : Access violation (GPF)
EIP = 768B13A8
OS : Windows 2008 R2 Service Pack 1(6.1.7601)
Registres :

EIP = 768B13A8 EBP = 028E9810
EAX = 00000000 EBX = 028B8AF0
ECX = 00000004 EDX = 00001022
ESI = 00000000 EDI = 029BC310

Pile des appels :

[kernel32.dll (768A0000)] 768B1328 : GetConsoleMode() + 128 bytes

Informations supplémentaires :
EIT_PILEWL :
Clic sur BTN_OOLO (FEN_CLIENTS.BTN_OOLO), ligne 77
EIT_DATEHEURE : 08/07/2014 17:27:04

Assistance
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 09 juillet 2014 - 02:13
hello,
moi je n'ai pas de plantage. Je suis en WD16 , LibreOffice 4.1.6.2, Windows 7 SP1. Et toi ?
as-tu le même code exactement que moi et le même document source ?

Au fait si tu veux enregistrer la fusion en un autre format que odt il faut que tu utilises le paramètre SaveFilter avant le lancement du publipostage par execute comme ceci :
oPublipostage>>SaveFilter = "writer8" // Nom du filtre d'exportation de OOo pour enregistrer en .odt
//oPublipostage>>SaveFilter = "MS Word 2007 XML" // Nom du filtre d'exportation de OOo pour enregistrer en .docx
// oPublipostage>>SaveFilter = "MS Word 97" // Nom du filtre d'exportation de OOo pour enregistrer en .doc
//oPublipostage>>SaveFilter = "writer_pdf_export" // Nom du filtre d'exportation de OOo pour enregistrer en .pdf


--
Ami calmant, J.P
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 09 juillet 2014 - 03:15
j'ai trouvé un moyen de se passer de l'utilisation des fonctions transfert pour éviter le crash en sortie de procédure : en utilisant Core Reflexion pour créer les property values.
1 - il faut rajouter une nouvelle variable :
oCRef est un objet automation dynamique


dans le code juste après la création de oDesktop rajouter :
// Core reflection est utilisé pour pouvoir créer des property value
oCRef = oSM>>createInstance("com.sun.star.reflection.CoreReflection")


et la procédure OOValeurNommée se transforme en :
Procedure OOValeurNommée(oSM est un objet automation dynamique, oCRef est un objet automation dynamique,
cName est une chaîne, uvalue est un Variant)
PropertyValue est un objet automation dynamique
//PropertyValue = oSM>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oCRef>>forName("com.sun.star.beans.PropertyValue")>>createObject(PropertyValue)
PropertyValue>>Name = cName
PropertyValue>>Value = uvalue
RENVOYER PropertyValue


et l'appel de la procédure est par exemple :
arg_DbArgs[1] = OOValeurNommée(oSM,oCRef,"Overwrite","true")



on peut alors supprimer toutes les procédures transfert :) !

--
Ami calmant, J.P
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 10:24
Salut J.P.

Vraiment, je te suis reconnaissant.
Je ne suis pas encore au stade d'avoir compris tout le fonctionnement du code (loin s'en faut).
Je vais essayer tes nouvelles procédures et je te tiens au courant.
Merci encore.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 10:27
J.P...

Et pour répondre à ta question, je suis en WD18, Windows 7 SP1 et libre office 4.2.5.2.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 11:15
Jurassic Pork a écrit :
hello,
moi je n'ai pas de plantage. Je suis en WD16 , LibreOffice 4.1.6.2, Windows 7 SP1. Et toi ?
as-tu le même code exactement que moi et le même document source ?

Au fait si tu veux enregistrer la fusion en un autre format que odt il faut que tu utilises le paramètre SaveFilter avant le lancement du publipostage par execute comme ceci :
oPublipostage>>SaveFilter = "writer8" // Nom du filtre d'exportation de OOo pour enregistrer en .odt
//oPublipostage>>SaveFilter = "MS Word 2007 XML" // Nom du filtre d'exportation de OOo pour enregistrer en .docx
// oPublipostage>>SaveFilter = "MS Word 97" // Nom du filtre d'exportation de OOo pour enregistrer en .doc
//oPublipostage>>SaveFilter = "writer_pdf_export" // Nom du filtre d'exportation de OOo pour enregistrer en .pdf



Ami calmant, J.P


Super ce truc là ! :merci:
J'ai essayé et ça marche !

Bon, je continue à essayer la suite du code que tu m'as donné.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 11:40
re Hello J.P

J'ai supprimé les procédures de transfert. De côté là, ça marche.
Par contre, j'ai toujours le même plantage à l'exécution de oPublipostage>>Execute(arg_MyProps) ;(

J'ai créé un petit projet me permettant de gérer une base clients à partir de laquelle je génère le fichier csv. Je n'ai donc certainement pas le même document source que toi. Manquerait-il du code dans les déclarations globales du projet qui ferait que ça plante ?

Voici le code du publipostage.
Y vois-tu une faille ?
Merci beaucoup.

// Publipostage d'un document LibreOffice Writer à partir d'une source csv
// J.P Juillet 2014
LOCAL
MonDocument est une chaîne = "C:\OOLO\Modele.odt"
PathURL est une chaîne
oSM est un objet automation dynamique
oDesktop est un objet automation dynamique
oPublipostage est un objet automation dynamique
oDatacontext est un objet automation dynamique
oDocument est un objet automation dynamique
oDocBase est un objet automation dynamique
dsInstance est un objet automation dynamique
arg_LdDoc est un tableau de 1 objet automation dynamique
arg_DbArgs est un tableau de 1 objet automation dynamique
arg_InfoBase est un tableau de 6 objet automation dynamique
arg_MyProps est un tableau de 0 Variants //Tableau des Propriétés de MailMerge pour la fusion
vdl est un entier
oCRefest un objet automation dynamique
sTexte est une chaîne

// pour générer mon csv
sTexte=TableVersTexte(TABLE_Clients,taTitreColonnes,";")
fSauveTexte("C:\OOLO\Temp\csvFiles\MesClients.csv",sTexte)

// Démarrage du service si il existe
QUAND EXCEPTION DANS
// Création d'un service LibreOffice si nécessaire
oSM = allouer un objet automation("com.sun.star.ServiceManager")
oDesktop = oSM>>createInstance("com.sun.star.frame.Desktop")
// Core reflection est utilisé pour pouvoir créer des property value
oCRef = oSM>>createInstance("com.sun.star.reflection.CoreReflection")
FAIRE
FinProgramme("LibreOffice n'est pas installé sur votre poste.")
FIN
SI fFichierExiste(MonDocument) ALORS
// on prépare les arguments pour la fonction LoadComponentFromURL
arg_LdDoc[1] = OOValeurNommée(oSM,oCRef,"Hidden",Vrai)
// Ouverture du fichier dans OpenOffice Writer en mode caché
oDocument = oDesktop>>LoadComponentFromURL( OOFichier(MonDocument), "_blank", 0, arg_LdDoc)
// On écrase le dernier paramètre transmis pour éviter un crash en sortie de procédure
//Transfert(&arg_LdDoc[1],&vdl,Dimension(vdl))
SI oDocument<>Null ALORS
// création d'une instance de base de données
oDatacontext = oSM>>createInstance("com.sun.star.sdb.DatabaseContext")
// on déférence Clients si il existe déjà
SI oDatacontext>>hasByName("Clients") ALORS oDatacontext>>revokeObject("Clients")
dsInstance = oDatacontext>>createInstance()
oDocBase = dsInstance>>DatabaseDocument
arg_DbArgs[1] = OOValeurNommée(oSM,oCRef,"Overwrite","true")
// On créé le fichier de base de données MaDataSource.odb qui contiendra la table MesClients
oDocBase>>storeAsURL(OOFichier("C:\OOLO\MaDataSource.odb"),arg_DbArgs)
// On écrase le dernier paramètre transmis pour éviter un crash en sortie de procédure
//Transfert(&arg_DbArgs[1],&vdl,Dimension(vdl))
// on référence Clients
oDatacontext>>registerObject("Clients", dsInstance)
// endroit où se trouvent les fichiers csv qui serviront de tables
// Dans ce répertoire j'ai un fichier MesClients.csv qui se transformera en table MesClients
PathURL = "sdbc:flat:"+ OOFichier("C:\OOLO\Temp\csvFiles")
dsInstance>>URL= PathURL
arg_InfoBase[1] = OOValeurNommée(oSM,oCRef,"Extension","csv")
arg_InfoBase[2] = OOValeurNommée(oSM,oCRef,"CharSet","ISO-8859-15")
arg_InfoBase[3] = OOValeurNommée(oSM,oCRef,"HeaderLine",True)
arg_InfoBase[4] = OOValeurNommée(oSM,oCRef,"FieldDelimiter",";")
arg_InfoBase[5] = OOValeurNommée(oSM,oCRef,"StringDelimiter","'")
arg_InfoBase[6] = OOValeurNommée(oSM,oCRef,"DecimalDelimiter",".")
dsInstance>>Info = arg_InfoBase
// On importe les fichiers csv dans MaDataSource.odb
oDocBase>>store()
//// On écrase les derniers paramètres transmis pour éviter un crash en sortie de procédure
//POUR x = 1 A 6
//Transfert(&arg_InfoBase[x],&vdl,Dimension(vdl))
//FIN
// Publipostage
// création d'une instance de publipostage
oPublipostage = oSM>>createInstance("com.sun.star.text.MailMerge")
oPublipostage>>DataSourceName="Clients" // Nom de la source de données
oPublipostage>>DocumentURL = OOFichier("C:\OOLO\Modele.odt") // Fichier modèle
oPublipostage>>CommandType=0 // O=table - 1=requête - 2=commande
oPublipostage>>Command="MesClients" //nom de la table (fichier .csv)
oPublipostage>>OutputType=2 //1=édition, 2=fichier
oPublipostage>>OutputUrl= OOFichier("C:\OOLO\") // répertoire de sortie
oPublipostage>>FileNameFromColumn=False

oPublipostage>>SaveFilter = "writer_pdf_export" // Nom du filtre d'exportation de OOo pour enregistrer en .pdf

oPublipostage>>FilenamePrefix="Fusion.odt" //préfixe du document fusionné , un numéro est rajouté
oPublipostage>>SaveAsSingleFile=True //1 seul fichier
oPublipostage>>Execute(arg_MyProps)
oPublipostage>>Dispose()
// on déréférence Clients si besoin
//oDatacontext>>revokeObject("Clients")
dsInstance>>Dispose()
oDatacontext>>Dispose()
oDocument>>Close(Vrai)
oDesktop>>Terminate()
Libérer oSM
SINON
Erreur("Document non ouvert")
FIN
FIN
//CAS EXCEPTION:
//Erreur("Exception LibreOffice")
Libérer oSM
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 12:58
Re Hello

J'ai testé en Windows seven et libreoffice v4.1.6.2 : même plantage.
J'ai testé en Windows XP et libreoffice v4.1.6.2 : même plantage.

wd180vm.dll qui serait en cause ? }:( Ceci dit j'espère pas...
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 14:33
Salut tout le monde.

J'ai testé le code J.P sur une plateforme Windev 18. Cela plante comme je l'ai dit plus haut.
Intrigué, j'ai refait le test, mais cette fois-ci en codant sur une plateforme Windev 16. Et là, ça marche !
J'en conclut qu'il y a sans doute un bug dans la dll wd180vm.dll.

J.P, qu'est-ce que tu en penses ? Je vais devoir envoyer le programme au S.T, ou tu as une autre idée ?
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 09 juillet 2014 - 15:00
hello,
peut-être que le problème vient du passage de ce paramètre :
arg_MyProps est un tableau de 0 Variants


oPublipostage>>Execute(arg_MyProps)


je n'ai que la version 16 de Windev alors je ne peux pas faire d'essai avec les versions supérieures.
Il faudrait savoir si le passage du tableau de 0 Variant est traité différemment entre la version 16 et la version 18 de windev.

--
Ami calmant, J.P
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 15:11
Hello,

Oui, mais je n'ai aucune idée de ce que l'on pourrait mettre à la place. Si tu as une suggestion... ;)
Ce serait tout de même étonnant qu'il n'y ai pas de compatibilité ascendante entre les différentes versions de Windev.

Amicalement.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 15:57
Suite...

Il y a un lézard quelque-part.

J'ai rebasculé le programme écrit en Windev 16 (qui était du copié/collé de celui écrit en 18) en windev 18, et là, surprise : le publipostage fonctionne en windev 18 !

J'y comprends plus rien.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 17:12
Bonsoir,

Et voilà, une histoire de fous :

Deux projets, rigoureusement le même code. L'un écrit en Windev 16 puis basculé en Windev 18. L'autre directement écrit en Windev 18.
Le premier fonctionne, l'autre plante.
Pour preuve, la comparaison entre les deux projets (aucune différence de code, le reste démontre qu'ils n'ont pas été générés de la même façon :

(impossible duploader l'image de la comparaison des 2 projets. décidément, c'est pas mon jour.

Quelqu'un a une idée, parce que là, moi... ;(
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 09 juillet 2014 - 18:31
Bon ben voilà, je donne ma langue au chat, ou plutôt au S.T.
J'ai en effet envoyé les deux projets au S.T, celui qui plante et celui qui plante pas, tout deux ayant le même code (rigoureusement).

Wait and see.
Posté le 09 juillet 2014 - 19:24
Bonjour Pierre Louis

projet windev 16 = par défaut en ansi, passé en 18 toujours en ansi
(toutes les chaines non spécifiées sont ansi)

projet windev 18 natif: par défaut en unicode

le code est exactement le même, mais "Machaine est chaine" créé soit une
chaine ansi, soit une chaine unicode, et les répercussions sont
nombreuses, en particulier dés qu'on travaille avec quelque chose d'externe

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

NOUVEAU: WXShowroom.com est disponible : Montrez vos projets !
Plus d'information sur http://fabriceharari.com


On 7/9/2014 9:12 AM, Pierre-Louis wrote:
Bonsoir,

Et voilà, une histoire de fous :

Deux projets, rigoureusement le même code. L'un écrit en Windev 16 puis
basculé en Windev 18. L'autre directement écrit en Windev 18.
Le premier fonctionne, l'autre plante.
Pour preuve, la comparaison entre les deux projets (aucune différence de
code, le reste démontre qu'ils n'ont pas été générés de la même façon :

(impossible duploader l'image de la comparaison des 2 projets.
décidément, c'est pas mon jour.

Quelqu'un a une idée, parce que là, moi... ;(
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 10 juillet 2014 - 00:09
voici une dernière tentative que tu peux essayer :
remplacer :
arg_MyProps est un tableau de 0 Variants //Tableau des Propriétés de MailMerge


par :
arg_MyProps est un tableau de 0 objet automation dynamique //Tableau des Propriétés de MailMerge pour la fusion


--
Ami calmant, J.P
Posté le 10 juillet 2014 - 12:03
Merci pour vos réponses. Cependant, je suis en vacances jusqu'à mardi. Donc je regarderai cela semaine prochaine car faire du windev sur un Nokia c"est pas top.
Membre enregistré
218 messages
Popularité : +14 (14 votes)
Posté le 15 juillet 2014 - 11:12
Bonjour,

Merci J.P et merci Fabrice pour vos tentatives de résolution du dernier problème que je rencontrais, c'est à dire : deux programmes, même code, l'un d'abord écrit en W16 puis migré en W18, l'autre directement écrit en W18 ; l'un fonctionnant, l'autre plantant.

J'ai essayé le truc de J.P : même constat.
J'ai essayé le code en ANSI de Fabrice : même constat.

Finalement, les deux programmes ayant forcément quelque chose de différent, j'ai trouvé que cela venait des options de compilation.
En W16, seule l'option "Classes : préfixes ":" et "::" d'accès aux membres et aux méthodes facultatifs" est cochée par défaut.
En W18, elles le sont toutes, dont "L'affectation de tableau copie le contenu" qui fait planter le publipostage.

En décochant cette dernière option de compilation, j'ai bien mes deux programmes qui fonctionnent. :)
Ouf.

Bons dev.
Posté le 15 juin 2015 - 17:22
je Bonjour
je n ai pas de réponse a ta demande mais comme tu semble bien maitrise les fusions vers word pourrais tu m aider
je voudrais a partir du fiche client imprime via word un imprimer type reprennant les donnes de client
ou encore a partir d'un tableau par selection des client faire un mailing via word
cordialement
Posté le 04 février 2016 - 12:21
Bonjour,
Merci pour ce code, cependant je butte dès la première instruction de chargement du doc LibreOffice :
oDocument=oDesktop>>LoadComponentFromURL(OOFichier(MonDocument),"_blank",0,arg_LdDoc)

arg_LdDoc est de type tableau de 1 objet Automation dynamique.
La procédure OOValeurNommée modifiée avec CoreReflection

Erreur Windev : Type incompatible durant une affectation ... c'est tout et ça m'avance pas.

Une idée ?

WINDEV 21 / LibreOffice 4.3.7.2