mrp_enter_automo.pas
来自「一个MRPII系统源代码版本」· PAS 代码 · 共 764 行 · 第 1/2 页
PAS
764 行
unit Mrp_Enter_AutoMo;
//
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Base_Entry_Body, Db, ActnList, AdODB, Grids, DBGridEh, StdCtrls,
ExtCtrls, ComCtrls, ToolWin, Mask, ExtEdit, DBCtrls, ExtPrintReport, jpeg;
Type
TFrm_Mrp_Enter_AutoMo = Class(TFrm_Base_Entry_Body)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edt_MoNo: TEdit;
Medt_Modate: TMaskEdit;
Label4: TLabel;
Edt_MoRemArk: TEdit;
DBGridEh1: TDBGridEh;
AdoQry_BodyMONO: TStringField;
AdoQry_BodyMoLineNO: TIntegerField;
AdoQry_BodyItemCode: TStringField;
AdoQry_BodyMOQTY: TFloatField;
AdoQry_BodyMoLineDATE: TDateTimeField;
AdoQry_BodyMoNoFinishQTY: TFloatField;
AdoQry_BodyMoLineSTATUS: TIntegerField;
AdoQry_BodyMOStArtWorkDate: TDateTimeField;
AdoQry_BodyItemName: TStringField;
AdoQry_BodyUomName: TStringField;
AdoQry_Head1: TAdoQuery;
Label5: TLabel;
Label6: TLabel;
Edt_SysParamValuec: TEdit;
Edt_SysParamCode: TExtEdit;
Lbl_SaleType: TLabel;
Edt_DeptCode: TExtEdit;
Lbl_DeptName: TLabel;
AdoQry_Temp: TAdoQuery;
Label7: TLabel;
Lbl_ItemFlag: TLabel;
Label9: TLabel;
DBText1: TDBText;
Label10: TLabel;
DBText2: TDBText;
Label8: TLabel;
Edt_DeptName: TEdit;
Label11: TLabel;
Cmbx_StandardFlag: TComboBox;
AdoQry_BodySsQty: TFloatField;
AdoQry_BodyLimItOut: TIntegerField;
AdoQry_BodyByProduct: TIntegerField;
AdoQry_BodyParentMoLineNo: TIntegerField;
AdoQry_BodyBackFlush: TIntegerField;
procedure Act_SaveExecute(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure DateCheck(Sender: TObject);
procedure Act_DeleteLineExecute(Sender: TObject);
procedure Edt_SysParamCodeKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edt_SysParamCodeExit(Sender: TObject);
procedure Act_PreviewExecute(Sender: TObject);
procedure Act_PrintExecute(Sender: TObject);
procedure Act_QuitExecute(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edt_DeptCodeExit(Sender: TObject);
procedure DataSourceDataChange(Sender: TObject; Field: TField);
procedure Act_ExcelExecute(Sender: TObject);
procedure Act_ModifyExecute(Sender: TObject);
private
{ Private declarations }
public
flag:integer;
procedure SetStatus(CurrentStatus:String;var AnswerStatus,EnableControls:String); Override;
procedure InitControls; Override;
procedure GetConnect(Ado_Qry:TAdoQuery);
procedure getbyProduct(ItemCode:string;qty:real;MoLinedate,mostArtdate:string);
procedure deletebyProduct(MoLineno:integer);
{ Public declarations }
end;
var
Frm_Mrp_Enter_AutoMo: TFrm_Mrp_Enter_AutoMo;
reMainqty:real;
implementation
uses Sys_Global,Mrp_Enter_MrpInfo,Mrp_Enter_MrpInfo1,Mrp_Enter_MrpInfo2, Mrp_Enter_AutoMo_D, Mrp_Enter_Mo_P,
Mrp_Qry_DynamicMrpInfo;
{$R *.DFM}
function checksymbol(Source:string;disptext:string):boolean; //检查输入中是否有单引号
var
i:integer;
s:string;
begin
s:=Trim(Source);
for i:=1 to length(s) do
if s[i]='''' then
begin
DispInfo(disptext+'中不能使用单引号!',1);
Result:=False;
exit;
end;
Result:=True;
end;
procedure TFrm_Mrp_Enter_AutoMo.GetConnect(Ado_Qry:TAdoQuery);
var
SqlText:String;
I,j:Integer;
begin
AdoQry_Tmp.Connection:=Ado_Qry.Connection;
AdoQry_Body.Connection:=Ado_Qry.Connection;
DbConnect:=Ado_Qry.Connection;
AdoQry_Head1.Connection:=DbConnect;
AdoQry_Head1:=Ado_Qry;
SqlText:=' Select Top 0 MoLine.*,Item.LimItOut,Item.ItemName,Uom.UomName '
+' From MoLine '
+' Join Item On MoLine.ItemCode=Item.ItemCode '
+' Left Join Uom On Item.UomCode=Uom.UomCode';
AdoQry_Body.Close;
AdoQry_Body.SQL.Text:=SqlText;
AdoQry_Body.Open;
Ado_Qry.First;
I:=1;
While Not Ado_Qry.Eof Do
begin
If Ado_Qry.fieldbyname('SScheck').AsInteger=1 Then
begin
SqlText:=' Select runlt As Dt '
+' From Item '
+' Where ItemCode='+''''+Ado_Qry.fieldbyname('ItemCode').AsString+'''';
AdoQry_Tmp.Close;
AdoQry_Tmp.SQL.Text:=SqlText;
AdoQry_Tmp.Open;
If AdoQry_Tmp.Eof Then
begin
DispInfo('物料代码'+Ado_Qry.fieldbyname('ItemCode').AsString+'不存在,制造提前期为0天!',3);
J:=0;
end
Else
J:=AdoQry_Tmp.fieldbyname('Dt').AsInteger;
AdoQry_Body.Append;
AdoQry_Body.fieldbyname('MoLineNo').AsInteger:=AdoQry_Body.RecordCount+1;
AdoQry_Body.fieldbyname('LimItOut').AsInteger:=Ado_Qry.fieldbyname('SsId').AsInteger;
AdoQry_Body.fieldbyname('ItemCode').AsString:=Ado_Qry.fieldbyname('ItemCode').AsString;
AdoQry_Body.fieldbyname('ItemName').AsString:=Ado_Qry.fieldbyname('ItemName').AsString;
AdoQry_Body.fieldbyname('UomName').AsString:=Ado_Qry.fieldbyname('UomName').AsString;
AdoQry_Body.fieldbyname('SsQty').AsFloat:=Ado_Qry.fieldbyname('TMpssReMainQty').AsFloat;
AdoQry_Body.fieldbyname('MoQty').AsFloat:=Ado_Qry.fieldbyname('TMpssReMainQty').AsFloat;
AdoQry_Body.fieldbyname('MoNoFinishQty').AsFloat:=Ado_Qry.fieldbyname('TMpssReMainQty').AsFloat;
AdoQry_Body.fieldbyname('MoLineStatus').AsInteger:=5;
// AdoQry_Body.fieldbyname('MoLineDate').AsDateTime:=iifstring(Ado_Qry.fieldbyname('ssDate').AsDateTime<now,now,Ado_Qry.fieldbyname('ssDate').AsDateTime);
AdoQry_Body.fieldbyname('MoLineDate').Asstring:=iifstring(Ado_Qry.fieldbyname('ssDate').AsDateTime<now,formatdatetime('yyyy.mm.dd',now),Ado_Qry.fieldbyname('ssDate').Asstring);
// AdoQry_Body.fieldbyname('MoStArtWorkDate').AsDateTime:=Ado_Qry.fieldbyname('ssDate').AsDateTime-J;
AdoQry_Body.fieldbyname('MostArtworkDate').Asstring:=iifstring((Ado_Qry.fieldbyname('ssDate').AsDateTime-j)<now,formatdatetime('yyyy.mm.dd',now),datetimetostr(Ado_Qry.fieldbyname('ssDate').Asdatetime-j));
AdoQry_Body.Post;
getbyProduct(AdoQry_Body.fieldbyname('ItemCode').AsString,AdoQry_Body.fieldbyname('MoQty').AsFloat,AdoQry_Body.fieldbyname('MoLineDate').Asstring,AdoQry_Body.fieldbyname('MoStArtWorkDate').Asstring);
end; //end of If Ado_Qry.fieldbyname('SScheck').AsInteger=1
Ado_Qry.Next;
end;
DataSource.DataSet:=AdoQry_Body;
dataSource.DataSet.First;
end;
procedure TFrm_Mrp_Enter_AutoMo.InitControls;
var
SQlText:String;
begin
inherited;
if Status='Add' Then
begin
MEdt_Modate.Text:=Formatdatetime('yyyy.mm.dd',Date);
Edt_DeptCode.SetFocus;
end;
Edt_DeptName.Enabled:=False;
Edt_SysParamValuec.Enabled:=False;
Cmbx_StandardFlag.ItemIndex:=1;
SQlText:=' Select SysParam.SysParamCode,SysParam.SysParamValuec From '
+' SysParam Where Upper(SubString(SysParamCode,1,8))=Upper('''+'SaleType'+''')';
AdoQry_Tmp.Close;
AdoQry_Tmp.SQL.Text:=SQlText;
AdoQry_Tmp.Open;
Edt_SysParamCode.Text:=AdoQry_Tmp.fieldbyname('SysParamCode').AsString;
Edt_SysParamValuec.Text:=AdoQry_Tmp.fieldbyname('SysParamValuec').AsString;
end;
procedure TFrm_Mrp_Enter_AutoMo.Act_SaveExecute(Sender: TObject);
var
SqlText,MoNo:String;
I:integer;
BookmArk:string;
bodymArk:string;
mArk:TBookmArk;
begin
try
bodymArk:=AdoQry_Body.BookmArk;
Edt_DeptCode.OnExit(Edt_DeptCode);
Edt_SysParamCode.OnExit(Edt_SysParamCode);
If AdoQry_Body.RecordCount=0 Then
begin
DispInfo('没有行数据,不能保存!',3);
Abort;
end;
AdoQry_Body.First;
I:=0;
While Not AdoQry_Body.Eof Do
begin
I:=I+1;
SqlText:=' Select * '
+' From Item '
+' Where (ItemCode='''+Trim(AdoQry_Body.fieldbyname('ItemCode').AsString)+''''
+' )And (PmCode In (0,3))';
AdoQry_Tmp.Close;
AdoQry_Tmp.SQL.Text:=SqlText;
AdoQry_Tmp.Open;
If AdoQry_Tmp.Eof Then
begin
DispInfo('第'+IntToStr(I)+'行物料代码不是制造物料,不能保存!',1);
Abort;
end;//在采购合同中不存在时的处理
If (AdoQry_Body.fieldbyname('MoQty').AsFloat<=0) And (Status='Add') Then
begin
DispInfo('第'+IntToStr(AdoQry_Body.RecNo)+'行数据约定交货量必须大于0,请修改!',1);
Abort;
end;
If (AdoQry_Body.fieldbyname('MostArtworkDate').AsDateTime<Date()) Then
begin
DispInfo('第'+IntToStr(AdoQry_Body.RecNo)+'行数据约定开工日小于了系统工作日,请修改!',1);
Abort;
end;
If (AdoQry_Body.fieldbyname('MoLineDate').AsDateTime<Date()) Then
begin
DispInfo('第'+IntToStr(AdoQry_Body.RecNo)+'行数据约定交货日小于了系统工作日,请修改!',1);
Abort;
end;
AdoQry_Body.Next;
end; //校验数据
DbConnect.beginTrans;
Try
AdoQry_Body.First;
i:=0;
While Not AdoQry_Body.Eof Do
begin
i:=i+1;
if AdoQry_Body.fieldbyname('byProduct').asinteger=1 then
begin
AdoQry_Body.Next;
continue;
end;
{ SqlText:=' Select * From Ss Where SsId='''+IntToStr(AdoQry_Body.fieldbyname('LimItOut').AsInteger)+''''
+' And convert(decimal(14,4),ReMainQty)>=convert(decimal(14,4),'+FloatToStr(AdoQry_Body.fieldbyname('SsQty').AsFloat)+')';
// showmessage(sqltext);
AdoQry_Tmp.Close;
AdoQry_Tmp.SQL.Text:=SqlText;
AdoQry_Tmp.Open;
If AdoQry_Tmp.eof Then
begin
AdoQry_tmp.Close;
AdoQry_tmp.SQL.text:=' Select * From Ss Where SsId='''+IntToStr(AdoQry_Body.fieldbyname('LimItOut').AsInteger)+'''';
AdoQry_tmp.Open;
// showmessage(inttostr(AdoQry_tmp.recordCount));
if AdoQry_tmp.fieldbyname('reMainqty').asfloat=0 then
begin
If DbConnect.InTransaction Then
DbConnect.RollBackTrans;
DispInfo('第'+inttostr(i)+'行数据已被修改,系统建议余量为0,您不能生成生产订单!',3);
Abort;
end
else
begin
If DbConnect.InTransaction Then
DbConnect.RollBackTrans;
if DispInfo('第'+inttostr(i)+'行数据已被修改,系统建议余量为'+floattostr(AdoQry_tmp.fieldbyname('reMainqty').asfloat)+',是否继续保存?',2)='y' then
begin
if AdoQry_Body.fieldbyname('SsQty').AsFloat>AdoQry_tmp.fieldbyname('reMainqty').asfloat then
begin
AdoQry_Body.Edit;
AdoQry_Body.fieldbyname('SsQty').AsFloat:=AdoQry_tmp.fieldbyname('reMainqty').asfloat;
AdoQry_Body.Post;
end;
toolbutton2.OnClick(sender);
end
else
begin
mArk:=AdoQry_Body.GetBookmArk;
AdoQry_Body.GotoBookmArk(mArk);
exit;
end;
activecontrol:=dbgrideh1;
exit;
end;
end; }
AdoQry_Body.Next;
end;
MoNO:='M'+Trim(Copy(FormatDateTime('yyyy.mm.dd',Now),3,2))+Trim(Copy(FormatDateTime('yyyy.mm.dd',Now),6,2));
Edt_MoNo.Text:=GetNo(DbConnect,MoNo,'Mo');
if edt_Mono.Text='' then abort;
Application.ProcessMessages;
AdoQry_Tmp.Close;
SqlText:='Insert Mo '
+' (MoNo,DeptCode,MoDate,MoReMArk,SaleType,StandardFlag)'
+' Values('
+''''+Trim(Edt_MoNo.Text)+''''+','
+''''+Trim(Edt_DeptCode.Text)+''''+','
+''''+Trim(MEdt_MoDate.Text)+''''+','
+''''+Trim(Edt_MoReMArk.Text)+''''+','
+''''+Trim(Edt_SysParamCode.Text)+''''+','
+''''+IntToStr(Cmbx_StandardFlag.ItemIndex)+''')';
AdoQry_Tmp.Close;
AdoQry_Tmp.SQL.Text:=SqlText;
AdoQry_Tmp.ExecSQL; // Insert Mo Table
savemohistory(dbconnect,Trim(edt_Mono.text),userCode,0);
AdoQry_Body.First;
While Not AdoQry_Body.Eof Do
begin
SqlText:='Insert MoLine '
+' (MoNo,MoLineNo,byProduct,ParentMoLineno,Backflush,ItemCode,MoLineDate,MOStArtWorkDate,SsQty,MOQty,MoNoFinishQty,MoLineStatus)'
+'Values('
+''''+Trim(Edt_MoNo.Text)+''','
+''''+IntToStr(AdoQry_Body.fieldbyname('MoLineNo').AsInteger)+''','
+inttostr(AdoQry_Body.fieldbyname('byProduct').asinteger)+','
+inttostr(AdoQry_Body.fieldbyname('ParentMoLineno').asinteger)+','
+inttostr(AdoQry_Body.fieldbyname('Backflush').asinteger)+','
+''''+AdoQry_Body.fieldbyname('ItemCode').AsString+''','
+''''+DatetimeToStr(AdoQry_Body.fieldbyname('MoLineDate').AsDateTime)+''','
+''''+DatetimeToStr(AdoQry_Body.fieldbyname('MOStArtWorkDate').AsDateTime)+''',';
If AdoQry_Body.fieldbyname('MoQty').AsFloat<=AdoQry_Body.fieldbyname('SsQty').AsFloat Then
SqlText:=SqlText+''''+FloatToStr(AdoQry_Body.fieldbyname('MoQty').AsFloat)+''','
Else
SqlText:=SqlText+''''+FloatToStr(AdoQry_Body.fieldbyname('SsQty').AsFloat)+''',';
SqlText:=SqlText+''''+FloatToStr(AdoQry_Body.fieldbyname('MOQty').AsFloat)+''','
+''''+FloatToStr(AdoQry_Body.fieldbyname('MoNoFinishQty').AsFloat)+''','
+'5)';
AdoQry_Tmp.Close;
AdoQry_Tmp.SQL.Text:=SqlText;
AdoQry_Tmp.ExecSQL;
saveMoLineHistory(dbconnect,Trim(edt_Mono.text),AdoQry_Body.fieldbyname('MoLineno').asinteger,userCode,0);
If Cmbx_StandardFlag.ItemIndex=1 then
If Not (AutoBuildOrder(DbConnect,Trim(Edt_MoNo.Text),Trim(AdoQry_Body.fieldbyname('ItemCode').AsString),
IntToStr(AdoQry_Body.fieldbyname('MoLineNo').AsInteger),'Add','Mo',AdoQry_Body.fieldbyname('MoQty').AsFloat)) Then //自动产生领料单
Abort;
AdoQry_Body.Next;
end;
AdoQry_Body.First;
While Not AdoQry_Body.Eof Do
begin
If AdoQry_Body.fieldbyname('MoQty').AsFloat<=AdoQry_Body.fieldbyname('SsQty').AsFloat Then
begin
AdoQry_Body.Edit;
AdoQry_Body.fieldbyname('SsQty').AsFloat:=AdoQry_Body.fieldbyname('MoQty').AsFloat;
AdoQry_Body.Post;
end;
SqlText:='Update Ss '
+'Set ReMainQty=case when ReMainQty-('+FloatToStr(AdoQry_Body.fieldbyname('ssQty').AsFloat)+')'+'>=0'
+' then ReMainQty-('+FloatToStr(AdoQry_Body.fieldbyname('ssQty').AsFloat)+')'
+' else 0 end '
+'where Ssid='''+IntToStr(AdoQry_Body.fieldbyname('LimItOut').AsInteger)+'''';
AdoQry_Tmp.Close;
AdoQry_Tmp.SQL.Text:=SqlText;
AdoQry_Tmp.ExecSQL;
If AdoQry_Head1.Locate('SsId',AdoQry_Body.fieldbyname('LimItOut').AsInteger,[loCaseInsensitive]) Then
{ IF (AdoQry_Body.fieldbyname('MoQty').AsFloat>=AdoQry_Head1.fieldbyname('ReMainQty').AsFloat) Then
begin
AdoQry_Head1.Delete;
AdoQry_Body.Next;
end
Else
begin
} begin
AdoQry_Head1.edit;
if AdoQry_Head1.fieldbyname('ReMainQty').AsFloat-AdoQry_Body.fieldbyname('ssQty').AsFloat>=0 then
AdoQry_Head1.fieldbyname('ReMainQty').AsFloat:=AdoQry_Head1.fieldbyname('ReMainQty').AsFloat-AdoQry_Body.fieldbyname('ssQty').AsFloat
else AdoQry_Head1.fieldbyname('ReMainQty').AsFloat:=0;
AdoQry_Head1.fieldbyname('SScheck').AsInteger:=0;
AdoQry_Head1.Post;
end;
AdoQry_Body.Next;
end;
DbConnect.CommitTrans;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?