Thema: Delphi 3 Taabellen,ausdünnen

Einzelnen Beitrag anzeigen

hirsch

Registriert seit: 29. Jan 2008
Ort: Tuttlingen
88 Beiträge
 
Delphi 2007 Professional
 
#1

3 Taabellen,ausdünnen

  Alt 21. Feb 2014, 14:16
Datenbank: Mysql • Version: 5 • Zugriff über: DBX
Ich hätte schon wieder eine Anfängerfrage.
Aus einer Tabelle mit Namen "Position", habe ich eine weitere Tabelle "KatalogPos" gemacht, die aus der "Position" nur die Katalogware enthällt.
Nun muss ich aus der Tabelle KatalogPos alle Angebote raus löschen, die in der Tabelle Position im gleichen Angebot eine andere Position als Katalogware enthällt.

Beispiel:
Angebot 777 Pos1: KatalogArtikel
Angebot 777 Pos2: SonderArtikel
Angebot 777 Pos3: Katalogartikel
Also würde die Regel hier zuschlagen.

Anderes Beispiel
Angebot 454 Pos1 KatalogArtikel
Angebot 454 Pos2 KatalogArtikel
Angebot 454 Pos3 KatalogArtikel
Angebot 454 Pos4 KatalogArtikel
Hier würde die Regel nicht zuschlagen.

Die Erstellung der zweiten Tabelle KatalogPos wurde mit
kopiere:='insert into katalogpos Select * From Position where SparteBez LIKE ''%Katalog%'' ;'; gemacht.
Daraus habe ich eine dritte Tabelle mit Namen "Temp" gemacht.
kopiere:='insert into Temp Select * From Katalogpos ;'; Das flutscht auch ganz schnell(22000 Datensätze).

Um diejenigen zu finden, die zu löschen sind habe ich das geschrieben:
Delphi-Quellcode:
//Prüfen ob es zu einem Angebot eine ander Position gibt, die keine Katalogware ist
    cdsKat.First; //CDSKat geht auf KatalogPos
    while not cdskat.Eof do begin
      angebot:=cdskat.FieldByName('AngbNr').AsString;
      sql:='Select * from Position where AngbNr= '''+Angebot+''';';
      if SDSPos.Active=True then SDSPos.Active:=False;
      if CDSPos.Active=True then CDSPos.Active:=False;
      sdsPos.CommandText:=sql;
      CDSPos.Active:=True;
      SDSPos.Active:=True;
      if cdspos.RecordCount >1 then begin
        bez:='';p:=0;
        CDSpos.First;
        while not cdspos.Eof do begin
          bez:=cdspos.FieldByName('SparteBez').AsString;
          p:=pos('Katalog',bez);
          if p = 0 then begin
            delete1:='Delete from Temp where AngbNr= '''+Angebot+''';';
            if SDSTemp.Active=True then SDSTemp.Active:=False; //CDSTemp und SDSTemp geht auf die Temp
            if CDSTemp.Active=True then CDSTemp.Active:=False;
            sql:='Select * From Temp';
            sdsTemp.CommandText:=delete1;
            sdsTemp.ExecSQL(True);
            sdsTemp.CommandText:=sql;
            sdsTemp.Active:=true;
            cdsTemp.Active:=true;
            cdsTemp.ApplyUpdates(-1);
          end;
          cdspos.Next;
        end;
      end
      else begin
        cdspos.Next;
      end;
      cdskat.Next;
    end;
Das läuft auch soweit, ca 2 Minuten. Dann bricht das Programm die MYSQL-Serververbindung ab.
Vermutlich habe ich etwas im kreis rumgeschrieben.
Kann man sowas nicht besser lösen?

Ich sehe es nicht.

Danke für Eure Hilfe.
Wolfgang Hirsch

Geändert von hirsch (21. Feb 2014 um 14:51 Uhr)
  Mit Zitat antworten Zitat