【问题标题】:Group Summary Involving dividing in Crystal Reports在 Crystal Reports 中涉及除法的组摘要
【发布时间】:2012-10-22 16:47:34
【问题描述】:

我有一个包含大约 9 个不同组的 Crystal 报表,并且希望能够获得一个包含一个值除以另一个值的摘要。

例如(表格):

Period    Company   Division   Region  State   City   Store   Employee   Sales   Goal
01-2012   Ab Works  Northern   NW      OR      Ball   888     Foo        100     150
01-2012   Ab Works  Northern   NW      OR      Ball   888     Choo       175     120
02-2012   Ab Works  Southern   SE      GA      Chip   743     Bar        34      75
02-2012   Perrywee  Northern   NC      MN      Fedd   147     Bill       80      64
03-2012   Perrywee  Eastern    FE      WV      Wood   98      Tim        75      250
01-2012   Perrywee  Eastern    FE      WV      Wood   92      Karl       84      250
01-2012   Perrywee  Western    W       CA      Fub    398     Fubar      175     170

然后我的输出如下所示:

Company   Jan2012   Feb2012   Mar2012 ...  YTD-Avg
Ab Works  70.3%     87.3%     87.5%        84.3%
Perrywee  93.5%     97.3%     130.3%       90.4%

每个都允许深入到其下方的组,并且该值的计算方法是该组的销售额总和除以该组的目标总和。由于有 14 个周期和 8 个组,我想避免创建约 115 个公式。

有没有简单的方法可以做到这一点?

【问题讨论】:

  • 您可能必须使用交叉表报表来实现此目的
  • 交叉表会生成他想要的网格,但交叉表没有“向下钻取”功能。

标签: crystal-reports crystal-reports-2008


【解决方案1】:

我做过类似的事情,但没有使用百分比。我想出来的方式几乎是痛苦的,但你将拥有向下钻取的能力。我会发布我想出的东西,但如果有人可以修改它以使其更容易,无论如何。

首先,创建 8 个您要使用的组并将它们隐藏。您将需要 14 个公式来为您的期间创建列。对于您的第一个时期,公式(以及后续时期)应如下所示:

IF {table.period} = "01-2012" THEN
    IF DrillDownGroupLevel = 0 THEN
        SUM({table.sales}, {table.group1}) / SUM({table.goal}, {table.group1})
    ELSE IF DrillDownGroupLevel = 1 THEN
        SUM({table.sales}, {table.group2}) / SUM({table.goal}, {table.group2})
    ELSE IF DrillDownGroupLevel = 2 THEN
        SUM({table.sales}, {table.group3}) / SUM({table.goal}, {table.group3})
    ELSE IF DrillDownGroupLevel = 3 THEN
        SUM({table.sales}, {table.group4}) / SUM({table.goal}, {table.group4})
    ...
    ELSE
        SUM({table.sales}, {table.group8}) / SUM({table.goal}, {table.group8})
ELSE
    0

这个公式的作用是确定它是什么时期,然后确定它处于哪个组级别。然后,考虑到该组在该级别上的假设情况,它总结了销售和目标。

  • 对于 IF {table.period} = "01-2012" THEN 行,我将其设置为参数,以便它可以工作多年。
  • 我宁愿使用函数来确定我所在的组级别,但我只知道 DrillDownGroupLevel。如果您尝试对组做一些花哨的事情(条件抑制),这很有用但有缺陷,不要进行简单的钻取。
  • {table.group1} 更改为您用于该组级别的任何字段。即{table.company}

这个公式的一个缺点是每次向下钻取时,DrillDownGroupLevel 都会改变。您显示的新关卡将是正确的,但仍然显示的以前的关卡将会改变。

希望这会有所帮助。

【讨论】:

  • 虽然它并不能完全解决我的问题,但它让我走上了一条不同的道路,并帮助我更接近我的需要。
【解决方案2】:

步骤:

  • 插入交叉表; company 用于行总计; period 用于列总计(将组选项设置为“每个月”);将salesgoal 添加到汇总字段
  • 预览报告
  • 右键单击goal 单元格,选择“嵌入式摘要”,然后选择“插入嵌入式摘要”
  • 切换到设计模式(交叉表专家);确保字段的顺序(从上到下)为@Embedded SummarySum of SalesSum of Goal
  • 进入预览模式;右键单击嵌入式摘要字段并选择“编辑计算公式”;添加以下内容:

    本地编号var n:=GridValueAt (CurrentRowIndex, CurrentColumnIndex, 1); local numbervar d:=GridValueAt (CurrentRowIndex, CurrentColumnIndex, 2);

    如果 d0 则 n/d*100

  • 抑制销售和目标字段

但是,我(还)没有找到删除多余空间的方法。

示例:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多