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 + -
显示快捷键?