如何在Crystal Report中引用上一组的同比计算?

时间:2011-02-14 16:23:41

标签: crystal-reports formula crystal-reports-xi

我正在撰写一份报告,其中包含3组:年,月和供应商。

每个页面都以年份开头,然后是12个月中的每一个,每个页面都有销售摘要。然后,用户可以深入查看该月份每家公司的个人销售数据。

e.g。我报告的最高级别如下所示:

2010  
   January    £20,000
   February   £30,000
   March      £15,000
   etc.

2011
    January   £16,000
    February  £14,000

现在,我希望将2011年1月的价值与去年同期的价值进行比较(在这种情况下:16,000对20,000),这样我就可以进行一些额外的计算。

目前,我通过使用名为JanGlobal,FebGlobal等的全局变量来实现这一目标,这些变量在必要时进行存储和检索。这是有效的,因为我知道只有12个月,所以我可以提前命名变量。

但是,在供应商层面,我不知道会有多少供应商,或者根本不存在供应商(供应商可能是新的,因此他们不会有年度信息;或者他们可能已经破产了,所以在新的一年里不存在。)

我的供应商深入研究如下:

2010
    January
        Company 1    £5,000
        Company 2    £7,000
        Company 3    £8,000

所以我需要将可变数量的供应商与之前12个月的同行进行比较(如果存在的话)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这里的解决方案涉及相当程度的字符串操作。基本上,在公司的团体页脚中(当年是2010年),您会建立一系列公司名称和销售数据。当年份是2011年时,您处理字符串而不是提取与2011年相关的数据(对于给定的公司和月份),并将其用于比较。

因此,对于名为ProcessJan的字符串公式,您可能具有(使用管道作为拆分字符):

Global StringVar JanGlobal;
Local NumberVar NumberToCompare := 0;
If Year(Sales) = 2010 Then
    JanGlobal := '||' + {CompanyName} + '|' + ToText({SalesFigure}); //append current value to Jan's formula
Else
(
    If UBound(SalesSearch) > 0
    (
        Local NumberVar Searching := 1;
        For Searching = 1 to UBound(SalesSearch)
            If SalesSearch[Searching] StartsWith ({CompanyName} + '|') Then
            (
                Local StringVar Array Matched := Split(SalesSearch[Searching], '|')
                NumberToCompare := ToNumber(Matched[2]);
            )          
        Next
    )
    //do whatever you want with the 2011 sales figure and the value of NumberToCompare
    //(which should be either zero or Jan 2010's sales figure for the company) here
)

通过一些工作,您可以调整此方法,使一个公式和全局变量管理所有月份和公司。