1

jasperレポートにクエリがあり、ユーザー指定の入力によって生成された結果セットの1つは、以下に示すデータである可能性があります。

memberId stockNo refineryCode constantSerialNo  serialNo
45       1       IAR          A-                98729
45       1       IAR          A-                98730
45       1       IAR          A-                98731
45       1       IAR          A-                98733
45       1       IAR          A-                98734
45       1       IAR          A-                98736
45       1       IAR          A-                98737
45       1       IAR          A-                98738
45       1       IAR          A-                98739

そして、serialNoが連続している場合は、それらのデータを1行に表示したいと思います。したがって、上記のデータをレポートに表示する場合は、以下の方法で表示する必要があります。

memberId stockNo refineryCode constantSerialNo  serialNo
45       1       IAR          A-                98729 - 98731
45       1       IAR          A-                98733 - 98734
45       1       IAR          A-                98736 - 98739

SQLでカーソルを使用するか、JavaなどのOOP言語でORMを使用して、jasperレポートに送信するソリューションがいくつかある可能性があることを私は知っています。しかし、好奇心から、iReportの式やグループ、または今では頭に浮かばなかった、私の生活を楽にする他の何かを使用した動的な解決策があるかどうかを尋ねたいと思います。

4

1 に答える 1

3

serialNoこれは、文字列ではなく何らかの数値であると仮定して、それを行う1つの方法です。

  1. 上に示したように、SQL クエリ結果のデータセットは で並べ替えるserialNo必要があります。
  2. Report Group次のグループ式で を作成します: $V{GroupCount} == new BigDecimal(0) ? $F{serialNo}:$F{serialNo}.subtract($V{GroupCount}). serialNoこれにより、シーケンスにギャップがあるたびに新しいグループが作成されます。
  3. 現在のグループ内GroupCountの連続する値の数をカウントする変数を作成します。この変数は、次に期待される値serialNoを追跡するために使用されます。serialNo
  4. StartRange連続する値の特定の範囲の開始値を保持する変数を作成しserialNoます。値は、新しいグループの開始時にリセットされ、次の値を持つ必要があります: $V{GroupCount}.intValue() == 1 ? $F{ID}:$V{StartRange}.
  5. フィールドのEvaluation Time値を に設定します。次の値を入れます。serialNoReportGroup$V{StartRange}+" - " + $F{serialNo}
  6. バンドの を次のようにPrint When Expression変更します。Detailnew Boolean($V{GroupCount}.intValue() == 1)

以下に完全な jrxml コードを掲載しました。

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="Group_By_Consecutive" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535" columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false" isSummaryNewPage="false">
  <property name="ireport.scriptlethandling" value="0" />
  <property name="ireport.encoding" value="UTF-8" />
  <import value="java.util.*" />
  <import value="net.sf.jasperreports.engine.*" />
  <import value="net.sf.jasperreports.engine.data.*" />
  <queryString>
    <![CDATA[select 1 as id, 'Name 1' as name from dual union all
select 2 as id, 'Name 2' as name from dual union all
select 3 as id, 'Name 3' as name from dual union all
select 4 as id, 'Name 4' as name from dual union all
select 6 as id, 'Name 6' as name from dual union all
select 7 as id, 'Name 7' as name from dual union all
select 8 as id, 'Name 8' as name from dual union all
select 9 as id, 'Name 9' as name from dual union all
select 10 as id, 'Name 10' as name from dual union all
select 11 as id, 'Name 11' as name from dual union all
select 14 as id, 'Name 14' as name from dual union all
select 15 as id, 'Name 15' as name from dual union all
select 16 as id, 'Name 16' as name from dual union all
select 17 as id, 'Name 17' as name from dual union all
select 23 as id, 'Name 23' as name from dual union all
select 24 as id, 'Name 24' as name from dual union all
select 25 as id, 'Name 25' as name from dual union all
select 26 as id, 'Name 26' as name from dual union all
select 27 as id, 'Name 27' as name from dual union all
select 28 as id, 'Name 28' as name from dual]]>
</queryString>
  <field name="ID" class="java.math.BigDecimal" />
  <field name="NAME" class="java.lang.String" />
  <variable name="GroupCount" class="java.math.BigDecimal" resetType="Group" resetGroup="Consecutive" calculation="Count">
    <variableExpression>
      <![CDATA[$F{ID}]]>
</variableExpression>
    <initialValueExpression>
      <![CDATA[new BigDecimal(0)]]>
</initialValueExpression>
  </variable>
  <variable name="StartRange" class="java.math.BigDecimal" resetType="Report" calculation="Nothing">
    <variableExpression>
      <![CDATA[$V{GroupCount}.intValue() == 1 ? $F{ID}:$V{StartRange}]]>
</variableExpression>
  </variable>
  <group name="Consecutive">
    <groupExpression>
      <![CDATA[$V{GroupCount} == new BigDecimal(0) ? $F{ID}:$F{ID}.subtract($V{GroupCount})]]>
</groupExpression>
    <groupHeader>
      <band height="0" isSplitAllowed="true"></band>
    </groupHeader>
    <groupFooter>
      <band height="0" isSplitAllowed="true"></band>
    </groupFooter>
  </group>
  <background>
    <band height="0" isSplitAllowed="true"></band>
  </background>
  <title>
    <band height="0" isSplitAllowed="true"></band>
  </title>
  <pageHeader>
    <band height="0" isSplitAllowed="true"></band>
  </pageHeader>
  <columnHeader>
    <band height="18" isSplitAllowed="true">
      <staticText>
        <reportElement x="0" y="0" width="200" height="18" key="staticText-1" />
        <box></box>
        <textElement>
          <font />
        </textElement>
        <text>
          <![CDATA[serialNo]]>
</text>
      </staticText>
      <staticText>
        <reportElement x="200" y="0" width="100" height="18" key="staticText-3" />
        <box></box>
        <textElement>
          <font />
        </textElement>
        <text>
          <![CDATA[Name]]>
</text>
      </staticText>
      <staticText>
        <reportElement x="300" y="0" width="100" height="18" key="staticText-4" />
        <box></box>
        <textElement>
          <font />
        </textElement>
        <text>
          <![CDATA[MetaData(Ignore)]]>
</text>
      </staticText>
    </band>
  </columnHeader>
  <detail>
    <band height="18" isSplitAllowed="true">
      <printWhenExpression>
        <![CDATA[new Boolean($V{GroupCount}.intValue() == 1)]]>
</printWhenExpression>
      <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self">
        <reportElement x="200" y="0" width="100" height="18" key="textField" />
        <box></box>
        <textElement>
          <font />
        </textElement>
        <textFieldExpression class="java.lang.String">
          <![CDATA[$F{NAME}]]>
</textFieldExpression>
      </textField>
      <textField isStretchWithOverflow="false" pattern="##0.00" isBlankWhenNull="false" evaluationTime="Group" evaluationGroup="Consecutive" hyperlinkType="None" hyperlinkTarget="Self">
        <reportElement x="0" y="0" width="200" height="18" key="textField" />
        <box></box>
        <textElement>
          <font />
        </textElement>
        <textFieldExpression class="java.lang.String">
          <![CDATA[$V{StartRange}+" - " + $F{ID}]]>
</textFieldExpression>
      </textField>
      <textField isStretchWithOverflow="false" pattern="##0.00" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self">
        <reportElement x="300" y="0" width="100" height="18" key="textField" />
        <box></box>
        <textElement>
          <font />
        </textElement>
        <textFieldExpression class="java.math.BigDecimal">
          <![CDATA[$V{GroupCount}]]>
</textFieldExpression>
      </textField>
    </band>
  </detail>
  <columnFooter>
    <band height="0" isSplitAllowed="true"></band>
  </columnFooter>
  <pageFooter>
    <band height="0" isSplitAllowed="true"></band>
  </pageFooter>
  <summary>
    <band height="0" isSplitAllowed="true"></band>
  </summary>
</jasperReport>
于 2012-05-09T16:26:50.607 に答える