Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
Delphi 10.4 Sydney
|
Re: Subquery mit mehreren Results
6. Mär 2009, 13:21
Also, das Programm beschäftigt sich mit der Terminverfolgung von Fertigungsaufträgen. Dazu werden drei Tabellen mit Daten aus dem ERP-System bestückt:
Auftragsdaten: AuftragsNr, ArtikelNr, Fertigungsmenge, ArbeitsgangNr
Kundebedarf: ArtikelNr, Bedarfsmenge, Liefertermin, Kunde
Lagerbestand: ArtikelNr, Lagerort, Lagermenge
Jeder Auftrag hat mehrere Arbeitsgänge, dass heißt, dass eine Auftragsnummer öfter in der tabelle Auftragsdaten (bislang Artikelstamm)
Ich möchte aufzeigen, welcher Auftrag bis wann fertig sein muss.
Dazu muss ich den Lagerbestand gegen die Kundbedarfe laufen lassen und gucken, wann der Lagerbestand durch 0 läuft. Spätestens dann müssen so viele Aufträge fertig sein, dass der Kundenbedarf gedeckt werden kann. (es kann nicht Kundenauftragsbezogen gefertigt werden, da das mit den Fertigungsmengen nicht vereinbar ist).
Wenn also der Lagerbestand durch 0 läuft müssen für die Aufträge, die am weitesten fertig sind, das Enddatum auf den Liefertermin gesetzt werden. Und so kann ich für alle Aufträge das erforderliche Enddatum berechnen und ausgeben.
Wenn ich nach einem Artikel suche, habe ich das wie folgt gelöst.
Delphi-Quellcode:
procedure TFA_suchen.suchenClick(Sender: TObject);
var query, query1, query2, query3 : string;
Cols, Cols1, Cols2, Cols3 : TCols;
Rows, Rows1, Rows2, Rows3 : TRows;
i, j, k :integer;
begin
//Lagerbestand
query:= ' select sum(lslgbe)from oms14 '+
' where watenr= '+Kriterium.Text;
MenueUnit.connect;
MenueUnit.ExecQuery( DB, query, cols, Rows);
//======================================}
//Kundenbedarf
query1:= ' select omslp.WATENR as ArtikelNr, as400.TEBEZ1 as Bezeichnung, omslp.liefer as Kd_Bedarf, '+
' DATE_FORMAT(omslp.ltlite,'+#39+' %d.%m.%Y'+#39+' ) as Kd_L_Datum, omslp.LTKDNR as Kd_Nr, omslp.KDKUNA as Kunde, '+
' omslp.ltbdmg*0 as L_Bestand_kum from omslp '+
' left join as400 on omslp.watenr=as400.watenr '+
' where omslp.watenr= '+ Kriterium.Text +
' group by omslp.ltlite order by omslp.ltlite';
MenueUnit.ExecQuery( DB, query1, cols1, Rows1);
//======================================}
//Fertigungsaufträge
query2:= ' Select as400.WAAUNR as FA_Nr, as400.WAAUPO as Me_Bearb, as400.WATENR as ArtikelNr, as400.TEBEZ1 as Bezeichnung, as400.OAAGNR as AG_Nr, as400.OAAGBZ as Arbeitsgang_Bezeichnung, '+
' REPLACE(FORMAT(as400.WAFEMG, 0),'+#39+' ,'+#39+' ,'+ #39+ ' .'+#39+' ) as FA_Menge, as400.OAAGNR*0 as Lagerzugang, as400.WAFEMG, eilfa.angeschoben from as400 '+
' left join eilfa on as400.WAAUNR=eilfa.WAAUNR and as400.WAAUPO=eilfa.WAAUPO '+
' where OATLKZ <> 9 and WATENR= '+ Kriterium.Text + ' and WASTAT<> 50' +
' GROUP BY as400.WATENR, as400.WAAUNR '+
' ORDER BY as400.WATENR, as400.OAAGNR DESC';
MenueUnit.ExecQuery( DB, query2, cols2, Rows2);
//======================================}
//Lagerzugangsdatum
i:=0; j:=0;
if AffectedRows > 0 then //Nur wenn es ein Ergebnis gibt
begin
rows1[6,i]:=inttostr(strtoint(rows[0,0])-strtoint(rows1[2,0]));
if strtoint(rows1[6,0])<0 then
begin
while (strtoint(rows1[6,0])<0) and (j<length(rows2[0])) do
begin
//Lagerzugangsdatum
rows2[7,j]:=datetostr(strtodate(rows1[3,0])-3);
//Fertigungsmenge zu rows1[3,i] addieren
rows1[6,0]:=inttostr(strtoint(rows1[6,0])+strtoint(rows2[8,j]));
// j+1
j:=j+1;
end;
end;
for i := 1 to length(rows1[0]) - 1 do
begin
rows1[6,i]:=inttostr(strtoint(rows1[6,i-1])-strtoint(rows1[2,i]));
if (strtoint(rows1[6,i])<0) and (strtoint(rows1[6,i-1])>=0) then
begin
while (strtoint(rows1[6,i])<0) and (j<length(rows2[0])) do
begin
//Lagerzugangsdatum
rows2[7,j]:=datetostr(strtodate(rows1[3,i])-3);
//Fertigungsmenge zu rows1[3,i] addieren
rows1[6,i]:=inttostr(strtoint(rows1[6,i])+strtoint(rows2[8,j]));
// j+1
j:=j+1;
end;
end;
end;
end
else
begin
MenueUnit.ClearGrid(FAs);
MenueUnit.ClearGrid(DetailFA);
MenueUnit.ClearGrid(KdBedarf);
end;
//Kundenbedarf mit Tausendertrennzeichen
query3:= ' select REPLACE(FORMAT(omslp.ltbdmg, 0),'+#39+' ,'+#39+' ,'+ #39+ ' .'+#39+' ) as Kd_Bedarf from omslp '+
' where omslp.watenr= '+ Kriterium.Text +
' group by omslp.ltlite order by omslp.ltlite';
MenueUnit.ExecQuery( DB, query3, cols3, Rows3);
if AffectedRows > 0 then //Nur wenn es ein Ergebnis gibt
begin
MenueUnit.FillGrid(FAs, Cols2, Rows2);
for k := 0 to length(rows1[0]) - 1 do
begin
rows1[2,k]:=rows3[0,k];
end;
MenueUnit.FillGrid(KdBedarf, Cols1, Rows1);
FAs.ColWidths[0]:= 50;
FAs.ColWidths[1]:= 65;
FAs.ColWidths[2]:= 60;
FAs.ColWidths[3]:= 170;
FAs.ColWidths[4]:= 50;
FAs.ColWidths[5]:= 170;
FAs.ColWidths[6]:= 70;
FAs.ColWidths[7]:= 85;
FAs.ColWidths[8]:= 0;
FAs.ColWidths[9]:= 0;
KdBedarf.ColWidths[0]:=65;
KdBedarf.ColWidths[1]:=175;
KdBedarf.ColWidths[2]:=90;
KdBedarf.ColWidths[3]:=90;
KdBedarf.ColWidths[4]:=60;
KdBedarf.ColWidths[5]:=175;
KdBedarf.ColWidths[6]:=115;
end;
end;
Jetzt muss ich das ganze aber realisieren für eine ganze Liste an Aufträgen gleicher und unterschiedlicher Artikel.
Ist mein Problem jetzt deutlicher geworden?
Lieben Gruß
Ykcim
Patrick
|