⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base2infofixadd.pas

📁 胜天财务进销存2003源代码,SQLSERVER版,目前最完整的财务进销存系统.
💻 PAS
字号:
unit Base2InfoFixAdd;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  EditForm, StdCtrls, Buttons, ComCtrls, DBData, ExtCtrls, dxCntner, Math,
  dxEditor, dxEdLib, dxDBELib, dxExEdtr, dxTL, dxDBCtrl, dxDBGrid, ImgList, Db,
  ADODB, KsControls, KsLabels, KsSkinLabels, KsPanels, KsSkinPanels, KsButtons,
  KsSkinButtons, KsHooks, KsForms, KsSkinForms, KsTabs, KsSkinTabs;

type
  TfrmBase2InfoFixAdd = class(TfrmEditForm)
    dsPlus: TDataSource;
    ADOsetPlus: TADODataSet;
    bbOk: TSeSkinButton;
    bbNo: TSeSkinButton;
    bbAdd: TSeSkinButton;
    PageControl: TSeSkinPageControl;
    TabSheet1: TKsCustomTabSheet;
    TabSheet2: TKsCustomTabSheet;
    Panel1: TSeSkinPanel;
    Label1: TSeSkinLabel;
    Label2: TSeSkinLabel;
    Label3: TSeSkinLabel;
    Label4: TSeSkinLabel;
    Label12: TSeSkinLabel;
    Label14: TSeSkinLabel;
    Label15: TSeSkinLabel;
    Label17: TSeSkinLabel;
    Label18: TSeSkinLabel;
    Label19: TSeSkinLabel;
    Label20: TSeSkinLabel;
    Label31: TSeSkinLabel;
    Label30: TSeSkinLabel;
    Label29: TSeSkinLabel;
    Label21: TSeSkinLabel;
    Label28: TSeSkinLabel;
    Label27: TSeSkinLabel;
    Label26: TSeSkinLabel;
    Label24: TSeSkinLabel;
    Label23: TSeSkinLabel;
    Label25: TSeSkinLabel;
    edtUserCode: TdxDBEdit;
    edtName: TdxDBEdit;
    edtClass: TdxDBButtonEdit;
    dxDBEdit1: TdxDBEdit;
    edtDept: TdxDBButtonEdit;
    edtAddMode: TdxDBButtonEdit;
    edtUse: TdxDBButtonEdit;
    edtBornValue: TdxDBEdit;
    edtAllAbate: TdxDBEdit;
    edtNetValue: TdxDBEdit;
    dxDBEdit5: TdxDBEdit;
    dxDBDateEdit1: TdxDBDateEdit;
    edtFutuPvalue: TdxDBEdit;
    edtFutuValue: TdxDBEdit;
    edtUseMonth: TdxDBEdit;
    edtCountMonth: TdxDBEdit;
    edtUnit: TdxDBEdit;
    edtMAbateMod: TdxDBEdit;
    edtMAbateValue: TdxDBEdit;
    edtSubject: TdxDBButtonEdit;
    edtAbateMode: TdxDBPickEdit;
    Panel2: TSeSkinPanel;
    gridPlus: TdxDBGrid;
    lblModulus: TSeSkinLabel;
    SeSkinLabel1: TSeSkinLabel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure edtClassButtonClick(Sender: TObject; AbsoluteIndex: Integer);
    procedure edtDeptButtonClick(Sender: TObject;
      AbsoluteIndex: Integer);
    procedure edtAddModeButtonClick(Sender: TObject;
      AbsoluteIndex: Integer);
    procedure edtUseButtonClick(Sender: TObject; AbsoluteIndex: Integer);
    procedure bbAddClick(Sender: TObject);
    procedure bbOkClick(Sender: TObject);
    procedure bbNoClick(Sender: TObject);
    procedure edtSubjectButtonClick(Sender: TObject;
      AbsoluteIndex: Integer);
    procedure edtAbateModeChange(Sender: TObject);
    procedure edtBornValueExit(Sender: TObject);
    procedure edtAllAbateExit(Sender: TObject);
    procedure edtNetValueExit(Sender: TObject);
    procedure edtFutuPvalueExit(Sender: TObject);
    procedure edtFutuValueExit(Sender: TObject);
    procedure edtUseMonthExit(Sender: TObject);
    procedure edtCountMonthExit(Sender: TObject);
    procedure dxDBDateEdit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    bReturn: Boolean;
    lMode: Integer;
    function CheckEdit: Boolean;
    procedure CanUseMonth; //年数总和法12倍检查
    function BornValueChange(cType: Char): boolean; //改变原值时的运算
    procedure EditCalcDepreciation; //折旧方法的运算
    procedure MainShow;
    procedure LoadData;
    procedure LoadGrid;
    procedure SaveData;
  public
    { Public declarations }
  end;

function CalcDepreciation(sAbaterMode {折旧方法}: string; dBorn {入账原值}, dAllA {累计折旧},
  dNetV {净值}, dFutuP {净残值率}, dFutuV {预计净残值}, dUserM {预计使用月份},
  dCountM {已计提月份}, dWorkdays {计提工作量}: Double; var dMAMod {月折旧率}, dMAVal {月折旧额}: Double): Boolean;
                                            //折旧算法
function Base2InfoFixAddShow(l1Mode: Integer): Boolean;

implementation

uses SysPublic, Base2Info;

{$R *.DFM}

function Base2InfoFixAddShow(l1Mode: Integer): Boolean;
var
  frmBase2InfoFixAdd: TfrmBase2InfoFixAdd;
begin
  frmBase2InfoFixAdd := TfrmBase2InfoFixAdd.Create(Application);
  with frmBase2InfoFixAdd do
  begin
    lMode := l1Mode;
    MainShow;
    Result := bReturn;
    Free;
  end;
end;

function TfrmBase2InfoFixAdd.CheckEdit: Boolean;
var
  sID: string;
begin
  sID := DataSet.FieldByName('ID').AsString;
  Result := CheckEditEmpty(1, self, [Label2.Name, Label3.Name, Label14.Name,
    Label17.Name, Label31.Name, Label26.Name, Label18.Name], [edtName.Name, edtClass.Name,
      edtAddMode.Name, edtBornValue.Name, edtAbateMode.Name, edtSubject.Name, edtAllAbate.Name]);
  if Result then
  begin
    if (Trim(edtUserCode.Text) <> '') and not
      GetDataSetEmpty('Select ID From FixedAssets WHERE [Delete]=FALSE and Usercode=''' +
      Trim(edtUserCode.Text) + ''' and not ID like ' + sID) then
    begin
      ShowMsg('相同编号的固定资产已存在,请重新输入编号!');
      Result := False;
    end;
  end;
end;

procedure TfrmBase2InfoFixAdd.MainShow;
begin
  DataSet:=edtUserCode.DataSource.DataSet;
  LoadGrid;
  LoadData;
  ShowModal;
end;

procedure TfrmBase2InfoFixAdd.LoadData;
var
  sSql: string;
  lID: Integer;
begin
  bReturn := false;
  Caption := '固定资增加';
  lID := DataSet.FieldByName('ID').AsInteger;
  sSql := 'select * from FixedAssetsPlus where FixedID=' + IntToStr(lID);
  OpenDataSet(ADOsetPlus, sSql);
  ADOsetPlus.Insert;
end;

procedure TfrmBase2InfoFixAdd.LoadGrid;
begin
  StrToGridField(gridPlus,
    '    Name,    Spec,    Unit,number,Money, UseDate,Memo',
    '设备名称,规格型号,计量单位,  数量, 金额,使用日期,备注',
    '90,70,70,70,70,70,100');
  edtAbateModeChange(nil);
end;

procedure TfrmBase2InfoFixAdd.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  if (bReturn = False) and (DataSet.State = dsInsert)
    and (Trim(edtName.Text) <> '') then
  begin
    if MsgBox('你没有保存数据,确定要退出吗?', '提示', MB_OKCANCEL) <> IDOK
      then
      Action := caNone;
  end;
end;

procedure TfrmBase2InfoFixAdd.edtClassButtonClick(Sender: TObject;
  AbsoluteIndex: Integer);
var
  sSort1: string;
begin
  inherited;
  sSort1 := BaseSelect(BASE_FIXED_SORT, 1, edtClass.Text);
  if sSort1 <> '' then
    DataSet.FieldByName(edtClass.DataField).AsString := sSort1;
end;

procedure TfrmBase2InfoFixAdd.edtDeptButtonClick(Sender: TObject;
  AbsoluteIndex: Integer);
var
  sDept1: string;
begin
  inherited;
  sDept1 := BaseSelect(BASE_DEPT, 1, edtDept.Text);
  if sDept1 <> '' then
    DataSet.FieldByName(edtDept.DataField).AsString := sDept1;
end;

procedure TfrmBase2InfoFixAdd.edtAddModeButtonClick(Sender: TObject;
  AbsoluteIndex: Integer);
var
  sMode1: string;
begin
  inherited;
  sMode1 := BaseSelect(BASE_FIXED_MODE, 1, edtAddMode.Text);
  if sMode1 <> '' then
    DataSet.FieldByName(edtAddMode.DataField).AsString := sMode1;
end;

procedure TfrmBase2InfoFixAdd.edtUseButtonClick(Sender: TObject;
  AbsoluteIndex: Integer);
var
  sUse1: string;
begin
  inherited;
  sUse1 := BaseSelect(BASE_FIXED_USE, 1, edtUse.Text);
  if sUse1 <> '' then
    DataSet.FieldByName(edtUse.DataField).AsString := sUse1;
end;

procedure TfrmBase2InfoFixAdd.SaveData;
var
  lID: Integer;
begin
  DataSet.FieldByName('Period').AsInteger := GetPeriod;
  SaveDataSet(TADODataSet(DataSet), false);
  lID := TADODataSet(DataSet).FieldByName('ID').AsInteger;
  ADOsetPlus.First;
  while not ADOsetPlus.Eof do
  begin
    ADOsetPlus.Edit;
    ADOsetPlus.FieldByName('FixedID').AsInteger := lID;
    ADOsetPlus.Next;
  end;
  SaveDataSet(ADOsetPlus, True);
end;

procedure TfrmBase2InfoFixAdd.bbAddClick(Sender: TObject);

begin
  inherited;
  if CheckEdit then
  begin
    DataSet.Edit;
    SaveData;
    DataSet.Insert;
    ADOsetPlus.Insert;
  end;
end;

procedure TfrmBase2InfoFixAdd.bbOkClick(Sender: TObject);
begin
  inherited;
  if CheckEdit then
  begin
    SaveData;
    bReturn := true;
    Close;
  end;
end;

procedure TfrmBase2InfoFixAdd.bbNoClick(Sender: TObject);
begin
  inherited;
  Close;
end;

procedure TfrmBase2InfoFixAdd.edtSubjectButtonClick(Sender: TObject;
  AbsoluteIndex: Integer);
var
  sSubject1: string;
begin
  inherited;
  sSubject1 := BaseSelect(BASE_SUBJECT, 1, edtSubject.Text);
  if (sSubject1 <> '') and (sSubject1 <> '0') then
  begin
    DataSet.FieldByName('SubjectID').AsString :=sSubject1;
    DataSet.FieldByName('Subject').AsString :=  FieldIdToName('Subject', sSubject1, 'Name');
  end;
end;

procedure TfrmBase2InfoFixAdd.edtAbateModeChange(Sender: TObject);
begin
  inherited;
  if edtAbateMode.ItemIndex = 3 then
  begin
    Label27.Caption := '预计工作量:';
    Label28.Caption := '已提工作量:';
    Label21.Visible := true;
    edtUnit.Visible := true;
  end
  else
  begin
    Label27.Caption := '预计使用月份:';
    Label28.Caption := '已计提月份:';
    Label21.Visible := False;
    edtUnit.Visible := False;
  end;
  CanUseMonth;
  EditCalcDepreciation;
end;

procedure TfrmBase2InfoFixAdd.CanUseMonth;
begin
  if (edtAbateMode.ItemIndex = 4) or (edtAbateMode.ItemIndex = 5) then
  begin
    if (Trim(edtUseMonth.Text) <> '') and (StrToInt(edtUseMonth.Text) mod 12 <>
      0) then
      ShowMsg('双倍余额递减法、年数总和法中预计使用月份应能被12整除!');
  end;
end;

function TfrmBase2InfoFixAdd.BornValueChange(cType: Char): boolean;
var
  dBorn, dAllA, dNetV, dFutuP, dFutuV: Double;
begin
  dBorn := DataSet.FieldByName(edtBornValue.DataField).AsFloat;
  dAllA := DataSet.FieldByName(edtAllAbate.DataField).AsFloat;
  dNetV := DataSet.FieldByName(edtNetValue.DataField).AsFloat;
  dFutuP := DataSet.FieldByName(edtFutuPvalue.DataField).AsFloat;
  dFutuV := DataSet.FieldByName(edtFutuValue.DataField).AsFloat;

  if dBorn <= 0 then
  begin
    if cType = 'P' then
    begin
      dNetV := 0.00;
      dFutuP := 0.00;
    end
    else if cType = 'I' then
    begin
      dAllA := 0.00;
      dFutuV := 0.00;
    end;
  end
  else
  begin
    if cType = 'P' then
    begin
      dNetV := dBorn - dAllA;
      if dFutuP <> 0 then
        dFutuV := dBorn * dFutuP / 100;
    end
    else if cType = 'I' then
    begin
      dAllA := dBorn - dNetV;
      if dBorn <> 0 then
        dFutuP := dFutuV * 100 / dBorn;
    end;
  end;

  DataSet.FieldByName(edtBornValue.DataField).AsFloat := dBorn;
  DataSet.FieldByName(edtAllAbate.DataField).AsFloat := dAllA;
  DataSet.FieldByName(edtNetValue.DataField).AsFloat := dNetV;
  DataSet.FieldByName(edtFutuPvalue.DataField).AsFloat := dFutuP;
  DataSet.FieldByName(edtFutuValue.DataField).AsFloat := dFutuV;
  Result := true;
end;

procedure TfrmBase2InfoFixAdd.edtBornValueExit(Sender: TObject);
begin
  inherited;
  BornValueChange('P');
  EditCalcDepreciation;
end;

procedure TfrmBase2InfoFixAdd.edtAllAbateExit(Sender: TObject);
begin
  inherited;
  BornValueChange('P');
  EditCalcDepreciation;
end;

procedure TfrmBase2InfoFixAdd.edtNetValueExit(Sender: TObject);
begin
  inherited;
  BornValueChange('I');
end;

procedure TfrmBase2InfoFixAdd.edtFutuPvalueExit(Sender: TObject);
begin
  inherited;
  BornValueChange('P');
  EditCalcDepreciation;
end;

procedure TfrmBase2InfoFixAdd.edtFutuValueExit(Sender: TObject);
begin
  inherited;
  BornValueChange('I');
end;

procedure TfrmBase2InfoFixAdd.edtUseMonthExit(Sender: TObject);
begin
  inherited;
  CanUseMonth;
  EditCalcDepreciation;
end;

function CalcDepreciation(sAbaterMode {折旧方法}: string; dBorn {入账原值}, dAllA {累计折旧},
  dNetV {净值}, dFutuP {净残值率}, dFutuV {预计净残值}, dUserM {预计使用月份},
  dCountM {已计提月份}, dWorkdays {计提工作量}: Double; var dMAMod {月折旧率}, dMAVal {月折旧额}: Double): Boolean;
var
  i, n: Integer;
begin
  Result := True;
  dMAMod := 0.00;
  dMAVal := 0.00;

  if (dBorn = 0) or (dUserM = 0) or (dUserM <= dCountM) then
  begin
    Result := False;
    Exit;
  end; //保证不除0错误

  if (sAbaterMode = '平均年限法(一)') or ((dUserM = 12) and (sAbaterMode = '年数总和法')) then
  begin
    dMAMod := (1 - dFutuP * 0.01) / dUserM * 100;
    dMAVal := (dBorn - dFutuV) / dUserM;
  end
  else if sAbaterMode = '平均年限法(二)' then
  begin
    dMAVal := (dBorn - dAllA - dFutuV) / (dUserM - dCountM); //反起算的
    dMAMod := dMAVal / (dBorn - dFutuV) * 100;
  end
  else if sAbaterMode = '双倍余额递减法' then
  begin
    n := Trunc(dUserM / 12); //预计使用年
    i := Trunc(dCountM / 12 + 1); //已计提年
    if ((dUserM - dCountM) > 24) then
    begin
      dMAVal := (2 * dBorn * IntPower((n - 2), i - 1)) / (12 * IntPower((n), i));
      dMAMod := dMAVal / dBorn * 100;
    end
    else
    begin
      dMAVal := (dBorn - dAllA - dFutuV) / 24; //反起算的
      dMAMod := dMAVal / (dBorn - dFutuV) * 100;
    end;
  end
  else if sAbaterMode = '年数总和法' then
  begin
    n := Trunc(dUserM / 12); //预计使用年
    i := Trunc(dCountM / 12); //已计提年

    dMAMod := (n - i) / (n * (1 + n) / 2) / 12 * 100;
    dMAVal := (dBorn - dFutuV) * dMAMod / 100;
  end
  else if sAbaterMode = '工作量法' then
  begin
    if dWorkdays <> 0 then dMAVal := ((dBorn * (1 - dFutuP * 0.01)) / dUserM) * dWorkdays;
  end
  else Result := False;
end;

procedure TfrmBase2InfoFixAdd.EditCalcDepreciation;
var
  dBorn, dAllA, dNetV, dFutuP, dFutuV, dUserM, dCountM, dMAMod, dMAVal: Double;
  sAbateMode: string;
begin
  sAbateMode := edtAbateMode.Text;
  dBorn := DataSet.FieldByName(edtBornValue.DataField).AsFloat;
  dAllA := DataSet.FieldByName(edtAllAbate.DataField).AsFloat;
  dNetV := DataSet.FieldByName(edtNetValue.DataField).AsFloat;
  dFutuP := DataSet.FieldByName(edtFutuPvalue.DataField).AsFloat;
  dFutuV := DataSet.FieldByName(edtFutuValue.DataField).AsFloat;
  dUserM := DataSet.FieldByName(edtUseMonth.DataField).AsFloat;
  dCountM := DataSet.FieldByName(edtCountMonth.DataField).AsFloat;

  if CalcDepreciation(Trim(sAbateMode), dBorn, dAllA, dNetV, dFutuP, dFutuV, dUserM, dCountM,0, dMAMod, dMAVal) then
  begin
    DataSet.FieldByName(edtMAbateMod.DataField).AsFloat :=dMAMod;
    DataSet.FieldByName(edtMAbateValue.DataField).AsFloat:= dMAVal;
  end;
end;

procedure TfrmBase2InfoFixAdd.edtCountMonthExit(Sender: TObject);
begin
  inherited;
  EditCalcDepreciation;
end;

procedure TfrmBase2InfoFixAdd.dxDBDateEdit1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  inherited;
  case KEY of
    VK_DOWN: SendMsg(TWinControl(Sender).Handle, WM_KEYDOWN, VK_F4);
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -