存储Crystal Report中当前行的上一行值

时间:2012-06-17 05:54:42

标签: vb.net crystal-reports

我想检索当前行中的上一行值,如下所示(Crystal Report 2008):

+------------+-----------------+----------+------------+----------------+
| Date       | PreviousBalance | Loan     | Collection | CurrentBalance |
+============+=================+==========+============+================|
| 14/02/2012 | 00.00           | 10000.00 | 00.00      | 10,000.00      |
| 15/02/2012 | 10,000.00       | 00.00    | 500.00     | 9,500.00       |
| 16/02/2012 | 9,500.00        | 00.00    | 500.00     | 9,000.00       |
| 18/02/2012 | 9,000.00        | 5,000.00 | 00.00      | 14,000.00      |
+------------+-----------------+----------+------------+----------------+

7 个答案:

答案 0 :(得分:3)

比看起来容易:

  1. 为字段{#TLoan}创建两个正在运行的总计{table.Loan},为字段{#TCol}创建一个集合{table.Collection}

  2. 使用以下内容创建公式:{@Total}

  3. {#TLoan}-{#TCol}

    这将具有CurrentBalance值。

    1. 创建另一个公式:{@Prev},其中包含以下内容:
    2. {@Total}-{table.Loan}+{table.Collection}

      这将具有PreviousBalance值。

      使用这种方法不需要复杂的公式,结果是预期的。

      enter image description here

      enter image description here

      希望它有所帮助!

答案 1 :(得分:2)

使用previous()函数似乎是此解决方案的明显选择,但因为公式不能周期性地相互引用(即{@CurrentBalance}可以' t引用{@PreviousBalance},反之亦然)也不能递归,实现它的方式比它最初看起来更难实现。

相反,您应该使用变量来跟踪事务之间的平衡。您可以通过创建3个公式并将它们放在报告的相应部分来完成此任务。

// {@initVars} - Initialize balance variable
//This formula should be placed in your report header
whileprintingrecords;
numbervar balance:=0

// {@previousBalance} - Display previous line's balance
//This formula should be placed in your Details section
whileprintingrecords;
numbervar balance;

// {@currentBalance} - Display current balance after transactions
//This formula should be placed in your Details section
evaluateafter({@previousBalance});
numbervar balance := balance + {table.LoanAmount} - {table.CollectionAmount}

答案 2 :(得分:1)

我认为有很多方法。怎么样:

previous({Table.Field})

或者你可以有一个总计,然后{#total} - {Table.Field}

答案 3 :(得分:1)

在存储过程存储中,通过使用从表中读取并返回先前余额并将其存储在变量中的函数,然后在存储过程内读取当前余额,将变量中的前一个余额存储在变量中。 使用 union 读取分隔行中的previous和Current,并在报告中获取它们。

答案 4 :(得分:0)

尝试:

// {@PreviousBalance}
If PreviousIsNull({@CurrentBalance}) Then
  0
Else
  Previous({@CurrentBalance})

答案 5 :(得分:0)

从存储过程(如果您使用的是)按日期ASC排序数据,或者如果您不使用SP,您需要按日期ASC对数据表或数据集进行排序,那么您必须确定GROUPING标准( ClientId)为一个客户端分组信息,例如在您提到的这种排序和分组中,您可以从(字段资源管理器 - >组名称字段 - >插入组)

分组记录

答案 6 :(得分:0)

请查看此link。您还没有指定基础数据源,因此我找到了MS SQL的示例。

如果您无权访问数据库以查询/编辑存储过程,则可以编写foreach循环并计算相应的值。问题是报告通常会汇总,切片和过滤数据。 "之前"的概念和"关注"在这种背景下失去了它的意义。