mrp_enter_automo_d.pas

来自「一个MRPII系统源代码版本」· PAS 代码 · 共 393 行

PAS
393
字号
unit Mrp_Enter_AutoMo_D;

Interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Base_Entry_Detail, Db, AdODB, ExtCtrls, StdCtrls, Mask, ExtEdit, linkedit;

Type
  TFrm_Mrp_Enter_AutoMo_D = Class(TFrm_Base_Entry_Detail)
    edt_qty: TEdit;
    Label4: TLabel;
    Label3: TLabel;
    medt_Modate: TMaskEdit;
    Label2: TLabel;
    Label1: TLabel;
    MEdt_MoStArtWorkDate: TMaskEdit;
    Label5: TLabel;
    Label6: TLabel;
    cmbBackflush: TComboBox;
    ExtEdt_ItemCode: TLinkEdit;
    edt_ItemName: TEdit;
    Label7: TLabel;
    edt_remArk: TEdit;
    procedure DateCheck(Sender: TObject);
    procedure btn_okClick(Sender: TObject);
    procedure ExtEdt_ItemCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ExtEdt_ItemCodeExit(Sender: TObject);
    procedure FloatCheck(Sender: TObject);
    procedure MEdt_MoStArtWorkDateExit(Sender: TObject);
    procedure ExtEdt_ItemCodeButtonClick(Sender: TObject);
  private
    UomName:String;  //记录当前单位
    MnldTime:Integer;//记录制造提前期
    runlt:integer;
    LineNo:Integer;//行号
    MoStArtWorkDate:String;//当前开工日期
    { Private declarations }
  public
    procedure InitControls; Override;
    procedure SaveBodyData; Override;
    procedure SetStatus(CurrentStatus:String;var EnableControls:String);Override;
    function existSalterson(ItemCode:string):boolean;
  end;

var
  Frm_Mrp_Enter_AutoMo_D: TFrm_Mrp_Enter_AutoMo_D;

implementation

uses Sys_Global,Mrp_Enter_AutoMo;

{$R *.DFM}

procedure TFrm_Mrp_Enter_AutoMo_D.InitControls;
var
  SqlText:String;
begin
  SetFocus_Control:=medt_Modate;
  Inherited;
  with AdoQry_Body do
  begin
    ExtEdt_ItemCode.Text:=fieldbyname('ItemCode').AsString;
    edt_ItemName.text:=fieldbyname('ItemName').AsString;
    UomName := fieldbyname('UomName').AsString;
    If (Status='Add') then
    begin
      LineNo:=RecordCount+1;
      Medt_MoDate.Text:=Formatdatetime('yyyy.mm.dd',date);
      MEdt_MoStArtWorkDate.Text:=FormatDateTime('yyyy.mm.dd',Date);
      MoStArtWorkDate:=FormatDateTime('yyyy.mm.dd',Date);
      cmbBackflush.ItemIndex:=0;
    end
    else
    begin
      SqlText:=' Select Item.MnldTime,runlt,Uom.UomName '
              +' From Item '
              +' Left Outer Join Uom On Item.UomCode=Uom.UomCode '
              +' Where ItemCode='+''''+Trim(ExtEdt_ItemCode.Text)+''''
              +' And PmCode In (0,3)';
      AdoQry_Tmp.Close;
      AdoQry_Tmp.SQL.Text:=SqlText;
      AdoQry_Tmp.Open;
      UomName:=AdoQry_Tmp.fieldbyname('UomName').AsString;
      MnldTime:=AdoQry_Tmp.fieldbyname('MnldTime').AsInteger;
      runlt:=AdoQry_tmp.fieldbyname('runlt').asinteger;
      LineNo:=fieldbyname('MoLineNo').AsInteger;
      MEdt_MoStArtWorkDate.Text:=FormatDateTime('yyyy.mm.dd',fieldbyname('MoStArtWorkDate').Asdatetime);
      MoStArtWorkDate:=FormatDateTime('yyyy.mm.dd',fieldbyname('MoStArtWorkDate').Asdatetime);
      Medt_MoDate.Text:=FormatDateTime('yyyy.mm.dd',fieldbyname('MoLineDate').Asdatetime);
      cmbBackflush.ItemIndex:=fieldbyname('Backflush').asinteger;      
    end;
    Edt_Qty.Text:=FormatFloat('##0.####',fieldbyname('MoQty').AsFloat);
    edt_remArk.Text:=fieldbyname('remArk').asstring;
  end;
end;


procedure TFrm_Mrp_Enter_AutoMo_D.SaveBodyData;
var tMpsqltext:string;
    ParentMoLineno:integer;
begin
   with AdoQry_Body do
  begin
    fieldbyname('MoLineNo').Asinteger:=LineNo;
    fieldbyname('ItemCode').AsString:=Trim(ExtEdt_ItemCode.Text);
    fieldbyname('ItemName').AsString:=edt_ItemName.text;
    fieldbyname('MoLineDate').Asdatetime:=strtodatetime(Medt_MoDate.Text);
    fieldbyname('MoStArtWorkDate').Asdatetime:=strtodatetime(Medt_MoStArtWorkDate.Text);
    fieldbyname('MoQty').AsFloat:=strtofloat(Edt_Qty.Text);
   // fieldbyname('SsQty').AsFloat:=strtofloat(Edt_Qty.Text);
    fieldbyname('MoNoFinishQty').AsFloat:=strtofloat(Edt_Qty.Text);
    fieldbyname('MoLineStatus').Asinteger:=5;
    fieldbyname('UomName').AsString:=UomName;
    fieldbyname('Backflush').asinteger:=cmbBackflush.ItemIndex;
    fieldbyname('remArk').asstring:=Trim(edt_remArk.text);
    Post;
  end;
    ParentMoLineno:=lineno;
  tMpsqltext:='select Bom.ItemCode,    '
              +'        Item.ItemName, '
              +'        Bom.Bomqty,   '
              +'        Uom.UomName  '
              +' from Bom '
              +' join Item on Bom.ItemCode=Item.ItemCode '
              +' left outer join Uom on Item.UomCode=Uom.UomName '
              +' where ite_ItemCode='+quotedstr(Trim(ExtEdt_ItemCode.Text))
               +' and BomItemType=4';
  Executesql(AdoQry_tmp,tMpsqltext,0);
  if AdoQry_tmp.RecordCount=0 then exit;
   with AdoQry_tmp do
     begin
       First;
       while not eof do
         begin
             If Status='Add' Then
              begin
               lineno:=AdoQry_Body.RecordCount+1;
               AdoQry_Body.Append;
                    AdoQry_Body.fieldbyname('MoLineNo').Asinteger:=LineNo;
                    AdoQry_Body.fieldbyname('ItemCode').AsString:=fieldbyname('ItemCode').AsString;
                    AdoQry_Body.fieldbyname('ItemName').AsString:=fieldbyname('ItemName').AsString;
                    AdoQry_Body.fieldbyname('MoLineDate').Asdatetime:=strtodatetime(Medt_MoDate.Text);
                    AdoQry_Body.fieldbyname('MoStArtWorkDate').Asdatetime:=strtodatetime(Medt_MoStArtWorkDate.Text);
                    AdoQry_Body.fieldbyname('MoQty').AsFloat:=StrtoFloat(Edt_Qty.Text)*fieldbyname('Bomqty').asfloat;
                    AdoQry_Body.fieldbyname('MoNoFinishQty').AsFloat:=strtofloat(Edt_Qty.Text)*fieldbyname('Bomqty').asfloat;
                    AdoQry_Body.fieldbyname('byProduct').asinteger:=1;
                    AdoQry_Body.fieldbyname('ParentMoLineno').asinteger:=ParentMoLineno;
                   If (Status='Add') Then
                    AdoQry_Body.fieldbyname('MoLineStatus').AsInteger:=5;
                    AdoQry_Body.fieldbyname('UomName').AsString:=fieldbyname('UomName').asstring;
                   AdoQry_Body.Post;
               end
               else
                 begin
                   AdoQry_Body.First;
                   while not AdoQry_Body.Eof do
                     begin
                       if AdoQry_Body.fieldbyname('ParentMoLineno').asinteger=lineno then
                         begin
                          AdoQry_Body.Edit;
                          AdoQry_Body.fieldbyname('mostArtworkdate').asdatetime:=strtodatetime(Medt_MoStArtWorkDate.Text);
                          AdoQry_Body.fieldbyname('MoLineDate').Asdatetime:=strtodatetime(Medt_MoDate.Text);
                          AdoQry_Body.fieldbyname('MoQty').AsFloat:=StrtoFloat(Edt_Qty.Text)*fieldbyname('Bomqty').asfloat;
                          AdoQry_Body.fieldbyname('MoNoFinishQty').AsFloat:=strtofloat(Edt_Qty.Text)*fieldbyname('Bomqty').asfloat;
                          AdoQry_Body.Post;
                         end;
                       AdoQry_Body.next;
                     end;
                 end;
            next;
         end;
     end;

end;

procedure TFrm_Mrp_Enter_AutoMo_D.SetStatus(CurrentStatus: String;
  var EnableControls: String);
begin
  inherited;
  EnableControls:='medt_Modate,edt_qty,edt_remArk,MEdt_MoStArtWorkDate,cmbBackflush,';
end;

procedure TFrm_Mrp_Enter_AutoMo_D.DateCheck(Sender: TObject);
begin
  If ActiveControl.Name='btn_Cancel' Then
    Exit;
  inherited;
  If SlCalendar(DbConnect,MEdt_MoDate.Text,0)<>MEdt_MoDate.Text Then
  begin
    DispInfo(MEdt_MoDate.Text+'不是工作日!',3);
    MEdt_MoDate.Text:=SlCalendar(DbConnect,MEdt_MoDate.Text,0);
    if MEdt_MoDate.CanFocus then
    MEdt_MoDate.SetFocus;
    Abort;
  end;
  If  MoStArtWorkDate<>SlCalendar(DbConnect,MEdt_MoDate.Text,runlt) Then
    MEdt_MoStArtWorkDate.Text:=SlCalendar(DbConnect,MEdt_MoDate.Text,runlt);
  If (StrToDateTime(MEdt_MoStArtWorkDate.Text)<Date())  Then
  begin
    AdoQry_Tmp.Close;
    AdoQry_Tmp.SQL.Text:=' Select DateDiff(Day,'''+DateTimeToStr(Date)+''','''+MEdt_MoStArtWorkDate.Text+''') As Day1 ';
    AdoQry_Tmp.Open;
    DispInfo('理论开工日('+Medt_MoStArtWorkDate.Text+ ')小于了系统工作日('+DateToStr(Date())+') '+IntToStr(Abs(AdoQry_Tmp.fieldbyname('Day1').AsInteger))+' 天!',3);
    Medt_MoStArtWorkDate.Text:=FormatDateTime('yyyy.mm.dd',Date);
    MoStArtWorkDate:=SlCalendar(DbConnect,MEdt_MoDate.Text,runlt);
  end;
end;

procedure TFrm_Mrp_Enter_AutoMo_D.btn_okClick(Sender: TObject);
var
  I:String;
begin
  If (StrToFloat(Edt_Qty.Text)=0) And (Status='Add') Then
  begin
    DispInfo('约定交货量不能为0!',1);
    if Edt_Qty.CanFocus then 
    Edt_Qty.SetFocus;
    Abort;
  end;
  If (Status='Add') Then
  begin
      if cmbBackflush.ItemIndex=1 then
       if existSalterson(Trim(Extedt_ItemCode.text)) then
         begin
          DispInfo(Trim(Extedt_ItemCode.text)+'物料有替代件子项,不能拉式领料!',3);
          abort;
         end;
    If AdoQry_Body.RecordCount>0 Then
    begin
      AdoQry_Body.First;
      While Not AdoQry_Body.Eof Do
      begin
        If (Trim(ExtEdt_ItemCode.Text)=Trim(AdoQry_Body.fieldbyname('ItemCode').AsString))
           And (StrToDateTime(MEdt_MoDate.Text)=AdoQry_Body.fieldbyname('MoLineDate').AsDateTime) Then
          begin
            DispInfo('你不能输入两笔相同(物料代码+约定交货日)的记录!',1);
            Btn_Ok.Enabled:=False;
            ExtEdt_ItemCode.SelectAll;
            if ExtEdt_ItemCode.CanFocus then  ExtEdt_ItemCode.SetFocus;
            Abort;
          end;
        AdoQry_Body.Next;
      end;  //end  while
    end;  //end if
  end;   //end (Add)
  If (Status<>'Add') Then
  begin
      if cmbBackflush.ItemIndex=1 then
       if existSalterson(Trim(Extedt_ItemCode.text)) then
         begin
          DispInfo(Trim(Extedt_ItemCode.text)+'物料有替代件子项,不能拉式领料!',3);
          abort;
         end;
    I:=AdoQry_Body.BookmArk;
    AdoQry_Body.First;
    While Not AdoQry_Body.Eof Do
    begin
      If (Trim(ExtEdt_ItemCode.Text)=Trim(AdoQry_Body.fieldbyname('ItemCode').AsString))
         And (StrToDateTime(MEdt_MoDate.Text)=AdoQry_Body.fieldbyname('MoLineDate').AsDateTime)
         And (I<>AdoQry_Body.BookmArk) Then
        begin
          DispInfo('你不能输入两笔相同(物料代码+约定交货日)的记录!',3);
          Btn_Ok.Enabled:=False;
          ExtEdt_ItemCode.SelectAll;
          if ExtEdt_ItemCode.CanFocus then
          ExtEdt_ItemCode.SetFocus;
          Close;
          Abort;
        end;
      AdoQry_Body.Next;
    end;  //end  while
    AdoQry_Body.BookmArk:=I;
  end;
  inherited;

end;

procedure TFrm_Mrp_Enter_AutoMo_D.ExtEdt_ItemCodeKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  inherited;
  If (Key=120) Then
  CommonHint(Sender,AdoQry_Tmp,'ItemName','物料描述','ItemCode',
       '物料代码','Item','  PmCode In (0,3) and ItemUsable=1');
end;

procedure TFrm_Mrp_Enter_AutoMo_D.ExtEdt_ItemCodeExit(Sender: TObject);
var
  SqlText:String;
begin
  inherited;
  If ActiveControl.Name='btn_Cancel' Then
    Exit;
  If Trim(TEdit(Sender).Text)='' Then
  begin
    DispInfo('物料代码不能为空!',3);
    if TWinControl(Sender).CanFocus then
    TWinControl(Sender).SetFocus;
    Abort;
  end;
  SqlText:=' Select Item.ItemName,Item.MnldTime,runlt,Uom.UomName '
              +' From Item '
              +' Left Outer Join Uom On Item.UomCode=Uom.UomCode '
              +' Where ItemCode='+''''+Trim(ExtEdt_ItemCode.Text)+''''
              +' And PmCode In (0,3)';
      AdoQry_Tmp.Close;
      AdoQry_Tmp.SQL.Text:=SqlText;
      AdoQry_Tmp.Open;
  If AdoQry_Tmp.Eof Then
  begin
    DispInfo('输入了错误的物料代码,请重新输入!',3);
    TWincontrol(Sender).SetFocus;
    Abort;
  end;
  UomName:=AdoQry_Tmp.fieldbyname('UomName').AsString;
  MnldTime:=AdoQry_Tmp.fieldbyname('MnldTime').AsInteger;
  runlt:=AdoQry_tmp.fieldbyname('runlt').asinteger;
  edt_ItemName.text:=AdoQry_Tmp.fieldbyname('ItemName').AsString;
end;

procedure TFrm_Mrp_Enter_AutoMo_D.FloatCheck(Sender: TObject);
begin
  If ActiveControl.Name='btn_Cancel' Then
    Exit;
  inherited;
  If (Status='Add') And (StrToFloat(Edt_Qty.Text)<=0 ) Then
  begin
    DispInfo('增加数据时约定交货量不能小于能于0!',3);
    TWincontrol(Sender).SetFocus;
    Abort;
  end;
  Edt_Qty.Text:=FormatFloat('##0.####',StrToFloat(Edt_Qty.Text));
end;

procedure TFrm_Mrp_Enter_AutoMo_D.MEdt_MoStArtWorkDateExit(
  Sender: TObject);
begin
  If (ActiveControl.Name ='btn_Cancel') Or (ActiveControl.Name='medt_Modate') Then
    Exit;
  If SlCalendar(DbConnect,Medt_MoStArtWorkDate.Text,0)<>Medt_MoStArtWorkDate.Text Then
  begin
    DispInfo(Medt_MoStArtWorkDate.Text+'不是工作日!',3);
    Medt_MoStArtWorkDate.Text:=SlCalendar(DbConnect,Medt_MoStArtWorkDate.Text,0);
    if Medt_MoStArtWorkDate.CanFocus then
    Medt_MoStArtWorkDate.SetFocus;
    Abort;
  end;  //约定开工日必须是工作日,否则返回前一个工作日
  If (Status='Add') And ((StrToDate(Medt_MoStArtWorkDate.Text)>StrToDate(Medt_MoDate.Text))
    Or (StrToDate(Medt_MoStArtWorkDate.Text)<Date())) Then
   begin
     DispInfo('约定开工日必须为系统工作日与约定交货日之间的日期,请修改!',3);
     if TWinControl(Sender).CanFocus then
     TWinControl(Sender).SetFocus;
     Abort;
   end;
  If (Status<>'Add') And (StrToDate(Medt_MoStArtWorkDate.Text)>StrToDate(Medt_MoDate.Text)) Then
  begin
    DispInfo('约定开工日必须小于约定交货日,请修改!',3);
    if TWinControl(Sender).CanFocus then
    TWinControl(Sender).SetFocus;
    Abort;
  end;
end;

function TFrm_Mrp_Enter_AutoMo_D.existSalterson(ItemCode: string): boolean;
var AdoQry:TAdoQuery;
    sqltext:string;
begin
   Result:=False;
   AdoQry:=TAdoQuery.Create(self);
   AdoQry.Connection:=dbconnect;
   sqltext:='select ItemCode from Bom where BomItemType=6 and ite_ItemCode='+quotedstr(ItemCode);
   try
     Executesql(AdoQry,sqltext,0);
     if AdoQry.RecordCount>0 then Result:=True;
   finally
    AdoQry.Free;
   end;
end;

procedure TFrm_Mrp_Enter_AutoMo_D.ExtEdt_ItemCodeButtonClick(
  Sender: TObject);
begin
  inherited;
  CommonHint(Sender,AdoQry_Tmp,'ItemName','物料描述','ItemCode',
       '物料代码','Item','  PmCode In (0,3) and ItemUsable=1');

end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?