📄 sy_ck_jyp.pas
字号:
{计算价输入时的合法性判断,以及和折扣的互斥}
procedure TFrm_SY_CK_JYP.qry_DetailJSJSetText(Sender: TField;
const Text: String);
var
l_Text: string;
l_SetTextEvent: TFieldSetTextEvent;
begin
l_SetTextEvent := qry_DetailJSJ.OnSetText;
qry_DetailJSJ.OnSetText := nil; {防止用鼠标点击其他记录时递归调用}
l_Text := Text;
if Trim(Text) = '' then
begin
Sender.AsString := Text;
qry_DetailJSJ.OnSetText := l_SetTextEvent; {防止用鼠标点击其他记录时递归调用}
Exit;
end
else {和折扣的互斥}
qry_Detail.FieldByName('ZK').AsString := '0';
try
if (StrToFloat(l_Text) >= 1000) or (StrToFloat(l_Text) <= 0) then
Abort; {触发abort异常}
Sender.AsFloat := StrToFloat(Text);
with qry_Detail do
begin
Edit;
{用结算价计算出结算金额}
if (FieldByName('JSJ').AsString <> '') and (FieldByName('FPSL').AsString <> '') then
FieldByName('JSJE').AsFloat := FieldByName('JSJ').AsFloat * FieldByName('FPSL').AsInteger;
Post;
end;
except
Application.MessageBox('所输入的结算价必须合法!', '提示', MB_ICONINFORMATION + mb_ok);
qry_DetailJSJ.OnSetText := l_SetTextEvent; {防止用鼠标点击其他记录时递归调用}
Abort;
end;
qry_DetailJSJ.OnSetText := l_SetTextEvent; {防止用鼠标点击其他记录时递归调用}
end;
{-------------------------------------------------------------------------------}
{结算价以元显示}
procedure TFrm_SY_CK_JYP.qry_DetailJSJGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
if Trim(Sender.AsString) = '' then
Exit;
try
if DisplayText then {显示状态}
begin
if Sender.AsString <> '' then
Text := FormatFloat('¥#,##0.000', Sender.AsFloat);
end
else {输入状态}
Text := FormatFloat('#0.###', Sender.AsFloat)
except
end;
end;
{-------------------------------------------------------------------------------}
{输入数据后,进行凑整操作}
procedure TFrm_SY_CK_JYP.qry_DetailFPSLSetText(Sender: TField;
const Text: String);
var
l_Dest: Integer;
L_Text: string;
l_SetTextEvent: TFieldSetTextEvent;
begin
l_SetTextEvent := qry_DetailFPSL.OnSetText;
qry_DetailFPSL.OnSetText := nil; {防止用鼠标点击其他记录时递归调用}
l_Text := Text;
if Trim(Text) = '' then
begin
Sender.AsString := Text;
qry_DetailFPSL.OnSetText := l_SetTextEvent; {防止用鼠标点击其他记录时递归调用}
Exit;
end;
try
if (StrToFloat(Text) >= 10000000) or (StrToFloat(Text) <= 0) then
Abort; {触发abort异常}
except
Application.MessageBox('所输入的分配数量必须合法!', '提示', MB_ICONINFORMATION + mb_ok);
qry_DetailFPSL.OnSetText := l_SetTextEvent; {防止用鼠标点击其他记录时递归调用}
qry_Detail.Cancel;
Exit;
end;
try
Sender.AsInteger := Trunc(StrToFloat(l_Text)); {分配数量只能为自然数}
{显示出修改后的理论库存}
ce_KC.Value := VL_TheoryKC - GetFPSL_Total; {显示的理论库存=理论库存 - 分配数量 }
l_Dest := 0;
case rg_Round.ItemIndex of
0: {凑包} {}
{ l_Dest := StrToInt(cb_BZGG.Text);}
l_Dest := StrToInt(VL_MBMS[cb_BZGG.ItemIndex]);
1: {凑版} {}
l_Dest := VL_Ban_GG;
2: {不用凑整数} {}
Exit;
end;
qry_Detail.Edit;
qry_Detail.FieldByName('FPSL').AsInteger :=
GetRoundNumber(Trunc(StrToFloat(l_Text)), l_Dest, rg_Round_Style.ItemIndex); {返回凑整后的数据}
qry_Detail.Post;
finally
qry_DetailFPSL.OnSetText := l_SetTextEvent; {防止用鼠标点击其他记录时递归调用}
end;
end;
{-------------------------------------------------------------------------------}
{判断是否凑包、凑版,以及计算出库总金额、结算金额}
procedure TFrm_SY_CK_JYP.qry_DetailFPSLValidate(Sender: TField);
begin
{计算出库总金额}
with qry_Detail do
begin
Edit;
if (FieldByName('XJ').AsString <> '') and (FieldByName('FPSL').AsString <> '') then
FieldByName('CKZJE').AsFloat := FieldByName('XJ').AsFloat * FieldByName('FPSL').AsInteger;
{用结算价计算出结算金额}
if (FieldByName('ZK').AsString = '0') or (FieldByName('ZK').AsString = '') then
if (FieldByName('JSJ').AsString <> '') and (FieldByName('FPSL').AsString <> '') then
FieldByName('JSJE').AsFloat := FieldByName('JSJ').AsFloat * FieldByName('FPSL').AsInteger;
{用折扣计算出结算金额}
if (FieldByName('JSJ').AsString = '0') or (FieldByName('JSJ').AsString = '') then
if (FieldByName('ZK').AsString <> '') and (FieldByName('FPSL').AsString <> '')
and (FieldByName('XJ').AsString <> '') then
FieldByName('JSJE').AsFloat := (FieldByName('ZK').AsFloat / 100) * FieldByName('FPSL').AsInteger
* FieldByName('XJ').AsFloat;
end;
end;
{-------------------------------------------------------------------------------}
{双击打开明细}
procedure TFrm_SY_CK_JYP.dbg_ListDblClick(Sender: TObject);
begin
pgc_LM.ActivePageIndex := 1;
end;
{-------------------------------------------------------------------------------}
{根据计划的不同状态绘制DBGrid的颜色}
procedure TFrm_SY_CK_JYP.dbg_ListDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
dbg_List.Canvas.Brush.Color := lbl_Color_0.Color;
try
if not qry_List.IsEmpty then
case qry_List.FieldByName('ZT').AsInteger of
0: dbg_List.Canvas.Brush.Color := lbl_Color_0.Color; {正常}
1, 3: dbg_List.Canvas.Brush.Color := lbl_Color_1.Color; {已经处理}
2: dbg_List.Canvas.Brush.Color := lbl_Color_2.Color; {已经签批}
end;
except
end;
if gdSelected in State then
begin
dbg_List.Canvas.Brush.Color := clNavy;
dbg_List.Canvas.Font.Color := clWhite;
end;
dbg_List.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
{-------------------------------------------------------------------------------}
{查询出库计划单}
procedure TFrm_SY_CK_JYP.bbtn_SearchClick(Sender: TObject);
begin
ShowList(True, ''); {查询条件模块的调用,并且是否显示窗体}
end;
{-------------------------------------------------------------------------------}
{查询条件模块的调用,并且是否显示窗体}
procedure TFrm_SY_CK_JYP.ShowList(A_ShowModal: Boolean; A_CKJHDH: string);
var
l_ModalResult: Integer;
begin
l_ModalResult := mrOk;
{初始化时打开模块时默认调出一周以内的施工单}
with TFrm_SY_CK_JYP_Sele.Create(Application) do
try
Show_Condition(VL_CKJH); {查询条件}
if A_ShowModal then
l_ModalResult := ShowModal
else
bbtn_OKClick(nil);
finally
Free;
end;
{如果需要进行查询,则根据查询条件取出查询结果}
if l_ModalResult = mrOK then
with qry_List do
begin
Close;
SQL.Text := VL_CKJH^.sql;
Open;
if IsEmpty then
qry_listAfterScroll(nil);
if A_CKJHDH <> '' then
Locate('CKJHDH', A_CKJHDH, []);
end;
end;
{-------------------------------------------------------------------------------}
{签批该计划分配单}
procedure TFrm_SY_CK_JYP.bbtn_QPClick(Sender: TObject);
begin
if qry_list.IsEmpty then
Exit;
{YJ}
if edt_PZR.Text = '' then
begin
Application.MessageBox('没有输入签批人,无法继续!', '提示', MB_OK + MB_ICONINFORMATION);
Exit;
end;
if bbtn_Save.Enabled then
begin
Application.MessageBox(Pchar('该计划分配单正在编辑状态,不能签批!'), '提示', 48 + mb_ok);
Exit;
end;
if not (qry_List.FieldByName('ZT').AsString = '0') then
begin
Application.MessageBox(Pchar('该计划分配单已经签批,不能再次签批!'), '提示', 48 + mb_ok);
Exit;
end;
{询问}
if Application.MessageBox('是否要签批该出库计划单?', '询问', MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2) = mrNo then
Exit;
try
Data.DM.StartTransaction;
{零枚票出库计划单表TYS_TXPCKJHDB 的ZT为2-已签批}
{零枚票出库计划单表TYS_JYPCKJHDB 的ZT为2-已签批}
with qry_tmp do
begin
Close;
SQL.Text := 'update TYS_JYCKJHDB set ZT=''2'', PZR=' + QuotedStr(edt_PZR.Text) +
' where CKJHDH =' + QuotedStr(qry_List.FieldByName('CKJHDH').AsString);
ExecSQL;
end;
Data.DM.Commit;
except
if Data.DM.InTransaction then
Data.DM.Rollback;
Application.MessageBox(Pchar('签批出库计划单时发生错误!'), '提示', 48 + mb_ok);
Exit;
end;
ShowList(False, qry_List.FieldByName('CKJHDH').AsString); {查询条件模块的调用,并且是否显示窗体}
end;
{-------------------------------------------------------------------------------}
{取消已经签批该计划分配单}
procedure TFrm_SY_CK_JYP.bbtn_CancelQPClick(Sender: TObject);
begin
if qry_list.IsEmpty then
Exit;
if bbtn_Save.Enabled then
begin
Application.MessageBox(Pchar('该计划分配单正在编辑状态,不能取消签批!'), '提示', 48 + mb_ok);
Exit;
end;
if not (qry_List.FieldByName('ZT').AsString = '2') then
begin
Application.MessageBox(Pchar('该计划分配单未签批或者已经处理,不能取消签批!'), '提示', 48 + mb_ok);
Exit;
end;
{询问}
if Application.MessageBox('是否要取消已经签批该出库计划单?', '询问', MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2) = mrNo then
Exit;
try
Data.DM.StartTransaction;
{零枚票出库计划单表TYS_JYPCKJHDB 的ZT为0-未签批}
with qry_tmp do
begin
Close;
SQL.Text := 'update TYS_JYCKJHDB set ZT=''0'', PZR=' + QuotedStr('') +
' where CKJHDH =' + QuotedStr(qry_List.FieldByName('CKJHDH').AsString);
ExecSQL;
end;
Data.DM.Commit;
except
if Data.DM.InTransaction then
Data.DM.Rollback;
Application.MessageBox(Pchar('取消签批出库计划单时发生错误!'), '提示', 48 + mb_ok);
Exit;
end;
ShowList(False, qry_List.FieldByName('CKJHDH').AsString); {查询条件模块的调用,并且是否显示窗体}
end;
{-------------------------------------------------------------------------------}
{打印模块}
procedure TFrm_SY_CK_JYP.bbtn_PrintClick(Sender: TObject);
var
L_ModalResult: Integer;
l_ModalPrint: Boolean; {是否套打}
begin
if qry_list.IsEmpty then
Exit;
L_ModalResult := Application.MessageBox('打印出库计划单时是否进行套打?', '询问', MB_ICONQUESTION + MB_YESNOCANCEL + MB_DEFBUTTON3);
if L_ModalResult = ID_Cancel then
Exit;
l_ModalPrint := l_ModalResult = mrYES;
with TFrm_SY_CK_JYP_Print.Create(Application) do
try
SetParams(qry_List.FieldByName('CKJHDH').AsString, l_ModalPrint);
{取得报表总页数}
qr_Print.Prepare;
SetParams(qry_List.FieldByName('CKJHDH').AsString, l_ModalPrint, qr_Print.QRPrinter.PageCount);
qr_Print.PreviewModal;
finally
Free;
end;
end;
{-------------------------------------------------------------------------------}
{是否应用所有单位导致分配数量的变化}
procedure TFrm_SY_CK_JYP.chk_RoundClick(Sender: TObject);
begin
rg_RoundClick(nil);
end;
{-------------------------------------------------------------------------------}
{凑包凑版的选择、凑整类型的选择,和包装规格的变化导致分配数量的变化}
procedure TFrm_SY_CK_JYP.rg_RoundClick(Sender: TObject);
var
l_SingleDest: Integer;
begin
l_SingleDest := 0;
pgc_SeleInfo.ActivePageIndex := rg_Round.ItemIndex; {YJ}
case rg_Round.ItemIndex of
0: {凑包} {}
begin
rg_Round_Style.Visible := True;
if cb_BZGG.Items.Count = 0 then
begin
Application.MessageBox('包装规格可能不完整,无法按包进行凑整!', '提示', MB_OK + MB_IconInformation);
rg_Round.ItemIndex := 2; {默认为不凑}
Exit;
end;
// l_SingleDest := StrToInt(cb_BZGG.Text);
l_SingleDest := StrToInt(VL_MBMS[cb_BZGG.ItemIndex]);
end;
1: {凑版} {}
begin
rg_Round_Style.Visible := True;
l_SingleDest := VL_Ban_GG;
end;
2: {不用凑整数} {}
begin
rg_Round_Style.Visible := False;
end;
end;
if not qry_Detail.IsEmpty then
begin
if chk_Round.Checked then {所有单位}
SetRounding {凑包凑版调用} {}
else {仅对当前单位适用}
with qry_Detail do
begin
BeforePost := nil;
Edit;
if rg_Round.ItemIndex = 2 then {不凑} {}
FieldByName('FPSL').AsInteger := FieldByName('FPSL_OLD').AsInteger
else
FieldByName('FPSL').AsInteger :=
GetRoundNumber(FieldByName('FPSL_OLD').AsInteger, l_SingleDest, rg_Round_Style.ItemIndex); {返回凑整后的数据}
Post;
BeforePost := qry_DetailBeforePost;
end;
{显示出修改后的理论库存}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -