📄 ffinanceparseserver.pas
字号:
unit FFinanceParseServer;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, ParseServer_TLB, StdVcl, ADODB, DB,ParseExpression;
type
TFinanceParseServer = class(TRemoteDataModule, IFinanceParseServer)
conMain: TADOConnection;
qryTemp: TADOQuery;
adsTemp: TADODataSet;
adsSysInfo: TADODataSet;
procedure RemoteDataModuleCreate(Sender: TObject);
procedure conMainBeforeConnect(Sender: TObject);
procedure RemoteDataModuleDestroy(Sender: TObject);
private
{ Private declarations }
aParse:TParseExpression;
function GetSysInfo(vP:String):String;
function GetCodeList(vS,vE:String):TStringList;
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
function Parse(const AExpression: WideString): WideString; safecall;
function GetCodeStart(vYear, vPeriod: Integer;
const vCode: WideString): Double; safecall;
function GetCodeCurDebit(vYear, vPeriod: Integer;
const vCode: WideString): Double; safecall;
function GetCodeCurLender(vYear, vPeriod: Integer;
const vCode: WideString): Double; safecall;
function GetCodeEnd(vYear, vPeriod: Integer;
const vCode: WideString): Double; safecall;
function GetCodeDebitYear(vYear: Integer; const vCode: WideString): Double;
safecall;
function GetCodeStartYear(vYear: Integer; const vCode: WideString): Double;
safecall;
function GetCodeEndYear(vYear: Integer; const vCode: WideString): Double;
safecall;
function GetCodeLenderYear(vYear: Integer;
const vCode: WideString): Double; safecall;
public
{ Public declarations }
procedure OpenSQL(aDataSet:TADODataSet;vSQL:String);
end;
implementation
uses BaseVar;
{$R *.DFM}
class procedure TFinanceParseServer.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;
function TFinanceParseServer.Parse(
const AExpression: WideString): WideString;
var
vCode,vFuncName:String;
BeginCode,EndCode:String;
vYear,vPeriod,i,j:Integer;
aTmpCodeList,aCodeList:TStringList;
Sum:Double;
begin
//aParse.Expression:='<101:103>(FUNCNAME){2005,10}';
aParse.Expression:=AExpression;
//TODO:根据分析结果处理返回运算结果
vCode:=aParse.GetCode;
vFuncName:=aParse.GetFuncName;
vYear:=aParse.GetYear;
vPeriod:=aParse.GetPeriod;
//凭证信息
CurYear:=StrToInt(GetSysInfo('当前会计年度'));
CurPeriod:=StrToInt(GetSysInfo('当前会计期间'));
//如果是-1则取当前值
if vYear=-1 then vYear:=CurYear;
if vPeriod=-1 then vPeriod :=CurPeriod ;
aTmpCodeList:=TStringList.Create;
aCodeList:=TStringList.Create;
aTmpCodeList:=aParse.Splite(vCode,',');
for i:=0 to aTmpCodeList.Count-1 do
//如果有: ,则表示取范围
if Pos(':',aTmpCodeList.Strings[i])>0 then
begin
//取起止
with aParse.Splite(aTmpCodeList.Strings[i],':') do
begin
BeginCode:=Strings[0];
EndCode:=Strings[1];
end;
with GetCodeList(BeginCode,EndCode) do
for j:=0 to Count-1 do aCodeList.Add(Strings[j]);
end
else
aCodeList.Add(aTmpCodeList.Strings[i]);
//循环求每个科目的值
Sum:=0;
for i:=0 to aCodeList.Count -1 do
begin
//判断函数
//期初
if vFuncName='STARTDATA' then Sum:=Sum+GetCodeStart(vYear,vPeriod,aCodeList.Strings[i]);
//借方金额
if vFuncName='CURDEBIT' then Sum:=Sum+ GetCodeCurDebit(vYear,vPeriod,aCodeList.Strings[i]);
//贷方金额
if vFuncName='CURLENDER' then Sum:=Sum+ GetCodeCurLender(vYear,vPeriod,aCodeList.Strings[i]);
//期末
if vFuncName='ENDDATA' then Sum:=Sum+ GetCodeEnd(vYear,vPeriod,aCodeList.Strings[i]);
//年度
//期初
if vFuncName='STARTDATAYEAR' then Sum:=Sum+ GetCodeStartYear(vYear,aCodeList.Strings[i]);
//借方金额
if vFuncName='DEBITYEAR' then Sum:=Sum+GetCodeDebitYear(vYear,aCodeList.Strings[i]);
//贷方金额
if vFuncName='LENDERYEAR' then Sum:=Sum+GetCodeLenderYear(vYear,aCodeList.Strings[i]);
//期末
if vFuncName='ENDDATAYEAR' then Sum:=Sum+GetCodeEndYear(vYear,aCodeList.Strings[i]);
end;
Result:=FloatToStr(Sum);
// Result:='8866';
end;
procedure TFinanceParseServer.RemoteDataModuleCreate(Sender: TObject);
begin
InitSys;
try
conMain.Connected :=True;
adsSysInfo.Open;
aParse:=TParseExpression.Create ;
except
end;
end;
procedure TFinanceParseServer.conMainBeforeConnect(Sender: TObject);
begin
try
conMain.Close;
conMain.ConnectionString :=vConnectionString;
except
end;
end;
procedure TFinanceParseServer.RemoteDataModuleDestroy(Sender: TObject);
begin
aParse.Free;
end;
function TFinanceParseServer.GetCodeStart(vYear, vPeriod: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目期初值
vSQL:='select isnull(期初余额,0) as 金额 from accounttotal where 年度='+IntToStr(vYear)+' and 会计区间='
+IntToStr(vPeriod)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
procedure TFinanceParseServer.OpenSQL(aDataSet: TADODataSet; vSQL: String);
begin
with aDataSet do
begin
close;
CommandText :=vSQL;
Open;
end;
end;
function TFinanceParseServer.GetCodeCurDebit(vYear, vPeriod: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目当前值
vSQL:='select isnull(借方金额,0) as 金额 from accounttotal where 年度='+IntToStr(vYear)+' and 会计区间='
+IntToStr(vPeriod)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
function TFinanceParseServer.GetCodeCurLender(vYear, vPeriod: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目当前值
vSQL:='select isnull(贷方金额,0) as 金额 from accounttotal where 年度='+IntToStr(vYear)+' and 会计区间='
+IntToStr(vPeriod)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
function TFinanceParseServer.GetCodeEnd(vYear, vPeriod: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目当前值
vSQL:='select isnull(余额,0) as 金额 from accounttotal where 年度='+IntToStr(vYear)+' and 会计区间='
+IntToStr(vPeriod)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
function TFinanceParseServer.GetSysInfo(vP: String): String;
begin
if adsSysInfo.Locate('属性',vP,[]) then Result :=adsSysInfo.FieldValues['属性值'] else Result :='';
end;
function TFinanceParseServer.GetCodeDebitYear(vYear: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目期初值
vSQL:='select isnull(借方金额,0) as 金额 from accounttotalYear where 年度='+IntToStr(vYear)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
function TFinanceParseServer.GetCodeStartYear(vYear: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目期初值
vSQL:='select isnull(期初余额,0) as 金额 from accounttotalYear where 年度='+IntToStr(vYear)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
function TFinanceParseServer.GetCodeEndYear(vYear: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目期初值
vSQL:='select isnull(余额,0) as 金额 from accounttotalYear where 年度='+IntToStr(vYear)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
function TFinanceParseServer.GetCodeLenderYear(vYear: Integer;
const vCode: WideString): Double;
var
vSQL:String;
begin
//取科目期初值
vSQL:='select isnull(贷方,0) as 金额 from accounttotalYear where 年度='+IntToStr(vYear)+' and 代码='''+vCode+'''' ;
OpenSQL(adsTemp,vSQL);
Result:=adsTemp.FieldByName('金额').asfloat;
end;
function TFinanceParseServer.GetCodeList(vS, vE: String): TStringList;
begin
//取之间的代码
Result :=TStringList.Create;
with qryTemp do
begin
close;
sql.Clear;
SQL.Add('select 代码 from accountcode where 代码 between '''+vS+''' and '''+vE+'''');
Open;
while not eof do
begin
Result.Add(FieldByName('代码').asstring);
Next;
end;
end;
end;
initialization
TComponentFactory.Create(ComServer, TFinanceParseServer,
Class_FinanceParseServer, ciMultiInstance, tmApartment);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -