📄 paymentbase.pas
字号:
unit PaymentBase;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Base, DBCtrls, StdCtrls, ExtCtrls, DB, ADODB, ComCtrls, ToolWin,
ActnList, wwdbdatetimepicker, Mask, wwdbedit;
type
TfrmPaymentBase = class(TfrmBase)
ALToolbar: TActionList;
acNew: TAction;
acModify: TAction;
acDelete: TAction;
acSave: TAction;
acCancel: TAction;
acFirst: TAction;
acPrior: TAction;
acNext: TAction;
acLast: TAction;
acFind: TAction;
acPrint: TAction;
acExit: TAction;
acConfirm: TAction;
ToolBar: TToolBar;
tbtNew: TToolButton;
tbtModify: TToolButton;
tbtDelete: TToolButton;
tbtDivider1: TToolButton;
tbtFirst: TToolButton;
tbtPrior: TToolButton;
tbtNext: TToolButton;
tbtLast: TToolButton;
tbtDivider: TToolButton;
ToolButton1: TToolButton;
ToolButton3: TToolButton;
tbtSave: TToolButton;
tbtCancel: TToolButton;
ToolButton5: TToolButton;
tbtFind: TToolButton;
tbtDivider3: TToolButton;
tbtExit: TToolButton;
spGetInNumber: TADOStoredProc;
spGetOutNumber: TADOStoredProc;
pnlTop: TPanel;
lblSubmit: TLabel;
lblBillCaption: TLabel;
lblNO: TLabel;
dbtxtNo: TDBText;
QMaster: TADOQuery;
dsMaster: TDataSource;
lblMaker: TLabel;
lblSubmitUser: TLabel;
lblDate: TLabel;
lblSubmitDate: TLabel;
wwDBEdtMaker: TwwDBEdit;
wwDBEdtSubmitUser: TwwDBEdit;
wwPKDate: TwwDBDateTimePicker;
wwPKSubmitDate: TwwDBDateTimePicker;
procedure acFirstExecute(Sender: TObject);
procedure acPriorExecute(Sender: TObject);
procedure acNextExecute(Sender: TObject);
procedure acLastExecute(Sender: TObject);
procedure acExitExecute(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure dsMasterDataChange(Sender: TObject; Field: TField);
procedure dsMasterStateChange(Sender: TObject);
procedure acNewExecute(Sender: TObject);
procedure acModifyExecute(Sender: TObject);
procedure acDeleteExecute(Sender: TObject);
procedure acSaveExecute(Sender: TObject);
procedure acCancelExecute(Sender: TObject);
procedure QMasterBeforePost(DataSet: TDataSet);
procedure QMasterAfterPost(DataSet: TDataSet);
procedure QMasterBeforeDelete(DataSet: TDataSet);
procedure QMasterPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure QMasterDeleteError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure FormCreate(Sender: TObject);
procedure QMasterAfterInsert(DataSet: TDataSet);
procedure acConfirmExecute(Sender: TObject);
private
{ Private declarations }
protected
iFunctionID :Integer; {模块标识ID}
iBillTypeID :Integer; {单据类型ID}
sMasterSql :String; {主表的Sql语句}
bCanNew,bCanModify,bCanDelete,bCanPrint,bCanConfirm,bCanCounteract :Boolean;
function CheckSave :Boolean; {检测当前数据是否保存函数}
function GetErrorInfo(E: EDatabaseError) :String; {取错误描述信息和错误原码}
Procedure GetPermiss ; virtual; {得到当前用户的权限}
public
{ Public declarations }
end;
var
frmPaymentBase: TfrmPaymentBase;
implementation
Uses Main, Global, DataModule;
{$R *.dfm}
{检测当前数据是否保存函数}
Function TfrmPaymentBase.CheckSave :Boolean;
begin
Result:=true;
if QMaster.State in [dsInsert,dsEdit] then //判断当前状态
Case Messagedlg('是否保存当前的修改?',mtWarning,[mbYes,mbNo,mbCancel],0) of
mrYes:
begin
QMaster.Post ;
Result := QMaster.State = dsBrowse; //状态是否为Browse
end;
mrNo:
begin
QMaster.Cancel ;
Result := QMaster.State = dsBrowse; //状态是否为Browse
end;
mrCancel:
Result := False ;
End
end;
{取错误描述信息和错误原码}
function TfrmPaymentBase.GetErrorInfo(E: EDatabaseError) :String;
var
AdoErrors :Errors; //ado的错误信息对象
sError :String;
// i :Integer;
begin
inherited;
{取得错误信息}
AdoErrors:=dmClient.adocnClothing.Errors ;
//for i:=0 to AdoErrors.Count-1 do
if AdoErrors.Count >0 then //可能有多个错误信息,这里只取第一个
sError:= sError+#10#13+AdoErrors.Item[0].Description+' (错误码:'+InttoStr(AdoErrors.Item[0].NativeError)+')'
Else if (E is EDatabaseError) then
sError:=E.Message ;
Result:=sError;
end;
{得到用户对当前窗体的操作权限}
procedure TfrmPaymentBase.GetPermiss;
begin
bCanNew :=G_bAdmin;
bCanModify :=G_bAdmin;
bCanDelete :=G_bAdmin;
bCanPrint :=G_bAdmin;
bCanConfirm :=G_bAdmin;
bCanCounteract :=G_bAdmin;
if G_bAdmin then //判断是否为超级用户
begin
bCanNew :=G_bAdmin;
bCanModify :=G_bAdmin;
bCanDelete :=G_bAdmin;
bCanPrint :=G_bAdmin;
bCanConfirm :=G_bAdmin;
bCanCounteract :=G_bAdmin;
end
else //否则查找当前用户是否有当前窗体的操作权限
with dmClient.spUserRight do
if Locate('fModuleID;fActionName',varArrayOf([iModuleID,sFunctionName]),[]) then
begin
bCanNew := FieldByName('fInsert').AsBoolean;
bCanModify := FieldByName('fEdit').AsBoolean;
bCanDelete := FieldByName('fDelete').AsBoolean;
bCanPrint := FieldByName('fPrint').AsBoolean;
bCanConfirm := FieldByName('fConfirm').AsBoolean;
bCanCounteract := FieldByName('fCancel').AsBoolean;
end
end;
procedure TfrmPaymentBase.acFirstExecute(Sender: TObject);
begin
inherited;
QMaster.First ;
end;
procedure TfrmPaymentBase.acPriorExecute(Sender: TObject);
begin
inherited;
QMaster.Prior;
end;
procedure TfrmPaymentBase.acNextExecute(Sender: TObject);
begin
inherited;
QMaster.Next;
end;
procedure TfrmPaymentBase.acLastExecute(Sender: TObject);
begin
inherited;
QMaster.Last;
end;
procedure TfrmPaymentBase.acExitExecute(Sender: TObject);
begin
inherited;
Close;
end;
procedure TfrmPaymentBase.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
inherited;
CanClose :=CheckSave; //未保存则不能退出
end;
procedure TfrmPaymentBase.dsMasterDataChange(Sender: TObject;
Field: TField);
begin
inherited;
{调用状态变化过程}
dsMasterStateChange(Sender);
end;
procedure TfrmPaymentBase.dsMasterStateChange(Sender: TObject);
var
i: Integer;
begin
inherited;
{设置功能按钮的有效性}
acSave.Enabled := QMaster.State in [dsInsert,dsEdit];
acNew.Enabled := bCanNew and Not acSave.Enabled ;
acModify.Enabled := bCanModify
and Not acSave.Enabled
and not QMaster.FieldByName('fSubmitFlag').AsBoolean; //还未确认的单据
acCancel.Enabled := acSave.Enabled ;
acDelete.Enabled := bCanDelete
and not QMaster.FieldByName('fSubmitFlag').AsBoolean; //还未确认的单据
acPrint.Enabled := bCanPrint;
acConfirm.Enabled := bCanConfirm //有确认操作权限
and not QMaster.FieldByName('fSubmitFlag').AsBoolean //还未确认的单据
and Not acSave.Enabled ;
acFind.Enabled := Not acSave.Enabled ;
//页脚信息
lblSubmitDate.Visible := QMaster.FieldByName('fSubmitFlag').AsBoolean;
lblSubmitUser.Visible := lblSubmitDate.Visible;
wwPKSubmitDate.Visible := lblSubmitDate.Visible;
wwDBEdtSubmitUser.Visible := lblSubmitDate.Visible;
//Lable信息
lblSubmit.Visible :=QMaster.FieldByName('fSubmitFlag').AsBoolean;
{设置编辑控件的ReadOnly}
With PnlTop do
for i:= 0 to ControlCount-1 do
if Controls[i] is TDBEdit then
(Controls[i] as TDBEdit).ReadOnly := Not acSave.Enabled
else if Controls[i] is TwwDBEdit then
(Controls[i] as TwwDBEdit).ReadOnly := Not acSave.Enabled
else if Controls[i] is TDBMemo then
(Controls[i] as TDBMemo).ReadOnly := Not acSave.Enabled;
{设置导航按钮的有效性}
acFirst.Enabled := (Not QMaster.Bof) and (Not acSave.Enabled) ;
acLast.Enabled := (Not QMaster.Eof) and (Not acSave.Enabled);
acPrior.Enabled := (acFirst.Enabled) and (Not acSave.Enabled);
acNext.Enabled := (acLast.Enabled) and (Not acSave.Enabled);
end;
procedure TfrmPaymentBase.acNewExecute(Sender: TObject);
begin
inherited;
QMaster.Append ;
end;
procedure TfrmPaymentBase.acModifyExecute(Sender: TObject);
begin
inherited;
QMaster.Edit ;
end;
procedure TfrmPaymentBase.acDeleteExecute(Sender: TObject);
begin
inherited;
if QMaster.RecordCount >0 then
if messagedlg('您确定要删除当前单据吗?',mtWarning,[mbOk,mbCancel],0)=mrOk then
QMaster.Delete ;
end;
procedure TfrmPaymentBase.acSaveExecute(Sender: TObject);
begin
inherited;
if QMaster.State in [dsInsert,dsEdit] then
QMaster.Post ;
end;
procedure TfrmPaymentBase.acCancelExecute(Sender: TObject);
begin
inherited;
if messagedlg('您确定要取消修改吗?',mtWarning,[mbOk,mbCancel],0)=mrOk then
QMaster.Cancel ;
end;
procedure TfrmPaymentBase.QMasterBeforePost(DataSet: TDataSet);
begin
inherited;
if QMaster.State = dsInsert then
begin
//取外部单号NO
Try
With spGetOutNumber do
begin
parameters.ParamValues['@BillType']:=iBillTypeID;
Execproc;
end;
except
on E:Exception do
begin
MessageDlg('取单据号失败!'+#13#10+E.Message,mterror,[mbOk],0);
Abort;
end;
end;
QMaster.FieldByName('fNO').asString:=
Trim(spGetOutNumber.Parameters.ParamValues['@OutNumber']);
End;
//开启事务
if Not dmClient.adocnClothing.InTransaction then
dmClient.adocnClothing.BeginTrans ;
end;
procedure TfrmPaymentBase.QMasterAfterPost(DataSet: TDataSet);
begin
inherited;
{提交事务}
if dmClient.adocnClothing.InTransaction then
dmClient.adocnClothing.CommitTrans ;
end;
procedure TfrmPaymentBase.QMasterBeforeDelete(DataSet: TDataSet);
begin
inherited;
{开启事务}
if Not dmClient.adocnClothing.InTransaction then
dmClient.adocnClothing.BeginTrans ;
end;
procedure TfrmPaymentBase.QMasterPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
inherited;
{提示错误描述信息和错误原码}
messagedlg('存盘失败!'+GetErrorInfo(E),mtError,[mbOk],0);
Action := daAbort; //终止存盘
end;
procedure TfrmPaymentBase.QMasterDeleteError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
inherited;
{提示错误描述信息和错误原码}
messagedlg('删除失败!'+GetErrorInfo(E),mtError,[mbOk],0);
Action := daAbort; //终止存盘
end;
procedure TfrmPaymentBase.FormCreate(Sender: TObject);
begin
inherited;
GetPermiss;
if not QMaster.Active then
QMaster.Open
else
dsMasterStateChange(Sender); {调用状态变化过程}
end;
procedure TfrmPaymentBase.QMasterAfterInsert(DataSet: TDataSet);
begin
inherited;
//取内部单号ID
Try
With spGetInNumber do
begin
parameters.ParamValues['@BillType']:=iBillTypeID;
Execproc;
end;
except
on E:Exception do
begin
MessageDlg('新增单据失败!'+#13#10+E.Message,mterror,[mbOk],0);
Abort;
end;
end;
QMaster.FieldByName('fID').asInteger:=
spGetInNumber.Parameters.ParamValues['@InNumber'];
QMaster.FieldByName('fPayType').asInteger:= 0;
QMaster.FieldByName('fUseRemain').asBoolean:= False;
QMaster.FieldByName('fMaker').asString:= G_sUserName;
QMaster.FieldByName('fDate').asDatetime:= Date();
end;
procedure TfrmPaymentBase.acConfirmExecute(Sender: TObject);
begin
inherited;
if messageDlg('你确定要审核当前单据吗?',mtWarning,[mbOk,mbCancel],0)=mrOk then
begin
Screen.Cursor :=crHourGlass;
try
QMaster.Edit ;
QMaster.FieldValues['fSubmitFlag'] :=1;
QMaster.FieldByName('fSubmitDate').AsDatetime :=date();
QMaster.FieldByName('fSubmitUser').AsString :=G_sUserName;
QMaster.Post ;
except
on E:Exception do
begin
Screen.Cursor :=crDefault;
messagedlg('操作失败!'+#13#10+E.Message,mtError,[mbOk],0);
exit;
end;
end;
Screen.Cursor :=crDefault;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -