用于动态字段名称的Crystal Reports公式



我试过弄清楚这一点,但没有成功。我工作的数据库中有一些字段显示了基于期间的总账账户余额(例如{GLAF.BAL1}{GLAF.BAL2}{GLAF.BAL3}等)。我正在寻找一种方法来显示基于当前日期的余额总和。

我有以下公式来确定当前期间(我们的财政年度从8/1开始:

if month(currentdate) >= 8 then Period := (Month(currentdate)-7) else Period := (Month(currentdate)+5)

有没有一种方法可以让我创建一个公式,基本上可以做到以下几点。两个例子来确保它是清楚的:

示例1(当前周期=4):

Balance =: ({GLAF.BAL1} + {GLAF.BAL2} + {GLAF.BAL3})

示例2(当前周期=7):

Balance =: ({GLAF.BAL1} + {GLAF.BAL2} + {GLAF.BAL3} + {GLAF.BAL4} + {GLAF.BAL5} + {GLAF.BAL6})

我不知道一些完全"动态"的东西,但我只想做一些类似的事情:

local numberVar Balance := 0;
if {@period} > 1 then
  Balance := Balance + {GLAF.BAL1};
if {@period} > 2 then
  Balance := Balance + {GLAF.BAL2};
if {@period} > 3 then
  Balance := Balance + {GLAF.BAL3};
Balance;

您可以像这样稍微缩短公式:

if {?period} >= 1 then {GLAF.BAL1} +
if {?period} >= 2 then {GLAF.BAL2} + 
if {?period} >= 3 then {GLAF.BAL3} + 
if {?period} >= 4 then {GLAF.BAL4} + 
if {?period} >= 5 then {GLAF.BAL5} + 
if {?period} >= 6 then {GLAF.BAL6} + 
if {?period} >= 7 then {GLAF.BAL7} + 
if {?period} >= 8 then {GLAF.BAL8} + 
if {?period} >= 9 then {GLAF.BAL9} + 
if {?period} >= 10 then {GLAF.BAL10} + 
if {?period} >= 11 then {GLAF.BAL11} + 
if {?period} >= 12 then {GLAF.BAL12}

但是,请注意NULL中没有任何值,因为这需要更小心的处理。

使用SQL表达式或公式字段将NULL转换为零。每个数据库字段都需要一个(在您的情况下需要12个)。

SQL表达式语法:

-- {%GLAF.BAL01}
-- convert NULL to 0
NVL(GLAF.BAL1,0)

公式字段语法:

// {@GLAF.BAL01}
// convert NULL to 0
If IsNull({GLAF.BAL1}) Then 0 Else {GLAF.BAL1}

创建一个公式字段来汇总这些字段:

// {@Balance}
// place each field in an array; summarize array
// use formula fields to convert NULL to 0
Numbervar Array periods := [{@GLAF.BAL01},{@GLAF.BAL02},...,{@GLAF.BAL12}];
Local Numbervar balance:=0;
Local Numbervar i;
For i := 1 To {?period} Do (
    balance := balance + periods[i];
);
balance;

最新更新