PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Erreur automation OLE OpenOffice
Erreur automation OLE OpenOffice
Started by LC, Sep., 06 2017 4:23 PM - 14 replies
Registered member
628 messages
Popularité : +0 (16 votes)
Posted on September, 06 2017 - 4:23 PM
Bonjour,
en suivant l'exemple fournit, (qui marche) j'ai codé :

oSM,oDesktop sont des objets Automation dynamiques
oDocument,oFeuille sont des objets Automation dynamiques
mNoArgs est un tableau de 0 Variant
QUAND EXCEPTION DANS
oSM = allouer un objet Automation("com.sun.star.ServiceManager")
oDesktop = oSM>>createInstance("com.sun.star.frame.Desktop")
FAIRE
Erreur("LibreOffice n'est pas installé sur votre poste.")
FIN
oDocument = oDesktop>>LoadComponentFromURL("private:factory/scalc", "_blank", 0, mNoArgs)

le nouveau tableau s'ouvre bien, mais j'ai l'erreur suivante :
"Le tableau dynamique n'a pas été alloué"
qu'est ce que j'ai oublié ?
Registered member
962 messages
Popularité : +183 (185 votes)
Posted on September, 06 2017 - 5:55 PM
hello,
avec ce code en windev 16, Libre Office 5.2.7.2 , sous windows 7 je n'ai pas d'erreur.

--
Ami calmant, J.P
Registered member
962 messages
Popularité : +183 (185 votes)
Posted on September, 06 2017 - 6:03 PM
si c'est le tableau de variant qui pose problème tu peux essayer ceci :
oSM,oDesktop,OCref sont des objets automation dynamiques
oDocument,oFeuille sont des objets automation dynamiques
mNoArgs est un tableau de 0 Variant
arg_LdDoc est un tableau de 1 objet automation dynamique
QUAND EXCEPTIONEXCEPTION DANS
oSM = allouer un objet automation("com.sun.star.ServiceManager")
oDesktop = oSM>>createInstance("com.sun.star.frame.Desktop")
OCref = oSM>>createInstance("com.sun.star.reflection.CoreReflection")
FAIRE
Erreur("LibreOffice n'est pas installé sur votre poste.")
FIN
arg_LdDoc[1] = OOValeurNommée(OCref,"Hidden",Faux)
oDocument = oDesktop>>LoadComponentFromURL("private:factory/scalc", "_blank", 0, arg_LdDoc)


--
Ami calmant, J.P
Message modified, September, 06 2017 - 6:04 PM
Registered member
628 messages
Popularité : +0 (16 votes)
Posted on September, 06 2017 - 6:19 PM
oui c'est ce que je fais, j'ai repris ton exemple et ça marche, je progresse ...
j'essaie maintenant avec un classeur OO déja ouvert de créer une nouvelle feuille automatiquement en fonction d'index .. pfuu ..
Excel est bien plus simple .. encore Merci.
Registered member
628 messages
Popularité : +0 (16 votes)
Posted on September, 06 2017 - 7:26 PM
Bon j'en suis à écrire dans les cellules, mais j'ai un problème car comme dans Excel (j'ai les 2),
je dois écrire une matrice (Matrice OO : x colonnes sur y lignes) et je ne sais pas comment faire, puisque je n'ai que 3 syntaxes :
oFeuille>>getCellRangeByName(PlageDeDonnees)>>String = MatriceOO
oFeuille>>getCellRangeByName(PlageDeDonnees)>>Value = MatriceOO
oFeuille>>getCellRangeByName(PlageDeDonnees)>>Formula = MatriceOO
Bien entendu, dans ma matrice, je peux avoir n'importe quelle sorte de données ...
comment ?
Registered member
628 messages
Popularité : +0 (16 votes)
Posted on September, 07 2017 - 10:42 AM
personne ?
un autre truc qui me dérange,
ma requête interroge une base MyQql et pour les numériques type [20,9 décimales]
la ligne : oFeuille>>getCellRangeByName(PlageDeDonnees)>>Value = champderequete
plante... Avec des entiers ça marche, comment dois je faire ?
Registered member
628 messages
Popularité : +0 (16 votes)
Posted on September, 07 2017 - 11:59 AM
bon j'ai converti avec : VAL et ça à l'air de marcher ...
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on June, 21 2020 - 6:13 PM
BJurassic Pork a écrit :
si c'est le tableau de variant qui pose problème tu peux essayer ceci :
oSM,oDesktop,OCrefsont des objets automationdynamiques
oDocument,oFeuillesont des objets automationdynamiques
mNoArgsest un tableau de0Variant
arg_LdDocest un tableau de1objet automationdynamique
QUAND EXCEPTIONEXCEPTION DANS
oSM=allouer un objet automation("com.sun.star.ServiceManager")
oDesktop=oSM>>createInstance("com.sun.star.frame.Desktop")
OCref=oSM>>createInstance("com.sun.star.reflection.CoreReflection")
FAIRE
Erreur("LibreOffice n'est pas installé sur votre poste.")
FIN
arg_LdDoc[1] =OOValeurNommée(OCref,"Hidden",Faux)
oDocument=oDesktop>>LoadComponentFromURL("private:factory/scalc","_blank",0,arg_LdDoc)


--
Ami calmant, J.P
Message modifié, 06 septembre 2017 - 18:04




Bonsoir à tous,
Et merci à Jurrasic Porck pour ces codes.
Je rencontre un PB similaire.
Je suis sous WD23 et mon OO est la version 4.1.7

Quand j'utilise l'exemple complet de manipulation des tableurs dans mon projet :
mNoArgs est un tableau de 0 variant
// Service manager nécessaire à OpenOffice
:_DémarrerService()
// Création d'un nouveau classeur
:oDocument = :oDesktop>>LoadComponentFromURL("private:factory/scalc", "_blank", 0, mNoArgs)//_blank

J'ai un message d'erreur qui me dit que le tableau n'est pas alloué.

J'ai tenté a exploiter tes codes (ci -dessus que JP a donné) mais j'ai un message qui me dit que OOValeurNommée est incconu.
Comment doit etre déclaré OOValeurNommée ?
Merci
Fred
Registered member
962 messages
Popularité : +183 (185 votes)
Posted on June, 22 2020 - 7:09 AM
hello,
voici la procédure OOValeurNommée :
Procedure OOValeurNommée(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


--
Ami calmant, J.P
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on June, 22 2020 - 4:40 PM
Bonjour,
Merci beaucoup.
C'est une procédure à mettre dans les procédure de la fenêtre? procédure globale ou procédure de la classe CCclasseur?
Au plaisir de te lire.
Fred
Registered member
962 messages
Popularité : +183 (185 votes)
Posted on June, 23 2020 - 7:07 AM
hello,
à mettre dans les procédures locales de la fenêtre si la procédure n'est appelée que par du code de cette fenêtre.

--
Ami calmant, J.P
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on July, 10 2020 - 10:44 PM
Bonsoir Jurassic Pork
Merci pour ton info.
J'ai mis en place la procédure dans les procédures locales de la fenêtre qui ne traite que l'automation.
Pour la création du tableau dans OO, c'est OK.
Là ou je rencontre un soucis c'est que lorsque depuis la même fenêtre je demande à remplir une cellule j'ai de nouveau la même erreur de tableau non alloué.
Devrais je mettre la procédure dans les procédure globales du projet? J'ai essayé mais j'ai alors l"erreur initiale à la création du tableau qui me dit aussi que le tableau n'est pas alloué.

Ce qui m’inquiète c'est que les codes que j'utilise sont ceux de l'exemple complets.

Que me suggères tu?
Merci
Registered member
962 messages
Popularité : +183 (185 votes)
Posted on July, 11 2020 - 12:57 AM
hello,
peux-tu nous montrer TOUT le code que tu utilises ? et l'endroit où tu as une erreur ?

--
Ami calmant, J.P
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on July, 11 2020 - 4:54 PM
Bonjour,

J'ai repris l'exemple complet de winDev dont j'ai juste modifier la fenetre pour etre ma fenetre principale.
Dans la fenetre principale j'ai mis la procedure locale que tu m'as suggéré:

-----------------------------------------------------------
PROCÉDURE OOValeurNommée(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
-----------------------------------------------------------

J'ai un bouton qui fait ceci:

-----------------------------------------------------------
gpclMonTableur = CChoixTableur::TableurChoix() // ce qui m'ouvre une boite de dialogue où je choisi OpenOffice
gpclMonTableur:Créer() // la créaction se passe bien. Open office m'ouvre un classeur
gpclMonTableur:Cellule_Ecrire("A1","NOM")
gpclMonTableur:Cellule_Ecrire("B1","PRENOM")
gpclMonTableur:Cellule_Ecrire("C1","AGE") // la création des 3 colonnes se passe bien.
gpclMonTableur:EnregistrerSous() // la boite de dialogue me demandant sous quel nom et dans quel rep je veux enregistrer mon nouveau tableau se passe bien?
-----------------------------------------------------------

La procédure pour créer ma classeur est celle-ci

-----------------------------------------------------------
PROCÉDURE VIRTUELLE Creer()
oSM,oDesktop,OCref sont des objets Automation dynamiques
pautODocument,pautOFeuille sont des objets Automation dynamiques
mNoArgs est un tableau de 0 Variant
arg_LdDoc est un tableau de 1 objet Automation dynamique
QUAND EXCEPTION DANS
oSM = allouer un objet Automation("com.sun.star.ServiceManager")
oDesktop = oSM>>createInstance("com.sun.star.frame.Desktop")
OCref = oSM>>createInstance("com.sun.star.reflection.CoreReflection")
FAIRE
Erreur("LibreOffice n'est pas installé sur votre poste.")
FIN
arg_LdDoc[1] = OOValeurNommée(OCref,"Hidden",Faux)
-----------------------------------------------------------

Quand le cmasseur est créé, selon l'enchainement du bouton j'ai appelé l'enregistrement du classeur et m'ouvre la fenetre de dialogue avec le repertoire à choisir et le nom a donner au fichier.

Quand je clique sur "enregistrer" l'ai le message suivant:

-----------------------------------------------------------
Erreur à la ligne 31 du traitement Méthode EnregistrerSous.
Le tableau dynamique n'a pas été alloué.

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

Projet : ETUDE

Appel WL :
Traitement de 'Méthode EnregistrerSous' (CClasseur.EnregistrerSous), ligne 31, thread 0

Que s'est-il passé ?
Le tableau dynamique n'a pas été alloué.

Code erreur : 2301
Niveau : erreur fatale

Dump de l'erreur du module 'wd230vm.dll' (23.0.370.1).
Identifiant des informations détaillées (.err) : 2301
Informations de débogage :
COperationAutomation::__bLibereParametreAppelAutomation(0)
Informations supplémentaires :
EIT_PILEWL :
Méthode EnregistrerSous (CClasseur.EnregistrerSous), ligne 31
Sélection du menu de Démarrage.OPT_Main_Courante.OPT_Creer_une_Main_Courante (FEN_Absence.Démarrage.OPT_Main_Courante.OPT_Creer_une_Main_Courante), ligne 18
EIT_DATEHEURE : 11/07/2020 16:43:18
-----------------------------------------------------------


Et le debugg me renvoi ici:

-----------------------------------------------------------
PROCÉDURE VIRTUELLE EnregistrerSous(psCheminComplet="")
// Variables locales
tabMNoArgs est un tableau de 0 Variant
sNomClasseur est une chaîne
// Y-a-t-il bien un document actif ?
SI :EstOuvert()=Faux ALORS RENVOYER Faux
SI psCheminComplet<>"" ALORS
sNomClasseur = psCheminComplet
SINON
sNomClasseur = fSélecteur("", "", "Sélectionnez un classeur...", "Classeur OpenOffice (*.ods)"+TAB+"*.ods"+RC+"Openoffice.org Classeur (*.sxc)"+TAB+"*.sxc", "*.ods", fselCrée)
SI sNomClasseur="" ALORS RENVOYER Faux
FIN
// Formatage du chemin du fichier
sNomClasseur = "file:///"+Remplace(sNomClasseur,"\","/")
// Enregistrement du document
:oDocument>>storeToURL(sNomClasseur, mNoArgs)
RENVOYER Vrai
-----------------------------------------------------------

Selon le debugg l'erreur pointe sur la ligne

:oDocument>>storeToURL(sNomClasseur, mNoArgs)


Ai je donné assez d'info?

En te remerciant.
Registered member
962 messages
Popularité : +183 (185 votes)
Posted on July, 12 2020 - 2:18 AM
hello,
d'après ce post :
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/237941-convertir-document-format-docx-vers-format-pdf-avec/read.awp
l'instruction :
tParams est un tableau de 0 objet automation dynamique //Tableau de paramètres
// ou tParams est un tableau de 0 variant

provoque un message d'erreur d'allocation du tableau depuis une version située ente la version 22 et la version 25.
Comme je n'ai que la version 16 je ne peux pas vérifier (pas d'erreur en version 16). Est-ce que quelqu'un peut confirmer cela ?
Dans ce cas il ne faut plus utiliser l'instruction mNoArgs est un tableau de 0 Variant

--
Ami calmant, J.P