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.