Dynamische Array einfügen

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

Moderator: Moderatoren

Plan-B
Beiträge: 4
Registriert: Mo, 01.11.2021 08:54

Dynamische Array einfügen

Beitrag von Plan-B »

einen schönen guten Tag an Alle,
Bitte um Hilfe:
test.ods
(10.65 KiB) 105-mal heruntergeladen
Komme leider nicht weiter beimSchreiben des Arrays auf die nächste Tabelle.

Code: Alles auswählen

Sub test_array
dim quelle(n)
oTest=thiscomponent
halt=0
n=0
i=0
do
	if oTest.Sheets(0).getCellByPosition(3,i).string = "x" then		'Check ob Spalte D markiert ist
		redim preserve quelle(n)
		quelle(n)=oTest.Sheets(0).getcellrangebyposition(0,i,2,i).getDataArray()
		n=n+1
		i=i+1
	else
		i=i+1
	end if
	if oTest.Sheets(0).getCellByposition(0,i).string="" then halt = 1
loop while halt=0
dim	ziel(n-1)
		ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
		ziel.SetDataArray(quelle(n-1))						'Hier funkt leider nicht. Fehlermeldung: Object variable nicht belegt

End Sub
Was mache ich falsch ? bzw. wie muss ich Zielarray definieren.
Vielen herzlichen Dank für Euere Hilfe.
Gruss
Win 10, oOo 4.1.10
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Dynamische Array einfügen

Beitrag von craig22 »

Hallo,

vorweg:
Es gibt verschieden Array-Typen:
typische Deklarationen:
  1. eindimensionale

    Code: Alles auswählen

    Dim mArray(0 to 5) as Variant
  2. mehrdimensionale

    Code: Alles auswählen

    Dim mArray(0 to 5,0 to 10) as Variant
  3. und "Array von Array's

    Code: Alles auswählen

    Dim mArray() as Variant
Die Array können wie in meinen Beispielen bereits dimensioniert werden, muss aber nicht.
Der Datentyp "Variant" kann hingegen wichtig sein, weil die Datenfelder des Array's unterschiedliche Inhalte aufweisen kann:
Text, Datum, Integer, Long, Double usw.

Wenn man aus einem Zellbereich ein Array befüllen will, dann nutzt man einfach ...getDataArray.
Die Festlegung und die Dimensionierung die Dimensionierung des Array's übrenimmt der Basic-Interpreter der IDE.
In jedem Fall ist ein solches Array ein "Array von Array's", das ich wie oben unter Punkt "c" beschrieben habe deklariert.
Dieses verschachtelte Array sieht dann so aus:
Basic-IDE-Beobachter --- Array von Arrays.JPG
Basic-IDE-Beobachter --- Array von Arrays.JPG (29 KiB) 3084 mal betrachtet
Und hier die Beispieldatei. In Module2 befindet sich das von mir geschrieben Makro inkl. diverser Kommentare:
test-2 Array von Arrays.ods
(13.48 KiB) 113-mal heruntergeladen
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Dynamische Array einfügen

Beitrag von Karolus »

@craig Es gibt *nur* die zwei Typen, dein Fall c. ist ein eindimensionales äusseres Arrray mit einem|mehreren inneren eindimensionalen Array's als Inhalt.
Off Topic: ein DataArray gebildet via …getDataArray entspricht c. falls aber eine Bereichadresse als Argument in eine UDF geworfen wird, kommt dort ein zweidimensionales Array an das unglücklicherweise ab index 1 dimensioniert ist anstatt wie sonst mit Index 0

zurück zum Thema, "Filtern" aller Zeilen einer Selektion deren letzte Spalte ein 'x' ist, in python per DataArray:
mit einem Cursor-object ( das ist nichts weiter als ein Zell[bereich] mit erweiterten Methoden kann das geschickt gelöst werden:

!Vorsicht Python!

Code: Alles auswählen

doc = XSCRIPTCONTEXT.getDocument()
selection = doc.CurrentSelection
data = selection.DataArray
out = [ row[ :-1] for row in data if row[-1]=='x' ] 

target = doc.Sheets.Tabelle2
cursor = target.createCursorByRange(target['A1'])
cursor.collapseToSize(len( out[0] ), len(out) ) #1.col_width 2.row_height
cursor.setDataArray( out )
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Plan-B
Beiträge: 4
Registriert: Mo, 01.11.2021 08:54

Re: Dynamische Array einfügen

Beitrag von Plan-B »

guten Morgen,
Vielen vielen Dank für Euere Hilfe.
@Craig22
Danke für die
Und hier die Beispieldatei. In Module2 befindet sich das von mir geschrieben Makro inkl. diverser Kommentare:
Super Erklärung für einen Anfänger wie ich. Vielen Dank.
Als Gerüst für mein Vorhaben kann ich es einsetzen. Es läuft.
Versuche den zu kopierenden Bereich etwas "dynamisch" anzupassen.
@Karolus
Vielen Dank für Deine Tips
Euch allen och einen schönen Tag.
gruss
Win 10, oOo 4.1.10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Dynamische Array einfügen

Beitrag von mikeleb »

Hallo,
wie schon gesagt, liefert .getDataArray ein Array von Arrays (ein Array von Zeilen, bei der jede Zeile wiederum ein Array darstellt. Durch die Konstruktion

Code: Alles auswählen

quelle(n)=oTest.Sheets(0).getcellrangebyposition(0,i,2,i).getDataArray()
Erzeugst du jetzt aber ein Array von Arrays von Arrays.
Lösung:

Code: Alles auswählen

quelle(n)=oTest.Sheets(0).getcellrangebyposition(0,i,2,i).getDataArray()(0)
Durch die (0) wird nur das erste Element des Arrays (= gewünschte Zeile) in das neue array übernommen.
Das Ende

Code: Alles auswählen

dim	ziel(n-1)
		ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
		ziel.SetDataArray(quelle(n-1))
kannst du einfach so schreiben:

Code: Alles auswählen

oTest.Sheets(1).getCellRangeByPosition(0,0,2,n-1).SetDataArray(quelle)
Wichtig ist vor allem die Variable n (anstelle von i).
Gruß,
mikeleb
Plan-B
Beiträge: 4
Registriert: Mo, 01.11.2021 08:54

Re: Dynamische Array einfügen

Beitrag von Plan-B »

Guten Abend,
@Mikeleb
Vielen vielen Dank für Deine Erkärung. Habs gleich in die Tat umgesetzt. Es funktioniert 1a. Danke sehr.
Eine Frage habe ich noch:
Bei dieser Schreibweise bekomme ich Die Fehlermeldung: "Objektvariable nicht belegt"
dim ziel(n-1)
ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
ziel.SetDataArray(quelle(n-1))
Mit deiner Schreibweise hier:
oTest.Sheets(1).getCellRangeByPosition(0,0,2,n-1).SetDataArray(quelle)
Keine Fehlermeldung, funktioniert 1A.
Vielen herzlichen Dank für die klasse Hilfe
Gruss
Win 10, oOo 4.1.10
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Dynamische Array einfügen

Beitrag von mikeleb »

Hallo,

Code: Alles auswählen

dim ziel(n-1)
ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
ziel.SetDataArray(quelle(n-1))
ist echt verwirrend ...

Code: Alles auswählen

dim ziel(n-1)
Initialisiert ein eindimensionales Array mit n Elementen (von 0 bis n-1)

Code: Alles auswählen

ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
weist dem letzten Element des Arrays einen zweidimensionalen Zellbereich als Objekt zu (hier taucht fälschlicherweise die Variable i auf!!!)

Code: Alles auswählen

ziel.SetDataArray(quelle(n-1))
Die Methode .setDataArray soll nun auf ziel angewendet werden. ziel ist aber (wie gerade initialisiert) ein Array (und nicht der Ziel-Zellenbereich)! ... und dann soll diesem auch "nur" die Daten des letzten Elements des Arrays quelle() zugewiesen.
Kurz: Um die Daten aus dem Array quelle() in den Ziel-Zellenbereich zu schreiben muss dieser Bereich angesprochen werden und dann die Daten übertragen werden. Entweder mit "meinem" Einzeiler oder

Code: Alles auswählen

Dim oZiel as object
oZiel=oTest.Sheets(1).getCellRangeByPosition(0,0,2,n-1)
oZiel.setDataArray(quelle())
Noch eine Anmerkung: oZiel.setDataArray(quelle()) und oZiel.setDataArray(quelle) sind gleichwertig. Beim ersterem ist nur eindeutiger, dass es sich um eine Array-Variable handelt.
Gruß,
mikeleb
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Dynamische Array einfügen

Beitrag von Karolus »

Hallo
Noch eine Anmerkung: oZiel.setDataArray(quelle()) und oZiel.setDataArray(quelle) sind gleichwertig. Beim ersterem ist nur eindeutiger, dass es sich um eine Array-Variable handelt.
@mikele: an das fertige quelle-objekt nochmal ()klammern dranzuhängen ist syntaktischer Unsinn, wenn du unbedingt kenntlich machen willst daß das ein array ist dann nenne es halt aquelle, das ist dann zumindest informativer wie das häufig zu sehende my…prefix.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Dynamische Array einfügen

Beitrag von craig22 »

Hallo,

@karolus
  • karolus hat geschrieben:Es gibt *nur* die zwei Typen,
    Dank für die Korrektur, werde mich nochmals näher mit den Array-Typen auseinandersetzen.
  • karolus hat geschrieben: nenne es halt aquelle, das ist dann zumindest informativer wie das häufig zu sehende my…prefix.
    In diesem Fall verwende ich meist die Präfixe gemäß der AOO-Konventionen.
    m → Präfix für Array's
    a → Präfix für Structures
    https://wiki.openoffice.org/wiki/DE/Mak ... #Variablen
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Plan-B
Beiträge: 4
Registriert: Mo, 01.11.2021 08:54

Re: Dynamische Array einfügen

Beitrag von Plan-B »

@all
Super Erklärung. Vielen herzlichen Dank.
Mit freundlichen Grüssen
Plan-B
Win 10, oOo 4.1.10
Antworten