レベル: 初級 福井 清香, 情報マネジメント技術/ソフトウェア開発研究所, IBM
2005年 9月 15日 今月はAlphabloxに焦点を当てて解説していきます。
DB2 Alphabloxは、データ分析を行うWebアプリケーションを作成・使用する際の強力な支援ツールです。専用のJSPタグが多種多様なデータ分析画面の作成をサポートしているので、分析用Webアプリケーションの開発を容易に行うことが可能です。(1) PresentBlox編ではPresentBloxを使用したアプリケーション開発方法について解説しましたが、(2) ReportBlox編ではリレーショナルデータベースの分析に特化した部品であるReportBloxを使用し、Alphabloxからリレーショナルデータベースのデータを照会・分析するアプリケーション開発を行う際の手順について、実際の例を使用して解説します。
リレーショナルデータベースによるReportBloxの利用
ReportBloxの利用手順
(1) PresentBlox編で述べたように、開発者はAlphabloxを使用して分析ツールを開発する際、Bloxと呼ばれるAlphabloxが提供している再利用可能なコンポーネントを使用します。Alphabloxからリレーショナルデータベースに接続してデータを表示する際、使用するBloxとしてはPresentBloxとReportBloxがあります。ReportBloxはリレーショナルデータベースの照会に特化したBloxです。特徴は、ユーザーがソートやグルーピングを自由に行えるインタラクティブなレポートを提供できること、またデータを計算した結果列を簡単な実装で追加できることが特徴で、計算列として例えば、照会結果をグルーピングして集計を行う機能や、列同士の計算を行った列を追加する機能などを提供しています。また、カスタマイズし整形されたレポートを出力することも可能です。本稿では、Alphabloxからリレーショナルデータベースへ接続し、ReportBloxを使用して様々な表の形式でデータベースを照会する方法を順を追って説明します(データソースの登録、アプリケーションの準備の手順は(1)PresentBlox編をご参照下さい)。
ReportBloxの定義(1)
この例は基本的なReportBloxの使い方を示したJSPファイルです。タグに条件を指定するサンプルを示していますが、前項の例と同様にAlphablox APIでデータソース名などをセットすることも可能です。その際の使用方法については、Alphabloxに添付のJavaDoc for DB2 Alphablox 8.2 Relational Reportingを参照してください。
- ReportBloxを使用するためのtaglibの設定をしています。
- ReportBloxで使用するスタイルシートを指定しています。
- スクリプトレットで照会に使用するクエリーを指定しています。
- ReportBloxを"blox_report"という名前で定義しています。interactive属性を"true"と設定することで、DHTMLによりユーザーがブラウザ上でソート、グルーピングを行うことを可能にします。(3)で定義した接続の際の照会文、ユーザー名、パスワードをタグの中で指定しています。
- 照会に使用するデータソース名を指定しています。
<%@ page language="java"
contentType="text/html; charset=utf-8"
pageEncoding="SHIFT_JIS" %>
<%@ taglib uri="bloxreporttld" -1
prefix="bloxreport" %>
<html>
<head>
<link rel="stylesheet" -2
href="/AlphabloxServer/report/report.css" />
</head>
<% -3
String query;
query = "SELECT REGIONNAME AS 地域,
MARKETNAME AS 都道府県, PRODUCTNAME AS 製品名,
SALES AS 売上高, COGS AS 販売管理費
FROM DB2ADMIN.SALESCOGS";
%>
<bloxreport:report id="blox_report" -4
interactive="true">
<bloxreport:sqlData
query="<%= query %>"
<bloxreport:dataSourceConnection -5
dataSourceName="CAR_RDB"/>
</bloxreport:sqlData>
</bloxreport:report>
</head>
<body>
<blox:display bloxRef="blox_report"/>
</body>
</html>
|
ReportBloxの定義(2)
以上の手順で作成されたレポートは、指定したスタイルシートにより整形されたものとなっています。また、interactive属性を"true"と指定したことで、レポート上部に表示されている列名にマウスをのせると以下のようにポップアップが現れ、ソートやグルーピング機能が使えるようになっています。これがReportBloxで作成したレポートの特徴の一つです。
図3 ReportBloxの表示結果
ReportBloxの定義・応用編(1)
次に、先ほど定義したReportBloxに以下の要件を追加したレポートを設計することとします。
- 売上の高い順にデータを表示
- 製品別、地域別にグルーピングを行ったレポートを作成
- 上記グループそれぞれについて集約したデータを作成
- 売上高における販売管理費の割合を表示し、製品や地域と、販売管理費の関係について分析
- 表示する数値について書式を設定
- 分析を容易にするため、売上高に対してフィルターをかけてレポートを表示
ReportBloxの定義・応用編(2)
まず、売上の高い順について降順にデータを表示させます。そのためにはSortBloxを使用します。以下のタグを<bloxreport:report>タグに入れ子の状態で記述します。
<bloxreport:sort member="売上高" ascending="false" missingLast="true" />
|
これにより、売上高について降順にソートすることができました。
以上は一つのルールに基づきソートを行った例です。複数のルールでソートをするには、以下のように<bloxreport:rule>タグを<bloxreport:sort>タグの中に複数記述します。
<bloxreport:sort>
<bloxreport:rule member="地域" ascending="true" missingLast="true"/>
<bloxreport:rule member="売上高" ascending="false" missingLast="true"/>
</bloxreport:sort>
|
この例では、まず地域について昇順にソートし、次に売上高について降順にソートしています。このようにして複数のルールによりソートを行うことが可能です。
地域、売上高の両方についてソートした結果は以下のようになります。地域ごとに売上高の降順に並んでいることが確認できます。
図4 ReportBloxでソートをした結果
次に、照会結果をグループごとに分けて出力する設定を行います。まず製品ごとにグルーピングを行い、次にその中で地域ごとにグルーピングして出力を行うようにします。GroupBloxの機能を用い、次のタグを<bloxreport:report>タグに入れ子の状態で記述します。
<bloxreport:group members="製品名,地域"/>
|
このようにして製品別、地域別にグルーピングが行われます。また、それぞれのグループ項目の下に集約値として列ごとの合計値が出力されます。
合計値以外の値を出力するには、AggregationBloxを使用します。これは先ほどの<bloxreport:group>タグに入れ子の状態で以下のように使用します。
<bloxreport:group members="製品名,地域" >
<bloxreport:aggregation member="売上高" type="max"/>
<bloxreport:aggregation member="販売管理費" type="average"/>
</bloxreport:group>
|
上記の例は、まず売上高の列について"type=max"と設定し、グループ内の最大値を表示するよう設定しています(type属性を指定しなかった場合は"type=sum"がデフォルトの設定です)。次に、販売管理費の列については"type=average"と設定し、平均値を出力しています。
以上からグルーピングを行い、更に製品ごとに売上高の最大値、および販売管理費の平均値を出力すると以下のような結果となります(下図は結果画面の一部です)。グルーピングによって大きくビューが変わります。
図5 ReportBloxでグルーピングをした結果
次に列同士の値を計算し、結果を表示する列をレポートに追加します。現在の照会結果には売上高と販売管理費のデータが含まれているので、販売管理費が売上高に対しどの程度の割合を占めているのかを計算し、レポートに新たな列として結果を追加します。使用するのは<bloxreport:calculate>タグで、これを<bloxreport:report>タグに入れ子の状態で使用します。
<bloxreport:calculate expression="[販管費割合] = ( 販売管理費 / 売上高 )" />
|
上記のコードでは、販売管理費の値を売上高で割ったものを"販管費割合"という名前を付けて表示しています。列名を[]で囲む必要は必ずしもありませんが、列名がスペースを含んでいる場合は必ず囲む必要があります。計算に用いることができる演算子は、"+","-","*","/"があります。また、"(" ")"を使用することもできます。
この計算結果の列をレポートに追加すると、その合計値も自動で表示されます。割合の合計は意味のない数字なので、AggregationBloxの部分を以下のように変更して、販管費割合の列についてはすべての値の平均値を表示するようにします。
<bloxreport:group members="製品名,地域" >
<bloxreport:aggregation member="売上高" type="max"/>
<bloxreport:aggregation member="販売管理費" type="average"/>
<bloxreport:aggregation member="販管費割合" type="average"/>
</bloxreport:group>
|
ここで、数値について表示形式を設定します。割合の値については%形式に変更します。金額の値については桁を区切って表示させます。これには<bloxreport:format>タグを<bloxreport:report>タグに入れ子の状態で使用します。
<bloxreport:format>
<bloxreport:numeric format="#,##0;-#,##0" member="売上高" />
<bloxreport:numeric format="#,##0;-#,##0" member="販売管理費" />
<bloxreport:numeric format="###0.00%;" member="販管費割合" />
</bloxreport:format>
|
売上高、販売管理費の列については、3桁区切りにし、";"の左側で正の値の形式、右側で負の値の形式を設定しています。販管費割合の列については、パーセント表示にし、小数点以下2桁まで表示する設定になっています。
以上から販売管理費の列を追加し、データの表示形式を設定すると以下のような出力となります。数字をフォーマットしたことで見やすくなりました。
図6 ReportBloxで計算列追加・数値のフォーマットを行った結果
表示の設定をするBloxとしては他に、フォントや右寄せ・左寄せなどを設定するStyleBlox、ヘッダーやフッターの設定をするTextBloxがあります。詳細はAlphablox Relational Reporting開発者用ガイドの「Relational Reporting Bloxのタグのリファレンス」の節をご参照ください。
ReportBloxの定義・応用編(3)
ここまではレポートの設定について静的に行える部分について説明しました。最後にデータに対して動的なフィルターをかける例を一つ紹介します。設定の手順は以下です。
- フィルタリング機能を提供するFilterBloxを設定
- FilterBloxに動的に条件を指定できるようHTMLフォームを作成
FilterBloxを使って売上高の値に対してフィルタリングを行うよう設定します。フィルタリングの条件は<bloxreport:report>に対し入れ子で設定する<bloxreport:filter>タグのexpression属性に対して行います。この条件を動的に変更できるよう、ここでは以下のようにJSPの式を用いて条件を設定します。
<%
String exp = ""; //フィルタリングの条件式
String condition = ""; //不等号を代入
int amount = 0; //フィルタリングの条件として使う値
%>
:
<% exp = "売上高 " + condition + " " + amount; %>
<bloxreport:filter expression="<%= exp %>" />
|
このJSPの"condition"の部分に"<"、">"、"="、"!="のいずれかを代入し、条件判定を行ってフィルターをかけるようにします。このFilterBloxに対して条件を選択するためのフォームを以下のように作成します。
<form id="myForm" action="report.jsp"> -1
<table>
<tr><td>売上高に対するフィルタリングの条件:
<input name="amount" type="text" value="<%= (amount > 0) ? amount : 0 %>">
<select name="condition"> -2
<OPTION value="GT" <%= (condition == ">") ? "selected" : "" %>>より大きい</OPTION>
<OPTION value="LT" <%= (condition == "<") ? "selected" : "" %>>より小さい</OPTION>
</select>
<input type="button" value="実行" onClick="document.all.myForm.submit()"></td>
</tr>
</table>
</form>
|
- では自分自身のJSPを呼び出すように設定しています。
- 以降のリストボックスでは不等号を表示し、値は"GT" "LT"という文字列を渡しています。よって実装時は、requestに詰められたこれらの文字列を不等号に再度変換してconditionに代入する必要があります。
これで自分自身のJSPにフォームから値を渡すことができるようになりました。しかしこれでは正しい結果が表示されません。それはこのフィルタリング機能がReportBloxのインスタンス化された時に働くためです。正しく値を更新するには、セッションに残っている値を消去する必要があります。そのためにはReportBloxのidを指定して以下のようにセッション属性の情報を削除します。
<% session.removeAttribute("blox_report"); %>
|
以上で、下図のようにフォームによって動的にフィルタリングを行う機能を実現することができます。
図7 ReportBloxで条件指定のフォームを作成した結果
以上でReportBloxについての解説は終了ですが、ここで紹介した方法以外にも様々な方法でReportBloxを拡張することが可能です。Alphabloxの豊かな表現力を使用して目的に合った見やすいレポートを作成することを心がけてください。
まとめ
本稿ではDB2 Alphabloxでリレーショナルデータベースを利用したアプリケーションをReportBloxにより開発する方法を紹介しました。ここで紹介した機能はほんの一部ですが、よりReportBloxを使用したより高度なアプリケーション開発をする際はDB2 Alphablox Relational Reporting 開発者用ガイドをご参照ください。(1) PresentBlox編で紹介したPresentBloxと本稿で紹介したReportBloxを使用することで、リレーショナルデータベースを使用した様々な分析アプリケーションが作成可能になります。
次回は、リレーショナルデータソースに対してWebSphere Application Server上で接続プールを設定し、パフォーマンスを向上させる方法について解説します。
参考文献
以上のドキュメントはDB2 Alphablox Libraryに含まれています。
著者について  | |  | 福井 清香はソフトウェア開発研究所のエンジニアで、Business Intelligenceの分野におけるプロジェクトでの開発・支援業務を担当しています。 |
記事の評価
|