AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi 3 Taabellen,ausdünnen
Thema durchsuchen
Ansicht
Themen-Optionen

3 Taabellen,ausdünnen

Ein Thema von hirsch · begonnen am 21. Feb 2014 · letzter Beitrag vom 21. Feb 2014
Antwort Antwort
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
jensw_2000
(Gast)

n/a Beiträge
 
#2

AW: 3 Taabellen,ausdünnen

  Alt 21. Feb 2014, 16:19
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').

Geändert von jensw_2000 (21. Feb 2014 um 16:36 Uhr)
  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 11:38 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