"setDataArray"-Anweisung wird nicht angenommen

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

Moderator: Moderatoren

Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

"setDataArray"-Anweisung wird nicht angenommen

Beitrag von Mr.Ed »

Hallo zusammen,

ich hangele mich von Funktion zu Funktion weiter. Arbeitsergebnisse werden jeweils über ein globales Array aGlobal() weitergegeben. Am Ende jeder Funktion steht eine Datei, die – gespeichert oder nicht – als gerade geöffnetes Dokument in die nächste Funktion (oDoc1 = ThisComponent) übernommen wird. Im konkreten Fall ist dies ein vorher gespeichertes leeres Calc-Dokument.

Aktuell gelingt es mir, die aus aGlobal() in aNamen() übernommenen Daten in das geöffnete Calc-Dokument einzutragen. Bis Zeile 13 des Codes funktioniert alles. Auch Zeile 14 (Füllen des Arrays aKopf()) und Zeile 15 werden akzeptiert. Dann aber gibt es in Zeile 16, der letzten Zeile des Codes, folgende Fehlermeldung: "Basic-Laufzeitfehler - Objektvariable nicht belegt."

Code: Alles auswählen

Function Calc_Datei_erstellen
	Dim oDoc1 as Object, arg(), aNamen(), oBereich as Object, z as Integer, aDat(), aKopf()
	oDoc1 = ThisComponent
	aNamen() = aGlobal()
	z = Ubound(aNamen())
	aDat() = aNamen()
	Redim Preserve aDat(1 to z, 22)
	oBereich = oDoc1.Sheets(0).getCellRangeByName("f2:ab24")
	oBereich.setDataArray(aDat())
	aDat() = aNamen()
	Redim Preserve aDat(1 to z, 23 to 23)
	oBereich = oDoc1.Sheets(0).getCellRangeByName("d2:d24")
	oBereich.setDataArray(aDat())
	aKopf() = array("ID", "klasse", "nr")
	oBereich = oDoc1.Sheets(0).getCellRangeByName("a1:c1")
	oBereich.setDataArray(aKopf())
End Function
Wie kann das sein? Die vorherigen "setDataArray"-Anweisungen wurden problemlos ausgeführt. Wieso hakt es in der letzten Zeile? Vielleicht hat jemand eine Idee?

MfG Mr.Ed
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von Karolus »

Hallo
Du solltest eigentlich schon bemerkt haben das DataArray_s in Calc immer verschachtelt sind!

Code: Alles auswählen

aKopf() = array( array("ID", "klasse", "nr"))
Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von Mr.Ed »

Karolus hat geschrieben: Du solltest eigentlich schon bemerkt haben das DataArray_s in Calc immer verschachtelt sind!
Nein, ich hatte noch nicht bemerkt, dass DataArrays in Calc immer verschachtelt sind, ich lerne ja noch. Vielen Dank dem 'strengen' Lehrer für seinen klaren Hinweis. Es funktioniert! (Verständnis hinkt hinterher.)

MfG Mr.Ed
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von Mr.Ed »

Hallo allerseits, hallo Carolus,

was ich im ursprünglichen Code (vergleiche erstes Posting) nicht verstand: Die beiden zweidimensionalen Arrays aDat(), jeweils mit Redim Preserve aus aNamen() zurechtgestutzt, wurden anstandslos von setDataArray(aDat()) in die Tabelle geschrieben. Genau das funktionierte aber nicht mit dem eindimensionalen Array aKopf().

Nun sagst du, Carolus, Arrays in Calc seien immer verschachtelt. Verschachtelte Arrays sind ja eindimensional, die "zweite Dimension" wird durch die Verschachtelung sozusagen simuliert.

Ich habe es gerade ausprobiert: "Echte" zweidimensionale Arrays werden auch ohne Verschachtelung geschrieben:

Code: Alles auswählen

'	aKopf() = array(array("ID", "klasse", "nr")) ===> Carolus, "verschachteles" Array, Schreiben in Calc funktioniert
	Redim aKopf(0,2) ' zweidimensionales Array
	aKopf(0,0) = "ID" : aKopf(0,1) = "klasse" : aKopf(0,2) = "nr"
	oBereich = oDoc1.Sheets(0).getCellRangeByName("a1:c1")
	oBereich.setDataArray(aKopf()) ' Funktioniert, obwohl Array nicht verschachtelt
Etwas anderes ist es wahrscheinlich mit dem Auslesen von Daten aus Calc (getDataArray()). Diese Methode liefert wohl immer ein eindimensionales, verschachteltes Array.

Habe ich es richtig verstanden?

MfG Mr.Ed
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von DPunch »

Aloha

DataArrays sind in UNO immer Sequenzen von Sequenzen (in Basic also Arrays von Arrays).
Die äussere Sequenz beschreibt die Zeilen, die inneren Sequenzen beschreiben die einzelnen Spalten.

Die Tatsache, dass auch zweidimensionale Arrays als DataArray akzeptiert werden, halte ich für eine Komfortfunktion, denn ein zweidimensionales Array ist etwas anderes als eine Sequenz aus Sequenzen, bzw. ein Array aus Arrays.

Insofern hast Du das durchaus richtig verstanden:
Beim Lesen wirst Du immer die vorgesehene Form zurückgeliefert kriegen (Array aus Arrays), beim Schreiben werden auch zweidimensionale Arrays akzeptiert.
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von Mr.Ed »

Hallo DPunch,
DPunch hat geschrieben: Die Tatsache, dass auch zweidimensionale Arrays als DataArray akzeptiert werden, halte ich für eine Komfortfunktion, denn ein zweidimensionales Array ist etwas anderes als eine Sequenz aus Sequenzen, bzw. ein Array aus Arrays.
Ich würde nicht sagen, dass es sich um eine reine "Komfortfunktion" handelt. Die Logik ist eigentlich ganz einfach: Tabellen, und nichts anderes macht Calc ja, sind immer zweidimensionale Datenarrangements. Also wird ein zweidimensionales Array beim Schreiben in eine Tabelle akzeptiert. Beim Lesen aus einer Tabelle ist halt die Frage, was der Benutzer wünscht, ein zweidimensionales Array oder ein "Arrays von Arrays". Hier hat man sich wohl für die zweite Möglichkeit entschieden.

Ich glaube, ich habe verstanden, worum es geht. Vielen Dank!

MfG Mr.Ed
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von DPunch »

Aloha
Mr.Ed hat geschrieben:Die Logik ist eigentlich ganz einfach: Tabellen, und nichts anderes macht Calc ja, sind immer zweidimensionale Datenarrangements. Also wird ein zweidimensionales Array beim Schreiben in eine Tabelle akzeptiert. Beim Lesen aus einer Tabelle ist halt die Frage, was der Benutzer wünscht, ein zweidimensionales Array oder ein "Arrays von Arrays". Hier hat man sich wohl für die zweite Möglichkeit entschieden.
Nein, die API ist da eindeutig.
Erwartet und zurückgeliefert wird ein Array aus Arrays, respektive eine Sequenz aus Sequenzen im UNO-Slang.
Wie gesagt sind zweidimensionale Arrays etwas anderes als ein Array aus Arrays - zweidimensionale Arrays haben eine festgelegte Dimensionierung für jedes Element der 1. Dimension, während bei einem Array aus Arrays das 1. Element des Arrays ein Array mit 5 Elementen sein könnte und das 2. Element ein Array mit 3 Elementen.

Was aber in diesem Fall eine Besonderheit ist, ist, dass Zellbereiche immer ein Rechteck bilden, so dass ein zweidimensionale Arrays anscheinend problemlos transformiert und akzeptiert werden kann - das entspricht nicht der Spezifikation, aber es funktioniert, sogar entgegen der OOo-Wiki
UNO does not recognize multi-dimensional sequences. Instead, a sequences can have elements that are also sequences.
Sowas nenne ich Komfortfunktion ;)
(dazu sei Dir noch erklärt, dass es einige Methoden gibt, die eine Sequenz, bzw eine Sequenz aus Sequenzen als Parameter verlangen, und ich befürchte, dass die wenigsten davon so nachsichtig sind wie .setDaraArray)
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von Mr.Ed »

Hallo DPunch,

okay Komfortfunktionalität. Jetzt habe ich den Unterschied vielleicht verstanden:
DPunch hat geschrieben:... während bei einem Array aus Arrays das 1. Element des Arrays ein Array mit 5 Elementen sein könnte und das 2. Element ein Array mit 3 Elementen.
Ein Array aus Arrays ermöglicht also mehr Information als ein zweidimensionales Array. Es mag in einer Tabelle Zellen geben, die schlicht ungefüllt (nicht genutzt, leer) sind. Genau das könnte in einem zweidimensonalen Array nicht dargestellt werden. Richtig verstanden?

MfG Mr.Ed
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: "setDataArray"-Anweisung wird nicht angenommen

Beitrag von DPunch »

Aloha
Mr.Ed hat geschrieben:Genau das könnte in einem zweidimensonalen Array nicht dargestellt werden. Richtig verstanden?
Prinzipiell richtig verstanden, wobei das Beispiel für einen Zellbereich / eine Tabelle nicht anwendbar ist, da Bereiche dort immer über ein Rechteck gebildet werden, so dass eine leere Zelle in dem Bereich auch immer ein (leeres) Element in der inneren Sequenz (welche ja die Spalten repräsentiert) nach sich zieht.
Das meinte ich mit Besonderheit: ein Zellbereich lässt sich, wie Du ja schon festgestellt hast, auch immer durch ein Zweidimensionales Array beschreiben, so dass die Transformation in diesem Fall kein Problem darstellen dürfte.
Ich gehe aber nicht davon aus, dass man dies als Gegebenheit für alle Methoden, die als Parameter ein Array von Arrays erwarten, sehen kann oder sollte.
Antworten