【问题标题】:Crystal Reports Formula for Dynamic Field Names用于动态字段名称的 Crystal Reports 公式
【发布时间】:2013-02-18 21:36:27
【问题描述】:

我已经尝试过解决这个问题,但无济于事。我正在使用的数据库具有显示基于期间的总帐帐户余额的字段(例如{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})

【问题讨论】:

    标签: dynamic crystal-reports report formulas


    【解决方案1】:

    我不知道完全“动态”的东西,但我会做类似的事情:

    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;
    

    【讨论】:

    • 谢谢!您的回答也产生了正确的数字。我选择了另一个答案,只是因为公式更短。
    【解决方案2】:

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

    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,因为这需要更加小心的处理。

    【讨论】:

    • 谢谢!!这非常有效。我知道肯定有一些我遗漏的明显方法,而且效果很好。
    • 更新:我不得不稍微调整公式,以说明会计总是在一个月后发布数字。所以我只是将每个间隔增加 1 并将“if {?period} >=1”放在底部。
    【解决方案3】:

    使用 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多