聚合函数(count,sum,...)坏了(Jaspersoft Studio 5.5.0.final和5.5.1.final)?

时间:2014-02-27 21:08:01

标签: jasper-reports aggregate-functions

(我在我的答案的底部部分(标记为: 1 中添加了基本的问题解决方案和基本理解,下面两个例子报告图形!)


DISTINCT COUNT列字段上我真正喜欢的是 String ,但似乎对我来说所有聚合函数的行为就像模拟 FIRST(...) 一样。

我无法相信这种情况已经破裂,我似乎更有可能在这里遗漏一些非常奇怪的东西。

(我对JasperReports已经非常有经验,并且之前也在使用BIRT和其他报告框架。)

查看文档,我无法查看问题所在:http://www.jasperassistant.com/docs/guide/ch06s08.html

最后,我创建了附加 simple sample report(现在 another test-report-ext.jrxml ,它通过更好的结构,标记和sql生成的比较数据来增强这一点)基于示例数据库并更新到最新的5.5.1.final版本而没有任何进展。

请有人告诉我我失踪的秘密,或者我的大惊喜确保它确实是一个错误。 : - (

THX

Andreas: - )

正如您在报告中看到的,只有一些page headersummary bands,包含product id/name/cost标签,name countcost count,{{ 1}}以及名称的所有变体cost sumincrement types)。 report/column/page/none拥有summary bandcost sum仅包含detail band

但是没有一个聚合函数显示聚合数据,但只显示detail fields结果。 (如果first(xxx)显示第一行count(name)列值而不是name :-(),那就太奇怪了。

(我也在Jasper论坛上发布了这个问题,并会在重要的帖子上保持最新:http://community.jaspersoft.com/questions/824152/aggregate-functions-count-sum-broken-jaspersoft-studio-550final-and-551final

enter image description here


示例报告解决方案

solution for summary and header bands by user12...解决了这些问题,同时显示了设置的混乱 1 (显示test-report-ext-fixed.jrxml的结果):

enter image description here


1 澄清正确和混乱的设置

我想为像我这样的人添加一些信息,(或者也许是为了我自己,如果我不得不在一段时间后再做一次,忘了特色;-))这可能会混淆和误导通过提供的设置选项,底层逻辑,(Eclipse)Jasper Studio工具提示和docus在我的答案的第一部分中提到...

正确理解/设置(据我所知):

  • 可以 number ,可以在某些生成步骤进行(重新)评估
  • 可以有 variables (可以基于这些变量),可以在某些生成步骤中更新

  • 使用汇总功能 ...

    • 需要使用 text fields 来声明 variables Reset Type(例如 NONE(默认情况下,如果未提供(使用XML格式)),ReportColumn
      • 意味着这是在生成阶段重新计算变量值的时间
    • Page 必须与 Value Class Name 匹配
      • e.g。 type of the final, aggregated result => Calculation = Count
      • Value Class Name = java.lang.Integer也适用的情况下可能会混淆 2 : - /
        • e.g。如果java.lang.String设置为Reset Type,生成的报告会将None显示为Title Band,则可能类似于String聚合函数的行为
      • 因为将First设置为Reset Type(例如在玩游戏时将其修复),因此更加混乱和误导 2 None字段上的Count String以前(正确)的设置,如果未调整为(通常)错误Value Class Name = java.lang.Integer <,则会导致java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number / LI>
      • e.g。 Value Class Name = java.lang.Integer =&gt; Calculation=Sum
        • 如果基础金额基于原子Value Class Name = java.lang.Float
      • e.g。 Float =&gt; Calculation=Sum
        • 如果基础金额始终可以转换为Value Class Name = java.lang.Integer
      • e.g。 Integer =&gt; Calculation=Sum
        • 如果基础金额可以很大并且#34; <&#34;
    • 可能必须将 Value Class Name = java.lang.BigDecimal 设置为 text fields 以外的 Evaluation Time ,例如 Now ,如果他们在报告中的位置不在Report 之前,或者在他们的值是/之前可以计算查看基础数据处理步骤(我会说Summary Band迭代)。
      • 可以很容易地忘记 2 来实现此功能,如果假设这可能会以某种方式根据使用的基础ResultSet自动发生
        • e.g。虽然Variables已正确设置,但在Count中使用了一些Title Band
    • Variable 仅相关,如果提供了 Increment Type
      • 可能会混淆 2 在可以设置而没有任何影响的情况下,虽然没有给出工厂,因此可能会将其与{{1语义: - (

2 :应该通过更严格的Jasper Studio输入验证,提到的文档和Jasper Studio工具提示来解决这个问题!

2 个答案:

答案 0 :(得分:1)

将resetType设置为“None”可能是您的问题(至少对于IdSum而言)。不知道为什么它最终会变成38。将resetType设置为“Report”或将其设置为空(默认为Report)以使其工作:

<variable name="IdSum" class="java.lang.Integer" calculation="Sum">
    <variableExpression>$F{ID}</variableExpression>
</variable>

变量CostCnt也是如此,虽然它将是一个正常的总和,而不是一个独特的总和。

如果最终解决您的问题,请将解决方案发布到论坛中。

只需将TextFields评估时间从“立即”更改为“报告”,即可修复标题中的计算字段 变化

<textField>
    <reportElement uuid="d30afc9a-40bc-4d5a-a4eb-15bf4f881acd" x="100" y="18" width="50" height="20" forecolor="#FF0000"/>
    <textElement/>
    <textFieldExpression><![CDATA[$V{NameCntNone}]]></textFieldExpression>
</textField>

<textField evaluationTime="Report">
    <reportElement uuid="d30afc9a-40bc-4d5a-a4eb-15bf4f881acd" x="100" y="18" width="50" height="20" forecolor="#FF0000"/>
    <textElement/>
    <textFieldExpression><![CDATA[$V{NameCntNone}]]></textFieldExpression>
</textField>

为每个TextField执行此操作,您应该看到计算值。

答案 1 :(得分:0)

我忘了提一些简单的解决方案,以防有人遇到类似“破坏”,奇怪或不充分的聚合功能的问题,至少如果你有一些Oracle数据库或类似的聚合功能:

可以聚合查询级别的数据(当然与报告页面等无关),这可能有优点或缺点(内存占用,网络/流量,专业知识,等等)。 ..),例如:

select 
  x.*, 
  sum(distinct name) over () as name_cnt_distinct,  -- of all results
  count(distinct cost) over () as cost_cnt_distinct,  -- of all results
  count(*) over () as row_cnt,  -- of all results
  sum(cost) over (partition by trunc(cost/10)) as cost_sum_per_cost_range_10  -- per cost range 0..10, 10..20, 20...
from product
where id < 20

(在我看来也很好)

此外,如果您在报告和基于过滤数据(与我一样)的计算中使用某些过滤功能,则上述数据库视图可能没有帮助(因为它不知道过滤器)手前设置)。

Oracle为这个名为table functions的{{3}}提供了一些非常方便的 parameterized view (想到这里的“可过滤视图”)功能这样的情况可以帮助从显示/布局/图形/国际化逻辑中分离信息生成逻辑(数据库引擎很擅长)(报告引擎很擅长)