Vb.net 在Crystal报表中存储当前行的上一行值

Vb.net 在Crystal报表中存储当前行的上一行值,vb.net,crystal-reports,Vb.net,Crystal Reports,我想检索当前行中的前一行值,如下所示(Crystal Report 2008): 我认为有很多方法。那么: previous({Table.Field}) 或者您可以有一个运行总数,然后执行{#total}-{Table.Field}?尝试: // {@PreviousBalance} If PreviousIsNull({@CurrentBalance}) Then 0 Else Previous({@CurrentBalance}) 从存储过程(如果使用存储过程)按日期ASC对数据

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


我认为有很多方法。那么:

previous({Table.Field})

或者您可以有一个运行总数,然后执行
{#total}-{Table.Field}

尝试:

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

从存储过程(如果使用存储过程)按日期ASC对数据进行排序,或者如果未使用SP对数据表或数据集按日期ASC进行排序,则必须确定分组条件(ClientId)以对一个客户端的信息进行分组,例如,按照您提到的排序和分组,您可以从(Field Explorer->group Name Fields->Insert group)对记录进行分组。

使用
previous()
函数似乎是此解决方案的明显选择,但因为公式不能循环引用彼此(即,
{@CurrentBalance}
不能引用
{@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}

在存储过程中,使用从表中读取并返回上一个余额的函数将上一个余额存储在变量中,然后在存储过程中读取当前余额。 使用union以单独的行读取上一行和当前行,并将它们包含在报告中。

请查看此页。您尚未指定基础数据源,因此我找到了MS SQL的示例


如果您无权访问数据库以查询/编辑存储过程,则可以编写foreach循环并计算适当的值。问题在于,报告通常会对数据进行汇总、切片和过滤。“上一个”和“下一个”的概念在这种情况下失去了它的意义。

这比看起来容易:

  • 为字段
    {table.Loan}
    的Loan
    {TLoan}
    创建两个运行总计,一个为字段
    {table.Collection}
    的Collection
    {TCol}
    创建一个运行总计

  • 创建具有以下内容的公式:
    {@Total}

  • {#TLoan}-{#TCol}

    这将具有CurrentBalance值。

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

    这将具有以前的余额值。

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


    希望有帮助

    在给定的示例中。。。前一行余额用于当前行?您能更准确地解释吗?正如我从问题中了解到的,这是某种金融或银行系统,因此将有一个标识列,例如(ClientID),可用于分组别担心!如果它有助于它的价值!什么是前一个({Table.Field})是空的?如何将其设置为一个值?
    // {@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}