|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
[WD12] Publipostage Open Office 2.4 |
Débuté par Mélanie, 13 oct. 2008 15:12 - 11 réponses |
| |
| | | |
|
| |
Posté le 13 octobre 2008 - 15:12 |
Bonjour,
Je rencontre un problème lorsque j'exécute un traitement de publipostage avec open office. La fusion du document se fait correctement, le document final est bien enregistré avec la totalité des documents fusionnés. Cependant à la sortie de la procédure alors que le traitement est terminé j'ai cette erreur :
--------------------------------------------------------- Détails techniques :
Module : WDTST.EXE Version du module : 12.00Ak VI : 01F120034d Adresse de base : 00000000 Erreur système : Access violation (GPF) EIP = 00000000 OS : Windows XP ou .NET Service Pack 2(5.1.2600) ---------------------------------------------------------
Voici Le code de la procédure :
Procedure Pr_PubliO0() LOCAL Vl_Url est une chaîne Vl_NomSource est une chaîne Vl_CheminODB est une chaîne Vl_OutPutest une chaîne Vl_Prefixeest une chaîne Vl_Fusion est un objet OLE dynamique Vl_oDBContexte est un objet OLE dynamique Vl_uneInstance est un objet OLE dynamique Vl_nomDocBase est un objet OLE dynamique Vl_MyProps est un tableau de 0 Variants Vl_Args est un tableau de 2 objet automation dynamique Vl_DbArgsest un tableau de 1 objet automation dynamique Vl_InfoBase est un tableau de 5 objet automation dynamique
LanceAppli("tskill soffice",exeIconise)
Vg_oServiceManager = allouer un objet OLE ("com.sun.star.ServiceManager") Vg_oDesktop = Vg_oServiceManager>>createInstance("com.sun.star.frame.Desktop")
Vl_Url="file:///P:/Bible/Test.odt"
Vl_Args[1]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_Args[1]>>Name = "Hidden" Vl_Args[1]>>Value = True Vl_Args[2]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_Args[2]>>Name = "ReadOnly" Vl_Args[2]>>Value = False
QUAND EXCEPTION DANS
Vg_oDocument=Vg_oDesktop>>LoadComponentFromURL(Vl_Url,"_blank",0,Vl_Args)
Vg_oDocument>>updateLinks
Vl_NomSource="BASE" Vl_oDBContexte = Vg_oServiceManager>>createInstance("com.sun.star.sdb.DatabaseContext") vl_CheminODB="File:///P:/BASE.ODB"
SI Vl_oDBContexte>>hasByName(Vl_NomSource) ALORS Vl_oDBContexte>>revokeObject(Vl_NomSource) FIN Vl_DbArgs[1] = Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_DbArgs[1]>>Name = "Overwrite" Vl_DbArgs[1]>>Value = True
Vl_uneInstance = Vl_oDBContexte>>createInstance() Vl_nomDocBase = Vl_uneInstance>>DatabaseDocument Vl_nomDocBase>>storeAsURL(Vl_CheminODB,Vl_DbArgs)
Vl_oDBContexte>>registerObject(Vl_NomSource,Vl_uneInstance) Vl_uneInstance>>URL="sdbc:flat:File:///P:/Bible" Vl_InfoBase[1]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[1]>>Name = "Extension" Vl_InfoBase[1]>>Value = "txt" Vl_InfoBase[2]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[2]>>Name = "HeaderLine" Vl_InfoBase[2]>>Value = True Vl_InfoBase[3]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[3]>>Name = "FieldDelimiter" Vl_InfoBase[3]>>Value = ";" Vl_InfoBase[4]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[4]>>Name = "StringDelimiter" Vl_InfoBase[4]>>Value = "''" Vl_InfoBase[5]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[5]>>Name = "DecimalDelimiter" Vl_InfoBase[5]>>Value = "," Vl_uneInstance>>Info = Vl_InfoBase Vl_nomDocBase>>store()
Vl_Fusion= Vg_oServiceManager>>createInstance("com.sun.star.text.MailMerge") Vl_Fusion>>DataSourceName="BASE" Vl_Fusion>>DocumentURL="file:///P:/Bible/test.odt" Vl_Fusion>>CommandType=0 Vl_Fusion>>Command="MAJEUR" Vl_Fusion>>OutputType=2 Vl_Fusion>>OutputUrl="file:///P:/Archivage/" Vl_Fusion>>FileNameFromColumn=False Vl_Fusion>>FilenamePrefix="Fusion.odt" Vl_Fusion>>SaveAsSingleFile=True Vl_Fusion>>Execute(Vl_MyProps) Vl_oDBContexte>>revokeObject(Vl_NomSource)
Vg_oDocument>>Dispose() Vl_nomDocBase>>Dispose() Vl_Fusion>>Dispose() Vl_oDBContexte>>Dispose() Vl_uneInstance>>Dispose() Vl_oDBContexte>>Dispose()
LanceAppli("tskill soffice",exeIconise)
Libérer Vl_Fusion Libérer Vl_uneInstance Libérer Vl_nomDocBase Libérer Vl_oDBContexte Libérer Vg_oDocument Libérer Vg_oDesktop Libérer Vg_oServiceManager
FAIRE SI Vg_oDocument<>Null ALORS Vg_oDocument>>Dispose() Libérer Vg_oDocument Libérer Vg_oDesktop Libérer Vg_oServiceManager
LanceAppli("tskill soffice",exeIconise) Erreur("Problème lors de la fusion"+RC+ExceptionInfo(errComplet)) FIN
RETOUR
J'ai également fait des tests sur un poste Vista et l'erreur se produit également mais de manière aléatoire, alors que sur le poste XP c'est systématique.
Pour résoudre ce problème j'ai essayé ces deux méthodes en vain : 1- J'ai utilisé l'instruction RETOUR pour sortir du traitement, cela a résolu le problème momentanément.
2- Au moment de passer les paramètres de la base (Vl_InfoBase), je n'ai passé que l'extension du fichier (txt)
Vl_oDBContexte>>registerObject(Vl_NomSource,Vl_uneInstance) Vl_uneInstance>>URL="sdbc:flat:File:///P:/Bible" Vl_InfoBase[1]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[1]>>Name = "Extension" Vl_InfoBase[1]>>Value = "txt" Vl_uneInstance>>Info = Vl_InfoBase Vl_nomDocBase>>store() Je n'ai plus eu de message d'erreur à la fin du traitement mais la fusion ne tenait compte que du premier enregistrement de la base et ne passait pas aux enregistrements suivants.
Merci pour votre aide |
| |
| |
| | | |
|
| | |
| |
Posté le 26 juin 2009 - 08:57 |
Bonjour,
J'ai le même problème que vous. Avez-vous trouvé une solution ? |
| |
| |
| | | |
|
| | |
| |
Posté le 13 janvier 2010 - 18:38 |
Bonjour,
Quelqu'un a-t-il trouvé pourquoi le code donné dans les messages précédents "PLANTE" à la fin, alors que tout c'est executé ?
J'ai récupéré ce code en WD14 et je suis en OpenOffice 3.1 et j'ai le même problème. Merci au prgrammeur qui a mis ce code sur le forum , cela m'a permis de mieux comprendre le fonctionnement d'OpenOffice. Mais pourquoi y-a-t-il une erreur à la fin, une fois toute la procédure executée.
L'application plante comme s'il y avait une erreur en mémoire, mais je ne comprend pas pourquoi !!!!
Corinne Bonhomme Canada (Montréal) |
| |
| |
| | | |
|
| | |
| |
Posté le 14 janvier 2010 - 23:37 |
Bonjour,
Quelqu'un a-t-il réussi à faire du publipostage avec OpenOffice ?
Si vous avez essayé et pas réussi, cela m'intéresse de le savoir Avez-vous trouver une autre solution à part Word (car je le fait déjà en Word, mais on m'impose OpenOffice dans certains cas particulier)
C'est important, SVP, j'ai besoin de savoir si c'est un problème de code ou autres choses.
Le code ci-dessus fonctionne, mais plante à la fin en WD14-030f. Avez-vous réussi a le faire fonctionner dans une autre version de Windev (12, 15...) ?
Je ne comprend pas ce qui pose un problème et si c'est la version de Windev qui a un problème avec OpenOffice, je suis en train de chercher pour rien dans le code... Y-a-t-il une dll en problème (openoffice ou windev....)
Merci d'avance
Corinne Bonhomme Canada |
| |
| |
| | | |
|
| | |
| |
Posté le 15 janvier 2010 - 11:20 |
Bonjour,
Je n'ai pas trouvé de solution (il me semble que sous vista ça fonctionne mais sous XP c'est instable --> acces violation).
J'ai donc changé de méthode, je dezippe le fichier odt je travaille ensuite sur le xml puis je rezippe avec l'extension odt (car odt c'est des fichiers xml zippé).
On trouve pas mal de doc sur internet sur cette méthode.
Cordialement |
| |
| |
| | | |
|
| | |
| |
Posté le 15 janvier 2010 - 15:58 |
Merci, c'est justement le genre de réponse que je voulais.
Je vais voir si ma repsonsable accepte que je passe du temps vers cette solution. Si tu as des liens sur de la documentation bien faite, je prend. De toute façon, cela pourra servir à d'autres. Quand on cherche une solution Publipostage Windev/OpenOffice, on tourne pas mal en rond et il n'y a pas vraiment de solution qui marche, de détaillé.
J'ai vu quelque chose qui parle de ça sur le forum de OpenOffice.org
Merci beaucoup.
Corinne Bonhomme Canada |
| |
| |
| | | |
|
| | |
| |
Posté le 15 janvier 2010 - 16:44 |
Bonjour, j'ai eu aussi des problèmes lorsque je sortais d'une exécution OpenOffice. Le problème était résolu avec une variable de libération (nVariableDeLibération & Transfert) - (assistance PC-Soft payante). C'est à adapter à vos codes. Je vous fournis le code proposé par l'assistance :
pautServiceManager est un objet OLE dynamique
pautBureau est un objet OLE dynamique
pautDocument est un objet OLE dynamique
pautMonTexte est un objet OLE dynamique
pautMonCurseur est un objet OLE dynamique
tabArgs est un tableau de 0 objet OLE dynamique
pautMonTableau est un objet OLE dynamique
nLargeurTableau est un entier
tabSéparateur est un tableau de 3 objet automation dynamique nVariableDeLibération est un entier
Sablier(Vrai) QUAND EXCEPTION DANS
pautServiceManager=allouer un objet OLE ("com.sun.star.ServiceManager") pautBureau=pautServiceManager>>createInstance("com.sun.star.frame.Desktop") FAIRE
Info("OpenOffice n'est pas installé sur le poste.", "OpenOffice est nécessaire au bon fonctionnement du logiciel.", "Fermeture du programme")
FinProgramme() FIN
QUAND EXCEPTION DANS
TableauAjoute(tabArgs) tabArgs[1]=pautServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") tabArgs[1]>>Name="Hidden" tabArgs[1]>>Value=OLEFaux pautDocument=pautBureau>>LoadComponentFromURL("private:factory/swriter", "_blank", 0, tabArgs) FAIRE Info("Impossible de créer un document texte.", "Fermeture du programme")
FinProgramme() FIN
Libérer(tabArgs)
pautMonTexte=pautDocument>>Text pautMonCurseur=pautMonTexte>>createTextCursor
pautDocument>>Text>>insertString(pautMonCurseur, "Blabla blablabla bla blabla"+Caract(13)+Caract(13), OLEFaux)
pautMonTableau=pautDocument>>createInstance("com.sun.star.text.TextTable")
pautMonTableau>>Name="Tableau01"
pautMonTableau>>initialize(5, 4)
pautMonTexte>>insertTextContent(pautMonCurseur, pautMonTableau, Faux)
nLargeurTableau=pautMonTableau>>TableColumnRelativeSum
tabSéparateur[1]=pautServiceManager>>Bridge_GetStruct("com.sun.star.text.TableColumnSeparator") tabSéparateur[1]>>Position=nLargeurTableau*1/4 tabSéparateur[1]>>IsVisible=OLEVrai tabSéparateur[2]=pautServiceManager>>Bridge_GetStruct("com.sun.star.text.TableColumnSeparator") tabSéparateur[2]>>Position=nLargeurTableau*3/4 tabSéparateur[2]>>IsVisible=OLEVrai tabSéparateur[3]=pautServiceManager>>Bridge_GetStruct("com.sun.star.text.TableColumnSeparator") tabSéparateur[3]>>Position=nLargeurTableau*7/8 tabSéparateur[3]>>IsVisible=OLEVrai
QUAND EXCEPTION DANS pautMonTableau>>TableColumnSeparators=tabSéparateur Transfert(&tabSéparateur[3], &nVariableDeLibération, Dimension(nVariableDeLibération)) Transfert(&tabSéparateur[2], &nVariableDeLibération, Dimension(nVariableDeLibération)) Transfert(&tabSéparateur[1], &nVariableDeLibération, Dimension(nVariableDeLibération)) FAIRE Info("Pb.") FIN
pautMonCurseur>>gotoEnd(OLEFaux)
pautDocument>>Text>>insertString(pautMonCurseur, +Caract(13)+"Bloblo blobloblo blo bloblo", OLEFaux)
Info("Attente...")
pautDocument>>Close(OLEVrai)
|
| |
| |
| | | |
|
| | |
| |
Posté le 15 janvier 2010 - 17:47 |
Merci, je vais regarder.
Je pense que cela va peut-être aider d'autres programmeurs Windev, qui but sur le même problème. C'est la première fois que je vois ce bout de code dans toutes les recherches que j'ai fait sur le sujet.
Merci, merci, merci
Corinne Bonhomme Canada |
| |
| |
| | | |
|
| | |
| |
Posté le 15 janvier 2010 - 18:34 |
Oh, wow... je viens d'appliquer la solution du Transfert() expliqué plus haut. Et cela ne plante plus
Donc afin que les prochains programmeurs Windev puisse avoir un code qui fonctionne, je transmet le code qui fonctionne chez moi.
J'ai mis la commande Transfert(...) partout où il y avait utilisation de la commande "...>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")" après avoir utiliser la valeur du tableau dynamique éviement, car si je comprend bien, cela doit libérer (ou vider) le tableau dynamique. (voir code ci-dessous)
Merci de m'avoir transmis ton code. Je vais pouvoir maintenant avancer, car ceci n'est que le début du code. Il me fallait faire fonctionner cet exemple simple pour continuer.
J'espère que ce sujet servira à d'autres programmeurs
LOCAL Vl_Url est une chaîne Vl_NomSource est une chaîne Vl_CheminODB est une chaîne l_sVl_OutPut est une chaîne l_sVl_Prefixe est une chaîne Vl_Fusion est un objet OLE dynamique Vl_oDBContexte est un objet OLE dynamique Vl_uneInstance est un objet OLE dynamique Vl_nomDocBase est un objet OLE dynamique Vl_MyProps est un tableau de 0 Variants Vl_Args est un tableau de 2 objet automation dynamique Vl_DbArgs est un tableau de 1 objet automation dynamique Vl_InfoBase est un tableau de 5 objet automation dynamique
Vg_oServiceManager est un objet OLE dynamique Vg_oDesktop est un objet OLE dynamique Vg_oDocument est un objet OLE dynamique
nVariableDeLibération est un entier
Vg_oServiceManager = allouer un objet OLE ("com.sun.star.ServiceManager") Vg_oDesktop = Vg_oServiceManager>>createInstance("com.sun.star.frame.Desktop")
Vl_Url = "W:\developpement\Mes Projets\DossierEmploye_OpenOffice\Exe\Modele_Writer.odt" Vl_Url = "file:///"+Remplace(Vl_Url,"\","/")
Vl_Args[1]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_Args[1]>>Name = "Hidden" Vl_Args[1]>>Value = True
Vl_Args[2]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_Args[2]>>Name = "ReadOnly" Vl_Args[2]>>Value = False
QUAND EXCEPTION DANS
Vg_oDocument=Vg_oDesktop>>LoadComponentFromURL(Vl_Url,"_blank",0,Vl_Args) Transfert(&Vl_Args[2], &nVariableDeLibération, Dimension(nVariableDeLibération)) Transfert(&Vl_Args[1], &nVariableDeLibération, Dimension(nVariableDeLibération))
Vg_oDocument>>updateLinks
Vl_NomSource="WINDEV" Vl_oDBContexte = Vg_oServiceManager>>createInstance("com.sun.star.sdb.DatabaseContext")
Vl_CheminODB="file:///"+Remplace("W:\developpement\Mes Projets\DossierEmploye_OpenOffice\Exe\WINDEV.ODB","\","/")
SI Vl_oDBContexte>>hasByName(Vl_NomSource) ALORS Vl_oDBContexte>>revokeObject(Vl_NomSource) FIN
Vl_DbArgs[1] = Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_DbArgs[1]>>Name = "Overwrite" Vl_DbArgs[1]>>Value = True Vl_uneInstance = Vl_oDBContexte>>createInstance() Vl_nomDocBase = Vl_uneInstance>>DatabaseDocument Vl_nomDocBase>>storeAsURL(Vl_CheminODB,Vl_DbArgs) Transfert(&Vl_DbArgs[1], &nVariableDeLibération, Dimension(nVariableDeLibération))
Vl_oDBContexte>>registerObject(Vl_NomSource,Vl_uneInstance)
Vl_uneInstance>>URL="sdbc:flat:File:///"+Remplace("W:\developpement\Mes Projets\DossierEmploye_OpenOffice\Exe","\","/") Vl_InfoBase[1]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[1]>>Name = "Extension" Vl_InfoBase[1]>>Value = "txt" Vl_InfoBase[2]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[2]>>Name = "HeaderLine" Vl_InfoBase[2]>>Value = True Vl_InfoBase[3]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[3]>>Name = "FieldDelimiter" Vl_InfoBase[3]>>Value = TAB Vl_InfoBase[4]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[4]>>Name = "StringDelimiter" Vl_InfoBase[4]>>Value = "'" Vl_InfoBase[5]= Vg_oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") Vl_InfoBase[5]>>Name = "DecimalDelimiter" Vl_InfoBase[5]>>Value = "," Vl_uneInstance>>Info = Vl_InfoBase Vl_nomDocBase>>store() Transfert(&Vl_InfoBase[5], &nVariableDeLibération, Dimension(nVariableDeLibération)) Transfert(&Vl_InfoBase[4], &nVariableDeLibération, Dimension(nVariableDeLibération)) Transfert(&Vl_InfoBase[3], &nVariableDeLibération, Dimension(nVariableDeLibération)) Transfert(&Vl_InfoBase[2], &nVariableDeLibération, Dimension(nVariableDeLibération)) Transfert(&Vl_InfoBase[1], &nVariableDeLibération, Dimension(nVariableDeLibération))
Vl_Fusion= Vg_oServiceManager>>createInstance("com.sun.star.text.MailMerge") Vl_Fusion>>DataSourceName="WINDEV"
Vl_Fusion>>DocumentURL = Vl_Url Vl_Fusion>>CommandType=0 Vl_Fusion>>Command="DEE" Vl_Fusion>>OutputType=2
Vl_Fusion>>OutputUrl="file:///"+Remplace("W:\developpement\Mes Projets\DossierEmploye_OpenOffice\Exe\","\","/") Vl_Fusion>>FileNameFromColumn=False Vl_Fusion>>FilenamePrefix="Fusion.odt" Vl_Fusion>>SaveAsSingleFile=True Vl_Fusion>>Execute(Vl_MyProps) Vl_oDBContexte>>revokeObject(Vl_NomSource)
Vg_oDocument>>Close(OLEVrai) Vl_nomDocBase>>Close(OLEVrai) Vl_Fusion>>Dispose() Vl_oDBContexte>>Dispose() Vl_uneInstance>>Dispose()
Libérer Vl_Fusion Libérer Vl_uneInstance Libérer Vl_oDBContexte
Libérer Vg_oDocument Libérer Vg_oDesktop Libérer Vg_oServiceManager FAIRE SI Vg_oDocument<>Null ALORS Vg_oDocument>>Close(OLEVrai) Libérer Vg_oDocument Libérer Vg_oDesktop Libérer Vg_oServiceManager Erreur("Problème lors de la fusion"+RC+ExceptionInfo(errComplet)) FIN
FIN: Info("Terminé")
Il faut finaliser et rafiner, car j'ai fait plusieurs essai erreur. Le code dans le "... FAIRE...." est à revoir et vérifier de bien fermer ce qui est ouvert. Ce que je n'ai pas fait encore car je viens juste de le faire fonctionner sans plantage. Ce code était un test simple pour comprendre le fonctionnement.
Corinne Bonhomme Canada |
| |
| |
| | | |
|
| | |
| |
Posté le 20 mars 2010 - 20:06 |
Je comprends à peu près le code présenté. En revanche, je ne comprends pas d'où viennent tous ces paramètres. Je cherche une doc Open Office qui les expliquent. Par exemple:
vl_Args[1]=VgoServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue") v1_Args[1]>>Name= "Hidden" // <===== d'où cela vient-il ? v1_Args[2]>>Value = True
// Je comprends bien ce que cela signifie, mais de quelle documentation vient le mot clef "Hidden" Merci de m'aider à débuter. |
| |
| |
| | | |
|
| | |
| |
Posté le 10 avril 2010 - 22:05 |
Pouvez-vous publier la version définitive de votre code. Il y a des choses qui ne fonctionnent pas chez moi Merci. |
| |
| |
| | | |
|
| | |
| |
Posté le 05 mai 2010 - 00:41 |
Désolé , je n'ai jamais réussi a résoudre tous les problèmes. J'ai toujours des problèmes, OpenOffice à l'air de rester bloqué. La première fois cela marche, mais la deuxième fois, openOffice plante.
Ma boss m'a demandé d'arrêter, le service technique a fini par résoudre leur problème avec Word sous terminal serveur, et mon code de fusion Word fonctionne bien. Donc le besoin de faire de la fusion OpenOffice n'est plus une priorité pour la société.
Bonne chance, j'ai passé plus d'une semaine à plein temps à me casser les dents sur la fusion avec OpenOffice.
Mes connaissances d'OpenOffice ne sont pas suffisante pour comprendre le fonctionnement. je ne suis même pas une utilisatrice d'openOffice en temps normal, alors cela devient difficile de programmer un auotmatisme dans ces conditions.
Bonne chance et désolé de n'avoir pas de solution tout prêt, cela m'aurait fait plaisir de publier une version qui fonctionne.
Corinne Bonhomme Canada |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|