📄 base2infofixadd.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 + -