1

ユーザーの選択に基づいて結果を合計できる Jasper iReport でグラフを描画する必要があります。私は果物テーブルを持っているとしましょう:

id (pk)       town          bananas          orange          cherry 
1            boston           5                 0              11              
2            paris            100               18             12              
3            bucharest        10                3              9
4            barcelona        9                 4              12              

ireport パラメーターが関連付けられた Jasper Web サーバー入力コントロール (java.util.collection) から、ユーザーは果物を選択します。

ユーザーが選択したすべての果物を合計し、グラフをプロットする必要があります。

たとえば、ユーザーが「バナナ」と「オレンジ」の両方を選択すると、結果は次のようになります。

              town          result  
1            boston           5 
2            paris            118 
3            bucharest        13 
4            barcelona        13 

問題は:

私はできません select sum(bananas,orange) as result from fruits group by town

mysql sum 関数はこの方法では機能しませんが、これは jasper 入力コントロールがユーザー選択をレポート クエリに戻す方法です。

試してみましSELECT (SELECT REPLACE('bananas,orange', ',', '+')) as result from fruits group by townたが、MySQL は置換ステートメントを列名として認識しません。私はこれを得る:

              town          result  
1            boston           bananas+orange 
2            paris            bananas+orange
3            bucharest        bananas+orange
4            barcelona        bananas+orange

また、SELECT sum(SELECT REPLACE('bananas,orange', ',', '+')) as result from fruits group by town 結果として 0 を返します

何か案が?多分これはireportから行うことができます..?

4

1 に答える 1

0

ユーザーが指定する入力パラメーターに基づいて、(ストアド プロシージャを使用して) 次のクエリを動的に作成できます。次に、ストアド プロシージャが JRXML 内のデータ ソースになります。

select id, town, sum(bananas) + sum(oranges) as result from fruits group by town

これはまずいと今思う。

別の方法は、次のように FRUIT_SALES テーブルをリファクタリングすることです。

CREATE TABLE "SEEDY_FOODS"."FRUIT_SALES"
  (
    "ID"            NUMBER NOT NULL ENABLE,
    "TOWN"          VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "FRUIT_TYPE_ID" NUMBER,
    "QTY_SOLD"      NUMBER NOT NULL ENABLE,
    CONSTRAINT "FRUIT_SALES_PK" PRIMARY KEY ("ID") 
  )

サンプルデータ

FRUIT_SALES
 ID TOWN    FRUIT_TYPE_ID  SALES
 1  boston  1              5
 2  boston  2              0
 3  boston  3              11
 4  paris   1              100
 5  paris   2              18
 6  paris   3              12

次に、次のような参照テーブルを用意します。

CREATE TABLE "SEEDY_FOODS"."FRUIT_TYPES"
  (
    "ID"   NUMBER NOT NULL ENABLE,
    "NAME" VARCHAR2(20 BYTE)
  )

サンプルデータ

FRUIT_TYPE
 ID NAME
 1  bananas
 2  orange
 3  cherry

上記の DDL SQL は、SQL Developer を使用して Oracle 用に作成されました。MySQL でこの構文を確認する必要があります。

Jasper Report のデータ ソースとして機能するターゲット クエリは次のようになります。

select town, sum(qty_sold)
from fruit_sales
where $X{IN,FRUIT_TYPE_ID,COUNTED_FRUIT_TYPES}
group by town

ここでは、JasperReports 機能を使用して、タイプ$X{IN,<column>,<PARAMETER>}のパラメーターで指定された果物の基準を満たす行のみを選択します。$P{COUNTED_FRUIT_TYPES}java.util.Collection

これがJXRMLの始まりです

<?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="FruitSalesByTown" 
              language="groovy" pageWidth="595" pageHeight="842" columnWidth="535" 
              leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" 
              uuid="9cc45ae0-15a8-4f13-8e02-b0a4379f7019">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
 :
 :
snip style tags 
 :
 :
    <parameter name="COUNTED_FRUIT_TYPES" class="java.util.Collection"/>
    <queryString>
        <![CDATA[select town, sum(qty_sold)
from fruit_sales
where $X{IN,FRUIT_TYPE_ID,COUNTED_FRUIT_TYPES}
group by town]]>
    </queryString>

(Jasper Reports Ultimate Guide の 80 ページを参照)

于 2012-07-05T16:56:13.560 に答える