![]() |
problem mit listenindex überschreitet maximum
hallo DPler,
beschäftige mich seid gut 2 wochen mit delphi und und bekomm irgendwie meinen fehler nicht ausgebügelt. folgendes... ich hab 2 listen. die eine (ListeModel) wird aus der datenbank ausgelesen und enthält alle bereits vorhandenen artikel. die 2.(Artikel[I].ARTIKELNUMMER) kommt aus ner csv und ist eine täglich aktualisierte liste mit artikeln. dort sind halt bereits angelegte artikel drin, aber auch neue. mit indexof prüfe ich nun ab, ob die artikel der csv in der liste der bereits vorhandenen artikel existiert oder nicht. wenn sie nicht existieren, werden sie in eine weitere liste eingefügt und in der db angelegt. wenn sie existieren werden die gefundene nummern in eine andereliste gespeichert (reine sichtprüfung) und in der db upgedated. das funktioniert auch soweit ganz gut, solange sich die neuen artikel irgendwo zwischen listenanfang und listenende der bereits angelegten artikel befinden. sobald jedoch alle artikel der bereitsangelegten artikel aktualisiert wurden, steigt er mir mit nem listeneindex überschreitet maximum (position ist der letzte eintrag in ListeModel) aus und ich kapier einfach nicht, warum.Solange der letze Artikel von ListeModel nicht aktualisiert wurde, fügt er ohne probleme neue artikel ein. ist er aktualisiert worden geht er die liste mit den neuen artikeln nicht mehr durch und fügt die da befindlichen artikel auch nicht mehr in die datenbank ein. hier der code zur veranschaulichung.
Delphi-Quellcode:
wäre super, wenn mir jemand n tip geben kann, woran das liegt, bzw wie ich den fehler beheben kann.
procedure TForm1.Button2Click(Sender: TObject);
var I : Integer; Zaehler : Integer; SQL : String; Updatezeit : String; begin Updatezeit := make_timestamp(now); if ListeModelID.Items.Count-1 >-1 then Zaehler := StrToInt(ListeModelID.Items[ListeModelID.Items.Count-1]) else //wert des letzten zählers Zaehler :=0 ; Gauge1.Progress := 0; Gauge1.MaxValue := ArtikelCount-1; For I:=0 to ArtikelCount-1 Do begin Gauge1.Progress := I; If (Artikel[I].ENDKUNDE='JA') AND (Artikel[I].VERFUEGBARKEIT='JA') then begin if ListeModel.items.indexof(Artikel[I].ARTIKELNUMMER) =-1 then begin //insert neue artikel Zaehler :=Zaehler+1; Application.ProcessMessages; ListeUnbekannt.Items.Add(Artikel[I].ARTIKELNUMMER); SQL := 'INSERT INTO products VALUES (';.... end else begin //update vorhandene artikel Application.ProcessMessages; ListeUpdate.Items.Add(Artikel[I].ARTIKELNUMMER); SQL := 'UPDATE products SET products_ean='; ... end; end; end; end; gruß sn0w |
Re: problem mit listenindex überschreitet maximum
*push*
keiner ne idee, woran das liegt, bzw wie ich das umgehen kann? gruß sn0w |
Re: problem mit listenindex überschreitet maximum
Hallo,
Von welchem Typ ist den Artikel? Aus deinem Quellcode geht nicht hervor, wo Artikel gefüllt wird und das ArtikelCount wirklich die Anzahl an Elementen in Artikel ist. Meine Glaskugel ist leider zurzeit in der Reinigung, aber dort würde ich jetzt weitersuchen, hätte ich den Source.
Delphi-Quellcode:
Übrigens du vergleichst hier Strings auf Gleichheit mit JA. Ich weiss zwar nicht, ob dort noch andere Werte als ja oder nein stehen können, aber möglicherweise solltest du da besser boolsche-Variablen verwenden.
..
For I:=0 to ArtikelCount-1 Do begin Gauge1.Progress := I; If (Artikel[I].ENDKUNDE='JA') AND (Artikel[I].VERFUEGBARKEIT='JA') then begin if ListeModel.items.indexof(Artikel[I].ARTIKELNUMMER) =-1 then begin ... end; end; end; grüße, daniel |
Re: problem mit listenindex überschreitet maximum
Hi.
[schnipp-schnapp] Hier stand Unsinn :wall: [/schnipp-schnapp] |
Re: problem mit listenindex überschreitet maximum
sorry ich wollte nich gleich den ganzen code reinstellen, das wäre wohl n bissel viel geworden.
also. Artikel : Array [0..50000] of TMEINELISTE; wobei type TMEINELISTE = Record ARTIKELNUMMER : String; ... end; usw ist also halt alle spalten der csv. die strings mit 'JA' sind werte in 2 Spalten der liste, die nur angeben, ob der artikel ein endkundenartikel ist und ob der artikel am lager verfügbar ist.können also 'JA' oder 'NEIN' sein. diese zeile kann man also getrost vernachlässigen. er soll also alle artikel der csv mit der ListeModel auf vorhandensein prüfen und wenn vorhanden, dann wird der artikel upgedatet und wenn nich in der liste, dann halt neu angelegt. wiegesagt es funktioniert soweit wunderbar, ausser er hat bereits alle artikel der ListeModel upgedated und in der cvs würden dann noch welche kommen. gruß sn0w |
Re: problem mit listenindex überschreitet maximum
Für solche Sachen wie Verfügbarkeit, die nur 'JA' oder 'NEIN' sein können, kann man statt String den Typ
![]() MfG Binärbaum [Edit] :firejump: Mein 700. Beitrag!! :cheers: :firejump: [/Edit] |
Re: problem mit listenindex überschreitet maximum
Zitat:
Bsp: 12345678,"Stoff Tasche","Taschen","keine Angabe",Stoff,,,"1,99","99,99",,,,1,NEIN,,492,Ausl auf,NEIN,"03.12.2004 " da steht in der spalte enkunde nein nein und in der spalte verfügbarkeit ein nein. hilft mir das mein problem zu lösen, wenn ich die beiden sachen jetzt extra noch in nen boolean umwandel obwohl ich nur schaue, ob da n ja oder n nein drin steht, bzw nur die artikel aus der liste rausnehme, wo ja drin steht? gruß sn0w |
Re: problem mit listenindex überschreitet maximum
@sn0w:
Ich denke, wenn du ein auf das Wesentliche reduziertes Demo-Programm samt Testdaten bereit stellst, dann kannst du eher mit Hilfe rechnen. Eines ist aber auch so schon klar bzw. unverständlich. Warum liest du deine Datenbank-Tabelle(n) zur iterativen Weiterverarbeitung komplett ein und speicherst sie in ein ARRAY [0..50000] OF RECORD um? Kannst Du das erklären? Grüße vom marabu |
Re: problem mit listenindex überschreitet maximum
Zitat:
ok noch mal zur verdeutlichung. per opendialog wird eine csv datei eingelesen, zerlegt und die dort vorhandenen daten in das array geschrieben.( Artikel[I].SPALTENNAME) dann werden die kategorien mit der csv abgeglichen, in ne liste geschrieben und neu in der db angelegt. als nächstes werden die hersteller abgeglichen und es folgen noch ein paar kleinere anpassungen wie preis und gewicht. als letztes werden dann product id und product model von bereits angelegten artikeln aus der datenbank ausgelesen und in listeModel und ListeModelID geschrieben, damit ich was zum vergleichen auf vorhandensein von artikeln habe, bzw die startposition für den zähler. nach nem klick auf nen 2. button soll dann der abgleich zwischen der ListeModel und dem array mit den artikelnummern erfolgen. das ganze funktioniert ja soweit auch, nur das er halt bei den ersten 2-4 neuen artikellisten mit nem listenindex überschritten aussteigt, wenn der letzte bekannte artikel geupdatet wurde. wenn ich nach dem aussteigen die gleiche liste nochmal lade, dann funzt es komischerweise. und je mehr neue artikel in die db kommen, umso seltener tritt das problem auch auf. ich möchte es aber, wenn möglich, ganz weg haben, da ich von niemanden, der das tool mal nutzen wird, verlangen will, das er erst einmal alle artikel seines lieferanten anlegt, damit er keine fehlermeldung bekommt. ich denke es hängt mit dem indexof und der dadurch erfolgenden positionsabfrage in der liste ab. beim abgleich interessiert mich aber erstmal nich die position sondern vielmehr ob der string vorhanden ist. nur leider is mir bisher nichts besseres eingefallen, was da funktionieren könnte, da ich wie schon erwähnt auf dem gebiet sowieso n totaler neuling bin :D gruß sn0w |
Re: problem mit listenindex überschreitet maximum
Hi snOw,
in deinen Erläuterungen verwendest du Begriffe (z.B. kategorien) deren Bedeutung für das Problemverständnis du vorher nicht darlegst - an solchen Stellen komme ich aus dem Tritt. Verzeih. Ich habe dein Code-Fragment auf die relevanten Zeilen reduziert und komme zu dem Schluss, das dein Code prinzipiell korrekt ist. Der Fehler muss in den Code-Zeilen liegen, die du nicht zeigst. Ich will dir nicht zu einem kompletten oop rewrite raten - das kann dir von anderer Seite noch widerfahren - aber ein bischen aufräumen solltest du schon. Auch rein prozeduraler Code kann in Delphi schön aussehen. Vielleicht siehst du dann auch sofort, wo dein Fehler liegt. Hier ein Muster ohne Wert als Denkanstoß:
Delphi-Quellcode:
Grüße vom marabu
var
i: integer; begin for i := 1 to ArtikelCount do if Check(Artikel[i]) then if Exists(ArtikelNummer(i)) then MarkForUpdate(ArtikelNummer(i)) else MarkForInsert(ArtikelNummer(i)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz