Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Abfragen ob etwas schon in meiner Tabelle ist


spoof - Fr 18.10.13 13:50
Titel: Abfragen ob etwas schon in meiner Tabelle ist
Hey, ich habe ein Programm geschrieben, welches eine Txt Datei einliest. Die Txt kann man sich vorstellen wie zb eine Liste voll mit Kundendaten.
Diese Liste wird durch mein Programm nun in meine Tabelle eingeordnet.
Momentan hab ich aber noch das Problem dass einige Dinge doppelt und dreifach auftauchen in der Tabelle da sie auch doppelt und dreifach im Txt sind.
Jetzt möchte ich es schaffen dass wenn die Daten exakt so schon vorhanden sind, dass dann nichts hinzugefügt werden soll.

Ich hab das nun so gecodet dass ich in meiner Schleife, die zum zufügen zuständig ist, eine weitere Schleife mit eingebunden ist, die die bisher erstandene Liste erst nochmal durchgeht ob die Felder die zusammengehören identisch sind mit dem was gerade hinzugefügt werden soll.
Das einzigste Problem um das noch zum laufen zu bringen ist folgendes


Delphi-Quelltext
1:
if (SG_List.Cells[0,counter+1]:=seite) = true                    


Ich muss es irgendwie schaffen dass er fragt
wenn meine Zelle den selben Inhalt hat wie die Variable, dann...
Wie kann ich das machen? Dachte zuerst an Boolean hab aber noch nie damit gearbeitet und bin mir nich sicher ob und wie es damit geht?!

mfg


WasWeißDennIch - Fr 18.10.13 13:54

Suchst Du das hier?

Delphi-Quelltext
1:
if SG_List.Cells[0,counter+1] = seite then                    


[edit] Wobei das konzeptionell schon schöner zu lösen wäre, aber sei es erst einmal drum. [/edit]


jaenicke - Fr 18.10.13 13:57

Die Daten in ein StringGrid einzulesen, ist keine gute Idee, das ist nur unnötig langsam und kompliziert...
Lese die besser in eine Liste ein, prüfe dabei direkt beim Hinzufügen, ob ein Wert schon drin ist, und zeige die Liste dann nur in dem StringGrid an.

Visuelle Komponenten sind nur zur Anzeige und Eingabe da, nicht zur Datenhaltung...


spoof - Fr 18.10.13 14:08

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Suchst Du das hier?

Delphi-Quelltext
1:
if SG_List.Cells[0,counter+1] = seite then                    


[edit] Wobei das konzeptionell schon schöner zu lösen wäre, aber sei es erst einmal drum. [/edit]


Nein, ich weiß dass da noch ein then kommt, ich hab nur einen teil der if abfrage gepostet die sieht eig so aus:


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:
26:
27:
28:
                      for i2 := 0 to counter+1 do     //liste bis zum jetzigen fund prüfen
                                begin

                                zwischencounter:=0;          //zwischencounter zurücksetzten um den neuen fund zu prüfen

                                  if (SG_List.Cells[0,counter+1]:=seite) = true and    //wenn die seiten genauso schon vorhanden sind zwischencounter + 1
                                     (SG_List.Cells[1,counter+1]:=seite2) = true and
                                     (SG_List.Cells[2,counter+1]:=seite3) = true and
                                     (SG_List.Cells[3,counter+1]:=seite4) = true and
                                     (SG_List.Cells[4,counter+1]:=seite5) = true then
                                        begin
                                            zwischencounter:=zwischencounter+1;       //zwischencounter + 1
                                       end;

                                end;

                            if zwischencounter = 0 then            //wenn noch nicht vorhanden da zwischencounter auf 0
                                begin

                                SG_List.Cells[0,counter+1]:=seite;      //Ausgeben
                                SG_List.Cells[1,counter+1]:=seite2;
                                SG_List.Cells[2,counter+1]:=seite3;
                                SG_List.Cells[3,counter+1]:=seite4;
                                SG_List.Cells[4,counter+1]:=seite5;

                                counter:=counter+1;             //Counter +1

                                end;


Ich bekomm in den Zeile wo ich abfrage:

Delphi-Quelltext
1:
2:
3:
4:
5:
if (SG_List.Cells[0,counter+1]:=seite) = true and    //wenn die seiten genauso schon vorhanden sind zwischencounter + 1
                                     (SG_List.Cells[1,counter+1]:=seite2) = true and
                                     (SG_List.Cells[2,counter+1]:=seite3) = true and
                                     (SG_List.Cells[3,counter+1]:=seite4) = true and
                                     (SG_List.Cells[4,counter+1]:=seite5) = true then


Die Fehlermeldung Operator ist auf diesem Operadentyp nicht anwendbar.
Ich denke ich kann nicht prüfen ob die zelle := variable (in der variable sowie in der zelle stehen die seiten also strings)



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Daten in ein StringGrid einzulesen, ist keine gute Idee, das ist nur unnötig langsam und kompliziert...
Lese die besser in eine Liste ein, prüfe dabei direkt beim Hinzufügen, ob ein Wert schon drin ist, und zeige die Liste dann nur in dem StringGrid an.

Visuelle Komponenten sind nur zur Anzeige und Eingabe da, nicht zur Datenhaltung...


Genauso passiert es ja, es wird in ein tstringgeladen der überprüft ob schon doppelt usw drin ist und dann nur die einzelnen in meine tabelle geladen.
Hab eine liste mit 1 Millionen Zeilen, geht innerhalb 1 sekunde keinerlei laggs.


spoof - Fr 18.10.13 14:31

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Suchst Du das hier?

Delphi-Quelltext
1:
if SG_List.Cells[0,counter+1] = seite then                    


[edit] Wobei das konzeptionell schon schöner zu lösen wäre, aber sei es erst einmal drum. [/edit]


Omg, hab dein Code falsch gelesen, genau das ging xD danke!


Delete - Fr 18.10.13 14:33

user profile iconspoof hat folgendes geschrieben Zum zitierten Posting springen:
Ich bekomm in den Zeile wo ich abfrage:

Delphi-Quelltext
1:
2:
3:
4:
5:
if (SG_List.Cells[0,counter+1]:=seite) = true and    //wenn die seiten genauso schon vorhanden sind zwischencounter + 1
                                     (SG_List.Cells[1,counter+1]:=seite2) = true and
                                     (SG_List.Cells[2,counter+1]:=seite3) = true and
                                     (SG_List.Cells[3,counter+1]:=seite4) = true and
                                     (SG_List.Cells[4,counter+1]:=seite5) = true then


1. Eine Zuweisung erfolgt mit :=, ein Vergleich dagegen lediglich mit =

2. Ein Vergleich zweiter Variablen mit = ergibt bereits einen Booleanwert. Du mußt diesen Wert nicht nochmal auf true testen, sondern schreibst einfach:


Delphi-Quelltext
1:
2:
3:
4:
5:
if (SG_List.Cells[0,counter+1] = seite)  and
   (SG_List.Cells[1,counter+1] = seite2) and
   (SG_List.Cells[2,counter+1] = seite3) and
   (SG_List.Cells[3,counter+1] = seite4) and
   (SG_List.Cells[4,counter+1] = seite5) then