Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi 3 Taabellen,ausdünnen (https://www.delphipraxis.net/179231-3-taabellen-ausduennen.html)

hirsch 21. Feb 2014 13:16

Datenbank: Mysql • Version: 5 • Zugriff über: DBX

3 Taabellen,ausdünnen
 
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
Delphi-Quellcode:
kopiere:='insert into katalogpos Select * From Position where SparteBez LIKE ''%Katalog%'' ;';
gemacht.
Daraus habe ich eine dritte Tabelle mit Namen "Temp" gemacht.
Delphi-Quellcode:
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.

jensw_2000 21. Feb 2014 15:19

AW: 3 Taabellen,ausdünnen
 
Frage doch beim Insert gleich alle Bedingungen auf einmal ab ..
Das geht per SQL recht einfach.

Code:
  -- Einfügen in Tabelle "KatalogPos"
  INSERT INTO KatalogPos
  -- alle Spalten und Datensätze aus Tabelle "Position"
  SELECT * FROM Position
  -- bei denen:
  WHERE
    -- die Angebotsnummer nicht enthalten ist, in
    AngbNr NOT IN
    -- der Liste eindeutiger Artikelnummern aus Tabelle Position, die eine andere "SparteBez" als 'KatalogArtikel' haben.
    ( SELECT DISTINCT AngbNr FROM Position WHERE SparteBez <> 'KatalogArtikel' );

Hinweis: LIKE %% ist deutlich langsamer als ein direkter Vergleich (<> 'KatalogArtikel').


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 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