AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
01.06.20 - 13:50:58
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Lotus Notes / Domino Sonstiges
| |-+  OLE/COM-Programmierung
| | |-+  OpenOffice Parameterübergabe
« vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: OpenOffice Parameterübergabe  (Gelesen 12798 mal)
Ottmar
Junior Mitglied
**
Offline Offline

Geschlecht: Männlich
Beiträge: 94



« am: 25.11.08 - 00:03:11 »

Hallo,

ich beiße mir gerade an folgendem Problem die Zähne aus:
Ein Symphony-Dokument (OpenOffice) soll im Hintergrund erstellt und als PDF gespeichert werden.

Das Erstellen klappt wunderbar, nur beim Speichern als PDF klappts mit der Parameterübergabe nicht.

Das aufgezeichnete Macro liefert folgendes:
Code:
.....
dim args6(1) as new com.sun.star.beans.PropertyValue
args6(0).Name = "URL"
args6(0).Value = "file:///C:/Temp/Test.pdf"
args6(1).Name = "FilterName"
args6(1).Value = "writer_pdf_Export"
dispatcher.executeDispatch(document, ".uno:ExportTo", "", 0, args6())


Bei der Nachprogrammierung unter Script gehe ich wie folgt vor:
Code:
......
PrintArgs(0) = "Name='URL' Value='file:///C:/Temp/Testausgabe.pdf'"
PrintArgs(1) = "Name='FilterName' Value='writer_pdf_Export'"


Set ObjServiceManager = CreateObject("com.sun.star.ServiceManager")
Set PrintClass = ObjServiceManager.createInstance("com.sun.star.beans.PropertyValue")
Set ObjCoreReflection= ObjServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
Set ObjDesktop = ObjServiceManager.createInstance("com.sun.star.frame.Desktop")
'# Set ObjDispatcher = ObjServiceManager.createUnoService("com.sun.star.frame.DispatchHelper") -> geht nicht
Set ObjDispatcher = ObjServiceManager.createInstance("com.sun.star.frame.DispatchHelper")


'Dieses Beispiel erstellt ein leeres Symphony-Document.
'Man kann dies auch vom Filesystem oder von einer URL laden
Set ObjDocument = ObjDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, args)
Set ObjText = ObjDocument.getText()
Set ObjCursor = ObjText.createTextCursor()
ObjText.insertString objCursor, "Dies ist Text, der gleich als PDF ausgedruckt wird!", False


'Ausgabe als PDF auf "C:\Temp"
Call Objdispatcher.executeDispatch(ObjDocument, ".uno:ExportTo", "", 0, PrintArgs)
objDocument.dispose

Das Problem. Der Objdispatcher.executeDispatch frisst meine PrintArgs nicht. Ich habe alles mögliche versucht. Als Variant, als Record, als verschiedene Strings, als List as String, auch die Werte selbst habe ich immer wieder modifiziert und anders übergeben.

So langsam fällt mir aber nichts mehr ein. Immer wieder die Meldung
Zitat
Automation object argument type mismatch

Wie übergebe ich die Parameter richtig? Oder liegt's vieleicht gar nicht an den Parametern? Warum funktioniert das nicht?
Gespeichert
Ralf_M_Petter
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1879


Jeder ist seines eigenen Glückes Schmied


WWW
« Antworten #1 am: 26.11.08 - 08:21:50 »

Was hat Printargs für einen Datentyp. In deinem Code ist da nichts erkennbar. In der Aufzeichnung hat es einen Typ von com.sun.star.beans.PropertyValue. Das muß in deinem Code auch ähnlich sein.

Grüße

Ralf
Gespeichert

Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.
Ottmar
Junior Mitglied
**
Offline Offline

Geschlecht: Männlich
Beiträge: 94



« Antworten #2 am: 29.11.08 - 13:45:22 »

Hallo Ralf,

offenbar habe ich mich schlecht ausgedrückt. Lotus Script kennt den Datentyp 'PropertyValue' nicht. Lotus Script ("Call") erwartet als Parameter für die Datenübergabe den Datentyp 'Variant' (Unbestimmt).

Das funktionieriert in der Regel unter der klassischen OLE-Programmierung auch wunderbar. Bei Übergabe nach Word, Excel und Co einfach die Parameter als Variant deklarieren und fertig ist die Kiste.

OpenOffice macht mir da aber Schwierigkeiten. Natürlich habe ich auch den Weg versucht, den Du mir unten beschrieben hast. So habe ich zum Beispiel die PropertyValue wie folgt nachgebaut:

Code:
Type PrintArgument

          Name As String
          Handle As Long
          Value As Variant
          State As Variant

End Type

......

Dim PrintArgs(1) As Printargument

......

Hier scheitert die Sache aber schon beim Speichern des Scripts, da - wie gesagt - Lotus Script einen Variant erwartet:
Zitat
Script Error(s) found. Choose Yes to edit error(s); No to continue without saving any changes.

Ich habe nach wie vor keine Lösung und bin für jeden Tipp dankbar.
Gespeichert
Ottmar
Junior Mitglied
**
Offline Offline

Geschlecht: Männlich
Beiträge: 94



« Antworten #3 am: 09.12.08 - 20:24:48 »

Nachdem mir aus dem Forum diesmal niemand helfen konnte  Sad , habe ich nun probiert und probiert und jetzt selbst eine Lösung gefunden, die ich niemanden vorenthalten möchte. Im Grunde genommen besteht die Antwort aus zwei Teilen.

Zum Ersten: Parameterübergaben macht man wie folgt: Zunächst definiert man die zu übergebenden Parameter möglichst nahe am Original. Im Idealfall greift man bei der Definition selbst über OLE auf die entsprechenden Klassen zu:
Für obiges Code-Beispiel sähe das wie folgt aus:
Code:
Dim PrintArgs(1) as Variant
Dim PrintArgs1 as Variant
Dim PrintArgs2 as Variant

Set Printargs1= objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Set Printargs2= objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")

PrintArgs1.Name = "URL"
PrintArgs1.Value = "file:///" + FilePathname
PrintArgs2.Name = "FilterName"
PrintArgs2.Value = "writer_pdf_Export"

Set PrintArgs(0) = PrintArgs1
Set PrintArgs(1) = PrintArgs2

Damit ist der Variant-Typ PrintArgs sowohl für Lotus Script als auch für OLE verarbeitbar.

Die Frage zur korrekten Parameterübergabe ist damit geklärt. Punkt. Ende. Aus. Basta!

Wenn man den obigen Code entsprechend anpasst, erhält man allerdings immer noch die gleiche Fehlermeldung. Hier führt Lotus Notes den Entwickler damit gehörig auf den Holzweg  Evil

Als OpenOffice-Neuling begebe ich mich nun mit den 2 Teil meiner Antwort in den Bereich der Spekulation, hier kann es nicht schaden, wenn Fachleute meine Mutmaßungen bestätigen, korrigieren oder ergänzen.

Offenbar gibt es einige OpenOffice-Methoden und Eigenschaften in den Klassen, mit denen Lotus Symphony arbeitet. die Lotus Script über OLE aber nicht ansprechen kann. Ich vermute hier diverse Versionsprobleme der Sorte Lotus Script / OLE arbeitet mit "OpenOffice 1.0", Lotus Symphony arbeitet aber mit "OpenOffice X.Y" Wenn ich z.B. mit der Methode "createUnoService" arbeite, deutet eine aussagekräftige Lotus-Notes Fehlermeldung darauf hin, dass er die Methode nicht kennt.

Baue ich mir nun über andere Wege das benötigte Datenobjekt zu einer Klasse zusammen (z.B. statt über "createUnoService" über "createInstance"), dann ist im Ergebnis meine Variable möglicherweise unvollständig bzw. andersartig, als gewünscht. Es sieht so aus, als ob mein so definiertes Objekt zwar vom richtigen Klassentyp ist, aber nicht die Eigenschaften und Methoden zur Verfügung stehen, die ich erwarte.

Jedenfalls bekomme ich die Fehlermeldung mit den falschen Argumententypen offenbar immer auch dann, wenn ich Methoden aufrufe, die theoretisch zwar da sein könnten (d.h. syntaktisch korrekt geschrieben und allgemein für die Klasse definiert) die aber (aufgrund der "Entstehungsgeschichte" des konkreten Datenobjektes?) nicht zur Verfügung stehen.

Für das PDF-Druckproblem habe ich jedenfalls eine Lösung gefunden, indem ich einfach über andere Klassen gehe:
Anstatt über den etwas fragwürdig definierten Object-Dispatcher zu gehen
Code:
Call Objdispatcher.executeDispatch(ObjDocument, ".uno:ExportTo", "", 0, "")
habe ich es über die sauber definierte ObjDocument Variable gemacht:
Code:
Call objDocument.storeToURL("file:///"+FilePathname, PrintArgs)
.... und siehe da: Es geht!

Mein persönlicher Senf hierzu:
Der 8-er-Client mit installiertem Symphony schreit geradezu nach Anwendungen, mit denen über LotusScript/OLE Funktionen aus OpenOffice angebunden werden. Nie mehr 1000 Fallunterscheidungen programmieren (Welches Word, welches Excel usw.)
Allerdings ist bei der Umsetzung der "klassische" Weg (Makro aufzeichnen, mit "Copy+Paste" in den Script-Code kopieren, etwas Feintuning bei den Parameterübergaben, fertig) leider ein Holzweg.
Das gilt im Übrigen auch für die 8.5 er-Beta, an der ich das Ganze auch probiert habe.
Hier bin ich ein wenig von IBM enttäuscht, dass sie das nicht besser in den Griff gekriegt haben. Einerseits gibt man den Entwicklern ein tolles und mächtiges Werkzeug in die Hand, andererseits erscheint mir dieses Werkzeug - sag ich mal - 'lieblos' und 'hemdsärmlig' implementiert.
Erschwerend kommt hinzu, dass vernünftige Dokumentation hierzu kaum zu finden ist.

Naja, trotz allem glaube ich, Lotus Symphony hat Zukunft! Es wird Word und Co ganz sicher nicht vom Markt verdrängen, aber wenn der Notes-Client mit Symphony schon mal da ist und die passsenden Anwendungen dazu kommen, werden sich speziell diese Anwender mit den Produkten aus der OpenOffice-Gemeinde anfreunden. Warten wir's mal ab....


Gespeichert
koehlerbv
Moderatoren
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 20460



« Antworten #4 am: 09.12.08 - 20:56:09 »

Herzlichen Dank für Deine ausführliche und fundierte Rückmeldung. Mich motiviert das, mich an den kommenden langen, dunklen und kalten Chiemgauer Winterabenden  und Nächten mich mit diesem Thema auch tiefschürfender zu beschäftigen.

Bernhard
Gespeichert
Mr.Langhaar
Junior Mitglied
**
Offline Offline

Geschlecht: Männlich
Beiträge: 70


It´s not a Bug. It´s a feature !


« Antworten #5 am: 25.08.09 - 23:03:53 »

Hallo,

nachdem ich selber gerade mit dem Thema Konvertierung nach PDF über OpenOffice zu tun habe, noch ein Hinweis zu dem Punkt

>>Erschwerend kommt hinzu, dass vernünftige Dokumentation hierzu kaum zu finden ist.

Bei Sun gibts ein Programmierhandbuch zum Thema Starbasic

http://docs.sun.com/app/docs/doc/819-1326

Oder einfach nach Starbasic googeln.

Gruß
Thomas
Gespeichert

Seit R5.0 mit dabei
Server 9.0.1
Clients 9.0.1
Blackberry 12.5/Traveler 9
Sametime 8.5.2
MarvelClient
Ralf_M_Petter
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1879


Jeder ist seines eigenen Glückes Schmied


WWW
« Antworten #6 am: 16.09.09 - 15:49:04 »

Lotusscript und UNO ist keine besonders gute Konbination. Darum mache ich die UNO Anbindung in Java und das funktioniert eigentlich ganz gut, sobald man sich an die verquerte Logik von UNO gewöhnt hat.

Grüße

Ralf
Gespeichert

Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: