📄 csh810_01.pas.svn-base
字号:
unit Csh810_01;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, BAS200_09, dxExEdtr, StdCtrls, wwdbdatetimepicker, Buttons, DB,
ADODB, ActnList, Menus, dxCntner, dxTL, wwfltdlg,
dxDBCtrl, dxDBTL, ExtCtrls, ComCtrls, ToolWin, dxDBTLCl, TeEngine,
Series, TeeProcs, Chart, DbChart;
type
TCsh810_01Form = class(TBas200_09Form)
lblItem: TLabel;
lblDate1: TLabel;
lblType: TLabel;
lblDate2: TLabel;
cbItem: TComboBox;
edtFromDate1: TwwDBDateTimePicker;
edtToDate1: TwwDBDateTimePicker;
cbType: TComboBox;
edtFromDate2: TwwDBDateTimePicker;
edtToDate2: TwwDBDateTimePicker;
ADODataSet1FCurNm: TStringField;
ADODataSet1FNo: TIntegerField;
ADODataSet1FParent: TIntegerField;
ADODataSet1FName: TStringField;
ADODataSet1FAmount: TBCDField;
ADODataSet1FLevel: TIntegerField;
ADODataSet1FSeqNo: TIntegerField;
ADODataSet1FDate1: TBCDField;
ADODataSet1FDate2: TBCDField;
ADODataSet1FPercent: TFloatField;
dxDBTreeList1FCurNm: TdxDBTreeListMaskColumn;
dxDBTreeList1FName: TdxDBTreeListMaskColumn;
dxDBTreeList1FDate1: TdxDBTreeListCurrencyColumn;
dxDBTreeList1FDate2: TdxDBTreeListCurrencyColumn;
dxDBTreeList1FAmount: TdxDBTreeListCurrencyColumn;
dxDBTreeList1FPercent: TdxDBTreeListCurrencyColumn;
sbSearch: TSpeedButton;
Panel2: TPanel;
DBChart1: TDBChart;
BarSeries1: TBarSeries;
Splitter1: TSplitter;
Series1: TBarSeries;
ActOpen: TAction;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure sbSearchClick(Sender: TObject);
procedure cbTypeChange(Sender: TObject);
procedure ActPrintExecute(Sender: TObject);
procedure ActOpenExecute(Sender: TObject);
private
{ Private declarations }
public
procedure SetInterface; override;
procedure RefreshEvent; override;
procedure ReportGetValue(const ParName: String; var ParValue: Variant); override;
{ Public declarations }
end;
var
Csh810_01Form: TCsh810_01Form;
ALevelNo:Integer; //层次号
implementation
uses SYSDATA, CommFun, Csh510_01;
{$R *.dfm}
procedure TCsh810_01Form.SetInterface;
begin
inherited;
Caption:=GetDBString('CSH81001001'); //比较分析报表
lblItem.Caption:=GetDBString('CSH81001002'); //项目
lblDate1.Caption:=GetDBString('CSH81001003'); //期段1
lblType.Caption:=GetDBString('CSH81001004'); //类型
lblDate2.Caption:=GetDBString('CSH81001005'); //期段2
sbSearch.Caption:=GetDBString('CSH81001006'); //查询
ADODataSet1FCurNm.DisplayLabel:=GetDBString('CSH81001007'); //币别
ADODataSet1FName.DisplayLabel:=GetDBString('CSH81001008'); //名称
ADODataSet1FDate1.DisplayLabel:=GetDBString('CSH81001003'); //期段1
ADODataSet1FDate2.DisplayLabel:=GetDBString('CSH81001005'); //期段2
ADODataSet1FAmount.DisplayLabel:=GetDBString('CSH81001009'); //增长额
ADODataSet1FPercent.DisplayLabel:=GetDBString('CSH81001010'); //增长率
cbItem.Items.Clear;
cbItem.Items.Add(GetDBString('CSH81001011')); //业务分类
cbItem.Items.Add(GetDBString('CSH81001012')); //客户
cbItem.Items.Add(GetDBString('CSH81001013')); //部门
cbItem.Items.Add(GetDBString('CSH81001014')); //项目
cbItem.ItemIndex:=0;
cbType.Items.Clear;
cbType.Items.Add(GetDBString('CSH81001023')); //本月与上月比较
cbType.Items.Add(GetDBString('CSH81001015')); //本季与上季比较
cbType.Items.Add(GetDBString('CSH81001016')); //本年与上年比较
cbType.Items.Add(GetDBString('CSH81001024')); //本年与上年同期比较
cbType.ItemIndex:=0;
cbTypeChange(cbType);
end;
procedure TCsh810_01Form.FormCreate(Sender: TObject);
begin
inherited;
SetInterface;
sbSearch.Click;
end;
procedure TCsh810_01Form.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
ADODataSet1.Close;
end;
//设置顶层分类数据
procedure SetParentData(ADataSet:TADODataSet;ACurNm:string);
begin
if not ADataSet.Active then Abort;
if ADataSet.Locate('FCurNm',ACurNm,[]) then Exit;
ADataSet.Append;
ADataSet.FieldByName('FCurNm').Value:=ACurNm;
ADataSet.FieldByName('FNo').Value:=-2;
ADataSet.FieldByName('FParent').Value:=-2;
ADataSet.FieldByName('FName').Value:=GetDBString('CSH80001017'); //收支差额
ADataSet.FieldByName('FAmount').Value:=0;
ADataSet.Post;
ADataSet.Append;
ADataSet.FieldByName('FCurNm').Value:=ACurNm;
ADataSet.FieldByName('FNo').Value:=-1;
ADataSet.FieldByName('FParent').Value:=-2;
ADataSet.FieldByName('FName').Value:=GetDBString('CSH80001018'); //收入
ADataSet.FieldByName('FAmount').Value:=0;
ADataSet.Post;
ADataSet.Append;
ADataSet.FieldByName('FCurNm').Value:=ACurNm;
ADataSet.FieldByName('FNo').Value:=0;
ADataSet.FieldByName('FParent').Value:=-2;
ADataSet.FieldByName('FName').Value:=GetDBString('CSH80001019'); //支出
ADataSet.FieldByName('FAmount').Value:=0;
ADataSet.Post;
end;
//将下级分类金额累加到上级分类
procedure UpdateClassParent(ANo:Integer;AValue1,AValue2:Double;ADataSet:TDataSet;ACurrName:String);
var
AParent,AType:Integer;
AClassName:String;
begin
ALevelNo:=ALevelNo+1;
//查找业务分类表中该记录是否有上级分类
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select * from CSH140 where C140_001='+IntToStr(ANo));
SYSDM.qryQuery.Open;
AClassName:=SYSDM.qryQuery.FieldByName('C140_002').AsString;
AParent:=SYSDM.qryQuery.FieldByName('C140_004').AsInteger;
AType:=SYSDM.qryQuery.FieldByName('C140_003').AsInteger;
if AParent=0 then AParent:=AType-1;
if ADataSet.Locate('FNo',ANo,[]) then
begin
ADataSet.Edit;
ADataSet.FieldByName('FDate1').Value:=ADataSet.FieldByName('FDate1').Value+AValue1;
ADataSet.FieldByName('FDate2').Value:=ADataSet.FieldByName('FDate2').Value+AValue2;
ADataSet.Post;
end else
begin
ADataSet.Append;
ADataSet.FieldByName('FCurNm').Value:=ACurrName;
ADataSet.FieldByName('FNo').Value:=ANo;
ADataSet.FieldByName('FName').Value:=AClassName;
ADataSet.FieldByName('FParent').Value:=AParent;
ADataSet.FieldByName('FLevel').Value:=0;
ADataSet.FieldByName('FSeqNo').Value:=0;
ADataSet.FieldByName('FDate1').Value:=AValue1;
ADataSet.FieldByName('FDate2').Value:=AValue2;
ADataSet.Post;
end;
if AParent>0 then UpdateClassParent(AParent,AValue1,AValue2,ADataSet,ACurrName);
end;
//取得上级业务分类
procedure GetParentClass(ADataSet:TADODataSet);
var
ABookmark:TBookmark;
ACurrName:string;
AMount1,AMount2:Double;
AClassNo:Integer;
begin
ADataSet.First;
while not ADataSet.Eof do
begin
ABookmark:=ADataSet.GetBookmark;
ACurrName:=ADataSet.FieldByName('FCurNm').AsString;
AMount1:=ADataSet.FieldByName('FDate1').AsFloat;
AMount2:=ADataSet.FieldByName('FDate2').AsFloat;
AClassNo:=ADataSet.FieldByName('FParent').AsInteger;
ALevelNo:=0;
if AClassNo>0 then UpdateClassParent(AClassNo,AMount1,AMount2,ADataSet,ACurrName);
ADataSet.GotoBookmark(ABookmark);
ADataSet.FreeBookmark(ABookmark);
//修改层次号 0=最顶层
ADataSet.Edit;
ADataSet.FieldByName('FLevel').Value:=ALevelNo;
ADataSet.Post;
ADataSet.Next;
end;
end;
//将下级项目金额累加到上级项目
procedure UpdateProjectParent(ANo:Integer;AValue1,AValue2:Double;ADataSet:TDataSet;ACurrName:String);
var
AParent:Integer;
AProjectName:String;
begin
ALevelNo:=ALevelNo+1;
//查找项目资料表中该记录是否有上级分类
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select * from CSH150 where C150_001='+IntToStr(ANo));
SYSDM.qryQuery.Open;
AProjectName:=SYSDM.qryQuery.FieldByName('C150_002').AsString;
AParent:=SYSDM.qryQuery.FieldByName('C150_003').AsInteger;
if ADataSet.Locate('FNo',ANo,[]) then
begin
ADataSet.Edit;
ADataSet.FieldByName('FDate1').Value:=ADataSet.FieldByName('FDate1').Value+AValue1;
ADataSet.FieldByName('FDate2').Value:=ADataSet.FieldByName('FDate2').Value+AValue2;
ADataSet.Post;
end else
begin
ADataSet.Append;
ADataSet.FieldByName('FCurNm').Value:=ACurrName;
ADataSet.FieldByName('FNo').Value:=ANo;
ADataSet.FieldByName('FName').Value:=AProjectName;
ADataSet.FieldByName('FParent').Value:=AParent;
ADataSet.FieldByName('FLevel').Value:=0;
ADataSet.FieldByName('FSeqNo').Value:=0;
ADataSet.FieldByName('FDate1').Value:=AValue1;
ADataSet.FieldByName('FDate2').Value:=AValue2;
ADataSet.Post;
end;
if AParent<>0 then UpdateProjectParent(AParent,AValue1,AValue2,ADataSet,ACurrName);
end;
//取得上级项目
procedure GetParentProject(ADataSet:TADODataSet);
var
ABookmark:TBookmark;
ACurrName:string;
AMount1,AMount2:Double;
AProjectNo:Integer;
begin
ADataSet.First;
while not ADataSet.Eof do
begin
ABookmark:=ADataSet.GetBookmark;
ACurrName:=ADataSet.FieldByName('FCurNm').AsString;
AMount1:=ADataSet.FieldByName('FDate1').AsFloat;
AMount2:=ADataSet.FieldByName('FDate2').AsFloat;
AProjectNo:=ADataSet.FieldByName('FParent').AsInteger;
ALevelNo:=0;
if AProjectNo<>0 then UpdateProjectParent(AProjectNo,AMount1,AMount2,ADataSet,ACurrName);
ADataSet.GotoBookmark(ABookmark);
ADataSet.FreeBookmark(ABookmark);
//修改层次号 0=最顶层
ADataSet.Edit;
ADataSet.FieldByName('FLevel').Value:=ALevelNo;
ADataSet.Post;
ADataSet.Next;
end;
end;
//更新收支余额、收入、支出的金额
procedure UpdateSumAmount(ADataSet:TADODataSet;AFieldName:string;ABalance,AIncome,APayment:Double);
begin
if AFieldName='' then Exit;
if ADataSet.Locate('FNo',-2,[]) then
begin
ADataSet.Edit;
ADataSet.FieldByName(AFieldName).Value:=ABalance;
ADataSet.Post;
end;
if ADataSet.Locate('FNo',-2,[]) then
begin
ADataSet.Locate('FNo',-1,[]);
ADataSet.Edit;
ADataSet.FieldByName(AFieldName).Value:=AIncome;
ADataSet.Post;
end;
if ADataSet.Locate('FNo',-2,[]) then
begin
ADataSet.Locate('FNo',0,[]);
ADataSet.Edit;
ADataSet.FieldByName(AFieldName).Value:=APayment;
ADataSet.Post;
end;
end;
//比较分析--按业务分类
procedure GetClassAmount(ADataSet:TADODataSet;AStartDate,AEndDate:TDateTime;APeriod:Integer);
var
AType,AParent,ANo:Integer;
AAmount,AIncome,APayment,ABalance:Double;
ACurNm,AName,AFieldName:string;
begin
AIncome:=0;
APayment:=0;
//按业务分类、收入支出类型分组求和
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select G100_003 as FCurNm, C140_001 as FNo, C140_002 as FName, C140_003 as FType, C140_004 as FParent, sum(C510B_006) as FAmount from CSH510A,CSH510B, CSH140, CSH550, GLD100');
SYSDM.qryQuery.SQL.Add('where C510B_007=C140_001 and C510A_004 not in (0,3) and C510A_003=C550_001 and C550_005=G100_001 and C510A_010>='+GetDateString(AStartDate)+' and C510A_010<='+GetDateString(AEndDate)+' and C510A_001=C510B_001');
SYSDM.qryQuery.SQL.Add('group by G100_003, C140_001, C140_002, C140_003, C140_004');
SYSDM.qryQuery.Open;
while not SYSDM.qryQuery.Eof do
begin
AType:=SYSDM.qryQuery.FieldByName('FType').AsInteger;
AParent:=SYSDM.qryQuery.FieldByName('FParent').Value;
if AParent=0 then AParent:=AType-1;
AAmount:=SYSDM.qryQuery.FieldByName('FAmount').Value;
ANo:=SYSDM.qryQuery.FieldByName('FNo').Value;
AName:=SYSDM.qryQuery.FieldByName('FName').Value;
if ACurNm<>SYSDM.qryQuery.FieldByName('FCurNm').Value then
begin
ACurNm:=SYSDM.qryQuery.FieldByName('FCurNm').Value;
SetParentData(ADataSet,ACurNm); //设置顶层分类数据
end;
if not ADataSet.Locate('FCurNm;FNo',VarArrayOf([ACurNm,ANo]),[]) then
begin
ADataSet.Append;
ADataSet.FieldByName('FCurNm').Value:=ACurNm;
ADataSet.FieldByName('FNo').Value:=ANo;
ADataSet.FieldByName('FParent').Value:=AParent;
ADataSet.FieldByName('FName').Value:=AName;
ADataSet.FieldByName('FDate1').Value:=0;
ADataSet.FieldByName('FDate2').Value:=0;
ADataSet.FieldByName('FAMount').Value:=0;
ADataSet.FieldByName('FPercent').Value:=0;
ADataSet.FieldByName('FLevel').Value:=0;
ADataSet.FieldByName('FSeqNo').Value:=0;
ADataSet.Post;
end;
case APeriod of
1:AFieldName:='FDate1';
2:AFieldName:='FDate2';
end;
ADataSet.Edit;
ADataSet.FieldByName(AFieldName).Value:=AAmount;
ADataSet.Post;
if AType=0 then AIncome:=AIncome+AAmount else APayment:=APayment+AAmount;
SYSDM.qryQuery.Next;
end;
if ADataSet.IsEmpty then Exit;
ABalance:=AIncome-APayment;
//更新收支余额、收入、支出的金额
UpdateSumAmount(ADataSet,AFieldName,ABalance,AIncome,APayment);
end;
//比较分析--按客户
procedure GetCustAmount(ADataSet:TADODataSet;AStartDate,AEndDate:TDateTime;APeriod:Integer);
var
AType,AParent,ANo:Integer;
AAmount,AIncome,APayment,ABalance:Double;
ACurNm,AName,AFieldName:string;
begin
AIncome:=0;
APayment:=0;
//按客户、收入支出类型分组求和
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select C.G100_003 as FCurNm, D.O150_001 as FNo, D.O150_003 as FName, A.C510A_005 as FType, 0 as FParent, sum(A.C510A_009) as FAmount from CSH510A A, CSH550 B, GLD100 C,');
SYSDM.qryQuery.SQL.Add('(select O150_001, O150_003, 0 as FCustType from ORD150');
SYSDM.qryQuery.SQL.Add('union');
SYSDM.qryQuery.SQL.Add('select H150_001 as O150_001, H150_003 as O150_003, 1 as FCustType from HRM150) as D');
SYSDM.qryQuery.SQL.Add('where A.C510A_003=B.C550_001 and B.C550_005=C.G100_001 and A.C510A_008=D.O150_001 and A.C510A_007=D.FCustType and A.C510A_004 not in (0,3) and A.C510A_010>='+GetDateString(AStartDate)+' and A.C510A_010<='+GetDateString(AEndDate));
SYSDM.qryQuery.SQL.Add('group by C.G100_003, D.O150_001, D.O150_003, A.C510A_005');
SYSDM.qryQuery.Open;
while not SYSDM.qryQuery.Eof do
begin
AType:=SYSDM.qryQuery.FieldByName('FType').AsInteger;
AParent:=SYSDM.qryQuery.FieldByName('FParent').Value;
if AParent=0 then AParent:=AType-1;
AAmount:=SYSDM.qryQuery.FieldByName('FAmount').Value;
ANo:=SYSDM.qryQuery.FieldByName('FNo').Value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -