AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi problem mit listenindex überschreitet maximum
Thema durchsuchen
Ansicht
Themen-Optionen

problem mit listenindex überschreitet maximum

Ein Thema von sn0w · begonnen am 21. Apr 2005 · letzter Beitrag vom 23. Apr 2005
Antwort Antwort
Seite 1 von 2  1 2      
sn0w

Registriert seit: 21. Apr 2005
7 Beiträge
 
#1

problem mit listenindex überschreitet maximum

  Alt 21. Apr 2005, 16:54
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:
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;
wäre super, wenn mir jemand n tip geben kann, woran das liegt, bzw wie ich den fehler beheben kann.

gruß
sn0w
  Mit Zitat antworten Zitat
sn0w

Registriert seit: 21. Apr 2005
7 Beiträge
 
#2

Re: problem mit listenindex überschreitet maximum

  Alt 22. Apr 2005, 17:37
*push*

keiner ne idee, woran das liegt, bzw wie ich das umgehen kann?

gruß
sn0w
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#3

Re: problem mit listenindex überschreitet maximum

  Alt 22. Apr 2005, 17:47
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:
..
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;
Ü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.

grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Waldteufel
(Gast)

n/a Beiträge
 
#4

Re: problem mit listenindex überschreitet maximum

  Alt 22. Apr 2005, 17:48
Hi.

[schnipp-schnapp] Hier stand Unsinn [/schnipp-schnapp]
  Mit Zitat antworten Zitat
sn0w

Registriert seit: 21. Apr 2005
7 Beiträge
 
#5

Re: problem mit listenindex überschreitet maximum

  Alt 22. Apr 2005, 18:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: problem mit listenindex überschreitet maximum

  Alt 22. Apr 2005, 22:19
Für solche Sachen wie Verfügbarkeit, die nur 'JA' oder 'NEIN' sein können, kann man statt String den Typ Delphi-Referenz durchsuchenBoolean verwenden, denn genau für solche Ja/Nein-Entscheidungen ist der Typ gedacht. Er kann nur zwei Werte, True oder False, annehmen. Außerdem braucht ein Boolean auch weniger Speicher als ein String.

MfG
Binärbaum

[Edit]
Mein 700. Beitrag!!
[/Edit]
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
sn0w

Registriert seit: 21. Apr 2005
7 Beiträge
 
#7

Re: problem mit listenindex überschreitet maximum

  Alt 23. Apr 2005, 10:49
Zitat von Binärbaum:
Für solche Sachen wie Verfügbarkeit, die nur 'JA' oder 'NEIN' sein können, kann man statt String den Typ Delphi-Referenz durchsuchenBoolean verwenden, denn genau für solche Ja/Nein-Entscheidungen ist der Typ gedacht. Er kann nur zwei Werte, True oder False, annehmen. Außerdem braucht ein Boolean auch weniger Speicher als ein String.

MfG
Binärbaum

[Edit]
Mein 700. Beitrag!!
[/Edit]
warum soll ich die werte , die eh schon eindeutig als JA oder Nein in den entsprechenden spalten stehen extra noch mal in 1 oder 0 umwandeln? welchen vorteil bringt mir das bei der behebung meines problems? die geschwindigkeit mit der die artikel aktualisiert werden, bzw neu angelegt werden, ist für mich erstmal zweitrangig.
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: problem mit listenindex überschreitet maximum

  Alt 23. Apr 2005, 14:37
@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
  Mit Zitat antworten Zitat
sn0w

Registriert seit: 21. Apr 2005
7 Beiträge
 
#9

Re: problem mit listenindex überschreitet maximum

  Alt 23. Apr 2005, 15:44
Zitat von marabu:
@sn0w:

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
ich denke, da hast du was missverstanden, der ARRAY [0..50000] OF RECORD ist für die artikel in der csv.

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

gruß
sn0w
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: problem mit listenindex überschreitet maximum

  Alt 23. Apr 2005, 19:35
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:
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;
Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz