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

📄 ffinanceparseserver.pas

📁 财务软件:功能尚可,基于UML设计开发的delphi系统,文档齐全
💻 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 + -