Array als Rückgabewert einer Function?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Agnostiker
Beiträge: 7
Registriert: Mo, 27.09.2004 12:32
Wohnort: Berlin
Kontaktdaten:

Array als Rückgabewert einer Function?

Beitrag von Agnostiker »

Hallo, ihr Lieben,

kann in OOBasic eine Function ein Array zurückgeben, und wenn ja, wie?
Habe leider bisher dazu nichts gefunden.

Und vielleicht noch eine winzige Frage: Wie rufe ich von VBA aus eine solche Function auf?

Merci vielmals!

Agnostiker
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Eine Funktion liefert bei Aufruf allgemein das Ergebnis der Operationen, welche in der Funktion 'durchgeführt' werden. Üblicherweise ist das Ergebnis ein Wert der sich an eine Variable übergeben läßt. Ich sehe da für ein Ergebnis das ein Array ist keine Besonderheiten, hier ist ein kleines Beispiel:

Code: Alles auswählen

Sub Macro1
Dim a(2,2) as integer
'funktionsaufruf
a()= test()
for x=0 to 2
for y=0 to 2
wert = STR(a(x,y))
gesamt = gesamt & wert & Chr(13)
next y
next x
msgbox gesamt
End Sub

function test()
dim b(2,2) as integer
b(0,0) = 1
b(0,1) = 3
b(0,2) = 5
b(1,0) = 11
b(1,1) = 12
b(1,2) = 7
b(2,0) = 14
b(2,1) = 8
b(2,2) = 9
test = b()
end function

Gruß
Stephan
Agnostiker
Beiträge: 7
Registriert: Mo, 27.09.2004 12:32
Wohnort: Berlin
Kontaktdaten:

Beitrag von Agnostiker »

Ja, super, Stephan, danke! :D

Das funktioniert ja hervorragend!
Auf die Idee war ich nicht gekommen. Ich Depp hab natürlich versucht einen Rückgabewert für die Funktion zu deklariert, - aber wenn's auch ohne geht... :lol:

Vielleicht kannst du (oder natürlich auch jemand anders 8) ) auch bei meiner Zusatzfrage helfen:

Wie kann ich solch eine Funktion zum Bleistift von Access (VBA) aus starten? Das ist mir leider trotz Recherche noch nicht klar...

Nochmal Merci vielmals

Agnostiker
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Wie kann ich solch eine Funktion zum Bleistift von Access (VBA) aus starten? Das ist mir leider trotz Recherche noch nicht klar...
Das VBA habe ich in Deinem ersten post mit Absicht überlesen, weil ich nicht wirklich dachte das VBA gemeint sei.
Ich nehme mal an das Du aus Access heraus nicht auf die Funktion zugreifen kannst (in dem Sinne das der Rückgabewert in Access direkt verwendet werden kann) sondern nur auf ein (StarBasic)Makro das dann die Funktion aufruft. Ich kann aber momentan auch nicht sagen wie das geht.

Was willst Du denn erreichen?
Es wäre z.B. relativ einfach in dem OpenOffice Dokument ein Autostartmakro zu haben, welches startet wenn die Datei (mit VBA) geöffnet wird.

Gruß
Stephan
Agnostiker
Beiträge: 7
Registriert: Mo, 27.09.2004 12:32
Wohnort: Berlin
Kontaktdaten:

Beitrag von Agnostiker »

Hallo Stephan, hallo ihr Lieben,

erstmal Danke für dein Interesse und deine Hilfe! :D

Gut, dann muß ich vielleicht doch kurz hier mein Problem in Gänze darstellen. Also, ich habe eine Access-Datenbank, die mir allerlei Textdokumente automatisch verschlagwortet. Dazu will ich OpenOffice sagen, welche Datei es öffnen soll und anschließend sollte mir OO die Worte in diesem Dokument in ein Array einlesen und dieses Array an Access zurückgeben, wo es dann weiterverarbeitet wird. Verständlich? Wenn nicht gern mehr über Email, ja?

Mit MS-Word funktioniert diese Zusammenarbeit sehr gut und ich denke mir, dass das entsprechend mit OO auch möglich sein sollte. Eigentlich fehlt mir jetzt zu meinem Glück nur noch der Aufruf meiner OO-Function! 8)
Erlaube mir, das noch mal als neues Thema in den Raum zu stellen.

Gruß

Agnostiker
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Gut, dann muß ich vielleicht doch kurz hier mein Problem in Gänze darstellen. Also, ich habe eine Access-Datenbank, die mir allerlei Textdokumente automatisch verschlagwortet. Dazu will ich OpenOffice sagen, welche Datei es öffnen soll und anschließend sollte mir OO die Worte in diesem Dokument in ein Array einlesen und dieses Array an Access zurückgeben, wo es dann weiterverarbeitet wird. Verständlich? Wenn nicht gern mehr über Email, ja?

Mit MS-Word funktioniert diese Zusammenarbeit sehr gut und ich denke mir, dass das entsprechend mit OO auch möglich sein sollte. Eigentlich fehlt mir jetzt zu meinem Glück nur noch der Aufruf meiner OO-Function!
Ja, das ist verständlich.
Ich habe jetzt aber das Gefühl das Du falsch an die Sache herangehst. Was soll der Funktionsaufruf? (Ich kann mir nicht vorstellen das Du bisher in Access ein Makro hast, welches eine in einem Word-Dokument gespeicherte Funktion aufruft und diese Funktion übergibt dann das Ergebnis an Access.)
Deshalb würde ich das auch für den Fall Access<-->OpenOffice(Writer) anders machen, z.B. so:

Code: Alles auswählen

Private Sub CommandButton1_Click()
'VBA !
Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
Set oDesktop = oServiceManager.createInstance("com.sun.star.frame.Desktop")
Dim aNoArgs()
'Pfad in Notation ConvertToUrl angeben
URL = "File:///D:/Test/test.sxw"
Set Doc = oDesktop.loadComponentFromURL(URL, "_blank", 0, aNoArgs())
Set Cursor = Doc.Text.createTextCursor
Cursor.gotostart (False)
gesamt = ""
Do
   Cursor.gotoEndOfParagraph (True)
   gesamt = gesamt & Cursor.String & Chr(13)
   Proceed = Cursor.gotoNextParagraph(False)
Loop While Proceed
MsgBox gesamt
End Sub
Dieses Makro (von MS Office aus gestartet) öffnet die angegebene *.sxw Datei und liest alle Absätze in eine Variable (gesamt) ein und gibt das dann in eine Message-Box aus.

Natürlich kannst Du auch einzelne Wörter ausgeben und das in ein Array einlesen etc. . Ich hoffe das Prinzip wird auch so deutlich. Ich habe das nicht ausgiebig getestet(*) (benutze zunächst vielleicht nur ein Dokument was einige kurze Absätze enthält und nichts weiter zum Ausprobieren), Fehler werden bisher nicht abgefangen.

(*)ich habe gerade kein Access installiert, getestet unter MS Word 97 und SO 7 PP3 (Windows 2000 Prof. SP4)


Sollte es, wider Erwarten, für den Funktionsaufruf einen spezifischen Grund geben, erkläre mir das bitte nochmal.

Gruß
Stephan
Agnostiker
Beiträge: 7
Registriert: Mo, 27.09.2004 12:32
Wohnort: Berlin
Kontaktdaten:

Beitrag von Agnostiker »

Hallo Stephan,

genauso hatte ich das zunächst im Fall Access<-->Word auch realisiert. Leider war dabei die Performance recht unbefriedigend, was möglicherweise an der OLE-Automation liegt. Deshalb hatte ich dann eben eine Funktion in Word geschrieben, die alle interessierenden Wörter in ein Array einliest und dann per Automation nur noch das ganze Array an Access zurückgibt, was die Performance um Faktor 20 bis 50 beschleunigte! Und jetzt war ich im Fall OO-Writer so auf dieses Konzept fixiert, dass ich an diese "alte" Variante gar nicht mehr gedacht habe! :oops: Deshalb danke für deinen Hinweis! Ich werde das in jedem Fall mal testen und dich das Ergebnis wissen lassen (natürlich nur, wenn's dich interessiert :wink: )

Gruß und Merci!

Agnostiker

P.S. Zum Thema "Function von VBA aus 'zünden'" habe ich doch noch was gefunden (siehe dort), allerdings weiß ich nicht, wie man den Rückgabewert einer Funktion erhalten kann...würde mich ja trotzdem noch interessieren...
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

genauso hatte ich das zunächst im Fall Access<-->Word auch realisiert. Leider war dabei die Performance recht unbefriedigend, was möglicherweise an der OLE-Automation liegt. Deshalb hatte ich dann eben eine Funktion in Word geschrieben, die alle interessierenden Wörter in ein Array einliest und dann per Automation nur noch das ganze Array an Access zurückgibt, was die Performance um Faktor 20 bis 50 beschleunigte!
Was die Ursache dafür ist weiß ich auch nicht, aber ich verstehe nun Deine Gründe für den vorgeschlagenen Weg.
Dieses Verhalten bezüglich der Geschwindigkeit sollte sich jedoch (falls es auch hier auftritt) sicher vermeiden lassen wenn Du:

Code: Alles auswählen

Private Sub CommandButton1_Click()
'VBA !
Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
Set oDesktop = oServiceManager.createInstance("com.sun.star.frame.Desktop")
Dim aNoArgs()
'Pfad in Notation ConvertToUrl angeben
URL = "File:///D:/Test/test.sxw"
Set Doc = oDesktop.loadComponentFromURL(URL, "_blank", 0, aNoArgs())
Set Cursor = Doc.Text.createTextCursor
Cursor.gotostart (False)
gesamt = ""
   Cursor.gotoEnd (True)
   
MsgBox Cursor.String
End Sub
Da jetzt praktisch der gesamte Text (Cursor.String) in einem "Zug" nach Access "übertragen" wird, sollte nun keine Verlangsamung der Verarbeitung eintreten. Der String ist (im Sinne "binär") vielleicht etwas größer als ein Array (dieses würde z.B. keine Leerzeichen enthalten müssen) aber der Unterschied sollte gering sein. Das einzige Problem was ich sehe ist die Beschränkung der String-Länge auf 64000 Zeichen, falls dieses Problem auftritt müßte man in Detail nachdenken wie man das auf mehrere Strings verteilt, was aber nicht grundsätzlich problematisch ist. Diesen langen String kannst Du dann in Access zerlegen.

Zu Deinen Ausführungen im anderen Thread:
OK der Code ist geeignet ein Makro der Bibliothek Standard von SO/OO zu starten. Hast Du eine Ahnung wie ich äquivalent ein Makro aus einem Modul des Dokuments starte? Wenn ich das Dokument mit Code öffne habe ich immer das Problem das SO meldet das Makro könne aus Sicherheitsgründen nicht gestartet werden (obwohl der Pfad des Dokuments in der Liste der sicheren Pfade steht)...
Wie Du dann das Array als Rückgabe bekommst weiß ich im spezifischen Fall nicht, aber Du könntest in jedem Fall das Array innerhalb des Moduls (jedoch außerhalb von Function oder Sub) mit Public oder Global deklarieren, dann bliebe der Inhalt des Arrays auch außerhalb der function oder sub erhalten. Ob oder wie Du mit VBA an diese Variable kommst weiß ich zunächst auch nicht - aber vielleicht gibt das Deinen Überlegungen eine neue Richtung.
Nun ja und Du kannst aus dem Array eine Textdatei mit Trennern erzeugen (innerhab des sub oder function von OO) und diese anschließend von Access aus auslesen und dann wieder löschen - ist aber ein bißchen eigentümliches Vorgehen.


Gruß
Stephan
Agnostiker
Beiträge: 7
Registriert: Mo, 27.09.2004 12:32
Wohnort: Berlin
Kontaktdaten:

Beitrag von Agnostiker »

Hallo Stephan,

zu und zu gern würde ich deine Frage bzgl. des "Dokumenten-Makros" beantworten können, aber da ich mich erst seit vier Tagen mit OO beschäftige wüsste ich jetzt noch nicht mal, wie dieses Makro zu adressieren wäre (in diesem dispatch-Befehl). Aber ich werde mich drum kümmern...

Auch habe ich immer noch keinen Hinweis gefunden, ob man einen Rückgabewert einer Funktion von VBA aus 'abholen' kann. Hab die Frage jetzt mal im englischsprachigen OO-Forum plaziert, wo mir doch ein wenig mehr Verkehr zu herrschen scheint.

Die von dir angeregte Variante werde ich jetzt mal die nächsten Tage austesten, wobei dein letzter Vorschlag (mit der Textdatei) sicherlich aus Performancegründen ausscheidet.

Dir nochmal ganz herzlichen Dank
und ich meld mich dann wieder

Agnostiker

P.S. Klar hatte ich das Array als Global bzw. Public deklariert :wink: , sonst wär's wohl nicht sooo günstig, oder? Aber ich hab halt keinen Schimmer wie ich den Pointer übergeben kann. Bin gespannt, ob's eine Lösung gibt... 8)
Antworten