Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
Delphi 10.4 Sydney
|
Re: Lagerreichweite und Fertigungsauftragsendtermin Berechnu
12. Feb 2009, 09:27
So sieht die Lösung aus. Ich habe es noch etwas erweitert, dass die varhandenen Fertigungsaufträge ausgegeben werden und das erforderliche Fertigstellungsdatum abhängig von Kundenbedarf und Fertigungsauftragsmenge...
Es war mir nicht möglich, das ganze auf dem MySQL-Server zu lösen, sondern nur in dem Delphi-Programm...
Delphi-Quellcode:
procedure TTest3.LagerzugangClick(Sender: TObject);
var query, query1, query2 : string;
Cols, Cols1, Cols2 : TCols;
Rows, Rows1, Rows2 : TRows;
i, j :integer;
begin
//Lagerbestand
query:= ' select sum(lslgbe)from oms14 '+
' where watenr=10013054';
unit1.connect;
unit1.ExecQuery( DB, query, cols, Rows);
//======================================}
//Kundenbedarf
query1:= ' select watenr, ltbdmg, DATE_FORMAT(ltlite,'+#39+' %d.%m.%Y'+#39+' ), ltbdmg*0 as kumuliert from omslp '+
' where watenr=10013054 '+
' order by ltlite';
unit1.ExecQuery( DB, query1, cols1, Rows1);
//======================================}
//Fertigungsaufträge
query2:= ' Select WAAUNR as FA_Nr, WATENR as ArtikelNr, TEBEZ1 as Bezeichnung, OAAGNR as AG, OAAGBZ as Arbeitsgang, '+
' OAAGNR*0 as Lagerzugang, WAFEMG from as400 '+
' where OATLKZ <> 9 and WATENR=10013054 '+
' GROUP BY WATENR, WAAUNR '+
' ORDER BY WATENR, OAAGNR DESC';
unit1.ExecQuery( DB, query2, cols2, Rows2);
//======================================}
//Lagerzugangsdatum
i:=0; j:=0;
rows1[3,i]:=inttostr(strtoint(rows[0,0])-strtoint(rows1[1,0]));
for i := 1 to length(rows1[0]) - 1 do
begin
rows1[3,i]:=inttostr(strtoint(rows1[3,i-1])-strtoint(rows1[1,i]));
if (strtoint(rows1[3,i])<0) and (strtoint(rows1[3,i-1])>=0) then
begin
while (strtoint(rows1[3,i])<0) and (j<length(rows2[0])) do
begin
//Lieferdatum zu FA
rows2[5,j]:=rows1[2,i];
//Fertigungsmenge zu rows1[3,i] addieren
rows1[3,i]:=inttostr(strtoint(rows1[3,i])+strtoint(rows2[6,j]));
// j+1
j:=j+1;
end;
end;
end;
unit1.disconnect;
//======================================}
//Datenausgabe
unit1.FillGrid(StringGrid5, Cols2, Rows2);
end;
Das ist die ExecQuery:
Delphi-Quellcode:
function ExecQuery( const Datenbank, query: string; var Cols: TCols; var Rows: TRows): Boolean;
var
MySQLRes: PMYSQL_RES;
MySQLRow: PMYSQL_ROW;
AffectedRows: Int64;
ColCount: Cardinal;
Field: PMYSQL_FIELD;
i: Integer;
j: Integer;
ErrorCode: Integer;
begin
// Datenbank auswählen
ErrorCode := mysql_select_db(_mycon, PChar(Datenbank));
if ErrorCode = 0 then
begin
// Query ausführen
ErrorCode := mysql_real_query(_mycon, PChar( query), length( query));
if ErrorCode = 0 then
begin
// Query speichern
MySQLRes := mysql_store_result(_mycon);
if Assigned(MySQLRes) then
begin
// zurückgelieferte Anzahl der Spalten
ColCount := mysql_num_fields(MySQLRes);
SetLength(Cols, ColCount);
// Spalten-Array füllen
for i := 0 to ColCount - 1 do
begin
Field := mysql_fetch_field_direct(MySQLRes, i);
Cols[i] := Field. Name;
end;
// Anzahl der betroffenen Zeilen ermitteln
AffectedRows := mysql_affected_rows(_mycon);
SetLength(Rows, ColCount, AffectedRows);
// neu ->
// Zeilen-array füllen
// alle Zeilen ...
for j := 0 to AffectedRows - 1 do
begin
// ... werden eingelesen
MySQLRow := mysql_fetch_row(MySQLRes);
// alle Spalten ...
for i := 0 to ColCount - 1 do
begin
// ... werden in Rows[] übertragen
Rows[i, j] := MySQLRow[i];
end;
end;
// gespeicherte Abfrage wieder freigeben
{mysql_free_result(MySQLRes);}
end
end
end;
result := ErrorCode = 0;
end;
und das die Fillgrid:
Delphi-Quellcode:
procedure FillGrid(SG: TStringGrid; Cols: TCols; Rows: TRows);
var
i, j: Integer;
begin
SG.ColCount := 0;
SG.RowCount := 0;
if Assigned(Rows) then
begin
// Wir brauchen eine Zeile mehr für die Spaltenüberschriften
SG.RowCount := length(Rows[0]) + 1;
SG.ColCount := length(Cols);
SG.FixedRows := 0;
// Spaltenüberschriften in die erste Zeile schreiben
for i := 0 to length(Cols) - 1 do
begin
SG.Cols[i].Add(Cols[i]);
SG.Cells[i, 0] := Cols[i];
end;
// zwei-dimensionales Zeilen-Array in den Zellen ausgeben
for i := 0 to length(Cols) - 1 do
begin
for j := 0 to length(Rows[0]) - 1 do
begin
SG.Cells[i, j + 1] := Rows[i, j];
end;
end;
end;
end;
Patrick
|