AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

verschachtelte for to do schleife

Ein Thema von Dr. Jack · begonnen am 13. Feb 2013 · letzter Beitrag vom 13. Feb 2013
Antwort Antwort
Dr. Jack

Registriert seit: 17. Mär 2010
78 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

verschachtelte for to do schleife

  Alt 13. Feb 2013, 20:10
Hallo zusammen,

ich möchte für ein Warenwirtschaftsprogramm beim Artikel anlegen vermeiden, dass ein und der selbe Hersteller mehrfach angelegt wird. Man gibt also den Hersteller in Form A ein, drückt enter und es öffnet sich Form B mit allen Ähnlichen Herstellern. -->
Knorr AG
Knorr GmbH
Knorr und lecker
Knorrirgendwas

Dann den richtigen Hersteller auswählen und chick.

Die Datenbank soll also durchsucht werden und dann geprüft werden ob dieser Hersteller bereits
in Form B steht, wenn ja dann nichts machen, wenn nein, dann auflisten.

Das Prüfen ist notwendig, damit nicht 70x Knorr steht, weil ich 70 Artikel von dieser Firma habe (in Grafik wie es nicht sein soll)

Hier der Quellcode mit dem Problem, dass die J Schleife nie durchlaufen wird. Ich verstehe nicht warum

Delphi-Quellcode:
begin
listview1.Clear;

                 Ini:=TIniFile.create(einstellungen.artikelreg);
                 //---------------------------------------------------- //Datenbankpfad zuweisen
                     db_ar_index:=ini.readstring('DB_AR', 'index', db_ar_index); // Anzahl Datenbankeinträge lesen
                     ean_hersteller_suche:=pflege.edit8.text; //herstellerfeld // Herstellerbezeichnung in aktuelle Form reinholen

                          for I := 0 to strtoint(db_ar_index)do // von 0 bis Ende der DB Einträge
                          begin
                            showmessage('beginne i schleife');
                            Ini:=TIniFile.create(einstellungen.artikelreg);
                            ean_hersteller_db:= ini.readstring(inttostr(I), 'hersteller', ean_hersteller_db); // Hersteller aus 1. Datensatz lesen


                                          ean_hersteller_suche:=uppercase(ean_hersteller_suche); // in Großbuchstaben umwandeln
                                          ean_hersteller_db_short:= copy(ean_hersteller_db,1,(length(ean_hersteller_suche)));
                                          ean_hersteller_db_short:=uppercase(ean_hersteller_db_short);

                                          if (Pos(ean_hersteller_suche,ean_hersteller_db_short)>0) // wenn Herstellereingabe von Benutzer mit Datenbankeintrag übereinstimmt
                                          then begin
                                               showmessage('i: suchwort enthalten');
                                               for J := 0 to listview1.items.Count - 1 do // --> listview durchsuchen ob Hersteller schonmal gelistet ist
                                                  begin
                                                      showmessage('beginne J schleife');

                                                      if (ListView1.Items.Item[J].Caption = ean_hersteller_db) // prüfen ob Hersteller schon einmal aufgeführt
                                                      then begin
                                                             exit; // Schleife verlassen
                                                           end
                                                      else begin
                                                              list:= listview1.Items.add; //Eintrag erzeugen
                                                              list.caption:=ean_hersteller_db;
                                                           end;
                                                  end;



                                               end;




                         end;// schleife I
Miniaturansicht angehängter Grafiken
delphi-err.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: verschachtelte for to do schleife

  Alt 13. Feb 2013, 20:20
So, wie der Quelltext dort steht, ist es klar, dass es nicht funktioniert:
Delphi-Quellcode:
listview1.Clear;
...
for J := 0 to listview1.items.Count - 1 do
Fällt dir was auf? Wobei ich anhand der starken Einrückungen davon ausgehe, dass du einige Zeilen Quelltext weggelassen hast, um nur das Wichtige zu zeigen (was ja richtig ist).

Davon abgesehen erzeugst du in der for-Schleife mit jedem Durchlauf eine Instanz von TIniFile, ohne diese zu zerstören. Besser diesen Aufruf in der Schleife weglassen, vor der Schleife erzeugen und danach (oder wenn nicht mehr benötigt) wieder zerstören.

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: verschachtelte for to do schleife

  Alt 13. Feb 2013, 20:21
Sieht aus also ob Listview1 leer ist ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: verschachtelte for to do schleife

  Alt 13. Feb 2013, 20:28
So, wie der Quelltext dort steht, ist es klar, dass es nicht funktioniert:
Delphi-Quellcode:
listview1.Clear;
...
for J := 0 to listview1.items.Count - 1 do
muss nicht zwingend sein, irgend wann muss er vor dem Neueinlesen den Inhalt löschen. Problematischer ist hier eher, dass nur wenn schon was in der Listview enthalten ist ein weiterer Eintrag dazu kommt:



Delphi-Quellcode:
                                               for J := 0 to listview1.items.Count - 1 do // --> listview durchsuchen ob Hersteller schonmal gelistet ist
                                                  begin
                                                      showmessage('beginne J schleife');

                                                      if (ListView1.Items.Item[J].Caption = ean_hersteller_db) // prüfen ob Hersteller schon einmal aufgeführt
                                                      then begin
                                                             exit; // Schleife verlassen
                                                           end
                                                      else begin
                                                              list:= listview1.Items.add; //Eintrag erzeugen
                                                              list.caption:=ean_hersteller_db;
                                                           end;
                                                  end;



                                               end;
                                               if listview1.items.Count = 0 then //das hier fehlt!
                                               begin
                                                              list:= listview1.Items.add; //Eintrag erzeugen
                                                              list.caption:=ean_hersteller_db;
                                                           end;
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: verschachtelte for to do schleife

  Alt 13. Feb 2013, 21:14
Warum so viel Code in einer einzigen Methode?
Das ist nicht gut!

Schreibe mal eine Funktion/Methode die nur Folgendes macht:
Inputparameter sind ein TStrings-Objekt mit allen Firmen und der Suchstring.
Die Funktion befüllt ein 2. TStrings-Objekt mit allen zum Suchstring passenden Treffern.

Man könnte das auch mit einer SQL-Abfrage mit dem Operator LIKE ermitteln.
Auf jeden Fall: nicht Alles in eine Funktion packen sondern das Problem zerlegen
und mit Unterfunktionen lösen.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: verschachtelte for to do schleife

  Alt 13. Feb 2013, 21:32
Prüf' auch mal die ini.Create***

Delphi-Quellcode:
  listview1.Clear;
  Ini := TIniFile.create(einstellungen.artikelreg); // ***
  db_ar_index := ini.readstring('DB_AR', 'index', db_ar_index);
  ean_hersteller_suche := pflege.edit8.text;
  for I := 0 to strtoint(db_ar_index) do
  begin
    Ini := TIniFile.create(einstellungen.artikelreg); // *** ???
Edit: Dalai war schneller

Geändert von Bjoerk (13. Feb 2013 um 21:34 Uhr) Grund: Edit:
  Mit Zitat antworten Zitat
Dr. Jack

Registriert seit: 17. Mär 2010
78 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#7

AW: verschachtelte for to do schleife

  Alt 13. Feb 2013, 23:13
Danke das war die Lösung!

@ Bjoerk: das 2. Tinifile.create habe ich entfernt, das war überflüssig. Danke dafür!
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:49 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