Einzelnen Beitrag anzeigen

Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Lagerreichweite und Fertigungsauftragsendtermin Berechnu

  Alt 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
  Mit Zitat antworten Zitat