Entwickler-Ecke
Datenbanken - Fehlermeldung: Index überschreitet das Maximum
Krischa - Mi 20.05.09 12:38
Titel: Fehlermeldung: Index überschreitet das Maximum
Hi,
Ich weiß nicht warum der Index angeblich zu weit läuft. Ich lese eine Datenbank aus und befülle ein CheckListBox. Einmal läuft er durch die While-Schleife komplett und beim zweiten mal springt er bei "if rechn.ValueFromIndex ... checklistbox1.checked[j]:=true;" raus. sre und rechn sind je eine Tstringlist.
CODE:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| for i :=0 to sre.Count-1 do begin query1.SQL.Text:='SELECT * FROM '+abe1+' WHERE KUNR="'+sre[i]+[d elphi]'" AND EXPORT_E="" AND RDATUM>="'+dmin+'" AND RDATUM<="'+dmax+'"'; query1.Open; while not query1.eof do begin rechn.Add(query1.fieldbyname('RENR').value); if j>0 then begin if rechn.ValueFromIndex[j]<>rechn.ValueFromIndex[j-1] then begin checklistbox1.Items.Add(query1.FieldByName('KUNR').Value+', '+query1.FieldByName('RENR').value+', '+query1.fieldbyname('KUNL').value+', '+datetostr(query1.fieldbyname('RDATUM').Value)); checklistbox1.Checked[j]:=true; end; end else begin checklistbox1.Items.Add(query1.FieldByName('KUNR').Value+', '+query1.FieldByName('RENR').value+', '+query1.fieldbyname('KUNL').value+', '+datetostr(query1.fieldbyname('RDATUM').Value)); checklistbox1.Checked[j]:=true; end; j:=j+1; query1.Next; end; query1.First; end; |
Sry, das der Code so unleserlich ist aber im Entwurf waren da noch Tabs. :roll:
Moderiert von
Gausi: Quote- durch Delphi-Tags ersetzt
Moderiert von
Narses: Titel geändert, war: "Fehlermeldung: Index überschreibt das Maximum"
baka0815 - Mi 20.05.09 12:46
Du zählst zum Schluss j hoch (j := j + 1;), setzt j aber nicht wieder zurück, also ist j beim zweiten Durchlauf zu hoch.
Delete - Mi 20.05.09 19:04
Wo ist eigentlich das Query1.Close? Das sieht so aus, als ob Du immer wieder dieselbe Datenmenge abgrast.
[edit] Übrigens solltest Du Deine Abfrage parametrisieren oder zumindest QuotedStr benutzen, sonst steht SQL-Injection Tür und Tor offen. [/edit]
Krischa - Mo 25.05.09 08:17
Hallo,
das j ist ja eingentlich nur für die Checklistbox da, damit Checked=true wird. Ich muss es doch in der Schleife hochzählen. Es wird vor der Schleife auf 0 gesetzt und nach jedem Durchlauf eins hochgezählt damit ich auf die aktuelle Zeile zugreifen kann.
Wenn ich es immer wieder zurücksetzten würde, dann würde er nur in der ersten Zeile das Häckchen setzten.
Das Query.close; habe ich aber wirklich vergessen aber das beseitigt mein Problem trozdem nicht. Ausserdem greif er auch ohne query.close; auf den nächsten Datensatz zu.
Dafür gibt es halt query.next;
Habe mein Indexproblem doch in den griff bekommen. Ich lasse das j weg und benutze:
checklistbox1.Checked[checklistbox1.Items.Count-1]:=true;
Danke für eure Hilfe.
P.S. was meinst du mit
Zitat: |
Übrigens solltest Du Deine Abfrage parametrisieren oder zumindest QuotedStr benutzen, sonst steht SQL-Injection Tür und Tor offen. |
Ich bin noch ein Neuling und arbeite erst seid kurzem mit Datenbanken und Delphi
ffgorcky - Mo 25.05.09 08:36
Setzt Du denn vor der for-Schleife die Variable j? (Also z.B. j:=0)
Denn sonst kann die Variable j ja irgendeinen, vom System gerade angestrebten, Wert haben.
Krischa - Mo 25.05.09 09:00
Hi,
j a die wird vorher auf 0 gesetzte. Ich glaube ich habe meinen fehler erkannt. Ich habe j an der falschen stelle erhöht. Er durchläuft zwar manchmal die Schleife aber schreibt nichts in die Checklistbox rein aber j wurde erhöht.
Naja vielen Dank nochmal. :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!