当前位置: 首页 > 知识库问答 >
问题:

聚合函数(计数,总和等)被破坏(贾斯珀软件工作室5.5.0.最终和5.5.1.最终)?

屈星腾
2023-03-14

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

我实际上喜欢的只是字符串列字段上的 DISTINCT COUNT,但在我看来,所有聚合函数的行为都像是在模拟 FIRST(...) 功能一样。

我不敢相信这个坏了,看起来我更有可能错过了一些非常奇怪的东西。

(我对JasperReports已经很有经验,以前也使用过BIRT和其他报告框架。)

查看文档,我看不出问题应该在哪里:http://www.jasperassistant.com/docs/guide/ch06s08.html

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

请任何人告诉我我错过的秘密,或者让我大吃一惊的是,确保它确实是一个错误。:-(

谢谢

安德烈亚斯:-)

正如您在报告中看到的,只有一些页眉摘要区间,包含产品ID/名称/成本标签,名称计数成本计数成本总和以及名称计数增量类型的所有变体(报告/列/页/无)。汇总带包含成本总和详细区间仅包含详图字段

但是没有一个聚合函数显示聚合数据,而只有第一个(xxx)结果。(无论如何,计数(name)显示第一行名称列值而不是数字:-( )。

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

用户汇总和标题区的解决方案12...解决了问题,同时显示了设置有多混乱(显示了test-report-ext-fixed.jrxml的结果):

我想为像我这样的其他人添加一些信息(或者为我自己添加一些信息,以防我不得不在一段时间后再次添加,而忘记了这些特性;-),这些信息可能会被提供的设置选项、底层逻辑、(Eclipse)Jasper Studio工具提示和我的答案第一部分中引用的文档所混淆和误导。。。

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

>

  • 可以有变量,可以在特定的生成步骤和
  • 中对其进行(重新)求值
  • 可以有文本字段(可以基于这些变量),可以在某些生成步骤中更新

    使用聚合函数...

      < Li > < code >变量需要用NOT的< code >重置类型声明!< code>NONE(例如< code>Report(如果未提供,则为默认值(以XML格式))、< code >列、< code >页) < ul > < li >这意味着在生成阶段将重新计算变量值
    • 例如,计算 = 计数 =
    • 如果基础总和基于原子浮点值
    • 如果基础总和将始终可转换为整数
    • 如果潜在的总和可能相当“大”
    • 如果假设这可能会基于底层使用的Variables自动发生,那么很容易忘记2实现此功能
      • e、 例如,在标题栏中使用一些Count
      • 在可以设置而不产生任何影响的情况下,可能会使2混淆,尽管没有给出工厂,因此可能会将其与重置类型语义混淆:-(

      2:这应该通过更严格的贾斯珀工作室输入验证,提到的文档和贾斯珀工作室工具提示来解决!


  • 共有2个答案

    茹元魁
    2023-03-14
    匿名用户

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

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

    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为这种称为< code >表函数的功能提供了一些< code >参数化视图(此处称为“可过滤视图”)功能,在这种情况下非常方便,可以帮助将信息生成逻辑(数据库引擎擅长于此)与显示/布局/图形/国际化逻辑(报表引擎擅长于此)分开

    袁英豪
    2023-03-14

    将resetType设置为“None”可能是您的问题(至少对于IdSum)。但不知道为什么最终会是38岁。将resetType设置为“Report”或无(默认为Report),使其工作:

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

    变量CostCnt也是如此,尽管它将是一个正常的和,而不是一个不同的和。

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

    您可以修改标题中的计算字段,只需从现在开始更改您的文本字段评估时间以报告更改

    <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执行此操作,您应该会看到计算值。

     类似资料:
    • 我是JasperReports/Jaspersoft Studio的新手,对图表有点纠结。专家们可能会发现它非常原始,可能我在这里遗漏了一些非常基本的东西。下面是我尝试做的事情的简要说明 1)数据源是csv,具有以下字段 Sr_No、URI、total_time_taken、No_of_requests、avg_time_per_req、most_expensive_req,timestamp_o

    • 恐怕我想多了,但我在饼图中使用变量“增量表达式”时遇到了问题。 我想要的是:$F{dataAsOfDate}==$V{maxDate},但它不起作用。相反,它仍然会拉入所有记录,就好像这个过滤器没有到位一样。我唯一能想到的是,它对每一行的变量求值。数据源中总共有12个日期,我只希望饼图使用最近日期的数据。 我只使用带有饼图和另一个列/线组合图的摘要带。饼图的重置类型为“报告”,增量类型为“无”。

    • 我需要打印一些大数值。一个值看起来像这样 2564894621 现在我想将浮点值格式化为: 2.564.894.621 我正在使用贾斯珀软件工作室来开发我的碧玉报告。

    • 我有一些文件存储在Elasticsearch中,如下所示: 我想得到的是字段1、字段2或字段3对每个文档的最大次数的计数,按日期分组,即。期望结果如下: 我在date上使用了一个术语聚合,但不知道如何比较不同的字段,以便使用Elasticsearch聚合来执行此max and count类型的操作。有什么建议吗?

    • 我正在与Jaspersoft Studio开发一些报告 我有一个web应用程序,它应该接受REST查询,并将它们转换为编译的报告 所以我包含了一些JasperReports jar: < li>groovy-all-2.0.1.jar < li>iText-2.1.7.js2.jar < li>jasperreports-5.2.0.jar 问题是当我编译我的报告并从Jaspersoft Stud

    • 问题内容: 为什么将只有私有构造函数的类标记为final是一个好习惯?我的猜测是,要让其他程序员知道它不能被子类化。 问题答案: 将类定为final具有一些(小的)性能提升,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好做法”的要求,但是我看到了好处。