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-1then
      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 user profile iconGausi: Quote- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: 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