Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
Delphi 10.4 Sydney
|
AW: Mehrfach Update STatement
8. Jul 2019, 12:08
Also die Daten ergeben sich. Der User schiebt per Drag&Drop die Zeilen einer Tabelle, um eine gute Auftragsreihenfolge zu erhalten. Aus der Position des Auftrags werden die Werte errechnet. Sequence zeigt die Reichenfolge an.
Ich erstelle mir das Update- Query in einer Functionanhand der Daten in der Tabelle. Die Daten können von Menge und Inhalt sehr unterschiedlich sein.
Delphi-Quellcode:
function TMySQLDB.Planung_Speichern(SG: TAdvStringGrid): boolean;
var I: integer;
where_SQL: string;
begin
FMyWriteQuery.SQL.Clear;
FMyWriteQuery.SQL.Add('update as400 set ');
//Sequence
FMyWriteQuery.SQL.Add('sequence = case ');
where_SQL:=' where concat(waaunr,'+QuotedStr('-')+',waaupo,'+QuotedStr('-')+',oaagnr) in (';
for I := 2 to SG.RowCount -2 do begin //Filter-Zeile und FloatingFooter
FMyWriteQuery.SQL.Add(' when concat(waaunr,'+QuotedStr('-')+',waaupo) ='+QuotedStr(SG.Cells[1,I])+
' and oaagnr ='+SG.Cells[5,I]+' then '+SG.Cells[0,I]+' ');
if I=2 then
where_SQL:=where_SQL+QuotedStr(SG.Cells[1,I]+'-'+SG.Cells[5,I])
else
where_SQL:=where_SQL+', '+QuotedStr(SG.Cells[1,I]+'-'+SG.Cells[5,I]);
end;
FMyWriteQuery.SQL.Add(' else 0 end, ');
//Frozen
FMyWriteQuery.SQL.Add('frozen = case ');
for I := 2 to SG.RowCount -2 do begin //Filter-Zeile und FloatingFooter
FMyWriteQuery.SQL.Add(' when concat(waaunr,'+QuotedStr('-')+',waaupo) ='+QuotedStr(SG.Cells[1,I])+
' and oaagnr ='+SG.Cells[5,I]+' then '+SG.Cells[25,I]+' ');
end;
FMyWriteQuery.SQL.Add(' else 0 end, ');
//PlanDate
FMyWriteQuery.SQL.Add('plan_date = case ');
for I := 2 to SG.RowCount -2 do begin //Filter-Zeile und FloatingFooter
FMyWriteQuery.SQL.Add(' when concat(waaunr,'+QuotedStr('-')+',waaupo) ='+QuotedStr(SG.Cells[1,I])+
' and oaagnr ='+SG.Cells[5,I]+' then '+QuotedStr(copy(SG.Cells[14,I],7,4)+'-'+copy(SG.Cells[14,I],4,2)+'-'+copy(SG.Cells[14,I],1,2))+' ');
end;
FMyWriteQuery.SQL.Add(' else '+QuotedStr('0000-00-00')+' end ');
where_SQL:=where_SQL+')';
FMyWriteQuery.SQL.Add(where_SQL);
FMyWriteQuery.Execute;
Result:=true;
end;
Ich habe vorher Einzelupdates gehabt und hatte das Problem, dass das sehr lange dauerte (mehrere Sekunden, obwohl ich nur die ersten 15 Zeile gespeichert habe). Jetzt geht es sehr schnell, sodass ich problemlos mehrere Tabelle auf einmal speichern kann.
Daher bin ich mit dieser Lösung gerade sehr glücklich...
Delphi-Quellcode:
update as400 set
sequence = case
when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10) then 1
when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10) then 2
when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10) then 3
else 0
end,
frozen = case
when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10) then 1
when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10) then 1
when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10) then 0
else 0
end,
plan_date = case
when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10) then '2019-07-05'
when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10) then '2019-07-05'
when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10) then '2019-07-06'
else '000-00-00'
end
where concat(waaunr,'-',waaupo,'-',oaagnr) in ('408216-0-10', '408217-0-10', '408218-0-10')
Zitat:
Wer auf diese Spaltennamen gekommen ist gehört übrigens standrechtlich erschossen.
Spaltenname von XPPS...
Gruß Patrick
Patrick
|