【问题标题】:Subreport Data Source Expression for XML documentXML 文档的子报表数据源表达式
【发布时间】:2019-08-15 13:48:17
【问题描述】:

我正在尝试使子报表适用于使用 XML 文档作为数据源的报表。

当我对主报表数据进行排序时,子报表不必重新查询 XML 文档。它需要 JRSortableDataSource,而不是 JRXmlDataSource

我做错了什么?

我使用了以下数据源表达式:

$P{REPORT_DATA_SOURCE}).subDataSource("/person/phone")

堆栈跟踪:

Error filling print... Error evaluating expression :      Source text : $P{REPORT_DATA_SOURCE}.subDataSource("/person/phone")

net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :  

    Source text : $P{REPORT_DATA_SOURCE}.subDataSource("/person/phone")     
at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:203)     
at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:591)     
at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:559)     
at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:966)     
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:384)     
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:286)     
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:259)     
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:459)     
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2044)     
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:778)     
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:288)     
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:151)     
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)     
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:126)     
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:464)     
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:300)     
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:757)     
at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:1003)     
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)     
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) Caused by: groovy.lang.MissingMethodException: 
No signature of method: net.sf.jasperreports.engine.fill.SortedDataSource.subDataSource() 
is applicable for argument types: (java.lang.String) values: [/person/phone]     
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:54)     
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)     
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)     
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)     
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)     
at TestParam_1362739351228_895383.evaluate(calculator_TestParam_1362739351228_895383:223)     
at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:190)    

【问题讨论】:

    标签: xpath jasper-reports


    【解决方案1】:

    您的数据源表达式$P{REPORT_DATA_SOURCE}).subDataSource("/B/C")
    有语法错误
    一开始你错过了不匹配的字符(
    那么

    如果它期待JRSortableDataSource
    使用这个表达式
    ((net.sf.jasperreports.engine.data.JRSortableDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("DefineThat")

    如果它期待JRXmlDataSource
    使用这个表达式
    ((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("DefineThat")

    【讨论】:

    • 我真的用过 $P{REPORT_DATA_SOURCE}.subDataSource("/person/phone")。我按名称对主要报告进行了排序......之后我遇到了这样的错误。我不知道如何解决这个错误。如果你不介意,请一步一步解释我。因为我是 Jasper Report 的新用户。谢谢。
    • 您必须将$P{REPORT_DATA_SOURCE} 参数转换为(JRXmlDataSource 类型),然后您的数据源表达式必须为((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/person/phone") 而不是$P{REPORT_DATA_SOURCE}.subDataSource("/person/phone")
    • 我已经改成这样了。但是仍然会出现错误。而且我通过从主报告传递参数在子报告中使用过滤器表达式。此时,电话号码只显示一个。我想显示很多电话号码。那个人附身了。这个过滤器不适合我。我不知道该怎么做。如果你知道另一种方式,请解释我。谢谢。
    【解决方案2】:

    $P{REPORT_DATA_SOURCE}).subDataSource("Xpath")

    当有人使用上述表达式连接以使用 XML 数据源在 Jasper 中创建子报告时,我们需要将报告语言设置为 groovy 而不是 Java。我认为 subdatasource 不是在 Java 中定义的方法,而是在 groovy 中定义的。我是试图在Java中找到一个与上面等效的方法

    【讨论】:

    • 1.单击子报表或列表或表格元素 2.转到使用 JRDatasource 表达式下的数据源,使用以下表达式((net.sf.jasperreports.engine.data.JRXmlDataSource) $P{REPORT_DATA_SOURCE }).subDataSource("Subquery Xpath") for Java
    【解决方案3】:

    遇到同样的问题,在 jaspersoft-community 找到了这个解决方案:

    在参数中捕获原始数据源:

    <parameter name="MyDataSource" class="net.sf.jasperreports.engine.JRDataSource" isForPrompting="false">
        <defaultValueExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></defaultValueExpression>
    </parameter>
    

    在 iReport-GUI 中相同:

    • 在主报表中创建新参数
    • 名称:“我的数据源”
    • 参数类:“net.sf.jasperreports.engine.JRDataSource”
    • 用作提示:否
    • 默认值表达式:“$P{REPORT_DATA_SOURCE}”

    现在在 subreport-datasource 中使用 MyDataSource 参数:

    <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{MyDataSource}).dataSource("/Subreport/path")]]></dataSourceExpression>
    

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多