Seite 1 von 1

Zuweisung von Werten für die Elemente eines Arrays

Verfasst: Mo 24. Dez 2012, 22:09
von arkadiuszpaluszek
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

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

Verfasst: Di 25. Dez 2012, 00:03
von gogo
$?=§(/§"%(§$("/§$...

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.

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

Verfasst: Di 25. Dez 2012, 10:30
von arkadiuszpaluszek
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! :?

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

Verfasst: Di 25. Dez 2012, 13:21
von gogo
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.

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

Verfasst: Di 25. Dez 2012, 14:32
von arkadiuszpaluszek
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

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

Verfasst: Di 25. Dez 2012, 18:24
von arkadiuszpaluszek
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

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

Verfasst: Di 25. Dez 2012, 18:37
von boser
Hallo,

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

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

Verfasst: Di 25. Dez 2012, 20:00
von gogo
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...

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

Verfasst: Di 25. Dez 2012, 22:15
von arkadiuszpaluszek
So ist es, danke schön!