🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Zuweisung von Werten für die Elemente eines Arrays

Alles zur Programmierung im LibreOffice.
Antworten
arkadiuszpaluszek
Beiträge: 39
Registriert: Sa 17. Mär 2012, 22:39

Zuweisung von Werten für die Elemente eines Arrays

Beitrag von arkadiuszpaluszek » Mo 24. Dez 2012, 22:09

Hallo!

Habe folgendes Problem: Es werden Elemente aus einer Datenbank gelesen, die Ergebnisse sollen in einem Array gespeichert werden:

Code: Alles auswählen

	' T H E M E N werden gelesen
	
	mySQL="SELECT * FROM ""Eintrag"" WHERE ""Datum""='"+myDatum+"'"
	msgbox mySQL
	oErgSet=oStatement.executeQuery(mySQL)

	if not isNull(oErgSet) then
	col_id_eintrag=oErgSet.findColumn("ID")
	col_kind=oErgSet.findColumn("ID_Kind")
	col_eintrag=oErgSet.findColumn("Eintrag")
	col_datum=oErgSet.findColumn("Datum")
	myCounter=0
		Do while oErgSet.Next()
			On Error Resume Next
			id_eintrag(myCounter)=oErgSet.getInt(col_id_eintrag)
			id_kind(myCounter)=oErgSet.getInt(col_kind)
			eintrag(myCounter)=oErgSet.getString(col_eintrag)
			datum(myCounter)=oErgSet.getString(col_datum)
				
				msgbox myCounter
				msgbox eintrag(myCounter)
						
			myCounter=myCounter+1
		loop
	
	' Schleife zu Debuggingzwecken:
	for x=0 to 3
	msgbox " Beim x="+x+" ist der Eintrag:"+eintrag(x)
	next x
	
	end if	
Hier werden also aus der DB Einträge gelesen, die an einem bestimmten Datum erstellt wurden. Am Datum X welches getestet wird gibt es genau 4 Einträge. Die Messageboxen innerhalb der do while - loop Schleife geben somit für den Wert myCounter Zahlen von 0 bis 3 aus und 4 verschiedene Einträge ("A","B","C","D").

Nach der Schleife folgt eine for - next Schleife, in welcher die jeweiligen Elemente des Arrays noch mal angezeigt werden sollen, hier stellt sich für mich unverständlicherweise heraus, dass alle Elemente des Arrays (0 bis 3) nur noch den letzten Eintrag "D" als Inhalt haben. Wo ist mein Fehler?...

Gruß

Arek

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von gogo » Di 25. Dez 2012, 00:03

$?=§(/§"%(§$("/§$...

Hallo,

Code: Alles auswählen

On Error Resume Next
solltest Du rausnehmen, wenn Du Fehler suchst ;)

weiters: Du sprichst von einem Array, Du hast aber 4 davon:
id_eintrag()
id_kind()
eintrag()
datum()

... und Du fragst nur eines davon ab ("eintrag(x)").

Wenn Du mehrere immer gleiche Datensätze (jeder mit mehreren Feldern) in ein Array füllen willst, dann wäre ein 2-dimensionales Array gut, wobei die erste Dimension die "Datensatznummer" angibt, und der 2. Dimension stehen dann die Werte.
Zweckmäßigerweise sollten Arrays in ihrer Größe immer definiert sein, bei einem 2-dimensionalen Array also etwa so:

Code: Alles auswählen

Dim myArray(0,0)
dieses Array ist aber nicht wirklich sinnvoll, es kann genau einen Wert speichern (entspricht also einer normalen Variablen, die auch nur einen Wert speichern kann). Angenommen aus Deiner Tabelle wird aber nur ein Wert (für sagen wir 10 Datensätze ausgelesen, dann ginge das mit folgender Dimensionierung:

Code: Alles auswählen

Dim myArray(9)
über die Zuweisung: myArray(2)=xyz kannst Du dann den Wert xyz an der 3. Position des Arrays speichern etc. Wenn Du aber z.B. Nachname und Vorname von 4 Personen in einem Array speichern willst, dann ist es praktisch eine 2. Dimension zu haben:

Code: Alles auswählen

Dim myArray(3,2)
Das bedeutet, dass im Array beim Wert 0, 1, 2 und 3 in der ersten Dimension jeweils 3 Werte in der 2. Dimension gespeichert werden können = 12 Werte:

Code: Alles auswählen

Dimension 1:   Dimension 2=0            Dimension 2=1               Dimension 2=2
0              myArray(0,0) = "HANS"    myArray(0,1) = "MEIER"      myArray(0,2) = "01.04.2012"
1              myArray(1,0) = "PETER"   myArray(1,1) = "MOSER"      myArray(1,2) = "05.04.2012"
2              myArray(2,0) = "JOE"     myArray(2,1) = "GRUBER"     myArray(2,2) = "09.11.2012"
3              myArray(3,0) = "LILLY"   myArray(3,1) = "SCHUSTER"   myArray(3,2) = "05.08.2012"

Damit Dein Code funktioniert, musst Du also das Array richtig dimensionieren, und dann schrittweise befüllen. Sollte das Array "unterwegs" zu klein werden, kannst Du es jederzeit mit dem Befehl "REDIM PRESERVE" erweitern - schau' Dir dazu einfach die LO-Hilfe an.
Dann noch was zu Deiner Variable myCounter:
Dein Resultset "oErgSet" hat die Eigenschaft ".Row" - das ist die Zeilennummer des Resultsets - die kannst Du als Referenz für die erste Dimension verwenden, wobei zu beachten ist, dass standardmäßig ein Array mit 0 beginnt, ein Resultset aber mit 1 - zur besseren Orientierung kann man ja in myArray(0,x) die Feldnamen schreiben...

Den Datensatz Nummer 3 aus dem obigen Beispiel würde man dann etwa so ins Array schreiben:

Code: Alles auswählen

myArray(oErgSet.Row,0) = oErgSet.getstring(oErgSet.findColumn("Vorname"))  ' das waere dann "JOE"
myArray(oErgSet.Row,1) = oErgSet.getstring(oErgSet.findColumn("Nachname")) ' das waere dann "GRUBER"
myArray(oErgSet.Row,2) = oErgSet.getstring(oErgSet.findColumn("Datum"))    ' das waere dann "09.11.2012"
Und zum Debugging würde ich Dir Folgendes empfehlen:

unter "' Schleife zu Debuggingzwecken:"
fügst Du Folgendes ein:

Code: Alles auswählen

print "Jetzt mal den Beobachter checken!"
wenn die Print-Prompt kommt, dann nicht gleich auf ok klicken, sondern zum Fenster mit dem Basic-Code wechseln. Dort setzt Du den Cursor irgendwo in den Namen Deines Arrays und drückst F7:

Code: Alles auswählen

myA|rray(0,3)= ...
Dann wir ganz unten im Beobachterfenster Deine Variable angezeigt, und Du kannst Dir exakt anzeigen lassen was da drinsteht.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

arkadiuszpaluszek
Beiträge: 39
Registriert: Sa 17. Mär 2012, 22:39

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von arkadiuszpaluszek » Di 25. Dez 2012, 10:30

Danke für Deine ausführliche Antwort.
Die Arrays sind selbstverständlich einige Zeilen höher dimensioniert worden, sogar recht großzügig, da ich die Funktion redim bisher nicht verwendet habe:

Code: Alles auswählen

dim id_eintrag(1000)
dim id_kind(1000)
dim eintrag(1000)
dim datum(1000)
dim details(1000,1000)
Es ist nur ein kleiner Ausschnitt des Codes welcher hier präsentiert wird.

Die Eigenschaft .row von ErgSet war mir auch nicht bekannt - vielen Dank dafür! Allerdings brauche ich spätestens beim letzten Durchlauf der Schleife den Wert ohnehin in einer anderen Variablen, da weiter unten eine Schleife "for x=0 to myCounter" folgt. Aber egal, das Problem bleibt nach wie vor folgendes:

Code: Alles auswählen

	Do while oErgSet.Next()
			'On Error Resume Next
			id_eintrag(oErgSet.row-1)=oErgSet.getInt(col_id_eintrag)
			id_kind(oErgSet.row-1)=oErgSet.getInt(col_kind)
			eintrag(oErgSet.row-1)=oErgSet.getString(col_eintrag)
			datum(oErgSet.row-1)=oErgSet.getString(col_datum)
				
				myCounter=oErgSet.row-1
				
				msgbox myCounter
				msgbox eintrag(myCounter)
		loop
	
	' Schleife zu Debuggingzwecken:
	for x=0 to 3
	msgbox " Beim x="+x+" ist der Eintrag:"+eintrag(x)
	next x
	
	end if	
1. Beim Durchlauf der Schleife while-loop scheint alles o.k. zu sein, die Messageboxen

Code: Alles auswählen

msgbox myCounter
msgbox eintrag(myCounter)
geben dann in etwa folgende Ergebnisse aus:

0 - Eintrag 1
1 - Eintrag 2
2 - Eintrag 3
3 - Eintrag 4

Die "Schleife zu Debuggingzwecken" jedoch zeigt klar, dass auf eine mir völlig unverständliche Art und Weise an jeder Position des Arrays nur der "Eintrag 4" gespeichert ist! :?
Zuletzt geändert von arkadiuszpaluszek am Di 25. Dez 2012, 22:16, insgesamt 2-mal geändert.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von gogo » Di 25. Dez 2012, 13:21

Also bei mir werden diese Werte richtig ausgelesen:

Code: Alles auswählen

Sub Suche_Werte

sSQL = "Select * from Projekte;"

oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource = oDatabaseContext.getByName("Test")
oInteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
oConnection = oDataSource.ConnectWithCompletion(oInteractionHandler)
oStatement= oConnection.createStatement
oErgSet=oStatement.executeQuery(sSQL)

dim eintrag(1000)

       myCounter=0
          Do while oErgSet.Next()
             eintrag(myCounter)=oErgSet.getString(2)
             myCounter=myCounter+1
          loop
       
       ' Schleife zu Debuggingzwecken:
       for x=0 to 3
       txt = txt + " Beim x="+x+" ist der Eintrag:"+eintrag(x) + chr$(10)
       next x

       msgbox txt
       print "Beobachter checken!"

end Sub
im Anhang auch der Debug über den Beobachter.
Dateianhänge
Unbenannt.gif
Unbenannt.gif (13.86 KiB) 10193 mal betrachtet
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

arkadiuszpaluszek
Beiträge: 39
Registriert: Sa 17. Mär 2012, 22:39

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von arkadiuszpaluszek » Di 25. Dez 2012, 14:32

Woraufhin ich vermutet habe, dass es also ein Problem von LO für Mac OS X sein könnte, habe es also noch unter Win7 getestet. Nein, es scheint irgendwo einen Unterschied zwischen meinem und Deinem Skript zu geben, den ich nicht erkennen kann. :? Falls Du Zeit und Muße hast, kannst Du gerne in meine Datei reinschauen - steht im Beitrag weiter oben zum Download bereit. Bin gespannt!

s. auch OO - Forum: http://de.openoffice.info/viewtopic.php?f=18&t=60749

Gruß

Arek

arkadiuszpaluszek
Beiträge: 39
Registriert: Sa 17. Mär 2012, 22:39

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von arkadiuszpaluszek » Di 25. Dez 2012, 18:24

Bin dem Problem ein bisschen näher gekommen: irgendwie wird jedes mal, wenn die Schleife durchläuft, der Wert nicht nur einer bestimmten Position des Arrays zugeteilt sondern ALLEN, habe das Skript folgendermaßen abgeändert:

Code: Alles auswählen

	
        if not isNull(oErgSet) then
	col_id_eintrag=oErgSet.findColumn("ID")
	col_kind=oErgSet.findColumn("ID_Kind")
	col_eintrag=oErgSet.findColumn("Eintrag")
	col_datum=oErgSet.findColumn("Datum")
	
		Do while oErgSet.Next()
			'On Error Resume Next
			id_eintrag(0)=oErgSet.getInt(col_id_eintrag)
			id_kind(0)=oErgSet.getInt(col_kind)
			eintrag(0)=oErgSet.getString(col_eintrag)
			datum(0)=oErgSet.getString(col_datum)
				
				myCounter=oErgSet.row-1
				
				msgbox "Aktueller Counter ist "+myCounter
				msgbox "Und damit der aktuelle Eintrag"+eintrag(myCounter)
					' Schleife zu Debuggingzwecken:
					for x=0 to 3
					msgbox " Beim x="+x+" ist der Eintrag:"+eintrag(x)
					next x
		loop

	end if	
Nun zeigt sich, dass bereits beim ersten Durchlauf der Schleife die ersten vier Positionen des Arrays mit dem entsprechenden Eintrag besetzt werden, obwohl ich diesmal in Klammern explizit "0" angebe - warum der Eintarg dann unter eintrag(1) und eintrag(2) etc. ebenso zu finden ist, ist mir ein Mysterium.

Gruß

Arek

boser
Beiträge: 106
Registriert: Di 26. Okt 2010, 20:41
Kontaktdaten:

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von boser » Di 25. Dez 2012, 18:37

Hallo,

was ist das http://de.openoffice.info/viewtopic.php ... 51#p225751 :evil:
Bitte endschiede dich , wo du welche infos bekommen möchtest.
mfg

boser

Computer sind halt dazu da, Probleme zu lösen, die wir ohne sie nicht hätten.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von gogo » Di 25. Dez 2012, 20:00

Der Fehler liegt in dieser Zeile:

Code: Alles auswählen

eintrag="Teamsitzung vom "+myDatum2
Du hast weiter oben "eintrag" als Array definiert, mit der dimensionslosen Verwendung geht das Array aber wieder flöten...

Wenn Du unter die Zeilen

Code: Alles auswählen

eintrag="Teamsitzung vom "+myDatum2
'f_textrahmen (8000,2000,2000,1500,"adressblock",eintrag)
"redim eintrag(1000)" schreibst, dann ist "eintrag" wieder ein Array. (oder ändere einfach die Variable "eintrag" auf "Textrahmentext" - oder was weiss ich ;) )

Im Beobachter hättest Du sehen können, dass das Array wieder zu einer normalen Variant-Variablen wurde...
Dateianhänge
Unbenannt.gif
Unbenannt.gif (5.78 KiB) 10165 mal betrachtet
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

arkadiuszpaluszek
Beiträge: 39
Registriert: Sa 17. Mär 2012, 22:39

Re: Zuweisung von Werten für die Elemente eines Arrays

Beitrag von arkadiuszpaluszek » Di 25. Dez 2012, 22:15

So ist es, danke schön!


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten