csh510_04.pas.svn-base
来自「一个用Delphi开发的ERP软件」· SVN-BASE 代码 · 共 443 行
SVN-BASE
443 行
unit Csh510_04;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Bas200_07, DB, ADODB, dxExEdtr, dxEdLib, dxCntner, dxEditor,
StdCtrls, Buttons, ExtCtrls, Menus, wwdbdatetimepicker;
type
TCsh510_04Form = class(TBas200_07Form)
Label2: TLabel;
lblFromAcc: TLabel;
lblToAcc: TLabel;
lblRemark: TLabel;
lblBillNo: TLabel;
lblDate: TLabel;
lblAmount: TLabel;
edtAmount: TdxCalcEdit;
ADOQuery5: TADOQuery;
edtDate: TwwDBDateTimePicker;
qryCsh500: TADOQuery;
cbFromAcc: TComboBox;
cbToAcc: TComboBox;
edtBillNo: TEdit;
edtRemark: TEdit;
qryCsh550: TADOQuery;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bbtnSaveClick(Sender: TObject);
procedure edtDateCloseUp(Sender: TObject);
procedure edtDateExit(Sender: TObject);
procedure qryCsh500AfterScroll(DataSet: TDataSet);
private
AMode:string;
AOldOutAccNo:Integer;
AOldInAccNo:Integer;
AOldDate:TDateTime;
AOldBillNo:Integer;
AOldAmount:Double;
procedure SaveData(AccNo:Integer;AInOut:Integer);
procedure SetInterface;
procedure SetEmptyInit;
{ Private declarations }
public
procedure OpenData(AcctNo:Integer;ADate:TDateTime;ABillNo:Integer);
{ Public declarations }
end;
var
Csh510_04Form: TCsh510_04Form;
implementation
uses SYSDATA, CommFun, CshComm;
{$R *.dfm}
//保存数据到帐本资料表[CSH500]
//AccNo:帐户编号
//AInOut:0=收入,1=支出
procedure TCsh510_04Form.SaveData(AccNo:Integer;AInOut:Integer);
var
ADateTime:TDateTime;
ABillNo:Integer;
begin
//修改时,先删除旧的记录,再插入新的记录
if AMode='UPD' then
begin
if AInOut=0 then
begin
//删除旧的转入帐号
ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('delete from CSH500 where C500_001='+IntToStr(AOldInAccNo)+' and C500_003='+GetDateString(AOldDate)+' and C500_004='+IntToStr(AOldBillNo));
ADOQuery5.ExecSQL;
if AccNo<>AOldInAccNo then
begin
//取上一条记录的日期&编号
GetPriorRecord(AOldInAccNo,AOldDate,AOldBillNo,ADateTime,ABillNo);
//计算余额
ReCalcBalance(AOldInAccNo, ADateTime, ABillNo);
end;
end else
if AInOut=1 then
begin
//删除旧的转出帐号
ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('delete from CSH500 where C500_001='+IntToStr(AOldOutAccNo)+' and C500_003='+GetDateString(AOldDate)+' and C500_004='+IntToStr(AOldBillNo));
ADOQuery5.ExecSQL;
if AccNo<>AOldOutAccNo then
begin
//取上一条记录的日期&编号
GetPriorRecord(AOldOutAccNo,AOldDate,AOldBillNo,ADateTime,ABillNo);
//计算余额
ReCalcBalance(AOldOutAccNo, ADateTime, ABillNo);
end;
end;
end;
ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('select top 1 * from CSH500 where C500_001='+IntToStr(AccNo)+' and C500_003<='+GetDateString(edtDate.Date)+' and C500_004<='+edtBillNo.Text+' order by C500_003 ,C500_004');
ADOQuery5.Open;
ADOQuery5.Append;
ADOQuery5.FieldByName('C500_001').Value:=AccNo; //帐户编号
ADOQuery5.FieldByName('C500_002').Value:=3; //1=收入单,2=支出单,3=转帐单,4=借入单,5=借出单,6=还入单,7=还出单
ADOQuery5.FieldByName('C500_003').Value:=edtDate.Date; //日期
ADOQuery5.FieldByName('C500_004').Value:=StrToInt(edtBillNo.Text); //单据编号
ADOQuery5.FieldByName('C500_005').AsString:=''; //客户
ADOQuery5.FieldByName('C500_006').AsString:=''; //类别
ADOQuery5.FieldByName('C500_007').Value:=StrToFloat(edtAmount.Text); //金额
ADOQuery5.FieldByName('C500_008').Value:=AInOut; //0=收入,1=支出
ADOQuery5.FieldByName('C500_009').Value:=edtRemark.Text; //摘要
// ADOQuery5.FieldByName('C500_010').Value:=''; //票据号
ADOQuery5.FieldByName('C500_011').AsString:=''; //项目
ADOQuery5.FieldByName('C500_012').AsString:=''; //部门
ADOQuery5.FieldByName('C500_013').AsString:=''; //经办人
ADOQuery5.FieldByName('C500_014').Value:=0; //余额
ADOQuery5.FieldByName('C500_015').Value:=2; //对象类型(0=客户,1=员工,2=空白)
ADOQuery5.FieldByName('C500_016').Value:=0; //来源类型(0=手工输入,1=销售定单,2=采购定单,3=任务工单)
ADOQuery5.FieldByName('C500_017').AsString:=''; //原始单号
ADOQuery5.Post;
//取上条记录的日期&编号
GetPriorRecord(AccNo,edtDate.Date,StrToInt(edtBillNo.Text),ADateTime,ABillNo);
//计算余额
ReCalcBalance(AccNo, ADateTime, ABillNo);
end;
procedure TCsh510_04Form.OpenData(AcctNo:Integer;ADate:TDateTime;ABillNo:Integer);
begin
//取得所有帐户名称
GetAllAcct(cbFromAcc,qryCsh550);
GetAllAcct(cbToAcc,qryCsh550);
qryCsh550.Locate('C550_001',AcctNo,[]);
cbFromAcc.ItemIndex:=cbFromAcc.Items.IndexOf(qryCsh550.FieldByName('C550_002').AsString);
cbToAcc.ItemIndex:=cbToAcc.Items.IndexOf(qryCsh550.FieldByName('C550_002').AsString);
if ABillNo=0 then AMode:='ADD' else AMode:='UPD';
qryCsh500.DisableControls;
qryCsh500.Close;
qryCsh500.SQL.Clear;
qryCsh500.SQL.Add('select * from CSH500 where C500_002=3 order by C500_001,C500_003,C500_004');
qryCsh500.Open;
qryCsh500.Locate('C500_001;C500_003;C500_004',VarArrayOf([AcctNo,ADate,ABillNo]),[]);
qryCsh500.EnableControls;
qryCsh500AfterScroll(qryCsh500);
end;
procedure TCsh510_04Form.SetInterface;
begin
lblFromAcc.Caption:=GetDBString('CSH51004001'); //转出帐户
lblToAcc.Caption:=GetDBString('CSH51004002'); //转入帐户
lblRemark.Caption:=GetDBString('CSH51004003'); //摘要说明
lblBillNo.Caption:=GetDBString('CSH51004004'); //单据编号
lblDate.Caption:=GetDBString('CSH51004005'); //转帐日期
lblAmount.Caption:=GetDBString('CSH51004006'); //转帐金额
end;
procedure TCsh510_04Form.FormCreate(Sender: TObject);
begin
inherited;
SetInterface;
edtDate.Date:=GetServerDate;
//取票据编号
edtBillNo.Text:=GetBillNo(edtDate.Date);
end;
procedure TCsh510_04Form.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
//
end;
procedure TCsh510_04Form.bbtnSaveClick(Sender: TObject);
var
AOutAccNo:Integer; //转出帐户编号
AInAccNo:Integer; //转入帐户编号
AOutStartDate:TDateTime; //转出帐户的建帐日期
AInStartDate:TDateTime; //转入帐户的建帐日期
ABalance:Double;
begin
//保存
//检验帐户的合法性
if (cbFromAcc.Text='') or (cbToAcc.Text='') then
begin
ShowMsg('UMS10000169'); //转出帐户或转入帐户不能为空
if cbFromAcc.Text='' then cbFromAcc.SetFocus
else if cbToAcc.Text='' then cbToAcc.SetFocus;
Abort;
end;
if cbFromAcc.Text=cbToAcc.Text then
begin
ShowMsg('UMS10000170'); //转出帐户或转入帐户不能相同
cbToAcc.SetFocus;
Abort;
end;
//取得转出帐户编号及建帐日期
ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('select C550_001,C550_007 from CSH550 where C550_002='+''''+cbFromAcc.Text+'''');
ADOQuery5.Open;
AOutAccNo:=ADOQuery5.Fields[0].Value;
AOutStartDate:=ADOQuery5.Fields[1].Value;
//取得转入帐户编号及建帐日期
ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('select C550_001,C550_007 from CSH550 where C550_002='+''''+cbToAcc.Text+'''');
ADOQuery5.Open;
AInAccNo:=ADOQuery5.Fields[0].Value;
AInStartDate:=ADOQuery5.Fields[1].Value;
//检验票据编号的合法性
if edtBillNo.Text='' then
begin
ShowMsg('UMS10000159'); //票据编号不能为空
edtBillNo.SetFocus;
Abort;
end;
try
StrToInt(edtBillNo.Text); //单据编号
except
ShowMsg('UMS10000160'); //无效的票据编号,编号只能为数字
edtBillNo.SetFocus;
Abort;
end;
if StrToInt(edtBillNo.Text)<=0 then
begin
ShowMsg('UMS10000161'); //无效的票据编号,编号不能为负数或零
edtBillNo.SetFocus;
Abort;
end;
//如果单据编号没有修改,则不检查票据编号是否重复
if AOldBillNo<>StrToInt(edtBillNo.Text) then
begin
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select 1 from CSH500 where C500_003='+GetDateString(edtDate.Date)+' and C500_004='+edtBillNo.Text);
SYSDM.qryQuery.Open;
if not SYSDM.qryQuery.IsEmpty then
begin
ShowMsg('UMS10000162'); //票据编号重复,请重新输入
edtBillNo.SetFocus;
Abort;
end;
end;
//检验日期的合法性
if edtDate.Text='' then
begin
ShowMsg('UMS10000163'); //日期不能为空
edtDate.SetFocus;
Abort;
end;
if (edtDate.Date<AOutStartDate) or (edtDate.Date<AInStartDate) then
begin
ShowMsg('UMS10000171'); //日期不能小于转出或转入帐户的建帐日期
edtDate.SetFocus;
Abort;
end;
//检验金额的合法性
if edtAmount.Text='' then
begin
ShowMsg('UMS10000167'); //金额不能为空
edtAmount.SetFocus;
Abort;
end;
try
StrToFloat(edtAmount.Text);
except
ShowMsg('UMS10000166'); //无效的金额,金额只能为数字
edtAmount.SetFocus;
Abort;
end;
if StrToFloat(edtAmount.Text)=0 then
begin
ShowMsg('UMS10000167'); //金额不能为零
edtAmount.SetFocus;
Abort;
end;
//允许记帐时收入支出金额为负数
if GetSysParams('CSH0002')='N' then
begin
if StrToFloat(edtAmount.Text)<0 then
begin
ShowMsg('UMS10000186'); //金额不能为负数
edtAmount.SetFocus;
Abort;
end;
end;
//取得帐户的余额
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select top 1 C500_014 from CSH500 where C500_001='+IntToStr(AOutAccNo)+' order by C500_001, C500_003 desc, C500_004 desc');
SYSDM.qryQuery.Open;
ABalance:=SYSDM.qryQuery.Fields[0].Value;
if AMode='ADD' then
begin
//允许帐户余额为负数
if GetSysParams('CSH0001')='N' then
begin
if StrToFloat(edtAmount.Text)>ABalance then
begin
ShowMsg('UMS10000168'); //金额不能大于帐户余额
edtAmount.SetFocus;
Abort;
end;
end;
end
else if AMode='UPD' then
begin
//允许帐户余额为负数
if GetSysParams('CSH0001')='N' then
begin
if StrToFloat(edtAmount.Text)-AOldAmount>ABalance then
begin
ShowMsg('UMS10000168'); //金额不能大于帐户余额
edtAmount.SetFocus;
Abort;
end;
end;
end;
//保存数据
try
Screen.Cursor:=crHourGlass;
SYSDM.ADOC.BeginTrans;
//插入到出纳帐本(转出帐户)
SaveData(AOutAccNo,1);
//插入到出纳帐本(转入帐户)
SaveData(AInAccNo,0);
SYSDM.ADOC.CommitTrans;
Screen.Cursor:=crDefault;
except
SYSDM.ADOC.RollbackTrans;
ShowMsg(SYSDM.ADOC.Errors[0].Description,1);
Abort;
end;
//新增模式下则继续新增下一条记录,否则关闭
if AMode='ADD' then
begin
SetEmptyInit;
cbFromAcc.SetFocus;
end else
begin
Close;
end;
inherited;
end;
procedure TCsh510_04Form.edtDateCloseUp(Sender: TObject);
begin
inherited;
//取票据编号
edtBillNo.Text:=GetBillNo(edtDate.Date);
end;
procedure TCsh510_04Form.edtDateExit(Sender: TObject);
begin
inherited;
//取票据编号
edtBillNo.Text:=GetBillNo(edtDate.Date);
end;
procedure TCsh510_04Form.SetEmptyInit;
begin
cbFromAcc.ItemIndex:=0;
cbToAcc.ItemIndex:=0;
edtRemark.Text:='';
edtDate.Date:=GetServerDate;
edtBillNo.Text:=GetBillNo(edtDate.Date);
edtAmount.Text:='0';
AOldInAccNo:=0;
AOldOutAccNo:=0;
AOldDate:=0;
AOldBillNo:=0;
AOldAmount:=0;
end;
procedure TCsh510_04Form.qryCsh500AfterScroll(DataSet: TDataSet);
var
ADate:TDateTime;
ABillNo:Integer;
begin
inherited;
if qryCsh500.State in [dsInsert,dsEdit] then Exit;
if (qryCsh500.IsEmpty) or (AMode='ADD') then
begin
SetEmptyInit; //初始化
Exit;
end;
ADate:=qryCsh500.FieldByName('C500_003').Value; //日期
ABillNo:=qryCsh500.FieldByName('C500_004').Value; //单据编号
if qryCsh500.FieldByName('C500_008').Value=0 then //收入 转入帐户
begin
AOldInAccNo:=qryCsh500.FieldByName('C500_001').Value;
qryCsh550.Locate('C550_001',AOldInAccNo,[]);
cbToAcc.ItemIndex:=cbToAcc.Items.IndexOf(qryCsh550.FieldByName('C550_002').Value);
//取转出帐户名称
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select C500_001 from CSH500 where C500_001<>'+IntToStr(AOldInAccNo)+' and C500_003='+GetDateString(ADate)+' and C500_004='+IntToStr(ABillNo));
SYSDM.qryQuery.Open;
AOldOutAccNo:=SYSDM.qryQuery.FieldByName('C500_001').Value;
qryCsh550.Locate('C550_001',AOldOutAccNo,[]);
cbFromAcc.ItemIndex:=cbFromAcc.Items.IndexOf(qryCsh550.FieldByName('C550_002').Value);
end
else if qryCsh500.FieldByName('C500_008').Value=1 then //支出 转出帐户
begin
AOldOutAccNo:=qryCsh500.FieldByName('C500_001').Value;
qryCsh550.Locate('C550_001',AOldOutAccNo,[]);
cbFromAcc.ItemIndex:=cbFromAcc.Items.IndexOf(qryCsh550.FieldByName('C550_002').Value);
//取转入帐户名称
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select C500_001 from CSH500 where C500_001<>'+IntToStr(AOldOutAccNo)+' and C500_003='+GetDateString(ADate)+' and C500_004='+IntToStr(ABillNo));
SYSDM.qryQuery.Open;
AOldInAccNo:=qryCsh500.FieldByName('C500_001').Value;
qryCsh550.Locate('C550_001',AOldInAccNo,[]);
cbToAcc.ItemIndex:=cbToAcc.Items.IndexOf(qryCsh550.FieldByName('C550_002').Value);
end;
edtDate.Date:=qryCsh500.FieldByName('C500_003').Value; //日期
edtBillNo.Text:=qryCsh500.FieldByName('C500_004').AsString; //单据编号
edtAmount.Text:=qryCsh500.FieldByName('C500_007').AsString; //金额
edtRemark.Text:=qryCsh500.FieldByName('C500_009').AsString; //摘要
AOldInAccNo:=qryCsh500.FieldByName('C500_001').Value;
AOldOutAccNo:=qryCsh500.FieldByName('C500_001').Value;
AOldDate:=qryCsh500.FieldByName('C500_003').Value;
AOldBillNo:=qryCsh500.FieldByName('C500_004').Value;
AOldAmount:=qryCsh500.FieldByName('C500_007').Value;
end;
initialization
RegisterClass(TCsh510_04Form);
finalization
UnRegisterClass(TCsh510_04Form);
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?