1

JasperReportsを使用して、 Django Web アプリケーションのレポートを作成しています。

ID と値を持つモデルがあるとします。この値はDjangoの選択であるため、データベースには値ではなくキーのみが含まれます (値はコード内にあります)。Djangoを使用しない人にとってより明確にするために、データベースで次のような結果になります。

id value
1  'GD'
2  'VG'
3  'VG'
4  'VG'
5  'GD'
6  'AV'
7  'GD'
8  'AV'

レポートで'GD' の代わりにGood を、 'AV' の代わりにAverageを、 VGの代わりにVery Good表示したいと考えています。これは、私にとって同様に望ましくない2つのオプションで実行できることを知っています。

  1. データベースにキーと値を持つ新しいテーブルを作成し、それをJRクエリに結合します。
    このようなテーブルを約10個作成する必要があるため、これは本当に嫌いです。

  2. 三項演算子を使用して正しい値を表示します。

field.equals("GD")?"Good":(field.equals("AV")?"Average":(field.equals("VG")?"Very good":"-"))

たとえば、キーと値のペアが 10 個あると非常に複雑になるため、これも嫌いです。

私の理想的な解決策は、すべてのキーと値のペアを含む辞書 ( HashMap ) 変数をレポートに定義しDICTIONARY.get(field)、フィールド値を表すために a を実行することです。これはできますか?別のより良い解決策を提案できますか?

データベースの設計を変更するように言わないでください。気に入らない人もいると思いますが、私のニーズにはぴったりです。

4

1 に答える 1

3

この問題は、Javaを使用して解決できます。たとえば、Guava ライブラリは、このタスクの解決に役立ちます。

レポートのパラメーターの使用

typeのパラメーターを追加しjava.util.Mapて、キーで値を抽出するために使用できます (サンプルのフィールドにすることができます)。

標本、見本:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="using_map" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="e566b23d-ca97-472e-9cc3-8073573f4537">
    <import value="com.google.common.collect.*"/>
    <import value="com.google.common.base.*"/>
    <parameter name="values" class="java.util.Map" isForPrompting="false">
        <defaultValueExpression><![CDATA[new ImmutableMap.Builder<String, String>().put("GD", "Good").put("AV", "Average").build()]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="id" class="java.lang.String"/>
    <field name="value" class="java.lang.String"/>
    <columnHeader>
        <band height="20">
            <staticText>
                <reportElement uuid="f23f6abc-cd9b-4415-a591-cb7a51ad0392" x="0" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Id]]></text>
            </staticText>
            <staticText>
                <reportElement uuid="f23f6abc-cd9b-4415-a591-cb7a51ad0392" x="100" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Value]]></text>
            </staticText>
            <staticText>
                <reportElement uuid="f23f6abc-cd9b-4415-a591-cb7a51ad0392" x="200" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Value from Map]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement uuid="8eb8bbef-430b-4ad1-b592-000fe7ccce9f" x="0" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="8eb8bbef-430b-4ad1-b592-000fe7ccce9f" x="100" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="8eb8bbef-430b-4ad1-b592-000fe7ccce9f" x="200" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$P{values}.get($F{value})]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

このサンプルでは、​​ ImmutableMap.Builderクラスを使用してMapの作成と入力を行います。

結果は次のようになります ( iReportプレビュー経由):

iReport の結果

ご覧のとおり、3 番目の列にはMapにない値のnull値が含まれています。


注: Guavaライブラリをクラスパスに追加することを忘れないでください。

スクリプトレットの使用

Scriptletsを使用して同じことができます。

たとえば、Mapから値を取得するために、静的メソッドを使用して単純なJavaクラスを作成できます。

国際化メカニズムの使用

最も簡単な方法は、レポートの国際化サポートを使用することです。

値を含むプロパティファイルをレポートに添付できます。

jrxmlのサンプル:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="localization" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" resourceBundle="marks" uuid="a5d74b61-8d62-41ac-b874-76d6f40da79e">
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="id" class="java.lang.String"/>
    <field name="value" class="java.lang.String"/>
    <columnHeader>
        <band height="20">
            <staticText>
                <reportElement uuid="f23f6abc-cd9b-4415-a591-cb7a51ad0392" x="0" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Id]]></text>
            </staticText>
            <staticText>
                <reportElement uuid="f23f6abc-cd9b-4415-a591-cb7a51ad0392" x="100" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Value]]></text>
            </staticText>
            <staticText>
                <reportElement uuid="f23f6abc-cd9b-4415-a591-cb7a51ad0392" x="200" y="0" width="114" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Value from Properties]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement uuid="8eb8bbef-430b-4ad1-b592-000fe7ccce9f" x="0" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="8eb8bbef-430b-4ad1-b592-000fe7ccce9f" x="100" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="8eb8bbef-430b-4ad1-b592-000fe7ccce9f" x="200" y="0" width="114" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[str($F{value})]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

marks.propertiesファイル:

GD=Good
AV=Average
VG=Very Good

結果は次のようになります ( iReportプレビューあり):

iReport の結果

str()メソッドと$R{}構文を使用しました。

于 2013-07-01T08:15:52.797 に答える