1

PHP / JavaBridgeを介してJasperReportsAPIを使用しています。これは、PHP側がJava側とは別のマシン上にあり、2つの側が同じファイルシステムを共有していないことを意味します。

レポートをロードするには、 PHPで.jasperファイルを読み取り、それをインスタンスに変換して、静的メソッドでロードする必要があります。java.io.InputStreamnet.sf.jasperreports.engine.util.JRLoader::loadObject

したがって、 Java側がアクセスできないファイルを参照するサブレポートがレポートに含まれるまで、すべてが正常に機能します。したがって、私の解決策は、 (クラスを使用して)すべてのサブレポートにアクセスし、サブレポートの式を評価し、メインレポートと同じメソッドを使用してレポートをロードすることでしたが、メインレポートのパラメーターに含まれています。net.sf.jasperreports.engine.util.JRElementsVisitor

そして、ここに私の問題があります。新しく追加されたパラメーターを指すようにJRBaseSubreport式を変更する方法がわかりません。

だから私の質問は、JRBaseSubreport式を変更する方法ですか?

4

1 に答える 1

0

これがあなたの言っていることかどうかはわかりませんが、実際には、サブレポートのJRXMLの定義を使用から使用に変更できますStringnet.sf.jasperreports.engine.JasperReport

たとえば、サブレポートを追加すると、通常、レポートに次のパラメータが追加されます。

<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["C:\\reports\\"]]
    </defaultValueExpression>
</parameter>

また、サブレポート要素自体には、次のようなものが追加されます。

<subreport>
  <reportElement uuid="64d21a88-9389-49f5-ba63-1f33aac5a39f" x="821" y="0" width="200" height="100"/>
  <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
  <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "report4_subreport1.jasper"]]></subreportExpression>
</subreport>

SUBREPORT_DIR代わりに、コンパイルされたJasperReportオブジェクトでintパスを渡します。したがって、パラメータを次のように変更します。

<parameter name="SUBREPORT" class="net.sf.jasperreports.engine.JasperReport" isForPrompting="false"/>

次に、サブレポート要素も:

<subreport>
  <reportElement uuid="64d21a88-9389-49f5-ba63-1f33aac5a39f" x="821" y="0" width="200" height="100"/>
  <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
  <subreportExpression><![CDATA[$P{SUBREPORT}]]></subreportExpression>
</subreport>

次に、特定のレポートに必要なサブレポートを知るだけです。

注:これには、で実行されないという不幸な副作用がありますが、通常は、テストして回避するためにiReport、パラメーターをaJasperReportからStringインスタンスに交換するだけです。iReport

于 2012-10-26T17:34:38.437 に答える