...

チュートリアル / .NET (PDFドキュメント)

by user

on
Category: Documents
145

views

Report

Comments

Transcript

チュートリアル / .NET (PDFドキュメント)
M3 チュートリアル
(M3 Web Edition)
2007/06/01
ECOSS Inc.
本書で利用されている「M3」という語は、
「esFoundation」の以前の製品名で、本製品の
開発コードです。
「esFoundation」は、
「ECOSS Solutions Foundation」の略で本製品を
指します。本書を含むその他のドキュメント、製品での「M3」という表記は「esFoundation」
と同義です。
変更履歴
日付
版数
更新内容
2007/06/01
1.1
初版リリース。M3 の他のエディションと版数を合わせるために 1.1
にする。
2007/10/01
1.2
1章の「1.1 このドキュメントについて」で、各章で行う作業に
ついて内容を追加。
2章以降は大幅に作業内容、構成を変更。
製品名が「esFoundation」に変更された事に伴い但し書きを追
加。
1 / 120
M3 チュートリアル .................................................................................................................1
1.
はじめに ...........................................................................................................................5
1.1.
このドキュメントについて.......................................................................................5
1.2.
表記等........................................................................................................................5
1.2.1.
1.3.
2.
環境....................................................................................................................6
1.3.2.
知識....................................................................................................................7
プロジェクトの作成.........................................................................................................8
2.1.
プロジェクトの新規作成 ..........................................................................................9
2.2.
データベースの作成、接続設定 .............................................................................10
2.2.1.
SQL Server 2005 でデータベースを指定、又は、SQL Server 2000 の場合10
2.2.2.
Oracle9i、Oracle10g の場合 ..........................................................................13
アプリケーションのテスト起動 .............................................................................16
コードジェネレータを利用したアプリケーションの作成.............................................17
3.1.
追加するサブシステムの概要 .................................................................................17
3.2.
定義書作成 ..............................................................................................................19
3.2.1.
データベース定義書作成 .................................................................................19
3.2.2.
コード定義書作成............................................................................................24
3.2.3.
画面定義書作成................................................................................................28
3.3.
定義書変換、生成物の配置.....................................................................................33
3.3.1.
データベース定義書変換、生成物の配置........................................................33
3.3.2.
コード定義書変換、生成物の配置 ..................................................................37
3.3.3.
画面定義書変換、生成物の配置 ......................................................................38
3.3.4.
入力規則定義書変換、生成物の配置...............................................................39
3.4.
4.
チュートリアルを読むにあたっての前提条件..........................................................6
1.3.1.
2.3.
3.
パス表記について..............................................................................................6
アプリケーションの起動 ........................................................................................41
3.4.1.
サイトマップの変更 ........................................................................................41
3.4.2.
動作確認...........................................................................................................41
生成したアプリケーションと機能について ..................................................................44
4.1.
M3 を利用した ASPX ページの構成 .....................................................................46
4.1.1.
登録ページの構成............................................................................................46
4.1.2.
検索ページの構成............................................................................................47
4.2.
フロー制御機能.......................................................................................................49
4.2.1.
フロー制御機能とは ........................................................................................49
4.2.2.
WizardController コントロール.....................................................................50
2 / 120
4.3.
ページセッション機能 ............................................................................................52
4.3.1.
ページセッションとは.....................................................................................52
4.3.2.
ページセッションの利用方法..........................................................................53
4.4.
データアクセス機能................................................................................................57
4.4.1.
データマネージャ............................................................................................57
4.4.2.
データオブジェクト ........................................................................................58
4.4.3.
補足..................................................................................................................60
4.5.
入力値の管理...........................................................................................................62
4.5.1.
M3 における入力値の管理方法 .......................................................................62
4.5.2.
入力値グループ化コントロール ......................................................................62
4.5.3.
データアクセッサとユーティリティ...............................................................65
4.5.4.
補足..................................................................................................................69
4.6.
入力値の検証機能 ...................................................................................................70
4.6.1.
入力規則機能とは............................................................................................70
4.6.2.
入力規則機能の利用方法 .................................................................................74
4.6.3.
補足..................................................................................................................77
4.7.
検索条件の作成・検索結果の表示機能 ..................................................................78
4.7.1.
検索条件クラス................................................................................................78
4.7.2.
検索条件用サーバーコントロール ..................................................................79
4.7.3.
検索結果表示用サーバーコントロール ...........................................................84
4.8.
UI コントローラ .....................................................................................................85
4.8.1.
DataCreateController コントロール .............................................................85
4.8.2.
SearchController コントロール .....................................................................86
4.8.3.
WizardController コントロール.....................................................................86
4.8.4.
DataLoadController コントロール ................................................................87
4.8.5.
InputRestoreController コントロール...........................................................87
4.8.6.
CaptionExportController コントロール ........................................................88
4.9.
M3 で提供するページ用ベースクラス ...................................................................89
4.9.1.
5.
提供する機能 ...................................................................................................89
アプリケーションのカスタマイズ .................................................................................92
5.1.
検索画面初期表示時に検索結果を表示する ...........................................................92
5.2.
入力値に対する検索条件演算子を変更する ...........................................................94
5.3.
独自の検索条件を追加する.....................................................................................96
5.4.
検索時のデータの取得処理を変更する ..................................................................98
5.5.
登録実行時の検証ロジックを変更する ................................................................100
5.6.
登録処理でのデータ保存時ロジックを変更する..................................................102
3 / 120
5.7.
データベースより取得したデータでプルダウンを作成する................................104
5.8.
M3 を利用して開発する際のエラー処理について ...............................................110
5.8.1.
M3 が提供する例外関連のクラス .................................................................110
5.8.2.
ユーザーインターフェース層でのエラー処理 ..............................................112
5.8.3.
ビジネスロジック層でのエラー処理.............................................................113
5.9.
6.
エラーメッセージを設定ファイルから取得する..................................................113
おわりに .......................................................................................................................120
4 / 120
1. はじめに
1.1.
このドキュメントについて
本書は、M3 を利用して Web アプリケーションを構築する手順をチュートリアル形式で説
明します。本書は以下のような構成になっています。
1章
はじめに
本章です。
2章
プロジェクトの作成
本書で利用するプロジェクトの作成手順について説明します。
3章
コードジェネレータを利用したアプリケーションの作成
データベース定義書、コード定義書、画面定義書といった定義書を作成してコードジェネ
レータで変換し、生成物をプロジェクトに配置する手順について説明します。
4章
生成されたページの説明
前章でコードジェネレータにて作成した登録・検索ページをモデルに、M3 で提供されてい
る主な機能について説明し、検証を行います。
5章
アプリケーションのカスタマイズ
コードジェネレータによって自動生成されたコードをカスタマイズする例を紹介します。
結果として、このチュートリアルでは以下のような知識を得ることができます。
1.
M3 を利用した開発の概要
2.
M3 が提供するデータベース定義書、コード定義書といった各種定義書の記述方法およ
びコードジェネレータの操作方法
3.
コードジェネレータを利用して機能を追加する手順
4.
コードジェネレータが自動生成した Web ページのカスタマイズ方法
5.
M3 が提供するサーバーコントロールに関する知識
6.
データアクセス、入力値検証等 M3 が提供する機能に関する知識
1.2.
表記等
本書の表記について説明します。
5 / 120
1.2.1. パス表記について
本書では、利用するパスは以下のように表記します。
表 1 本書の表記
表記
%M3_HOME%
%DOC_HOME%
1.3.
説明
M3 をインストールしたディレクトリを指します。
「%M3_HOME%¥docs」以下のドキュメントディレクトリを指します。
チュートリアルを読むにあたっての前提条件
このチュートリアルに従い学習を進める上で前提となる環境、知識について説明します。
1.3.1. 環境
1.
M3 をインストール済みであること。インストールされていない場合は「M3 インスト
ールガイド(NET).doc」に従いインストールしてください。
2.
M3 のインストール時に、プロジェクトテンプレート及び Web アプリケーションテン
プレートをインストールしていること。
プロジェクトテンプレート及び Web アプリケーションテンプレートをインストールしてい
ない場合は、インストーラのカスタムセットアップ画面から再度インストールを行ってく
ださい。インストール方法に関しては「M3 インストールガイド(NET).doc」を参照してく
ださい。
3.
Visual Studio 2005 をインストール済みであること。
(Visual Web Developer のみでよ
い)
4.
SQL Server 2000、SQL Server 2005、SQL Server 2005 Express Edition 、Oracle
のいずれかの DBMS をインストール済みであること。
※
なお、Visual Studio 2005、SQL Server 2005 Express Edition は以下のサイトからダウンロード可
能です。
http://www.microsoft.com/japan/msdn/vstudio/express/
5.
必須の前提ではございませんが、ファイルの比較を行う Diff ツールとして WinMerge
をインストールされることを推奨いたします。
※
WinMerge は、以下のサイトからダウンロード可能です。
http://winmerge.org/
6 / 120
1.3.2. 知識
1.
Visual Studio .NET を利用した開発についての知識があること
2.
C#または Visual Basic .NET いずれかの知識があること。
※
C#、Visual Basic いずれの知識も無い場合は以下のサイトを参考にしてください。
http://msdn2.microsoft.com/ja-jp/library/67ef8sbd.aspx(C#)
http://msdn2.microsoft.com/ja-JP/library/90h82b3x.aspx(Visual Basic)
7 / 120
2. プロジェクトの作成
本章では、M3 を利用した Web アプリケーション開発を行うための手順について説明しま
す。
M3 を利用して Web アプリケーション開発を行う場合、以下のような手順になります。
1.
プロジェクトの新規作成
M3 の提供するプロジェクトテンプレートを利用して、.NET のソリューションを作成しま
す。本章で説明します。
2.
データベース作成、接続文字列の変更
データベースの作成と、
利用する DBMS に応じた接続設定を行います。
本章で説明します。
3.
各定義書を作成し、コードジェネレータで変換して生成物をプロジェクトに配置
データベース定義書、画面定義書等の定義書をコードジェネレータを利用してソースコー
ドに変換し、作成したプロジェクトに配置します。3 章にて説明します。
4.
コードジェネレータが自動生成したコードをカスタマイズ
自動生成されたコードを要件に合わせてカスタマイズを行います。4 章、5 章にて説明しま
す。
8 / 120
2.1.
プロジェクトの新規作成
Visual Studio 2005(Visual Web Developer)を起動し、[ファイル]-[新しい Web サイト]
と進むと次のような画面が表示されます。
図 1 M3 のアプリケーションテンプレートを選択
[M3 Web アプリケーション]を選択し、
「場所」に「C:¥Tutorial¥MyApp」を入力して[OK]
を押下します。また、
「言語」のドロップダウンでは、
「Visual C#」
「Visual Basic」のどち
らか利用する言語を選択してください。
図 2 プロジェクト作成
この画面のようにソリューションが表示されればプロジェクトの作成は完了です。
9 / 120
2.2.
データベースの作成、接続設定
本項では、利用する DBMS 別にデータベースの作成と接続設定について説明します。
接続文字列、SQL フォーマッタの変更は、「%DOC_HOME%¥M3 インストールガイド
(NET).doc」の「5.3 接続設定変更手順」で説明を行っていますので、そちらを参照して
ください。
2.2.1. SQL Server 2005 でデータベースを指定、又は、SQL Server 2000 の場合
SQL Server Management Studio を開き、ログイン ID とパスワードを入力して「接続」を
クリックしてください。
データベースの作成
SQL Server Management Studio を開き、ログイン ID とパスワードを入力して「接続」を
クリックしてください。
図 3 ログイン画面
データベースを作成する権限
があれば、SQL Server 認証、
Windows 認証の どちらでも
ログインすると次のようにオブジェクトエクスプローラが開きますので、サーバー名を右
クリック-[新しいクエリ]をクリックしてください。
図 4 新しいクエリをクリック
10 / 120
[新しいクエリ]をクリックすると次のように SQL 実行ウィンドウが開きます。
SQL 実行ウィンドウに以下の SQL を記述し、
「実行」をクリックします。
リスト 1 データベース作成 SQL
CREATE DATABASE Tutorial
図 5
SQL 実行ウィンドウ
SQL を実行し、次のようにオブジェクトエクスプローラに「Tutorial」が表示されればデ
ータベースの作成は終了です。
図 6 テーブル作成完了
11 / 120
接続文字列変更
ソリューションエクスプローラから MyApp¥Web.config を開き、<connectionStrings>タ
グで囲まれた部分を有効にして(
「<!-- -->」でコメントアウトされているので、そのコメン
トアウトを外します)次のように変更します。
リスト 2 変更後の接続文字列
<connectionStrings>
<add name="Default" connectionString="workstation id=サーバー名;data source=サーバー
名;packet size=4096;user id=ユーザー名; password=パスワード;initial catalog=データベ
ース名;persist security info= true/false どちらかを指定;Pooling= true/false どちらかを
指定;" providerName="System.Data.SqlClient" />
</connectionStrings>
また、App_Data¥M3¥m3.config をエディターで開き、ISqlFormatter を指定する行につ
いて次のように修正します。
# Default SQL Formatter
ECOSS.M3.Data.Sql.ISqlFormatter=ECOSS.M3.Data.Sql.SqlServerFormatter
設定で不明な点がある場合は、
「%DOC_HOME%¥M3 インストールガイド(NET).doc」
の「5.3 接続設定変更手順」で説明を行っていますので、そちらを参照してください。
以上で接続文字列の変更は終了です。
12 / 120
2.2.2. Oracle9i、Oracle10g の場合
※
他の方法で既にデータベースを作成された場合は、本項の作業の必要はありません。
接続文字列変更
.NET で Oracle9i、Oracle10g を利用する場合は、Microsoft 社が提供する OracleClient を
利用する方法と、Oracle 社が提供する Oracle Data Provider for .NET を利用する方法があ
ります。ここでは、この 2 つの方法について説明します。
設定で不明な点がある場合は、
「%DOC_HOME%¥M3 インストールガイド(NET).doc」
の「5.3 接続設定変更手順」で説明を行っていますので、そちらを参照してください。
OracleClient を利用する場合
M3 の OracleClient 拡張は、M3.Data.OracleClient.dll で行っています。プロジェクトの
参照に M3.Data.OracleClient.dll、System.DataOracleClient.dll を追加してください。
追加方法については、後述する「.NET アセンブリ参照の追加」をご参照ください。
接続文字列の変更
MyApp¥Web.config を開き、次のように<connectionStrings>要素の内容を変更します。
<connectionStrings>
<add name="Default" connectionString="user id=ユーザー名;data source= SID;password=パ
スワード" providerName="System.Data.OracleClient"/>
</connectionStrings>
SQL フォーマッタの変更
ウェブアプリケーションの App_Data¥M3¥m3.config をエディターで開き、
ISqlFormatter
を指定する行について次のように修正します。
# Default SQL Formatter
ECOSS.M3.Data.Sql.ISqlFormatter=ECOSS.M3.Data.Sql.OracleClientFormatter,M3.Data.Oracl
eClient
Oracle Data Provider for .NET を利用する場合
M3 の Oracle Data Provider for .NET 拡張は、M3.Data.ODP.dll で行っています。プロジ
ェクトの参照に M3.Data.ODP.dll、Oracle 社から提供されている Oracle.DataAccess.dll
を追加してください。
※
Oracle Data Provider for .NET は Oracle 社からダウンロードしてインストールする必要があります。
http://otn.oracle.co.jp/software/tech/windows/odpnet/index.html
13 / 120
接続文字列の変更
MyApp¥Web.config を開き、次のように<connectionStrings>要素の内容を変更します。
<connectionStrings>
<add name="Default" connectionString="user id=ユーザー名;data source= SID;password=パ
スワード" providerName="Oracle.DataAccess.Client"/>
</connectionStrings>
SQL フォーマッタの変更
ウェブアプリケーションの App_Data¥M3¥m3.config をエディターで開き、
ISqlFormatter
を指定する行について次のように修正します。
# Default SQL Formatter
ECOSS.M3.Data.Sql.ISqlFormatter=ECOSS.M3.Data.Sql.OracleODPFormatter,M3.Data.ODP
.NET アセンブリ参照の追加
利用するデータプロバイダに応じて参照を追加します。
ソリューションエクスプローラで Bin を[右クリック]-[参照の追加]をクリックします。
図 7 参照の追加をクリック
14 / 120
[参照の追加]をクリックすると次のような「参照の追加」ダイアログボックスが開きます。
図 8 「参照の追加」ダイアログボックス
利用するデータプロバイダに応じて
OracleClient を利用する場合は「M3.Data.OracleClient」
「System.Data.OracleClient」
Oracle Data Provider for .NET を利用する場合「M3.Data.ODP」
「Oracle.DataAccess」
を選択し、
「OK」をクリックします。
図 9 M3CorLib.dll の置換
このように M3CorLib.dll の置換を確認するダイアログボックスが開きますので、
「はい」
をクリックします。
図 10 M3CorLib.xml の置換
このように M3CorLib.xml の置換を確認するダイアログボックスが開きますので、
「はい」
をクリックします。
15 / 120
参照の追加を実行後、Web.config は、次のように<assemblies>要素の内容が変更されてい
ます。このとき、
「アセンブリの厳密名」を指定するようになっていれば、問題ありません。
<compilation debug="true">
<!-依存アセンブリ >
<assemblies>
<add assembly="System, Version=2.0.0.0, ・・・ Version、Culture、
<中略>
PublicKeyToken 等、省略せずに
<add assembly="M3CorLib"/>
<add assembly="M3.Web"/>
「厳密名」で指定。
<add assembly="M3.Web.UI"/>
<add assembly="M3.Framework"/>
<add assembly="M3.Framework.Web"/>
<add assembly="M3.Data.OracleClient, Version=3.2.708.0,
Culture=neutral, PublicKeyToken=B1BC3962F21A9848"/>
<add assembly="System.Data.OracleClient, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
※
ただし、
参照した結果、
「MyApp¥bin」
フォルダに M3.Data.OracleClient.dll および M3.Data.ODP.dll
が格納された場合は、M3.Data.OracleClient.dll および M3.Data.ODP.dll が<assemblies>要素に追
加されている必要はありません。
以上で参照の追加は終了です。
2.3.
アプリケーションのテスト起動
Visual Studio 2005(Visual Web Developer)の[デバッグ]-[デバッグ開始]をクリックしま
す。ブラウザが起動し、次のような画面が表示されればプロジェクトの作成は完了です。
図 11 起動画面
16 / 120
3. コードジェネレータを利用したアプリケーションの作成
本章ではコードジェネレータを利用して、前章で作成したプロジェクトに「不具合情報マ
スタメンテナンス機能」を追加します。
M3 を利用した開発において機能を追加する場合、データベース定義書、画面定義書といっ
た定義書を作成し、これらの定義書をコードジェネレータで変換し、生成物をプロジェク
トに配置するというフローになります。
要件に合わせてカスタマイズが必要な場合には、その後ロジックの追加を行います。
具体的には、以下のような流れになります。
1.
データベース定義書(3.2.1 データベース定義書作成)の作成。
2.
コード定義書の作成(3.2.2 コード定義書作成)
。
3.
データベース定義書から生成した画面定義書のカスタマイズ
(3.2.3 画面定義書作成)
。
4.
プログラム、設定ファイルの生成(3.3 定義書変換、生成物の配置)
。
5.
アプリケーションのカスタマイズ。
本章では手順に沿って手順 4 までの説明を行い、機能追加に必要な定義書と生成物につい
ての知識とコードジェネレータの利用方法、また、動作させるためには何をどこに配置す
ればよいのかについて学習します。
手順 5 のカスタマイズに関しては「5 アプリケーションのカスタマイズ(P.92)」にて例を示
します。また、本章で作成したアプリケーション、および M3 で提供されている機能につ
いては「4 生成したアプリケーションと機能について(P. 44)」で説明します。
3.1.
追加するサブシステムの概要
追加する「不具合情報マスタメンテナンス機能」の概要を説明します。
不具合情報マスタメンテナンス機能は「不具合情報」テーブルのマスタメンテナンス機能
です。
「%DOC_HOME%¥Support Files¥チュートリアル¥3 章¥データベース設計書.xls」
を開いてください。
17 / 120
図 12 データベース定義書
不具合情報登録機能
不具合情報の登録を行う機能です。「項目名」
「カテゴリ」
「重要度」「不具合内容」といっ
た情報を入力し、登録入力→確認→完了と遷移することによって登録処理を完了します。
不具合情報更新・削除機能
不具合情報の更新または削除を行う機能です。更新対象の不具合情報を検索し、「項目名
(Subject)
」「カテゴリ(Category)」等を入力し、更新入力ページ→更新確認ページ→完
了ページと Wizard 形式で遷移して更新処理を完了します。
または、更新入力画面で「削除」をクリックすると、削除確認ページ→完了ページと Wizard
形式で遷移して、削除処理を実行します。
不具合情報検索機能
不具合情報の検索・詳細閲覧を行う機能です。
「項目名」
「カテゴリ」
「重要度」
「不具合内
容」といった情報で不具合情報を検索し、一覧から不具合情報を選択するとの詳細画面が
表示されます。
18 / 120
3.2.
定義書作成
サブシステム要件が決まったら要件に応じて各定義書を作成します。作成する定義書は以
下の通りです。
1.
データベース定義書
2.
コード定義書
3.
画面定義書
本項では定義書の作成のみを行い、次項でコードジェネレータを利用して変換を行って生
成物を配置します。
3.2.1. データベース定義書作成
データベース定義書はデータベースのスキーマを記述したファイルで、シート毎にテーブ
ルの定義を行います。
M3 においては、データベース定義書はアプリケーション開発の元となる定義書で開発の初
期の段階で作成されることが期待されます。
データベース定義書からは、テーブル作成用の SQL 文、データオブジェクト、テーブル定
義に基づく入力規則定義書が生成されます。
なお、不具合情報テーブルのデータベース定義書が「%DOC_HOME%¥Support Files¥チ
ュートリアル¥3 章」以下に用意されています。今回はこの定義書を利用します。
19 / 120
データベース定義書の内容について
「%DOC_HOME%¥Support Files¥チュートリアル¥3 章¥データベース定義書.xls」を開
いてください。
図 13 データベース定義書
以降、簡単に定義内容について確認します。詳細については「%DOC_HOME%¥技術ドキ
ュメント¥M3 定義書とコードジェネレータ利用方法.doc」の「2 データベース定義書変換」
を参照してください。
テーブル定義
テーブル ID(E2)
データベースのテーブル名(物理名)として「BugItem」を指定しています。
この値がデータベースのテーブル名として利用され、既定ではデータオブジェクトのクラ
ス名としても利用されます。(テーブル概要(D3)でクラス名を明示的に指定する場合は、
そちらの方が優先されます。)
テーブル名(I2)
表示用のテーブル名(論理名)として「不具合情報」が指定されています。
この定義がデータオブジェクトクラスのコメントといった表示で利用されます。
20 / 120
テーブル概要(D3)
テーブルに関するコメントを記述しますが、生成されるデータオブジェクト名を明示的に
指定する場合は、
「プログラム名(クラス名) 」の形式でクラス名を指定可能です。
列定義
カラム ID(B 列)
データベースの列名を指定しています。例えば「B6」では「BugID」を列名として指定し
ています。
この値がデータベースの列名として利用され、データオブジェクトのプロパティ名として
も利用されます。
カラム名(E 列)
列名に対応する表示名を指定します。例えば「E6」では「不具合 ID」を指定しています。
この値は、データオブジェクトのプロパティに対するコメントとして利用され、入力規則
生成時には項目名として利用されます。
型(I 列)
列の型を指定しています。この設定はデータベースの列の型として利用され、データオブ
ジェクトのプロパティの型、入力規則の型としても利用されます。例えば「I6」では int と
指定しているために、データオブジェクトのプロパティの型は「Int32」型になり、数値型
の入力規則定義が生成されます。
長さ(J 列)
列の長さを指定します。この設定はデータベースの列の長さとして利用されると共に、デ
ータオブジェクト、入力規則生成時の制約としても利用されます。
例えば「J8」では型を「varchar」長さを「255」と指定しています。この場合データオブ
ジェクトの対象列の RawType 属性には「varchar(255)」が設定され、入力規則の対象列の
最大長は「255」が設定されます。
NULL(K 列)
NULL 可の場合は「○」と指定します。NULL 不可の場合は何も記入しません。
この設定はデータベースの NULL 可・不可に利用されると共に、データオブジェクト、入
力規則生成時の制約としても利用されます。
P-KEY(L 列)
プライマリキーを指定します。単独プライマリキーの場合は「1」を記入し、複合プライマ
21 / 120
リキーの場合は1からの序数(1,2・・・)を記入します。
この設定はデータベースのプライマリキー設定に利用されると共に、データオブジェクト
生成時(ロード時)の引数としても利用されます。
U-IDX(M 列)
ユニークインデックス毎に「1-1」
、
「1-2」のように1つ目の数字をペア毎に同じにして指定
します。
この設定は、インデックス作成用の SQL 生成に利用されます。またプライマリキーが設定
されていない場合は、データオブジェクト作成時のキー列として利用されます。
INDEX(N 列)
インデックス毎に「1-1」,「1-2」の様に1つ目の数字をペア毎に同じにして指定します。
この設定は、インデックス作成用の SQL 生成に利用されます。
外部テーブル(O 列)
外部キーを設定する場合、参照するテーブルのテーブル ID(E2)を指定します。この設定
は、テーブル作成用の SQL 文生成時の外部制約生成のために利用されます。
参照列(P 列)
外部キーを設定する場合、参照する列のカラム ID(B 列)を指定します。この設定は、テ
ーブル作成用の SQL 文生成時の外部制約生成のために利用されます。
既定値(Q 列)
データ登録、更新時の初期値を指定します。例えば「重要度」にあたる「Q9」列では「5」
を指定しています。この場合、重要度の初期値が「5」であるようにデータオブジェクトに
設定されます。
また、決められた文字列を指定することにより、データオブジェクトが保存時に動的に設
定する既定値として利用されます。
22 / 120
指定可能な既定値は以下の通りです。
表 2 設定可能な既定値
既定値
IDENTITY
作成日
更新日
現在日
説明
データ追加時に自動生成の ID 値を設定します。
データ追加時に現在日時を設定します。
データ更新時に現在日時を設定します。
データ追加、更新時に現在日時を設定します。
備考(R 列)
コメントとして決められた形式で設定することにより、データオブジェクト生成時の動作
を変更できます。以下に設定可能な主要なコメントを示します。
※
なお、その他設定可能なコメントについては「%DOC_HOME%¥技術ドキュメント¥M3 定義書とコ
ードジェネレータ利用方法.doc」の「2 データベース定義書変換」を参照してください。
表 3 設定可能なコメント
コメント
プログラム名(名前)
コード(名前)
列挙値(型名)
シーケンス名(名前)
説明
生成されるデータオブジェクトの対象列のプロパティ名に、(名前)に指定した
値が利用されます。指定がない場合はカラム ID をそのままプロパティ名とし
て利用します。
生成されるデータオブジェクトの対象列が、(名前)に指定したコード定義と紐
付けられます
生成されるデータオブジェクトの対象列の型として、(型名)に指定した列挙型
が利用されます。
生成されるデータオブジェクトの ID 列の値として、シーケンスを利用する場合
は(名前)に指定した値が利用されます。この機能は SQL Server ではサポー
トされていません。
23 / 120
3.2.2. コード定義書作成
コード定義とは、データベースの値とアプリケーションで利用する定数値、表示用の文字
列のマッピングを管理するための機能です。
例えば、「表 4 コード定義例(会員ステータス)」のような会員ステータスを例にすると、
データベースの値である 0 は、プログラムからは Temp という定数でアクセスされ、表示
時には「仮登録中」と表示される必要があります。
表 4 コード定義例(会員ステータス)
DB の値
0
1
2
3
定数名
Temp
Regular
Cancel
Black
表示文字列
仮登録中
通常登録
退会
ブラックリスト会員
コード定義書とは、データベースの値とアプリケーションで利用する定数値、表示用の文
字列のマッピングを定義するファイルになります。
実際の開発ではコード定義書は手作業で作成することになりますが、不具合管理機能用の
コード定義書が「%DOC_HOME%¥Support Files¥チュートリアル¥3 章」以下に用意され
ています。今回はこの定義書を利用します。
コード定義書の内容について
コード定義.xls を開いてください。コード定義書には不具合管理テーブルの「カテゴリ」
「重
要度」
「ステータス」にあたるコードと表示値を定義しています。
「コード」はデータベー
スに登録される値となり、
「名称」はユーザーインターフェースに表示される文言となりま
す。
24 / 120
図 14 コード定義書
以降、簡単に定義内容について確認します。詳細については「%DOC_HOME%¥技術ドキ
ュメント¥M3 定義書とコードジェネレータ利用方法.doc」の「8. コード定義書変換」を参
照してください。
ヘッダ部分
名前空間(D2)
生成される列挙型のクラスの名前空間を指定します。
項目定義部分
コード名称(B 列)
このコードの表示名を指定します。プログラム、設定ファイルでは表示名として利用され
ます。
コード ID(C 列)
プログラムでコード定義にアクセスする際の ID として利用されます。
例えば「C6」では「BugSeverity」と指定していますが、これは生成される列挙型クラス
のクラス名として利用され、プログラムでコードを指定する際にこの値を利用します。
25 / 120
型(D 列)
項目を表現する時の型を「列挙」
「数値」
「文字列」
「データ」から選択します。例えば「D12」
では「文字列」を指定していますが、この場合コードの値は、文字列型として利用されま
す。
コード(E 列)
項目のコード値を指定します。この値は「型(D 列)
」が文字列の場合は、文字列として扱
われ、列挙、数値の場合は数値として扱われます。データの場合は取得されたデータの型
に対応します。
例えば「E6、F6」では、コードが「9」、名称が「致命的」と指定されています。この場合、
ユーザーインターフェースで「致命的」を選択するとデータベースには「9」が保存されま
す。
名称(F 列)
項目の表示値を指定します。ユーザーインターフェースに表示される値になります。
定数名(G 列)
プログラムでアクセスする要素名、または列挙型のクラスのフィールド名になります。
例えば「G12」では定数名を「BackUI」
、コードを「BU」と定義していますが、この場合
定数値定義クラスでは、以下のように定義されます。
public sealed class BugCategory
{
/// <summary>
/// バックオフィス UI
/// </summary>
public const String BackUI = "BU";
・・・
備考(H 列)
コメントで利用されますが、
「表示のみ」と指定すると列挙型クラスが生成されません。
また「型(完全名)
」で生成される定義クラスの完全名を明示的に指定することが可能です。
※
「型」で「データ」を指定した場合、項目をデータベースから取得します。カスタマイズ例が「5.7
データベースより取得したデータでプルダウンを作成(P.104)」で紹介されていますので、設定例につ
いてはそちらを参照してください。
26 / 120
コード定義をデータベース定義書に反映
コードを定義した後には、コード定義とデータベースの列を結びつける必要があります。
このことにより、データベースの型、生成される入力規則がコード定義に従ったものとな
ります。
コードの型が「列挙値」の場合は、コードを結びつけるほかに列の型として定義された列
挙型を結びつけることが可能です。
今回は、データベース定義書の「カテゴリ」
「重要度」
「ステータス」の備考欄にコード定
義と列挙値定義を結び付けます。後で読む人のために、コードの値と表示名を備考に記述
することをお勧めします。
表 5 データベース定義書に設定するコード定義の内容
DB の列
Category
Severity
Status
備考の設定内容
コード(BugCategory)。BU:バックオフィス UI、FU:フロント UI、JB:ビジネスロジック、
M3:M3、NT:[.NET フレームワーク]、DB:データベース
コード(BugSeverity)。列挙値(MyApp.Data.Tutorial.BugSeverity)。9:致命的、7:重大、5:通
常、3:通常より低い、1:ささいな問題、0:提案
コード(BugStatus)。列挙値(MyApp.Data.Tutorial.BugStatus)。0:登録済み、1:再オープ
ン、3:修正中、5:修正済み、8:修正しない(仕様)、9:無効
27 / 120
3.2.3. 画面定義書作成
画面定義書は、検索、登録、更新といった処理で、画面に表示する入力項目、入力形式、
表示形式といったユーザーインターフェースを定義するファイルです。
画面定義書はデータベース定義書から雛形が自動生成されますので、まず雛形を作成し、
それを実際に作成する画面に合わせてカスタマイズするという手順になります。
データベース定義書から画面定義書の作成
データベース定義書から画面定義書の雛形を作成する場合にはコードジェネレータの「Web
アプリケーション画面定義書生成」を利用します。
図 15 コードジェネレータ(画面定義書雛形生成)
表 6 画面定義書雛形生成時の設定
項目
Namespace
入力値
MyApp.Data.Tutorial
ExcelFile
Language
%DOC_HOME%¥Support Files¥チュ
ートリアル¥3 章¥データベース定
義書.xls を指定
CSharp
NamingMethod
Normal
CapitlizeWords
指定なし
SingularizeTables
False
28 / 120
説明。
データクラスの名前空間を指定しま
す。
変換する Excel ファイルを指定します。
生成するコードの言語を指定します。
CSharp、VB の 2 種類があります。
定義書の「テーブル名」「カラム名」か
ら、「データクラス名」、「フィールド名」
を生成する方法を指定します。
「データクラス名」「フィールド名」生成
時に、大文字のまま出力したい語を指
定します。
複数形のテーブル名を単数形に変更
FileName
WebMaster.xls
DBMS
利用する DBMS に応じて
「SQLServer」「SQLServer2005」ま
たは「Oracle」を選択
するかどうかを指定します。
出力される画面定義書雛形のファイル
名を指定します。
利用する DBMS を指定します。
上表のように設定し、変換を行うと画面定義書(WebMaster.xls)が生成されます。
画面定義書の内容について
画面定義書(WebMaster.xls)を開いてください。
図 16 生成された画面定義書雛形
以降、簡単に定義内容について確認します。詳細については「%DOC_HOME%¥技術ドキ
ュメント¥M3 定義書とコードジェネレータ利用方法.doc」の「4.1.Wizard 形式マスタメン
テ画面生成」を参照してください。
ヘッダ部分
ID(C1)
生成される ASPX ファイル及び入力規則で利用するための識別子として利用されます。
例えば、ここでは「BugItem」を指定していますが、この場合、
「BugItemRegister.aspx」
「 BugItemSearch.aspx 」 と い っ た ASPX フ ァ イ ル と 「 BugItemRegister.UI 」
「BugItemSearchUI」といった入力規則が生成されます。
29 / 120
テーブル名(C2)
生成するユーザーインターフェースが対応するテーブルとして「BugItem」を指定していま
す。画面生成時にデータを取得するテーブルを特定するために利用されます。
ASPX パス(C3)
ASPX ファイルのパスを指定します。生成された定義書では「/Auth/」となっています。生
成される ASPX ファイルは「/Auth/BugItemSearch.aspx」でアクセスされます。今回は、
この値を「/Tutorial/」に修正します。
キャプション(F2)
ユーザーインターフェースで利用される、対応テーブル(
「テーブル名」で指定したテーブ
ル)の表示名として「不具合情報」を指定しています。この場合、ユーザーインターフェ
ースでは「不具合情報登録」
「不具合情報検索」等と表示されます。
ページベースクラス(K1)
生成される ASPX ファイルの派生元となるクラスを完全修飾名で指定しています。
データクラス(K2)
テーブルに対応するデータオブジェクト(
「3.3.1 データベース定義書変換、生成物の配置」
にて生成されます)を完全修飾名で指定しています。
マスターページ(K3)
作成するページがマスターページを利用する場合には、マスターページのパスを指定しま
す。
列定義部分
列名(B 列)
データベースの列名を指定しています。データベースの列とデータオブジェクトのプロパ
ティ名が異なる場合はプロパティ名を指定します。
例えば、B8 では「BugID」と指定していますが、この設定はコントロールの ID に反映さ
れ、入力コントロールの ID は「inBugID」といった ID になります。
キャプション(C 列)
ユーザーインターフェースで表示される項目名として表示されます。またエラーメッセー
ジの項目名としても利用されます。
例えば、C8 では「不具合 ID」と指定していますが、この設定は生成されたユーザーインタ
30 / 120
ーフェースの項目名として利用され、入力エラー時には「不具合 ID を確認してください。
」
といた形でエラーメッセージを作成するのにも利用されます。
型(D 列)
テーブルの列の型を指定しています。入力規則の型としても利用されます。
例えば「D8」では「Int32」と指定しているため、不具合 ID は数値型であるとの入力規則
定義が生成されます。
長さ(E 列)
テーブルの列の長さ(String の場合に有効)を指定しています。
例えば「E9」では「32」を指定しているため、「項目名」の最大長は「32」であるとの入
力規則定義が生成され、入力コントロールの入力最大長も 32 と設定されます。
必須(F 列)
必須項目であるかどうかを指定します。
例えば「F9」では「○」を指定しているため、
「項目名」は必須項目であるとの入力規則定
義が生成されます。
コード定義(G 列)
利用するコード ID(コード定義書で定義したコード定義のコード ID)を指定します。
コード定義を指定している場合は、入力時のドロップダウンリスト等の選択リストの項目
としてコードを利用し、表示時にもコードの表示名を表示します。
KEY(H 列)
データベース定義上、対象の列が主キー列の場合には「1」を指定します。複合キーの場合
はキーとなる列毎に「1」
、
「2」
、
「3」と複合キーの順序を指定します。
検索(I 列)
検索画面における表示形式を指定します。指定がない場合は検索項目としては利用しませ
ん。例えば「I9」では「TextLike」を指定しているため、検索画面では不具合 ID はテキス
トボックスによる入力で、LIKE 検索を行います。
一覧(J 列)
一覧画面に表示させるかどうかを指定します。例えば「J12」では「○」を指定しているた
め、ステータスは一覧画面に表示さます。表示しない場合は、何も指定しません。
31 / 120
詳細(K 列)
詳細画面に表示させるかどうかを指定します。例えば「K20」では「○」を指定しているた
め、最終更新日は詳細画面に表示されます。表示しない場合は、何も指定しません。
登録(L 列)
登録画面における表示形式を指定します。指定がない場合は登録画面で入力項目として表
示されせん。例えば「L9」では「TextBox」を指定しているため、登録画面では項目名はテ
キストボックスによる入力となります。
更新(M 列)
更新画面における表示形式を指定します。指定がない場合は更新画面で入力項目として表
示されせん。例えば「M9」では「TextBox」を指定しているため、更新画面では項目名は
テキストボックスによる入力となります。
備考(N 列)
「行バージョン」と指定すると、対象列を行バージョン列として扱います。行バージョン
列は、更新時に元となるデータベースのデータが更新されたかを検証する際に、比較する
ために利用する列です。
画面定義書のカスタマイズ
本来ならば、業務要件に合わせて生成された画面定義書をカスタマイズしますが、今回は
カスタマイズを加えた画面定義書が「%DOC_HOME%¥Support Files¥チュートリアル¥3
章¥画面定義書(変更後).xls」にあります。
こちらをそのまま利用します。生成された画面定義書からの変更点は背景がピンクになっ
ています。変更前の画面定義書と見比べてください。
32 / 120
3.3.
定義書変換、生成物の配置
本項では、前項で作成した定義書をコードジェネレータにて変換して生成物を配置し、実
際に動作までを行います。
3.3.1. データベース定義書変換、生成物の配置
データベース定義書はコードジェネレータの「データベース定義書変換」にて変換を行い
ます。
※
データベース定義書変換についての詳しい説明は「%DOC_HOME%¥技術ドキュメント¥M3 定義書
とコードジェネレータ利用方法.doc」の「2 データベース定義書変換」を参照してください。
図 17 コードジェネレータ(データベース定義書変換)
表 7 データベース定義書変換時の設定
項目
ErrorMessageTemplate
入力、選択値
指定なし
Namespace
ExcelFile
MyApp.Data.Tutorial
%DOC_HOME%¥Support
Files¥チュートリアル¥3 章¥デ
ータベース定義書.xls
CSharp
Language
33 / 120
説明
今回は指定しませんが、エラーメッセー
ジのテンプレートを入力します。なお、
「{0}」はフィールド名、「{1}」はフィールドの
表示文字列、「{{0}}」は入力値、「{{1}}」は
エラーの詳細メッセージに置換されま
す。
データクラスの名前空間を指定します。
変換するデータベース定義書を指定しま
す。
生成するコードの言語を選択します。
CSharp、VB の 2 種類があります。
OutPutCharset
NamingMethod
shift_jis
Normal
CapitlizeWords
指定なし
SingularizeTables
False
CreateInputRule
False
CreateCode
True
CreateSQL
True
DBMSCharset
shift_jis
DBMS
利用する DBMS に応じて
「SQLServer」
「SQLServer2005」または
「Oracle」を選択
String[] 配列
Connections
出力ファイルの文字コードを指定します。
定義書の「テーブル名」「カラム名」から、
「データクラス名」、「フィールド名」を生成
する方法を指定します。
「データクラス名」「フィールド名」生成時
に、大文字のまま出力したい語を指定し
ます。
複数形のテーブル名を単数形に変更す
るかどうかを指定します。
入力規則定義(Excel)を生成するかどう
かを指定します。
データオブジェクトを生成するかどうかを
指定します。
テーブル作成の SQL を生成するかどう
かを指定します。
DBMS が使用する文字コードを指定しま
す。
利用する DBMS を指定します。
使用する接続のリストを指定します。
上表のように設定し変換を行うと次のようなファイル、ディレクトリが生成されますので
それぞれ「配置先」に示したディレクトリに配置してください。
表 8 データベース定義書変換時の生成物
生成物
DataClasses
DataClasses¥Base
sql
説明
データアクセス用のクラスを生成し
ます。
データアクセス用のクラスのベース
クラスを生成します。
テーブルおよびインデックス生成、
削除用の SQL 文が出力されます。
配置先
MyApp/App_Code/Data
MyApp/App_Code/Data/Base
配置しません
テーブルの作成で使用します。
テーブルの作成
データベース定義書変換時に生成された CreateTable.sql を利用して、
「2.2 データベースの
作成、接続設定」で作成したデータベースにテーブルを作成します。
SQL Server 2005 でデータベースを指定する場合及び、SQL Server 2000 の場合
本書では、テーブル作成の手順として SQL Server Management Studio を利用した作成手
順を説明します。他のツールをご利用の際は、読み替えて作成してください。
34 / 120
SQL Server Management Studio を開き、ログイン ID とパスワードを入力して「接続」を
クリックしてください。
図 18 ログイン画面
ログインすると次のようにオブジェクトエクスプローラが開きますので、
「Tutorial」を右
クリック-[新しいクエリ]をクリックしてください。
図 19 新しいクエリをクリック
[新しいクエリ]をクリックすると次のように SQL 実行ウィンドウが開きます。
35 / 120
図 20
SQL 実行ウィンドウ
SQL 実行ウィンドウにデータベース定義書変換時に生成された CreateTable.sql をドロッ
プして「実行」をクリックします。
図 21 SQL 実行完了
正常に SQL が実行された旨のメッセージが表示され、BugItem テーブルが作成されればテ
ーブルの作成は終了です。
Oracle を利用する場合
SQL*Plus 等を利用し、データベース定義書変換時に生成された CreateTable.sql を実行し
てください。
36 / 120
3.3.2. コード定義書変換、生成物の配置
コード定義書はコードジェネレータの「コード定義書変換」にて変換を行います。
※
コード定義書変換の詳しい説明については「%DOC_HOME%¥技術ドキュメント¥M3 定義書とコー
ドジェネレータ利用方法.doc」の「8. コード定義書変換」を参照してください。
図 22 コードジェネレータ(コード定義書変換)
表 9 コード定義書変換時の設定
項目
ProgramCharset
shift_jis
入力、選択値
AppConfigCharset
utf-8
ExcelFile
Language
%DOC_HOME%¥Support
Files¥チュートリアル¥3 章¥コ
ード定義書.xls
CSharp
Program
True
AppConfig
True
説明
生成される列挙型クラスの文字コードを指
定します。
コード定義ファイル(.config ファイル)の文
字コードを指定します。
変換するコード定義書を指定します。
生成される列挙型クラスの文字コードを指
定します。
列挙型クラスを生成するかどうかを指定し
ます。
コード定義ファイル(.config ファイル)を出力
するかどうかを指定します。
上表のように設定し変換を行うと次のようなファイル、ディレクトリが生成されますので
それぞれ「配置先」に示したディレクトリに配置してください。
表 10 コード定義書変換時の生成物
生成物
codes/列挙型クラス
codes/M3Code.conf
ig
説明
列挙型クラスが生成されています。
コード定義に対応するアプリケーション
設定です。
37 / 120
配置先
MyApp/App_Code/Data
MyApp/App_Data/M3/appconfig
3.3.3. 画面定義書変換、生成物の配置
画面定義書はコードジェネレータの「Web ページ作成(カスタマイズ)」の「Wizard 形式マ
スタメンテ画面生成」にて変換を行います。
※
画面定義書変換の詳しい説明については「%DOC_HOME%¥技術ドキュメント¥M3 定義書とコード
ジェネレータ利用方法.doc」の「5.1 Wizard 形式マスタメンテ画面生成」を参照してください。
図 23 コードジェネレータ(画面定義書変換)
表 11 画面定義書変換時の設定
項目
入力、選択値
Charset
shift_jis
ExcelFile
作成した画面定義書.xls
Language
CSharp
CreateInputRule
InputRuleType
True
UI
説明
出力ファイルの文字コードを指定しま
す。
変換する画面定義書を指定します。
生成するコードの言語を指定します。
CSharp、VB の 2 種類があります。
入力規則定義書を出力するかどうか
ユーザーインターフェースで利用され
る入力規則定義(Excel)の生成に関す
る設定を行います。
上表のように設定し変換を行うと次のようなファイル、ディレクトリが生成されますので
それぞれ「配置先」に示したディレクトリに配置してください。
38 / 120
表 12 画面定義書変換の生成物
生成物
Pages/ASPX ファイ
ル
Pages/コードビハイ
ンドグラス
Pages/UIInputRule.
xls
Pages/Web.sitemap
説明
表示用の APX ファイルが出
力されます。
ASPX ファイルのコードビハ
インドクラスが出力されま
す。
ASPX 用の入力規則定義書
です。
作成したページに関するサ
イトマップです。
配置先
MyApp/Tutorial
MyApp/Tutorial
配置しません
入力規則定義書変換で使用します
MyApp/Tutorial 直下
3.3.4. 入力規則定義書変換、生成物の配置
1.入力規則の変更
画面定義書から生成された UIInputRule.xls を利用します。
今回は、登録、更新に関してはデータオブジェクトの列定義を元に実行時に自動的に作成
された入力規則定義書を利用するために、
「不具合情報検索 UI」以外のシートを削除します。
また、成果物としてわかりやすいように、
「画面入力規則定義書.xls」とリネームします。
不要なシートを削除した後の入力規則定義書は「%DOC_HOME%¥Support Files¥チュー
トリアル¥3 章¥画面入力規則定義書.xls」にあります。参考にしてください。
39 / 120
2.入力規則の生成・配置
「画面入力規則定義書.xls」をコードジェネレータの「入力規則定義書変換」にて変換しま
す。
※
入力規則定義書変換方法については「%DOC_HOME%¥技術ドキュメント¥M3 定義書とコードジェ
ネレータ利用方法.doc」の「6. 入力規則定義書変換」を参照してください。
図 24 コードジェネレータ(入力規則定義書変換)
表 13 入力規則定義書変換時の設定
項目
ExcelFile
Platform
入力、選択値
画面定義書変換時に生成された
UIInputRule.xls
Net
説明
変換する入力規則定義書
を指定します。
M3 のプラットフォームを指
定します。
上表のように設定し変換を行うと次のようなファイル、ディレクトリが生成されますので
それぞれ「配置先」に示したディレクトリに配置してください。
表 14 入力規則定義書変換の生成物
生成物
Runtime/inputrule
説明
入力規則定義ファイルが出
力されます。
配置先
MyApp/App_Data/M3/runtime/inputrule
以上でファイルの生成、配置は終了です。
40 / 120
3.4.
アプリケーションの起動
3.4.1. サイトマップの変更
「3.3.3 画面定義書変換、生成物の配置 (P. 38)」で生成されたサイトマップと Web アプリ
ケーションのルートディレクトリのサイトマップを関連付けるために、ルートのサイトマ
ップファイルを変更します。
ソリューションエクスプローラで「MyApp¥Web.sitemap」を選択してください。
図 25 サイトマップファイルの変更
選択されたファイルを以下のように変更してください。
<?xml version="1.0" encoding="utf8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMapFile1.0" >
<siteMapNode url="‾/Default.aspx" title="トップ" description="既定のページ">
<siteMapNode siteMapFile="‾/Tutorial/Web.sitemap" />
</siteMapNode>
</siteMap>
3.4.2. 動作確認
Visual Studio 2005(Visual Web Developer)で[ビルド]-[Web サイトのビルド]を行い、[デ
バッグ]-[デバッグ実行]をクリックするとアプリケーションが起動します。
起動後に表示されるブラウザには、トップページが表示されます。上部のメニューから「不
具合情報の管理」を選択して、登録、更新、検索の各機能について一通り、動作をご確認
ください。
41 / 120
図 26 トップページから不具合情報管理機能への遷移
図 27 作成したアプリケーションを起動(画像は検索画面)
Web アプリケーションが動作しない場合には
プロジェクトでコンパイルエラーが発生した場合には、「%DOC_HOME%¥Support
Files¥チュートリアル¥3 章¥SQLServer/Oracle¥CSharp/VB¥MyApp」に、このフェ
ーズまで作業を行ったプロジェクトが存在します。こちらを参考にして修正してくだ
さい。
※
このプロジェクトを直接利用する場合は、
「2.2 データベースの作成、接続設定 (P. 10)」を参考にし
て接続文字列を変更してください。
アプリケーション実行中に「処理に失敗しました」とエラーが表示される場合には
「図 28 想定外のエラーが発生した場合のメッセージ」のような画面が出る場合は、アプ
リケーションで想定外のエラーが発生している可能性があります。
42 / 120
Visual Studio の出力ウィンドウでログを確認してエラー内容を確認してください(図 29
想定外のエラーが発生した場合の出力ウィンドウ)
。ちなみに下記エラーはデータベース接
続時のエラーです。接続文字列を確認し、修正してください。
図 28 想定外のエラーが発生した場合のメッセージ
図 29 想定外のエラーが発生した場合の出力ウィンドウ
どうしても解決しない場合は、「%DOC_HOME%¥Support Files¥チュートリアル¥3 章
¥SQLServer/Oracle¥CSharp/VB¥MyApp」のプロジェクトを利用して動作確認してくだ
さい。
※
このプロジェクトを利用する際には、
「2.2 データベースの作成、接続設定 (P. 10)」を参考にして接
続文字列を変更してください。
※
それでも解決しない場合は、データベース接続に失敗したか、チュートリアルの動作に必要な環境が
インストールされていない可能性があります。必要な環境に関しては、
「1.3.1 環境 (P. 6)」を参考に
してください。
43 / 120
4. 生成したアプリケーションと機能について
本章では、前章までにコードジェネレータにて作成した登録・検索ページをモデルに、M3
で提供されている主な機能について説明し、検証を行います。
本章は、大きく以下の項に分けられます。
M3 を利用した ASPX ページの構成
作成した登録・検索 ASPX ページの構成、ページ内で利用されている M3 のサーバーコン
トロールについて説明します。
フロー制御機能
「不具合情報登録画面」のような「入力→確認→完了」といった画面遷移の制御を、M3 で
は、どのように実現しているかについて説明します。
ページセッション機能
M3 を利用した Web アプリケーションのセッション管理で利用している、ページセッショ
ン機能について説明します。
データアクセス機能
M3 で提供するデータベースへのアクセスを伴う処理に関する機能について説明します。
入力値の管理
M3 を利用した Web アプリケーションでのユーザーインターフェースからの入力値の操作
方法のの概要、および入力値の操作で利用する「入力値グループ化コントロール」、
「デー
タアクセッサ」について説明します。
入力値の検証機能
M3 では、ユーザーインターフェースからの入力値の検証を「入力規則機能」を利用して行
っています。
「入力規則機能」が利用する入力規則・差分入力規則についてと、利用するサ
ーバーコントロールについて、それぞれ説明します。
44 / 120
検索条件の作成・検索結果の表示機能
M3 では、ユーザーインターフェースからの入力値を元に、自動的に検索条件を作成するサ
ーバーコントロールを提供しています。
これらのサーバーコントロールの概要、およびデータベース非依存の検索条件を表す検索
条件クラスについて説明します。
UI コントローラ
Web アプリケーションにおける「入力値を取得→検証→登録処理」
、
「入力値を取得→検索
条件生成→SQL 実行→データ表示」といった定型的な処理を提供する「UI コントローラ」
について概要を説明します。
M3 で提供するページ用ベースクラス
M3 を利用して Web アプリケーションを開発する場合、通常 ASPX ページは、M3 が提供
しているページ用ベースクラスを継承します。ページ用ベースクラスで提供する機能およ
びユーティリティメソッドについて説明します。
45 / 120
4.1.
M3 を利用した ASPX ページの構成
作成した登録・検索 ASPX ページの構成、ページ内で利用されている M3 のサーバーコン
トロールについて説明します。
4.1.1. 登録ページの構成
登録ページの構成と利用されているコントロールの概要について説明します。まず、Visual
Studio で不具合情報登録入力画面(BugItemRegister.aspx)を開いてください。
デザインビューでは「図 30 不具合情報登録入力画面(デザインビュー)」のような表示
になります。
図 30 不具合情報登録入力画面(デザインビュー)
③ ウィザードコントローラ
・ フロー制御
・ ページセッション管理
② データ生成・管理コントローラ
・ データの初期化
・ 入力値の管理
-----------------------------------
中略
----------------------------------------① 入力値グループ化コントロール
・入力値をグルーピングして一括取得・設定
以下に、主要なサーバーコントロールについて概要を説明します。
① 入力値グループ化コントロール(InputCaptionPanel)
InputCaptionPanel は、配下にある入力用コントロールへの入力値をグルーピングして保
持するコントロールです。
「4.5 入力値の管理(P. 62)」で説明します。
② データ生成・管理コントローラ(DataCreateController)
DataCreateController は、登録ページにおける初期値の設定、入力値の取得の処理を自動
化している「UI コントローラ」です。
「4.8.1 DataCreateController コントロール(P. 85)」
で説明します。
46 / 120
③ ウィザードコントローラ(WizardController)
WizardController は、入力→確認→完了といったフロー(処理単位)の管理やページのイ
ンデックス管理、また、フロー内におけるセッション管理を行う「UI コントローラ」です。
「4.2 フロー制御機能(P.49)」で説明します。
4.1.2. 検索ページの構成
検索ページの構成と利用されているコントロールの概要について説明します。まず、Visual
Studio で不具合情報検索画面(BugItemSearch.aspx)を開いてください。
デザインビューでは「図 31 不具合情報検索画面(デザインビュー)」のような表示にな
ります。
図 31 不具合情報検索画面(デザインビュー)
① 検索コントローラ
・ 検索の実行
・ 入力値のクリア
・ 検索条件の復元
② 検索用グループ化コントロール
・ 入力値から検索条件の作成
-------------------------
中略
-----------------------------③ テーブルデータソースコントロール
・ データの取得
④ M3 リピータコントロール
・ データの表示
以下に、主要なサーバーコントロールについて概要を説明します。
① 検索コントローラ(SearchController)
SearchController は、検索実行、入力値のクリア、ソートの実行などのイベント処理や、
データの取得・一覧表示処理を自動化している「UI コントローラ」です。
47 / 120
「4.8.2 SearchController コントロール(P. 86)」で説明します。
② 検索用グループ化コントロール(FindCaptionPanel)
FindCaptionPanel は、配下にある検索条件入力用コントロールをグルーピングし、それら
の入力値から検索条件の作成を行うコントロールです。
「4.7.2 検索条件用サーバーコントロール(P. 79)」で説明します。
③ データソースコントロール(TableDataSource)
TableDataSource は、FindCaptionPanel が生成した検索条件を元にデータを取得するため
のデータソースコントロールです。
「4.7.3 検索結果表示用サーバーコントロール(P. 84)」で説明します。
④ リピータコントロール(M3Repeater)
M3Repeater は、TableDataSource が取得したデータを表示するコントロールです。
「4.7.3 検索結果表示用サーバーコントロール(P. 84)」で説明します。
48 / 120
4.2.
フロー制御機能
「不具合情報登録」画面における「入力→確認→完了」ページ遷移の制御を例に、M3 が提
供するフロー制御機能について説明します。
4.2.1. フロー制御機能とは
M3 では、今回作成した「不具合情報登録」用ページのような複数ページにまたがるページ
遷移において、正しい順序でページにアクセスすることを保証するための「フロー制御機
能」を提供しています。
「不具合情報登録」用ページのように、ウィザード形式でデータを登録する場合は、
「登録
入力→内容確認→登録完了」という流れになり、各ページのアクセス順序を制限する必要
があります。そこで、フロー制御機能を利用すると、入力ページをスキップして、直接、
確認ページにアクセスした場合には、自動的に入力ページに戻すことが可能になります。
フロー制御機能は、次項で説明するページセッション(P. 52)と連携しており、
「図 32 フロ
ー制御イメージ」のように、ASPX ページのインデックスと、セッションに保存されたユー
ザーが現在アクセス中のページのインデックスを比較することにより、フロー制御を行い
ます。
「図 32 フロー制御イメージ」を例に説明すると、ユーザーが登録入力画面で不具合登録
完了ページに直接アクセスした場合は、
不具合登録完了画面の
ページのインデックス
(2)
ユーザーが現在アクセス中の
>
ページのインデックス
(0)
上記のように、ユーザーが現在アクセス中のページのインデックスが小さいために、前の
ページ(不具合登録確認画面)に戻されます(①)
。不具合登録確認画面のページのインデ
ックスは1のために、再度前のページに戻され、最終的に不具合情報入力ページに戻され
ます(②)
。
図 32 フロー制御イメージ
直接アクセスは不可
不具合登録入力
不具合登録確認
不具合登録完了
フロー: BugItemRegister
インデックス: 0
フロー: BugItemRegister
インデックス: 1
フロー: BugItemRegister
インデックス: 2
②
①
49 / 120
4.2.2. WizardController コントロール
フロー制御は、M3 が提供するサーバーコントロールの WizardController コントロールを
利用して行います。
WizardController は、UI コントローラ(P. 85)の一種で、ページセッション及びフローを管
理するためのコントローラです。WizardController は、ページのインデックス(FlowIndex
プロパティ)、フロー(処理)名(FlowName プロパティ)、次の遷移先(NextPath プロパテ
ィ)等のプロパティを持っています。
図 33
WizardController のプロパティ
WizardController は不具合情報登録入力、確認、完了の全てのページで利用され、以下の
ように「FlowName」
、
「FlowIndex」プロパティが設定されています。
表 15 ページ毎の WizardController のプロパティ設定
ページ
FlowName プロパティ
FlowIndex プロパティ
入力
BugItemRegister
0
確認
BugItemRegister
1
完了
BugItemRegister
2
この設定では、不具合情報登録入力、確認、完了ページは、全て「FlowName」プロパテ
ィに指定した「BugItemRegister」という処理単位に属します。画面遷移は、
「FlowIndex」
プロパティに指定した値に従い、
「入力 → 確認 → 完了」という順序になります。
50 / 120
フロー制御の動作検証
WizardController のフロー制御によって正しい順序でのページアクセスが保証されること
を確認するために、URL を直接アドレスバーに入力して画面遷移した場合に、正しい画面
に戻されることを検証します。
動作検証結果
Web アプリケーションをデバッグ実行して起動し、不具合情報登録入力画面にてアドレス
バーに確認画面の URL(/Tutorial/BugItemRegisterConfirm.aspx)を入力して Enter を
押してください。
図 34 URL 直接入力
URL を直接アドレスバーに入力し、Enter を押下
以下、遷移後の画面です。
図 35 URL 直接入力後の遷移
Enter を押下後、入力画面へ戻ることが
確認できる。
確認画面(「FlowIndex」=1)へ直接アクセスしても、現在のページセッション中のフローイ
ンデックスの値が「0」であるため、前のページである登録入力画面へ戻っており、
WizardController のフロー制御機能によって正しい順序が保証されることが分かります。
51 / 120
4.3.
ページセッション機能
M3 で提供する Web アプリケーションのセッション管理の機能について、検証を行いなが
ら、説明します。
4.3.1. ページセッションとは
ASP.NET のセッション機能を利用してアプリケーション開発を行うと、セッションのキー
の重複、セッションの増大といった問題が必ずといっていいほど発生します。
M3 では、これらの問題を解決するために ASP.NET のセッションを細分化し、処理毎・ペ
ージ毎に異なるセッションを利用するための機能を提供しています。この機能により、注
文処理、会員登録処理といった処理単位で異なるセッションを利用することが可能になり
ます。
この結果、セッションのキー名の重複の問題を避けることが可能になり、処理単位のセッ
ションの数を制限することによりセッションの増大も防げます。
M3 では、この処理毎、ページ毎のセッションを「ページセッション」と呼んでいます。
ページセッションの詳細
このページセッションを実現するために、実際には ASP.NET のセッション情報に、処理名
毎のディクショナリをセッションオブジェクトとして作成し、利用するようにしています。
ASP.NET のセッションオブジェクトには「図 36 ASP.NET のセッションに保存されたペ
ージセッション」のように処理名-ディクショナリのペアのリストを保存します。
図 36 ASP.NET のセッションに保存されたページセッション
処理
キー
値
不具合登録
Subject
カテゴリ
内容
Subject
カテゴリ
・・・
・・・
“テスト実行1”
“不具合”
・・・・・・・
“テスト実行2”
“致命的”
・・・
処理毎のディクショ
ナリの数を制限
不具合更新
不具合検索
・・・
52 / 120
処理のキー名単位で
ディクショナ リを管理す
る。(=ページセッション)
4.3.2. ページセッションの利用方法
ページセッションへは、通常 M3 が提供するページのベースクラスである
「ECOSS.M3.Framework.Web.UI.M3Page」を利用してアクセスします。
リスト 3 ページセッション利用例
// M3Page かその派生クラス内で、次のようなコードを書くと、ページセッションに
//格納されたオブジェクトへアクセスできる。
(C#の場合)
this["Member"] = member;
this["SomeValue"] = value;
「リスト 3 ページセッション利用例」のように M3Page のインデクサを利用すると、
C#の場合は this[名前] で、VB の場合は、Me(“名前”)で、名前に対応する値にアクセスす
ることが可能です。
ページセッションの利用例
M3 で提供する Web アプリケーションでは、ページセッションを利用してユーザー毎の情
報を保持します。
M3 で提供するコンポーネントでもページセッションを利用するものが多くあります。例え
ば、フロー制御機能で利用する WizardController コントロール(P. 50)は、ユーザーが現在
アクセス中のページのインデックスを、ページセッションを利用して保持します。また、
不具合情報登録画面で利用する DataCreateController コントロール(P. 85)は、登録対象と
なるデータオブジェクトを、ページセッションで管理するようにしています。
53 / 120
ページセッションの動作検証
不具合情報登録画面で格納したページセッションの値が、登録フローでのみ取得可能であ
ることを検証します。
具体的には、登録入力ページでページセッションに値を埋め込み、登録確認ページと検索
ページで、それぞれページセッションの値をコンソールに出力する処理を記述します。
アプリケーションを実行し、登録入力ページ、登録確認ページでのみ、ページセッション
の値が表示されることを検証します。
イベントの記述
不具合情報登録入力ページ(BugItemRegister.aspx)の Page_Load イベントに、以下のよ
うに、ページセッションに、現在時刻の値(キー名:
「AccessDate」)を格納する処理を記述
してください。
図 37 不具合情報登録入力 ASPX の修正
BugItemRegister.aspx
のコードビハインドクラスを修正
リスト 4 BugItemRegister.aspx でのイベントの記述(C#)
protected void Page_Load(object sender, EventArgs e)
{
// このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("入力画面の Page_Load が呼び出されました");
//ページセッションに、キー名=「AccessDate」でセッションに現在時刻を設定
this["AccessDate"] = String.Format("{0}に BugItemRegister にアクセス",
DateTime.Now);
// ページセッションの「AccessDate」キーに格納された値をダンプ
System.Diagnostics.Debug.WriteLine(this["AccessDate"]);
}
リスト 5
BugItemRegister.aspx でのイベントの記述(VB)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("入力画面の Page_Load が呼び出されました")
' ページセッションに、キー名=「AccessDate」でセッションに現在時刻を設定
Me("AccessDate") = String.Format("{0}に BugItemRegister にアクセス", _
DateTime.Now)
' ページセッションの「AccessDate」キーに格納された値をダンプ
System.Diagnostics.Debug.WriteLine(Me("AccessDate"))
End Sub
54 / 120
同様に、不具合情報登録確認ページ(BugItemRegisterConfirm.aspx)
、不具合検索ページ
(BugItemSearch.aspx)の Page_Load イベントでもページセッションの値をダンプする
処理を記述してください。
リスト 6
BugItemRegisterConfirm.aspx でのイベントの記述(C#)
protected void Page_Load(object sender, EventArgs e)
{
// このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("確認画面の Page_Load が呼び出されました");
// ページセッションの「AccessDate」キーに格納された値をダンプ
System.Diagnostics.Debug.WriteLine(this["AccessDate"]);
}
リスト 7
BugItemRegisterConfirm.aspx でのイベントの記述(VB)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("確認画面の Page_Load が呼び出されました")
' ページセッションの「AccessDate」キーに格納された値をダンプ
System.Diagnostics.Debug.WriteLine(Me("AccessDate"))
End Sub
リスト 8
BugItemSearch.aspx でのイベントの記述(C#)
protected void Page_Load(object sender, EventArgs e)
{
// このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("検索画面の Page_Load が呼び出されました");
// ページセッションの「AccessDate」キーに格納された値をダンプ
System.Diagnostics.Debug.WriteLine(this["AccessDate"]);
}
リスト 9
BugItemSearch.aspx でのイベントの記述(VB)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("検索画面の Page_Load が呼び出されました")
' ページセッションの「AccessDate」キーに格納された値をダンプ
System.Diagnostics.Debug.WriteLine(Me("AccessDate"))
End Sub
55 / 120
動作検証
コードの記述が終わったらビルドを行い、Web アプリケーションを起動し、以下の操作を
行ってください。
1.
登録入力ページを初期表示させる
2.
登録入力ページで任意の項目を入力して「登録」ボタンを押下する(確認画面へ遷移)
3.
検索ページを初期表示させる
以下、コンソール出力結果の検証です。
リスト 10 コンソール出力結果
―― 1. 登録入力ページの出力 ――
入力画面の Page_Load が呼び出されました
2007/08/24 13:08:27 に BugItemRegister にアクセス
①
―― 2. 確認ページの出力 ――
確認画面の Page_Load が呼び出されました
2007/08/24 13:09:27 に BugItemRegister にアクセス
②
―― 3. 検索ページの初期表示時の出力 ――
検索画面の Page_Load が呼び出されました
③
① 登録入力画面でセッションを格納した直後です。設定した値が出力されます。
② 「登録」ボタンクリック後、確認画面に遷移しました。確認画面では登録画面と同じ
フロー(BugItemRegister)に属するために、登録画面で設定した値が出力されます。
③ 検索画面を表示しました。検索画面は WizardController を利用してフロー制御を行わ
ないために、ページ毎のページセッションを利用します。ページセッションが異なる
ために、登録入力画面で設定した値にアクセスできません。
56 / 120
4.4.
データアクセス機能
M3 を利用してデータベースにアクセスする方法について説明します。
M3 を利用してデータベースにアクセスする場合に、実行される SQL を意識する場合は、
データマネージャを利用します。一方 SQL を意識せずにデータを操作する場合は、テーブ
ル毎に作成されるデータオブジェクトを利用します。
データマネージャ、データオブジェクト共に、
データベース接続オープン
SQL 文実行クラスの初期化
パラメータ設定
更新対象のデータの取得
といったデータベースアクセスに伴う煩雑な作業を自動的に行います。
4.4.1. データマネージャ
データマネージャは、M3 でデータベースにアクセスするための最も基本的なクラスで、デ
ータベースへの接続、ADO.NET のデータプロバイダや DBMS の違いによる差異の吸収、
トランザクションの管理、SQL の発行などを行います。
後述するデータオブジェクト(P. 58)も、データのロードやデータの保存を実行するときに、
内部的にデータマネージャを利用しています。
データマネージャの詳細については、
「%DOC_HOME%¥技術ドキュメント¥M3 データア
クセス機能.doc」の「1.1 データマネージャ」を参照してください。
トランザクションの管理
トランザクションの管理はデータマネージャが行っています。
複数テーブルを同時更新する場合などは、データマネージャのトランザクション開始、コ
ミットメソッドを利用して、明示的にトランザクションを制御します。
リスト 11 トランザクションの開始・コミット実行例(C#)
// トランザクション開始
mgr.BeginTrans();
// データの保存を実行。
dao.RefreshOnSave = true;
dao.ValidateOnSave = false;
dao.Save(mgr);
// トランザクションコミット
mgr.CommitTrans();
57 / 120
4.4.2. データオブジェクト
データオブジェクト(データアクセスオブジェクト、Data Access Object、以降データオブ
ジェクトと表記します)は、データベースのテーブルの行単位で、データの追加、更新、削
除を行うクラスです。データオブジェクトはデータベース定義書ファイルを元に、コード
ジェネレータを利用して、
「データベース定義書変換、生成物の配置 (P.33)」の手順で作成
できます。
例えば、不具合情報テーブル(BugItem テーブル)に対して、BugItem クラスというデー
タオブジェクトを作成することによって、プログラムでは BugItem クラスのプロパティを
操作することにより、行単位でのデータの更新が可能です。
登録、更新、削除処理のいずれも、Save メソッドを呼び出すだけで、実行できます。
リスト 12 データ保存のコード例(C#)
// 空のデータオブジェクトを作成してプロパティを設定
BugItem bugItem = new BugItem();
bugItem.Subject = "仕様確認";
bugItem.Category ="BU";
// 設定値をデータベースに保存
bugItem.Save();
// 不具合 ID を元にデータを取得し、更新
bugItem = new BugItem (123);
bugItem.Category ="FU";
// 更新値をデータベースに保存
bugItem.Save();
58 / 120
出力される SQL の確認
不具合情報登録、更新、削除処理では、データオブジェクトの Save メソッドを利用してデ
ータを保存しています。Save メソッドで発行される SQL 文をコンソールに出力して更新
内容を確認します。
Web アプリケーションを起動し、不具合情報登録、更新、削除を実行すると、
「リスト 13
コンソール出力結果(SQL Server の場合)
」のような SQL が出力されます。
リスト 13 コンソール出力結果(SQL Server の場合)
―― 1. 登録実行時の SQL 出力 ――
・・・LogQuery : QUERY=[INSERT INTO [dbo].[BugItem] ([Subject],
[Category], [Severity],[Status],[Contents],[Memo],
[OpEntered],[DateEntered],
[OpFixed],[DateFixed],[OpChanged],[DateChanged])
VALUES(@P0,@P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8,@P9,@P10,@P11);
・・・・
―― 2. 更新実行時の SQL 出力 ――
・・・LogQuery : QUERY=[UPDATE [dbo].[BugItem] SET [DateChanged]=@P0
WHERE ([BugID]=@P1) AND ([Rowversion]=@P2);
SELECT [BugID],[Subject],[Category],[Severity],
[Status], [Contents],[Memo],[OpEntered] ,
[DateEntered],[OpFixed], [DateFixed],
[OpChanged],[DateChanged],[Rowversion]
FROM [dbo].[BugItem] WHERE [BugID]=@P3
・・・・
―― 3. 削除実行時の SQL 出力 ――
・・・LogQuery : QUERY=[DELETE FROM [dbo].[BugItem]
WHERE ([BugID]=@P0) AND ([Rowversion]=@P1)
・・・・
① 登録の SQL 文(INSERT INTO・・・)が生成されていることが確認できます。
② 更新の SQL 文(UPDATE BugItem・・・)が生成されていることが確認できます。
③ 削除の SQL 文(DELETE FROM BugItem・・・)が生成されていることが確認できま
す。
59 / 120
4.4.3. 補足
行バージョン列を利用した排他制御
M3 では、排他制御として、更新の度に DBMS、あるいはデータオブジェクトにより必ず
更新される列(
「図 38 M3 における排他制御のイメージ」の RowVersion(行バージョン)
列)を利用した楽観的ロックを行います。具体的には、更新実行の際に、セッション中の
データオブジェクトの「更新列」とテーブルの「更新列」を比較することによって更新済
みであるかを判断します。
図 38 M3 における排他制御のイメージ
データベース
セッション
BugItem テーブル
BugItem データオブジェクト
ID
項目名
RowVersion
100001 1月15日発生
3
100001 確認事項
11
ID:100001
データ取得
Subject:1 月 15 日に発生
RowVersion:3
変更値を設定
他の人が更新し、
rowversion の値が変わる
BugItem データオブジェクト
ID:100001
Subject:1 月 17 日に発生
RowVersion:3
ID
項目名
RowVersion
100001 1月15日発生
4
100001 確認事項
11
クエリ実行
Update BugItem
SET Subject= ’ 1 月 17 日に発生’
WHERE BugID= ‘100001’
RowVersion の値が違うため、
AND RowVersion = 3
更新は出来ない。
60 / 120
行バージョン列を利用した排他制御の動作検証
排他制御が行われているかは、ブラウザを 2 つ起動し、同じ不具合 ID の不具合情報の更新
を行う際に、同時更新のエラーが発生するかどうかで検証可能です。
次のような手順を行います。
1.
ブラウザを 2 つ起動します。
2.
1 つ目のブラウザで、不具合情報更新検索→不具合情報更新入力→確認画面に遷移しま
す。
3.
2 つ目のブラウザでも、2で選択した不具合 ID と同じ ID を選択し、同様に更新確認
画面に遷移し、更新ボタンをクリックして更新を実行します。
4.
1 つ目のブラウザで更新ボタンをクリックします。
4の結果として、
「図 39 確認画面の同時実行エラー」のようなページが表示されます。
図 39 確認画面の同時実行エラー
上記の様に、
「データが更新されています。再度最初から処理を実行してください。」とい
うエラーが表示され、データの更新が行えないことが確認できます。
61 / 120
4.5.
入力値の管理
M3 では、ユーザーインターフェースからの入力値を一括して操作しています。この項では、
入力値の管理機能の概要および、入力値の操作で利用する「入力値グループ化コントロー
ル」
「データアクセッサ」について説明します。
4.5.1. M3 における入力値の管理方法
M3 では、入力値をグルーピングするためのサーバーコントロールである「入力値グループ
化コントロール」と、データに汎用的にアクセスするための「データアクセッサ機能」を
提供しています。
4.5.2. 入力値グループ化コントロール
M3 を利用した入力フォームでは、通常「図 40 M3 における入力フォームの例」のよう
に、入力値グループ化コントロールの中に、テキストボックス等の入力用コントロールを
配置します。
図 40 M3 における入力フォームの例
入力値グループ化コントロール(囲み部分)
コントロール名:inputPanel
配下の入力用コントロール
ID:inName フィールド名: Name
ID: inCity フィールド名: City
ID: inAge フィールド名: Age
入力値グループ化コントロールは、配下にある入力用コントロールをグルーピングし、
内部の入力コントロールの値には、ディクショナリ形式でアクセス可能になります。
リスト 14 M3 における入力値へのアクセス
// 入力値が格納されたデータアクセッサを取得
IDataAccessor da = inputPanel.GetAccessor(); //-①
// Name の値を取得
String name = (String)da["Name"];
// City の値を取得
String city = (String)da["City"];
// Age の値を取得
String age = (String)da["Age"];
62 / 120
このように、M3 では①のコードのみでグルーピングされた入力値を取得することが可能で、
入力値のコレクション(IDataAccessor)を利用することによりコントロールの種類を意識
せずに入力値にアクセスすることが可能です。
この入力値のコレクションのように、IDataAccessor インターフェースを提供するクラスが
M3 における「データアクセッサ」です。
※
データアクセッサの詳細については「4.5.3 データアクセッサとユーティリティ(P. 65)」で説明します。
入力値グループ化コントロールの動作検証
入力グループ化コントロール(InputCaptionPanel)を通して、配下の入力コントロールの
入力値にアクセスできることを検証します。
具体的には、不具合情報登録画面(BugItemRegister.aspx)の Page_Load イベントで入力
値のコレクションの内容をダンプして確認します。
イベントの記述
不具合情報登録入力 ASPX(BugItemRegister.aspx)の Page_Load イベントに、以下のよ
うに InputCaptionPanel からデータアクセッサを取得し、その内容をコンソール出力する
処理を記述してください。
リスト 15 イベントの記述(C#)
protected void Page_Load(object sender, EventArgs e)
{
// このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("Page_Load が呼び出されました");
// InputCaptionPanel からデータアクセッサを取得
IDataAccessor da = valueInput.GetAccessor();
// データアクセッサに格納されている値をコンソール出力
System.Diagnostics.Debug.WriteLine("項目名
:" + da["Subject"]);
System.Diagnostics.Debug.WriteLine("カテゴリ :" + da["Category"]);
System.Diagnostics.Debug.WriteLine("重要度
:" + da["Severity"]);
System.Diagnostics.Debug.WriteLine("不具合内容:" + da["Contents"]);
System.Diagnostics.Debug.WriteLine("備考
:" + da["Memo"]);
System.Diagnostics.Debug.WriteLine("登録者
:" + da["OpEntered"]);
}
リスト 16 イベントの記述(VB)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("Page_Load が呼び出されました")
'InputCaptionPanel からデータアクセッサを取得
Dim da As IDataAccessor = valueInput.GetAccessor()
'データアクセッサに格納されている値をコンソール出力
System.Diagnostics.Debug.WriteLine("項目名
:" & _
Convert.ToString(da.Item("Subject")))
System.Diagnostics.Debug.WriteLine("カテゴリ :" & _
63 / 120
Convert.ToString(da.Item("Category")))
System.Diagnostics.Debug.WriteLine("重要度
:" & _
Convert.ToString(da.Item("Severity")))
System.Diagnostics.Debug.WriteLine("不具合内容:" & _
Convert.ToString(da.Item("Contents")))
System.Diagnostics.Debug.WriteLine("備考
:" & _
Convert.ToString(da.Item("Memo")))
System.Diagnostics.Debug.WriteLine("登録者
:" & _
Convert.ToString(da.Item("OpEntered")))
End Sub
動作検証
コードの記述が終わったらビルドして Web アプリケーションを起動し、以下の操作を行っ
てください。
1.
登録入力ページを初期表示させる
2.
登録画面で登録内容を入力して登録ボタンをクリックする
以下、コンソール出力結果の検証です。
リスト 17 コンソール出力結果
―― 1. 初期表示時の出力 ――
Page_Load が呼び出されました
項目名
:
カテゴリ :BU
重要度
:5
不具合内容:
備考
:
登録者
:
―― 2. 登録ボタンクリック ――
Page_Load が呼び出されました
項目名
:データベースに関する質問
カテゴリ :DB
重要度
:5
不具合内容:質問
備考
:
登録者
:
セレクトボックス等のデフォルト値が、
InputCaptionPanel のデータアクセッサで
保持されていることが確認できます。
登録画面で入力した値へ、データアクセッ
サを通してアクセスできることが確認でき
ます。
登録画面上の入力値にデータアクセッサを通してアクセス可能なことが確認できます。
64 / 120
4.5.3. データアクセッサとユーティリティ
入力値グループ化コントロールの例(リスト 14 M3 における入力値へのアクセス P. 62)
では、入力値のコレクションとして IDataAccessor インターフェースを取得しています。
この入力値のコレクションのように、IDataAccessor インターフェースを提供するクラスが
M3 における「データアクセッサ」です
データアクセッサには、列名を指定したデータの取得・設定、列名一覧の列挙といった、
データ操作に最低限必要なメソッドやプロパティが定義されています。
表 16 データアクセッサの主なメンバ
メソッド/プロパティ名
説明
FieldNames
プロパティです。データアクセッサで持っている列名の一覧を返します。
Item
プロパティです。指定列の値を取得・設定するためのインデクサです。
IsReadOnly
メソッドです。指定列は読取専用か(設定不可)かどうかを返します。
M3 では、データオブジェクト(P. 58)やファイルにアクセスするクラス、フォームからの入
力値のコレクションがこの IDataAccessor インターフェースを提供しているために、ファ
イル、データベースといったデータの保存先を意識せずに操作が可能です。
M3 が提供するユーティリティ
M3 では、データアクセッサを利用したデータのコピーや入力値の検証といったユーティリ
ティを提供しています。これらのユーティリティを利用すると、ファイルからデータベー
スへのコピー、入力値をデータオブジェクトに設定するといった作業が簡単に実現できま
す。
リスト 18 ユーティリティを利用した入力値検証、データのコピー(C#)
// InputRuleSection を利用して入力値を検証しながら
// 不具合情報のデータオブジェクトにコピーします。
M3MessageList errors =
InputRuleManager.AssureSection("BugItem").SetValues(inputs, dao, false);
// 入力値を不具合情報のデータオブジェクトにコピーします。
// こちらは検証を行いません。
DAUtil.Copy(inputs, dao);
65 / 120
データアクセッサの動作検証
検証内容
入力コントロールへの入力値が、データアクセッサを介する形で入力値検証機能を利用し、
登録対象となるデータオブジェクト(P. 58)へ格納されることを確認します。
具体的には、不具合情報登録入力画面で入力値をコピーする処理を行う前後に、データオ
ブジェクトの内容をコンソールに出力する処理を追加します。
イベントの記述
不具合情報登録入力 ASPX(BugItemRegister.aspx)の doNext_Click イベントに、以下の
ように、登録対象となるデータオブジェクトの内容をコンソール出力する処理を記述して
ください。
リスト 19 イベントの記述(C#)
// 入力値をコピーし、次のページに遷移します。
protected void doNext_Click(object sender, EventArgs e)
{
if (!this.IsValid) return;
try
{
IDataAccessor inputs = ctlData.CurrentInputs;
BugItem dao = (BugItem)ctlData.Target;
//コピー実行前のコンソール出力
IEnumerator itr;
System.Diagnostics.Debug.WriteLine("データのコピー実行前");
itr = dao.FieldNames.GetEnumerator();
while(itr.MoveNext())
System.Diagnostics.Debug.WriteLine(itr.Current + " :"
+ dao[(String)itr.Current]);
// 入力値を検証しながらコピーします。
M3MessageList errors =
InputRuleManager.AssureSection("BugItem").SetValues(inputs, dao, false);
if (errors.Count > 0) throw new ValidationException(errors);
//コピー実行後のコンソール出力
System.Diagnostics.Debug.WriteLine("データのコピー実行後");
itr = dao.FieldNames.GetEnumerator();
while (itr.MoveNext())
System.Diagnostics.Debug.WriteLine(itr.Current + " :"
+ dao[(String)itr.Current]);
―中略―
}
}
66 / 120
リスト 20 イベントの記述(VB)
' 入力値をコピーし、次のページに遷移します。
Protected Sub doNext_Click(ByVal sender As Object, ByVal e As EventArgs)
If (Not IsValid) Then
Return
End If
Try
Dim inputs As IDataAccessor = ctlData.CurrentInputs
Dim dao As BugItem = CType(ctlData.Target, BugItem)
' コピー実行前のコンソール出力
System.Diagnostics.Debug.WriteLine("データのコピー実行前")
Dim itr As System.Collections.IEnumerator
itr = dao.FieldNames().GetEnumerator()
While (itr.MoveNext())
System.Diagnostics.Debug.WriteLine(itr.Current & " :" & _
Convert.ToString(dao.Item(itr.Current)))
End While
' 入力値を検証しながらコピーします。
Dim errors As M3MessageList = InputRuleManager.AssureSection("BugItem") _
.SetValues(inputs, dao, False)
If errors.Count > 0 Then
Throw New ValidationException(errors)
End If
' コピー実行後のコンソール出力
System.Diagnostics.Debug.WriteLine("データのコピー実行後")
itr = dao.FieldNames().GetEnumerator()
While (itr.MoveNext())
System.Diagnostics.Debug.WriteLine(itr.Current & " :" & _
Convert.ToString(dao.Item(itr.Current)))
End While
―中略―
End Sub
67 / 120
動作検証
コードの記述が終わったらビルドして Web アプリケーションを起動し、以下の操作を行っ
てください。
1.
登録入力ページで任意の項目を入力して「登録」ボタンを押下する
以下、コンソール出力結果の検証です。
リスト 21 コンソール出力結果
―― 1. 登録ボタンクリック後 ――
データのコピー実行前
BugID :
Subject :
Category :
Severity :5
Status :0
Contents :
Memo :
OpEntered :
DateEntered :2007/08/27 17:00:55
OpFixed :
DateFixed :
OpChanged :
DateChanged :
Rowversion :
データのコピー実行後
BugID :
Subject :項目テスト
Category :FU
Severity :5
Status :0
Contents :不具合内容を確認
Memo :備考内容を確認
OpEntered :テスト
DateEntered :2007/08/27 17:00:55
OpFixed :
DateFixed :
OpChanged :
DateChanged :
Rowversion :
データオブジェクトには、テーブル定義で定
めたデフォルト値以外は保持されていませ
ん。
画面で入力した値が入力規則検証クラ
スを通して、データオブジェクトに設定さ
れています。
68 / 120
4.5.4. 補足
入力値グルーピングのルールについて
入力値グループ化コントロールが、具体的にはどのように入力値をグルーピングしている
かについて説明します。
入力値グループ化コントロールは、配下にある入力用コントロールのうち以下のいずれか
の条件にマッチしたものをグループ化対象と判断し、その入力値をグルーピングします。
M3 が提供するサーバーコントロールで「FieldName」プロパティが設定されているも
の
入力用コントロールのコントロール ID が、グループ化コントロールの「Prefix」プロ
パティから始まるもの
図 41 入力用サーバーコントロールのプロパティ
このコントロールは FieldName プロパ
ティに Subject と指定しているので、
データアクセッサからは Subject とい
うキーでアクセス可能。
なお、入力値グルーピングのルールは、
「4.7.2 検索条件用サーバーコントロール(P. 79)」
の場合も同様です。検索用グループ化コントロールは、グループ化対象とみなしたサーバ
ーコントロールの入力値を元に、検索条件クラスを生成します。
入力値グループ化コントロールについてさらに学習するには
その他、入力値グループ化コントロールの詳細については、
「%DOC_HOME%¥技術ドキュ
メント¥ASP.NET サーバーコントロールガイド.doc」の「2.3.2.入力値グループ化コントロ
ール」を参照してください。
入力値グループ化コントロールが提供するプロパティ、メソッドについては、M3 のヘルプ
を参照してください。
69 / 120
4.6.
入力値の検証機能
M3 では、ユーザーインターフェースからの入力値を「入力規則機能」を利用して検証して
います。
「入力規則機能」が利用する入力規則・差分入力規則についてと、入力値の検証機
能を提供するサーバーコントロールについて、それぞれ説明します。
4.6.1. 入力規則機能とは
M3 では、入力規則設定ファイルを元に、入力値の変換、検証を行なうための入力規則機能
を提供しています。
この入力規則機能は M3 の基本機能の1つとして提供されており、ユーザーインターフェ
ース層での入力値の検証、ビジネスロジックでのパラメータの検証、データ層での保存デ
ータの検証など、検証が必要な全ての箇所で利用されています。
入力規則設定
入力規則設定は、複数の XML 形式の設定ファイルで構成されますが、開発者は通常、入力
規則設定ファイルを直接作成・編集せずに、入力規則定義書と呼ばれる Excel のワークシ
ートに定義を記述し、コードジェネレータを用いて設定ファイルを生成します。
入力規則定義書 (例:図 42 入力規則定義書)は、処理単位毎にシートを分け、入力項目単
位で、文字列、数値、日付といった入力規則を定義します。これは仕様書としても利用可
能です。
図 42 入力規則定義書
70 / 120
これらの入力規則定義を、コードジェネレータを利用して変換すると「リスト 22 入力規
則設定ファイル」のような XML による設定ファイルが作成されます。
リスト 22 入力規則設定ファイル
<inputrule name="Subject">
<class>ECOSS.M3.Runtime.InputRule.StringInputRule</class>
<initproperties>
<property>
<name>message</name>
<value><![CDATA[項目名を確認してください。]]></value>
</property>
<property>
<name>nullable</name>
<value><![CDATA[false]]></value>
</property>
<property>
<name>lengthinbytes</name>
<value><![CDATA[true]]></value>
</property>
・・・中略・・・
</initproperties>
</inputrule>
<inputrule name="Category">
<class>ECOSS.M3.Runtime.InputRule.StringInputRule</class>
<initproperties>
<property>
<name>message</name>
<value><![CDATA[カテゴリを確認してください。]]></value>
</property>
・・・中略・・・
セクションとルールについて
入力規則は、会員登録、注文処理といった処理毎にグルーピングして定義します。M3 では
これらのグルーピングの単位を、入力規則セクションか単純にセクションと呼びます。
セクション名は、入力規則定義書(Excel)のシートの「セクション名(X1)」列に設定した
値になります。一方、シート内の項目列毎の規則をルールと呼びます。
セクション名
ルール名
図 43 セクション名とルール名
71 / 120
差分入力規則設定
「差分入力規則」は、既存の入力規則の差分のみを定義し、アプリケーション依存のカス
タマイズ部分を、入力規則として適用したい場合に利用します。
例えば、「電話番号」に対する入力規則について考えます。「電話番号」はデータベース定
義では、14 バイトの文字列として定義されているために、データベース定義を元にすると
文字列長の検証しかできません。
これに対して「XX−XXXX-XXXX」のような電話番号形式の入力のみ許可したい場合は、
カスタマイズした入力規則定義を作成する必要があります。
しかし、テーブルの変更に伴い、データベース定義を変更した場合、カスタマイズ部分が
上書きされてしまいます。
その場合に備えて、差分入力規則に、入力項目用のルールを定義しておくことによって、
入力規則を修正する必要がなくなります。
テーブル定義上の入力規則では、列の制限値の
み適用可能
差分入力規則が存在する場合は優先して適用さ
れる
図 44 差分入力規則の利用目的
このように、アプリケーション依存の部分を別のファイルで管理することによって、デー
タベース定義書を変更した場合でも、入力規則定義の再変更を行う必要がありません。
差分入力規則で、入力規則と同名のセクション名・ルール名がある場合は、差分入力規則
が優先的に適用されます。
また、差分入力規則で、入力規則にはないセクション・ルールを設定した場合には、新た
な入力規則として定義されます。
72 / 120
入力規則の階層関係
入力規則、差分入力規則を利用した大規模なアプリケーションの入力規則の関係は「図 45
入力規則の階層関係」のようになります。
入力規則を UI 層、ビジネスロジック層、データ層といった全てのレイヤで利用しており、
それぞれ下のレイヤの入力規則を拡張するという形式をとっています。
①UI 用入力規則
②ビジネスロジック用
入力規則
③データ保存用
入力規則の差分入力規則
④データ保存用
入力規則
ビジネスロジックの入力規則に
UI 固有の拡張を追加
データ保存用の入力規則に、登録、更新とい
ったビジネスロジック固有の拡張を追加
データベース定義書から生成される入力規
則に、アプリケーション固有のカスタマイズを
追加
データベース定義書から生成された入力規
則を利用して作成。
図 45 入力規則の階層関係
この結果、例えばデータベーススキーマを変更した場合も、
「④データ保存用入力規則」を
置き換えるだけで更新を反映できるため、入力規則自体の変更も容易です。
※
「M3 SR2」以降をご利用の場合は、入力規則機能ではデータオブジェクトの定義を元に、実行時に
入力規則を作成する様にしているため、
「④データ保存用入力規則」は、必ずしも出力する必要はあ
りません。
73 / 120
4.6.2. 入力規則機能の利用方法
入力規則は、UI 層でサーバーコントロールのプロパティに設定して利用する方法とプログ
ラムから直接入力規則を利用する方法の2種類の方法で利用可能です。
サーバーコントロールで利用
M3 では、入力規則機能を利用した検証コントロール(M3Validator コントロール)を提供
しています。検証コントロールのプロパティにセクション名とルール名を指定すると対応
する入力規則が適用されます。
「Section」プロパティに入力セクション
名、
「Rule」プロパティに入力ルール名を設定
図 46 検証コントロールのプロパティ設定画面
M3Validator コントロールは、サーバーサイドでは M3 の入力規則を利用して入力値の変
換、検証を行ない、クライアントサイドでは M3 の入力規則の一部を利用して javascript
で検証します。
プログラムから利用
入力規則機能をプログラムから利用する場合は、「ECOSS.M3.Runtime.InputRule」名前
空間で提供されているクラスを利用します。
InputRuleManager クラスは、入力規則機能を利用する際のエントリポイントになります。
こ の ク ラ ス を 通 し て 、 セ ク シ ョ ン を 表 す InputRuleSection ク ラ ス 、 ル ー ル を 表 す
IInputRule クラスを取得して検証を行ないます。検証は以下のように行ないます。
リスト 23 入力規則利用例(C#)
// 不具合情報のデータをページセッションより取得。
BugItem bugItem = (BugItem)ctlData.Target;
// 不具合情報登録(BugItemRegister)用の入力規則セクションを取得する。
74 / 120
InputRuleSection section = InputRuleManager.AssureSection("BugItemRegister");
// 不具合情報に対して取得した入力規則セクションを適用し、一括で変換、検証を行なう。
section.Apply(bugitem);
// 「項目(Subject)」フィールドの値に対して入力規則を適用し、変換、検証を行なう。
String subject = bugitem.Subject;
subject = (String)section.AssureRule("Subject").Apply(subject);
// InputRuleManager クラスのユーティリティを利用して
//不具合登録の「項目(Subject)」フィールドを検証(変換・設定なし)する。
InputRuleManager.Check("BugItemRegister ", " Subject ", subject);
差分入力規則を利用した検証用サーバーコントロールの動作検証
不具合情報の項目名として全角のみ入力可能にする作業を通して、差分入力規則が「4.6.2
入力規則機能の利用方法(P. 74)」で説明した検証用コントロールに適用されることを検証し
ます。次の手順で作業を行います。
1.
差分入力規則定義書の作成
2.
差分入力規則設定ファイルの生成・配置
差分入力規則定義書の作成
不具合情報の項目名として、全角のみを許可し、半角を入力した場合は全角に変換するよ
うな入力規則を差分入力規則に追加します。
リスト 24 項目名に対する差分入力規則の設定内容
設定名
セクション名
入力規則名
エラーメッセージ
タイプ
NULL
Trim
最大値
単位
全半
チェック
設定値
BugItem
Subject
項目名は半角 32 文字以内、全角 16 文字以内
で入力してください。{1}
文字列
×
Both
32
B
555
FF00
説明
{1}にはエラー詳細を出力しま
す。
NULL 不可
前後の空白を削除します。
文字列長は 32 バイトまで有効。
長さをバイトで比較します。
半角文字を全角に変換します。
全角のみ許可します。
「リスト 24 項目名に対する差分入力規則の設定内容」のとおり、差分入力規則定義書.xls
を作成します。
75 / 120
図 47 差分入力規則定義書
差分入力規則設定ファイルの生成・配置
コードジェネレータの「差分入力規則定義書変換」にて変換します。なお、詳しい利用方
法については「%DOC_HOME%¥技術ドキュメント¥M3 定義書とコードジェネレータ利用
方法.doc」の「7. 差分入力規則定義書変換」を参照してください。
図 48 コードジェネレータ(差分入力定義書変換)
生成した差分入力規則設定ファイルを「MyApp/App_Data/M3/runtime/inputrule/diff」の
下へコピーしてください。
図 49 差分入力規則ファイルの配置
MyApp¥App_Data¥M3¥runtime¥inputrule¥diff の下へ
コピー
76 / 120
動作検証結果
Web アプリケーションをデバッグ実行して起動し、不具合情報登録入力画面で、何も入力
しないか、何らかの入力エラーが起こる状態で、
「登録」ボタンを押してください。
以下、実行後の画面です。
図 50 入力エラー表示
差分入力規則定義で指定し
たエラーメッセージが出力さ
れる
「図 50 入力エラー表示」のように、先ほど作成した差分入力規則のエラーメッセージが
出力されます。
このように、検証用コントロールが、差分入力規則を利用した状態でも動作することが確
認できます。
4.6.3. 補足
M3Validator の暗黙的なルール設定
M3Validator コントロールが利用する入力規則のセクション名・ルール名を、暗黙的に設
定する方法があります。この設定を行った場合、M3Validator コントロールの「Section」
プロパティおよび「Rule」プロパティを設定する必要はありません。
入力規則セクション名の暗黙的な設定方法
入力値グループ化コントロール(P. 62)の「RuleSection」プロパティを指定することで、配
下の検証コントロールが利用するセクション名を一括で指定することが可能です。
入力規則ルール名の暗黙的な設定方法
M3Validator コントロールに入力規則ルール名を指定していない場合は、検証対象の入力
用サーバーコントロールの「FieldName」プロパティの値をルール名として利用します。
77 / 120
4.7.
検索条件の作成・検索結果の表示機能
M3 では、検索条件の作成機能として、検索条件を表すクラスと検索条件入力用のサーバー
コントロールおよび検索条件用グループ化コントロールを提供しています。
また、検索実行結果を取得し、一覧表示するためのサーバーコントロールも、同様に提供
しています。
実際に、不具合情報検索画面で「検索」を実行すると、次のようなフローになります。
1.
検索条件入力用のサーバーコントロールの入力値から検索条件を表すクラスを取得し、
取得した検索条件クラスを元に、DBMS に応じた適切な SQL に変換してクエリを実行
します。
2.
クエリ発行後、該当するデータがあった場合は、データソースコントロールに結果を
設定し、データ連結コントロールが結果を一覧表示します。
この項では、検索条件クラス、検索条件入力用のサーバーコントロールと、検索結果の表
示用のサーバーコントロールについて説明します。
※
実際に 検索条件作成 用のサーバー コントロール を利用して、 検索処理を実 行しているの は、
SearchController コントロール(P.86)になります。
4.7.1. 検索条件クラス
検索条件クラスは、プログラム的には「ICriteria」というインターフェースを実装するク
ラスです。これらのクラスは SQL の WHERE 句に設定する条件を表しています。
代表的な検索条件クラスを例にして、検索条件クラスについて具体的に説明します。
全ての検索条件クラスは「ECOSS.M3.Data.Sql」名前空間で提供されています。
Criteria クラス
このクラスは、
「列名 オペレータ 値」という最も単純な検索条件を表すクラスです。
このクラスの Field プロパティ、Operator プロパティ、Value プロパティに値を設定して
検索条件を作成します。例えば、以下のように設定すると、
Field プロパティ
Operator プロパティ
Value プロパティ
Subject
Like
エコス*
以下のような SQL が実行時に作成されます。
[Subject] LIKE ‘エコス%’
78 / 120
CriteriaCollection クラス
このクラスは、複数の検索条件を OR 句か AND 句でつなげるためのクラスです。
「リスト 25 CriteriaCollection クラスの利用例」のように利用します。
リスト 25 CriteriaCollection クラスの利用例(C#)
// AND 条件で複数の検索条件をつなげる。
CriteriaCollection col = new CriteriaCollection(Operator.And);
// AAA='BBB'を追加
col.Add(new Criteria("AAA", "BBB", Operator.Equal));
// BBB LIKE 'BBB%'を追加
col.Add(new Criteria("BBB", "BBB*", Operator.Like));
// Age < 10 を追加
col.Add(new Criteria("Age", 10, Operator.LessThan));
// 結果をダンプ
// (AAA='BBB') AND (BBB LIKE 'BBB%') AND (Age < 10)
// を出力
System.Diagnostics.Debug.WriteLine(col.ToString());
4.7.2. 検索条件用サーバーコントロール
M3 では、列単位の検索条件を入力するための検索条件入力用コントロールと、検索条件入
力用コントロールをグルーピングし、検索条件をまとめて取得するための検索用グループ
化コントロールを提供しています。
検索条件入力用サーバーコントロール
検索条件入力用サーバーコントロールとは、テキストボックス、ドロップダウンリストと
いった形式で列単位の検索条件を入力するためのコントロールです。
図 51 検索条件入力用サーバーコントロールのプロパティ
「DbType」プロパティ、
「Operator」プロパティ
「FieldName」プロパティ
が、検索条件生成に関連するプロパティ
となる。この設定の場合は、
「Contents LIKE ‘入力値’ 」のような条件
が出力される。
これらのコントロールに「表 17 検索条件入力用コントロールの検索関連のプロパティ」
に示すようなプロパティを設定することにより、コントロールから先に述べた検索条件ク
79 / 120
ラス(ICriteria)を取得できます。
表 17 検索条件入力用コントロールの検索関連のプロパティ
プロパティ名
FieldName
Operator
DbType
意味
検索対象のデータベースの列名を指定します。
条件のオペレータを指定します。既定は Equal です。
検索値の型を指定します。既定値は文字列です。
検索条件入力用コントロールが保持する検索条件は、GetCriteria メソッドを呼び出すこと
により取得可能です。
これらの検索条件入力用コントロールは「ECOSS.M3.Web.UI」名前空間で提供されてお
り、テキストボックス、ドロップダウンリスト以外にも、チェックボックスやラジオボタ
ンリスト、マルチ選択リスト等があります。
詳細な説明については「%DOC_HOME%¥技術ドキュメント¥ASP.NET サーバーコント
ロールガイド.doc」の「2.2.検索条件入力用コントロール」を参照してください。
80 / 120
検索用グループ化コントロール
配下の検索条件入力用コントロールをグループ化し、その入力値から検索条件クラスを取
得し、AND 演算子か OR 演算子でまとめて取得するためのコントロールです。
検索条件入力用コントロール、検索用グループ化コントロール、検索条件クラスの関係は
「図 52 入力値から検索条件を作成」のようになります。
検索用グループ化コントロール配下の入力コントロールによる検索条件は、検索条件入力
コントロールと同様、GetCriteria メソッドを呼び出すことにより取得可能です。
CriteriaCollection
ID
100001
Criteria
Subject あ
FindTextBox
FieldName =BugID
Operator =Equal
DbType
=Int32
Criteria
ID:100001
Subject:あ
条件:And
条件:Like
FindCaptionPanel
FindTextBox
FieldName=Subject
Operator =Like
DbType =String
Operator =And
(ID = 100001) AND (Name LIKE ‘あ’)
図 52 入力値から検索条件を作成
詳細な説明については「%DOC_HOME%¥技術ドキュメント¥ASP.NET サーバーコント
ロールガイド.doc」の「2.3.コントロールをグループ化するコントロール」を参照してくだ
さい。
81 / 120
検索条件の取得の検証
検 索 条 件 入 力 用 コ ン ト ロ ー ル ( FindTextBox ) と 検 索 用 グ ル ー プ 化 コ ン ト ロ ー ル
(FindCaptionPanel)が、入力値を元にした検索条件が取得できることを検証します。
具体的には、Page_Load イベント内で、これらのコントロールの GetCriteria メソッドの
実行結果をコンソール出力する処理を追加します。
イベントの記述
不具合情報検索 ASPX(BugItemSearch.aspx)の Page_Load イベントに、以下のようなコ
ードを追加します。
リスト 26 イベントの記述(C#)
protected void Page_Load(object sender, EventArgs e)
{
// このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("Page_Load が呼び出されました");
// 検索条件入力用のコントロールが保持している検索条件を出力
System.Diagnostics.Debug.WriteLine("項目名の検索条件:"
+ StrUtil.SafeToString(inSubject.GetCriteria(true)));
// 検索用グルーピングコントロールが保持している検索条件を出力
System.Diagnostics.Debug.WriteLine("パネルの検索条件:"
+ StrUtil.SafeToString(searchInput.GetCriteria()));
}
リスト 27 イベントの記述(VB)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' このイベントが呼び出されたらコンソール出力
System.Diagnostics.Debug.WriteLine("Page_Load が呼び出されました")
Dim da As IDataAccessor = searchInput.GetAccessor()
'検索条件入力用のコントロールが保持している検索条件を出力
System.Diagnostics.Debug.WriteLine("項目名の検索条件:" & _
StrUtil.SafeToString(inSubject.GetCriteria(True)))
'検索用グルーピングコントロールが保持している検索条件を出力
System.Diagnostics.Debug.WriteLine("パネルの検索条件:" & _
StrUtil.SafeToString(searchInput.GetCriteria()))
End Sub
82 / 120
動作検証
コードの記述が終わったらビルドして Web アプリケーションを起動し、以下の操作を行っ
てください。
1.
検索ページを初期表示する
2.
検索ページで項目名に任意の項目を入力して「検索」ボタンを押下する
以下、コンソール出力結果の検証です。
リスト 28 コンソール出力結果(SQL Server)
―― 1. 初期表示 ――
Page_Load が呼び出されました
項目名の検索条件:
パネルの検索条件:
「検索」ボタンイベント前のため、まだ検索条件は設定
されていないことが確認できます。
―― ②. 「検索」ボタンをクリック ――
Page_Load が呼び出されました
項目名の検索条件:[Subject] LIKE '項目%'
パネルの検索条件:
検索条件:([BugID]>=0) AND ([Subject] LIKE '項目%')
AND ([Category]='BU') AND ・・・中略・・・
83 / 120
FindCaptionPanel 内の検索条件入力用コン
トロールを元に、検索条件が生成されてい
ることが確認できます。
4.7.3. 検索結果表示用サーバーコントロール
本項では検索画面において、検索結果を取得するデータソースコントロールである
TableDataSource コントロール、検索結果を一覧表示するためのコントロールである
M3Repeater コントロールについて説明します。
※
詳細については、「%DOC_HOME%¥技術ドキュメント¥ASP.NET サーバーコントロールガイ
ド.doc」の「2.4.データを取得するためのコントロール」と「2.5 データリストを表示するコントロー
ル」と、M3 のヘルプを参照してください。
テーブルデータソースコントロール(TableDataSource)
データソースコントロールは、主に検索画面において検索結果を取得するために利用され
ます。TableDataSource コントロールはテーブル名と検索条件を元に、データベースから
データを取得するためのデータソースコントロールです。
TableDataSource はデータの取得をカスタマイズするイベントとして、Selecting イベント
と Selected イベントを提供しています。Selecting イベントはデータ取得の直前に発生する
イベントのため、検索条件のカスタマイズやデータ取得処理自体を変更する場合などに利
用します。一方 Selected イベントはデータ取得の直後に発生するイベントのため、取得し
たデータを変更する場合などに利用します。
リピータコントロール(M3Repeater)
リピータコントロールは、検索、一覧表示画面において検索結果を一覧表示するために利
用されます。リピータコントロール自体では、データの取得を行わずリスト形式のデータ
を繰り返し表示する機能を提供します。
表示用のデータはプログラムで直接指定するか、データソースコントロールを利用してデ
ータを取得します。データソースコントロールを利用する場合は、
「DataSourceID」プロ
パティにデータソースコントロール ID を指定すると、自動的に取得されます。
M3Repeater コントロール
M3Repeater は、ASP.NET で提供される「System.Web.UI.WebControls.Repeater」コン
トロールを拡張したデータ連結コントロールで、ASP.NET で提供されている Repeater コ
ントロールに対して、表示用のプロパティ、操作をカスタマイズするためのイベントを追
加しています。
検索を実行する SearchController コントロール等、UI コントローラでは、M3Repeater を
前提に提供されているために、リスト表示の場合は M3Repeater コントロールを利用して
ください。
84 / 120
4.8.
UI コントローラ
M3 が提供する「UI コントローラ」は、Web アプリケーションにおける「入力値を取得→
検証→登録処理」
、
「入力値を取得→検索条件生成→SQL 実行→データ表示」といった定型
的な処理を提供するサーバーコントロールです。
UI コントローラを利用すると、これらの処理を、プログラムコードを 1 行も書かずに実装
することが出来ます。
この項では、本書で利用している UI コントローラについて簡単に説明します。
詳細については「%DOC_HOME%¥技術ドキュメント¥ ASP.NET サーバーコントロール
ガイド.doc」の「3. UI コントローラ」を参照してください。また、UI コントローラが提供
するイベント、メソッドについては、M3 のヘルプを参照してください。
全ての UI コントローラは、
「ECOSS.M3.Framework.Web.UI.Controllers」名前空間に属
します。
4.8.1. DataCreateController コントロール
「不具合情報登録画面」のような、データを 1 件新規に登録する ASPX ページで利用され
る UI コントローラです。
最初にアクセスした場合には、
「DataClass」プロパティに指定したクラス名を元に、デー
タオブジェクトを作成し、2 回目以降にアクセスした場合には、データオブジェクトから入
力値を復元します。
提供する機能
データオブジェクトを作成してセッションに設定する機能
データオブジェクトから入力値を復元する機能
詳細については、ASP.NET サーバーコントロールガイドの「3.8.4. DataCreateController
コントロール」を参照してください。
85 / 120
4.8.2. SearchController コントロール
「不具合情報検索画面」のような、検索条件を入力して一覧表示させる ASPX ページで利
用される UI コントローラです。
検索実行、入力値のクリアなどの検索・一覧表示画面に必要となる処理を自動化している
コントロールです。検索条件の入力値を保持する機能も提供します。
提供する機能
入力された検索条件を元に検索を実行する機能
検索条件の入力値を、セッションを利用して維持する機能
検索条件の入力値をクリアする機能
検索のエラー時に適切にエラーハンドリングする機能
詳細については、ASP.NET サーバーコントロールガイドの「3.5.1.SearchController コン
トロール」を参照してください。
検索条件のカスタマイズについて
検索条件の取得は CreateCriteria イベントで行い、その後に TableDataSource(
「テーブル
データソースコントロール(TableDataSource)(P.84)」)に検索条件を設定する処理が行
われます。
よって、ユーザーインターフェースの入力値から作成された検索条件にプログラム内で検
索条件を追加する場合は、CreateCriteria イベント内で処理を行います。
「5. アプリケーションのカスタマイズ(P.92~98)」には、実際に検索条件のカスタマイズを
行う例が紹介されていますので、必要に応じて参照、実践してください。
4.8.3. WizardController コントロール
「不具合情報登録」画面における「入力→確認→完了」といった画面フローを制御するた
めに利用する UI コントローラです。フロー制御機能(P. 49)、ページセッション機能(P. 52)
に関する設定を行います。
提供する機能
フロー制御
フロー内のセッション管理
詳細については、ASP.NET サーバーコントロールガイドの「3.7.1. WizardController コン
トロール」を参照してください。
86 / 120
4.8.4. DataLoadController コントロール
「不具合情報詳細画面」のような、データを 1 件詳細表示する ASPX ページで利用される
UI コントローラです。
最初にアクセスした場合には、
「DataClass」プロパティに指定したクラス名を元に、デー
タオブジェクトをロードし、2 回目以降にアクセスした場合には、データオブジェクトから
入力値を復元します。
提供する機能
クエリストリングをキーとしてデータオブジェクトをロードし、セッションに設定す
る機能
データオブジェクトから入力値を復元する機能
詳細については、ASP.NET サーバーコントロールガイドの「3.8.3. DataLoadController
コントロール」を参照してください。
4.8.5. InputRestoreController コントロール
「不具合情報登録確認画面」のような、他のページからアクセスした場合に、データオブ
ジ ェ ク ト か ら 入 力 値 を 復 元 す る た め の コ ン ト ロ ー ラ で す 。 DataLoadController 、
DataCreateController とは異なり、復元に利用するデータオブジェクトがセッションに存
在しない場合には、前のページに遷移させます。
提供する機能
データオブジェクトから入力値を復元する機能
詳細については、
ASP.NET サーバーコントロールガイドの「3.8.3. InputRestoreController
コントロール」を参照してください。
87 / 120
4.8.6. CaptionExportController コントロール
「不具合情報検索画面」のような、検索条件を入力して一覧表示させる ASPX ページで、
検索結果をファイルにエキスポートするための UI コントローラです。
SearchController (P. 86) が保持する検索条件を元に検索を実行し、検索結果を CSV ファ
イル等で出力します。また、出力ファイルのフォーマットとして、1 行目に「Captions」プ
ロパティで指定した値を設定し、2 行目に出力対象の列名を出力します。
提供する機能
データソースコントロール、SearchController から検索条件を作成する機能
検索を実行し、検索結果を出力するための機能
詳細については、ASP.NET サーバーコントロールガイドの
「3.5.5. CaptionExportController コントロール」を参照してください。
88 / 120
4.9.
M3 で提供するページ用ベースクラス
M3 を利用して Web アプリケーションを開発する場合、全ての ASPX ページは、アプリケ
ーションテンプレートで提供する ASPX ページ用ベースクラスを継承します。このベース
クラスで提供するユーティリティ、および共通の例外処理について説明します。
4.9.1. 提供する機能
アプリケーションテンプレートで提供するページのベースクラスは、
「App_Code¥Page¥
AppPage.vb/.cs」で定義されおり、AppPage クラスは、
「ECOSS.M3.Framework.Web.UI .
M3Page」クラスから派生しています。
M3Page クラスは、フロー制御機能(P.49)、ページセッション機能(P.52)を提供しており、
UI コントローラも M3Page クラスが前提で提供されています。
ASPX ページを作成する場合は、必ず「AppPage」クラスを継承するようにしてください。
AppPage クラスで提供するメソッドについて
AppPage クラスでは、ASPX 上で利用するデータ表示用のメソッドを用意しています。
ASPX ページ内で、データ連結式やバインド式で値を動的に出力する際には、必要が無い限
り個別に書式を指定せずに、なるべく AppPage の表示用のメソッドを利用してください。
ID 表示用メソッドである ToID を利用
図 53 ASPX のメソッド利用例(詳細表示画面)
表示用のメソッドは「To…」
、
「Eval…」から始まるものの 2 つが用意されています。
「To」から始まるメソッド(表 18 ページ出力時に利用する主なメソッド)は値のフォーマッ
トのみを行い、
「Eval」から始まるメソッド(表 19 データ連結式で利用する主なメソッド)
は Eval 式を評価した結果の値をフォーマットします。
89 / 120
ページ出力時(<%= ∼ %>)に利用するメソッド
表示するデータに対して、表示形式を指定して値を表示するメソッドを用意しています。
以下に、利用できるメソッドを挙げます。
表 18 ページ出力時に利用する主なメソッド
メソッド名
HtmlEncode
書式
HtmlEncode (値)
ToCode
ToCode("コード定義", 値)
ToID
ToID(値)
ToNumber
ToNumber (値)
ToCurrency
ToCurrency (値)
ToMonth
ToMonth (値)
ToLongDate
ToLongDate (値)
ToShortDate
ToShortDate (値)
用途
指定されたデータの値を、HTML エンコードしま
す。
指定されたデータの値に対応するコード設定の
表示文字列を表示します。
指定されたデータの値を ID 形式(0 埋めで出力
します)に変換して表示します。
指定されたデータの値を数字形式に変換して
表示します。
指定されたデータの値を貨幣形式に変換して
表示します。
指定されたデータの値を年月形式(YYYY/MM)
に変換して表示します。
指定されたデータの値を、年月日時分秒形式
(YYYY/MM/DD HH:MM:SS)に変換して表示しま
す。
指定されたデータの値を、年月日形式
(YYYY/MM/DD)に変換して表示します。
データ連結式(<%# ∼ %>)で利用するメソッド
検 索 画 面 で 利 用 す る 、 M3Repeater( 検 索 結 果 表 示 用 サ ー バ ー コ ン ト ロ ー ル (P.84)) や
GridView 等のデータ連結コントロールのコンテナの値を評価し、表示形式を指定して値を
表示するメソッドを用意しています。以下に、利用できるメソッドを挙げます。
表 19 データ連結式で利用する主なメソッド
メソッド名
HtmlEval
Eval*
書式
HtmlEval("列名")
用途
指定された列名の値を、HTML エンコードしま
す。
「表 18 ページ出力時に利用する主なメソッド」の To 系のメソッドと同様のメソッドを
提供します。
90 / 120
例外処理のハンドリング
M3 では定型的なエラー処理を行うために、M3Page クラスで、HandleError メソッドを提
供しています。
HandleError メソッド内では、以下の処理を行います。
1.
M3UserException がスローされた場合にはエラーをエラー表示用のコントロールに設
定します。
2.
それ以外の場合はログを出力して汎用エラーメッセージをエラー表示用のコントロー
ルに設定します。
3.
エラー表示用のコントロールにエラーを設定できない場合は、ユーザーにエラーが表
示できないとみなし、エラーを再スローします。
※
M3UserException 等、M3 が提供する例外の詳細については、
「5.8.1 M3 が提供する例外関連のクラ
ス(P.110)」を参照して下さい。
M3Page クラスの HandleError メソッドは、以下のように利用します。
例 1 M3Page クラスの HandleError 利用例(C#)
try
{
// 注文処理ロジックを呼び出す。
・・・
}
catch (Exception e)
{
// エラーをページ既定のエラーリストに表示
this.HandleError("注文処理",e);
}
例 2 M3Page クラスの HandleError 利用例(VB)
Try
'' 注文処理ロジックを呼び出す。
・・・
Catch e As Exception
'' エラーをページ既定のエラーリストに表示
HandleError("注文処理", e)
End Try
91 / 120
5. アプリケーションのカスタマイズ
前章で、M3 を利用した Web アプリケーション開発について、概要について一通り説明し
ました。本章をスキップし、
「6 おわりに(P. 120)」に従いサンプルに触れてみて、開発時に
リファレンスとして利用しても、理解に問題ありません。
本章では、M3 を利用した開発でよくあるタスクについて、作成した不具合管理機能にカス
タマイズを行いながら、説明します。
アプリケーションのカスタマイズ方法
アプリケーションのカスタマイズを行う場合、コントロールのプロパティ設定を変更する
ことで対応できるものはプロパティ設定の変更で対応します。プロパティ設定の変更だけ
では対応できない場合はイベントを作成し、処理を記述します。
5.1.
検索画面初期表示時に検索結果を表示する
M3 の既定の動作では、検索・結果表示画面の初期表示時には検索は実行されず、検索結果
は表示されていません。これを、初期表示時に検索結果を表示するようにカスタマイズし
ます。
カスタマイズ方法
検 索 を 制 御 す る UI コ ン ト ロ ー ラ の SearchController コ ン ト ロ ー ル (P.86) の
「DefaultSearch」プロパティが、初期表示時の検索実行、非実行を制御するプロパティで
す。このプロパティに True(既定は False)を設定することによって初期表示時に検索を
実行するようになります。
Visual Studio 2005(Visual Web Developer)で BugItemSearch.aspx のデザインビュー
を開き、SearchController コントロールのプロパティウィンドウを開きます。
92 / 120
図 54 検索コントロールのプロパティ設定画面
「DefaultSearch」プロパティの値を
「True」に設定
プロパティウィンドウの「DefaultSearch」の設定値を「True」に変更します。これで、初
期表示時の検索を実行するよう設定されたことになります。
同様に、CaptionExportController コントロール(P.88)の「DefaultSearch」の設定値も
「True」に変更します。この設定を行うことで、ダウンロード実行時初期表示時に行われ
た検索結果をファイルに出力するようになります。
データが登録された状態で検索画面を開くと、次のように初期表示時に検索結果が表示さ
れます。
図 55 初期表示時に検索結果を表示
93 / 120
5.2.
入力値に対する検索条件演算子を変更する
検索条件入力用コントロール、検索条件グループ化コントロールの「Operator」プロパテ
ィを変更することにより、出力する検索条件の演算子を変更することが可能です。
※
各サーバーコントロールの詳細については、
「4.7.2 検索条件用サーバーコントロール(P. 79)」を参照
してください。
列の検索条件演算子を変更する
「不具合内容」列の検索条件を「Like」から「Equal」に変更して、実行されるクエリを検
証します。
プロパティの設定
Web アプリケーションを終了し、Visual Studio で BugItemSearch.aspx の「不具合内容」
のテキストボックスのプロパティ画面を開いてください。
図 56 「不具合内容」の検索条件入力テキストボックスのプロパティ設定画面
「Operator」プロパティの値を
「Equal」に設定
Operator プロパティを「Like」から「Equal」に変更します。
動作検証
再度 Web アプリケーションを起動し、先ほどと同様不具合内容に「不具合内容」を入力、
カテゴリで「バックオフィス UI」を選択して検索を行ってください。
以下、コンソール出力結果の検証です。
リスト 29 コンソール出力結果
Page_Load が呼び出されました
検索条件:([Category]='BU') AND ([Contents]='不具合内容') -①
―中略―
・・・LogQuery : QUERY=[SELECT・・・WHERE ([Category]=@P0) AND ([Contents]=@P1)・・・
@P0:BU, @P1:不具合内容
-②
94 / 120
FindCaptionPanel から取得される検索条件(①)
、実行されるクエリ(②)共に、
「不具合
内容」列の検索条件が「=(イコール)」に変更されたことがわかります。
論理演算子(列ごとの検索条件を繋ぐ演算子)を変更する
列ごとの検索条件を繋ぎ合わせる論理演算子を「And」から「Or」に変更して、実行され
るクエリを検証します。
プロパティの設定
Visual Studio で BugItemSearch.aspx の FindCaptionPanel コントロールのプロパティ画
面を開いてください。
図 57 FindCaptionPanel のプロパティ設定画面
「Operator」プロパティの値を
「Or」に設定
Operator プロパティを「And」から「Or」に変更します。
動作検証
再度 Web アプリケーションを起動し、先ほどと同様不具合内容に「不具合内容」を入力、
カテゴリで「バックオフィス UI」を選択して検索を行ってください。
以下、コンソール出力結果の検証です。
リスト 30 コンソール出力結果
Page_Load が呼び出されました
検索条件:([Category]='BU') OR ([Contents]='不具合内容')
95 / 120
-①
―中略―
・・・LogQuery : QUERY=[SELECT・・・WHERE ([Category]=@P0) OR ([Contents]=@P1)・・・@P0:BU,
@P1:不具合内容
-②
FindCaptionPanel から取得される検索条件(①)
、実行されるクエリ(②)共に、列ごと
の検索条件を繋ぎ合わせる条件が「OR」に変更されたことがわかります。
5.3.
独自の検索条件を追加する
検索時、ユーザーインターフェースで入力された検索条件以外にプログラム内部で何らか
の検索条件を追加しなければいけない場合を想定しカスタマイズを行います。
今回は、
「Subject(項目名) Like ‘項目%’」を検索条件に追加するようカスタマイズしま
す。
カスタマイズ方法
検索を制御する UI コントローラの SearchController コントロール(P.86)の CreateCriteria
イベントを利用して、検索条件を追加する処理を記述します。以下にそのコード例を示し
ます。以下にそのコード例を示します。
リスト 31 検索条件追加のコード例(C#)
protected void ctlSearch_CreateCriteria(object sender, CriteriaEventArgs e)
{
// 既定の処理は実行しない。
e.Result = OperationResult.Handled;
// 入力された検索条件を取得
ICriteria criOrg = this.searchInput.GetCriteria();
//①
if (!SqlUtil.IsEmpty(criOrg))
{
// 検索条件が入力されている場合のみ実行
ICriteria criAdd = new Criteria("Subject", "項目*", Operator.Like); //②
// 2 つの検索条件を AND 条件でマージ
e.Criteria = SqlUtil.Merge(criOrg, criAdd, Operator.And); // ③
}
}
96 / 120
リスト 32 検索条件追加のコード例(VB)
Protected Sub ctlSearch_CreateCriteria(ByVal sender As Object, ByVal e _
As CriteriaEventArgs) Handles ctlSearch.CreateCriteria
'' 既定の処理は実行しない。
e.Result = OperationResult.Handled
'' 入力された検索条件を取得
Dim criOrg As ICriteria = searchInput.GetCriteria()
''①
If (SqlUtil.IsEmpty(criOrg) = False) Then
'' 検索条件が入力されている場合のみ実行
Dim criAdd As ICriteria = New Criteria("Subject", "項目*", _
[Operator].Like) ''②
'' 2 つの検索条件を AND 条件でマージ
e.Criteria = SqlUtil.Merge(criOrg, criAdd, [Operator].And) '' ③
End If
End Sub
上記のコード(リスト 31、リスト 32)では、次の事を行っています。
① FindCaptionPanel コントロールの GetCriteria メソッドを呼び出し、入力した検索条
件を取得します。
② Criteria クラスを使って、
「Subject Like ‘項目%’
」という検索条件を新規に作成し
ます。
③ ①で取得した検索条件と②の検索条件をマージし、イベント引数の Criteria プロパテ
ィに設定します。これで、内部的に、
「Subject Like ‘項目%’
」という検索条件が追
加されたことになります。
図 58 検索条件に「Subject Like ‘項目%’
」を追加した結果
④ 項目名が「項目…」であるデータのみが表示されます。
97 / 120
検索時のデータの取得処理を変更する
5.4.
検索処理を、既定の実装を利用せず、独自の実装にカスタマイズします。
カスタマイズ方法
検索結果データを取得する TableDataSource コントロールの Selecting イベントを追加し、
既定の処理を行わずに独自の検索処理を記述します。以下にそのコード例を示します。
※
TableDataSource コントロールの詳細については、「4.7.3 検索結果表示用サーバーコントロール
(P.84)」を参照してください。
リスト 33 検索自体の変更のコード例(C#)
protected void listDS_Selecting(object sender, DataSourceSelectingEventArgs args)
{
if (IsPostBack)
{
// 検索自体を既定の実装ではなくてデータマネージャを利用して実行
using (DirectDataManager mgr = new DirectDataManager())
{
String sql = "SELECT * FROM BugItem";//①
if (!SqlUtil.IsEmpty(listDS.Criteria))
{
sql += " WHERE {0}";//②
}
if (!TypeUtil.IsEmpty(args.SortExpression))
{
sql += " ORDER BY " + args.SortExpression; //③
}
DataTable table = mgr.GetDataTable(sql, listDS.Criteria); //④
sql = "SELECT COUNT(*) FROM BugItem";
if (!SqlUtil.IsEmpty(listDS.Criteria))
{
sql += " WHERE {0}";
}
int rowCount = Convert.ToInt32
(mgr.ExecuteScalar(sql, listDS.Criteria)); // ⑤
args.Rows = table.DefaultView;
// ⑥
args.TotalRowCount = rowCount;
// ⑦
}
}
}
リスト 34 検索自体の変更のコード例(VB)
Protected Sub listDS_Selecting(ByVal sender As Object, ByVal args As _
DataSourceSelectingEventArgs) Handles listDS.Selecting
If (IsPostBack) Then
'' 検索自体を既定の実装ではなくてデータマネージャを利用して実行
Using mgr As New DirectDataManager()
Dim sql As String = "SELECT * FROM BugItem" ''①
98 / 120
If (SqlUtil.IsEmpty(listDS.Criteria) = False) Then
sql += " WHERE {0}" ''②
End If
If (TypeUtil.IsEmpty(args.SortExpression) = False) Then
sql += " ORDER BY " + args.SortExpression
''③
End If
Dim table As DataTable = mgr.GetDataTable(sql, listDS.Criteria) ''④
sql = "SELECT COUNT(*) FROM BugItem"
If (SqlUtil.IsEmpty(listDS.Criteria) = False) Then
sql += " WHERE {0}"
End If
Dim rowCount As Integer = Convert.ToInt32( _
mgr.ExecuteScalar(sql, listDS.Criteria))
'' ⑤
args.Rows = table.DefaultView
'' ⑥
args.TotalRowCount = rowCount
'' ⑦
End Using
End If
End Sub
上記のコード(リスト 33、リスト 34)では、次の事を行っています。
① 検索条件を除いた SQL を作成します。
② 検索条件がある場合のみ、WHERE 句を追加した SQL に変更します。
③ 作成した SQL にソート条件を追加しています。
④ 画面で入力された検索条件(listDS.Criteria)で検索を実行します。
⑤ レコード数を取得します。
⑥ 検索結果を表示するデータのリストを設定します。
⑦ レコード数を設定します。
※
なお、このサンプルコードでは検索画面の「ページサイズ」の選択値(1 ページあたりの表示件数)
は反映されず、全件が取得されます。
99 / 120
5.5.
登録実行時の検証ロジックを変更する
ユーザーインターフェースからの入力値に対して内部的に検証のロジックを追加しなけれ
ばならない場合について説明します。今回は、登録時に「項目名」が「テスト」だった場
合に検証エラーとするようにカスタマイズを加えます。
カスタマイズ方法
不具合情報登録入力 ASPX(BugItemRegister.aspx)の doNext_Click イベントを変更し、
検証の処理を記述します。以下にそのコード例を示します。
リスト 35 検証ロジック追加のコード例(C#)
// 入力値をコピーし、次のページに遷移します。
protected void doNext_Click(object sender, EventArgs e)
{
if (!this.IsValid) return;
try
{
―中略―
// 入力値を検証しながらコピーします。
M3MessageList errors =
InputRuleManager.AssureSection("BugItem").SetValues(inputs, dao, false);
if (dao.Subject.Equals("テスト"))
{
// エラーメッセージを設定する
errors.AddDefault(M3Message.FromText(
"項目名に「テスト」は指定できません")); //-①
}
if (errors.Count > 0) throw new ValidationException(errors);
}
―中略―
}
リスト 36 検証ロジック追加のコード例(VB)
' 入力値をコピーし、次のページに遷移します。
Protected Sub doNext_Click(ByVal sender As Object, ByVal e As EventArgs)
If (Not IsValid) Then
Return
End If
Try
Dim inputs As IDataAccessor = ctlData.CurrentInputs
Dim dao As BugItem = CType(ctlData.Target, BugItem)
' 入力値を検証しながらコピーします。
Dim errors As M3MessageList = InputRuleManager.AssureSection("BugItem") _
100 / 120
.SetValues(inputs, dao, False)
If (dao.Subject.Equals("テスト")) Then
' エラーメッセージを設定する
errors.AddDefault(M3Message.FromText("項目名に" & _
"「テスト」は指定できません")) '//-①
End If
If errors.Count > 0 Then
Throw New ValidationException(errors)
End If
End Sub
上記のコード例(リスト 35、リスト 36)では、次のような処理を行っています。
① 入力規則による検証実行後、エラーメッセージのリストにエラーメッセージを追加
これで、項目名が「テスト」だった場合にエラーとする処理が追加されます。
図 59 検証ロジック追加実行結果
項目名に「テスト」を入力して「登録」をクリックするとエラーメッセージが表示されま
す。
101 / 120
5.6.
登録処理でのデータ保存時ロジックを変更する
登録時に処理を追加しなければならない場合について説明します。今回は登録時に、ユー
ザーインターフェースで入力された「項目名」の語尾に「文言追加」という文字列を付け
加えて登録するようにカスタマイズを加えます。
カスタマイズ方法
不具合情報登録確認 ASPX(BugItemRegisterConfirm.aspx)の doNext_Click イベントを
変更し、処理を記述します。以下にそのコード例を示します。
リスト 37 登録時の処理追加のコード例(C#)
// データの保存
protected void doNext_Click(object sender, EventArgs e)
{
―中略―
try
{
// トランザクション開始
mgr.BeginTrans();
// 文言追加
dao.Subject = dao.Subject + "文言追加";
// ①
// 登録後再読み込みします。
dao.RefreshOnSave = true;
// 検証は既に入力ページで行っているので省略します。
dao.ValidateOnSave = false;
dao.Save(mgr);
// トランザクションコミット
mgr.CommitTrans();
―中略―
}
リスト 38 登録時の処理追加のコード例(VB)
' データの保存
Protected Sub doNext_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim dao As BugItem = CType(ctlData.Target, BugItem)
' データマネージャを作成
Dim mgr As DataManager = New DataManager()
Try
' トランザクション開始
mgr.BeginTrans()
' 文言追加
dao.Subject = dao.Subject & "文言追加" '' ①
' 登録後再読み込みします。
dao.RefreshOnSave = True
102 / 120
' 検証は既に入力ページで行っているので省略します。
dao.ValidateOnSave = False
dao.Save(mgr)
' トランザクションコミット
mgr.CommitTrans()
―中略―
End Sub
上記のコード例(リスト 35、リスト 36)では、次のような処理を行っています。
① 「項目名」
(Subject)に”文言追加”を付け加える
これにより、ユーザーインターフェースで入力された項目名の語尾に「文言追加」の文字
列が追加されます。
103 / 120
5.7.
データベースより取得したデータでプルダウンを作成する
プルダウンリストを、設定ファイルではなくデータベースから取得したデータによって動
的に作成する場合について説明します。
今回は不具合情報登録入力ページの「登録者」の入力欄を、テキストボックスによる入力
ではなく、「オペレータ情報」テーブル(図 60 オペレータ情報テーブル概要)のデータ
を元に作成したプルダウンから選択するようカスタマイズを加えます。
また、確認画面や詳細画面等でキー値(オペレータ ID)に対応した表示値(名前)を表示
させるようカスタマイズを加えます。つまり不具合情報の「登録者」には Operator テーブ
ルの OperatorID を設定し、表示時には Name 列の値を利用します。
図 60 オペレータ情報テーブル概要
※本チュートリアルでは「Email」は利用しません。
カスタマイズ手順
本項では以下の手順でカスタマイズを行います。
1.
オペレータ情報テーブルの作成
プルダウンに表示するデータを保持するための「オペレータ情報」テーブルを作成します。
2.
オペレータ情報の初期データ投入
オペレータ情報テーブルに初期データを投入します。
3.
コード定義書の編集
プルダウン表示するデータを「オペレータ情報」テーブルから取得するためのコード定義
を、コード定義書に追加します。
4.
コード定義書変換、生成物の配置
コード定義書を変換し、生成物をソリューションに配置します。
5.
ASPX ファイルの変更
「登録者」のテキストボックスをプルダウンに変更します。また、確認・詳細画面でキー
104 / 120
値(オペレータ ID)に対応した表示値(名前)を表示させるよう変更します。
以降、この手順に沿って説明します。
1.
オペレータ情報テーブルの作成
テーブルを新たに作成する場合、実際の開発では「データベース定義書作成→コードジェ
ネレータで変換して SQL ファイルを生成→SQL 実行」という手順になりますが、ここでは
既に用意されている SQL ファイルを利用します。
利用している DBMS に応じて以下の SQL を実行し、オペレータ情報テーブルを作成して
ください。
SQL の実行は、SQL Server の場合には SQL Server Management Studio でチュートリ
アル用のデータベースを[右クリック]-[クエリの実行]から行います。
Oracle の場合は、SQL*Plus 等のツールを利用してください。
テーブル作成手順の詳細については、
「データベース定義書変換、生成物の配置 (P.33)」の
「テーブル作成」を参照してください。
SQL Server 2005 の場合
「%DOC_HOME%¥Support Files¥チュートリアル¥5 章¥5.7¥sql¥
¥Oracle¥CreateTable.sql」を利用
SQL Server 2000 の場合
「%DOC_HOME%¥Support Files¥チュートリアル¥5 章¥5.7¥sql¥
¥ SQLServer2000¥CreateTable.sql」を利用
Oracle9i、Oracle10g の場合
「%DOC_HOME%¥Support Files¥チュートリアル¥5 章¥5.7¥sql¥
¥SQLServer2005¥CreateTable.sql」を利用
2.
オペレータ情報の初期データ投入
作成したオペレータ情報テーブルに初期データを投入します。
SQL Server 2005、SQL Server 2000 の場合
「%DOC_HOME%¥Support Files¥チュートリアル¥5 章¥5.7¥sql¥
InitData(SQLServer).sql」を実行し、初期データを投入してください。
105 / 120
Oracle を利用する場合
SQL*Plus 等を利用し、
「%DOC_HOME%¥Support Files¥チュートリアル¥5 章¥5.7¥
sql¥InitData(Oracle).sql」を実行し、初期データを投入してください。
3.
コード定義書の編集
コード定義の追加を行います。
「%DOC_HOME%¥Support Files¥チュートリアル¥3 章¥コ
ード定義書.xls」を開き、次のように編集してください。なお、編集済みのコード定義書が
「%DOC_HOME%¥Support Files¥チュートリアル¥5 章¥5.7」以下にありますのでそちら
を利用しても構いません。
表 20 編集内容
項目
コード名称
不具合登録者
入力値
コード ID
BugOpEntered
型
データ
コード
OperatorID
名称
Name
定数名
OperatorID
備考
クエリ(SELECT OperatorID,Name FROM
Operator) タイムアウト(60)
説明
ユーザーインターフェースで表示名として
利用されます。
プログラムでコード定義にアクセスする場
合の ID として利用されます。
項目を表現する時の型を指定します。項
目をデータベースから取得する場合は「デ
ータ」を指定します。
キー値として利用される列名を指定しま
す。
表示値として利用される列名を指定しま
す。
「コード」の別名を指定します。別名が無け
れば「コード」と同様の値でかまいません。
データベースからデータを取得するクエリ
とタイムアウト時間(秒)を指定します。
上記のコード定義では以下のような指定を行っています。
1.
コード定義「BugOpEntered」はデータベースのデータを元に動的に作成される。
2.
データベースからデータを取得する際には「備考」に制定したクエリ「SELECT
OperatorID,Name FROM Operator」を実行して取得する。
3.
取得したデータの OperatorID 列をコード(キーの値)として利用し、Name 列を表示
名として利用する。
4.
取得されたデータは 60 秒間キャッシュされる。これは「備考」に指定した「タイムア
ウト(60)
」の設定に従う。
106 / 120
図 61 コード定義書
4.
コード定義書変換、生成物の配置
編 集 が 終 了 し た ら コ ー ド ジ ェ ネ レ ー タ で 変 換 し 、 生 成 さ れ た 「 M3Code.config 」 を
「¥App_Data¥M3¥appconfig」以下に上書きします。なお、コードジェネレータの利用方
法と生成物の配置先の詳細については「コード定義書変換、生成物の配置 (P. 37)」を参照
してください。
5.
ASPX ファイルの変更
登録画面の「登録者」のテキストボックスをプルダウンに変更する
変更の対象となる画面は BugItemRegister. aspx のみです。
「登録者」のテキストボックスを出力しているコードを次のように変更してください。
変更前
<m3:M3TextBox ID="inOpEntered" FieldName="OpEntered" runat="server" Columns="257"
MaxLength="255" />
変更後
<m3:M3DropDownList
runat="server" />
ID="inOpEntered"
Code="BugOpEntered"
FieldName="OpEntered"
確認・詳細画面で「登録者」の値をキー値(オペレータ ID)から表示値(名前)に変換し
て出力するよう変更する
対象となる画面は以下の通りです。
BugItemRegisterConfirm.aspx
BugItemDetail.aspx
BugItemUpdate.aspx
BugItemUpdateConfirm.aspx
107 / 120
各画面の、
「登録者」を出力しているコードを次のように変更してください。
C#の場合
変更前
<%= this.HtmlEncode(ctlData.Target["OpEntered"]) %>
変更後
<%= this.ToCode("BugOpEntered", ctlData.Target["OpEntered"])%>
VB の場合
変更前
<%= HtmlEncode(ctlData.Target("OpEntered")) %>
変更後
<%= ToCode("BugOpEntered", ctlData.Target("OpEntered"))%>
全ての作業が終了したらビルドを行い、Web アプリケーションを起動します。
起動したら不具合情報登録入力画面を開いてください。次のように「登録者」がプルダウ
ン表示されます。
図 62 不具合情報登録入力画面
また確認画面に遷移すると、選択したオペレータの「オペレータ ID」ではなく「名前」が
表示されます。
108 / 120
図 63 不具合情報登録確認画面
109 / 120
5.8.
M3 を利用して開発する際のエラー処理について
M3 では、エラー番号といった String 等の戻り値を利用せずに、例外を利用してエラーを
呼び出し側に伝えます。これは例外の方が、エラー番号より、エラーに関する情報を豊富
に含めることができるためです。
M3 では、スローする例外クラスの型により、ユーザーに表示可能なメッセージを含む例外
かそうでないかを判断しています。
本セクションでは、M3 が提供するエラー処理関連のクラスについて説明した後に、ユーザ
ーインターフェース層、ビジネスロジック層での例外処理について記述します。
5.8.1. M3 が提供する例外関連のクラス
メッセージクラス
M3 では、M3 のメッセージ機能と結びついた、ロケールに依存しないメッセージの表現と
して M3Message クラスを提供しています。
M3Message クラスは内部的にはメッセージ ID とメッセージに対する引数のみを保持して
おり、メッセージ内容取得時にメッセージ機能を利用してロケールに応じた言語別のメッ
セージを返します。
またメッセージを複数保持するクラスとして M3MessageList クラスを提供しています。
M3Message クラスと M3MessageList クラスとの関係は「図 64 M3MessageList の構造」
のようになります。
これらのクラスは、ECOSS.M3 名前空間に格納されています。
図 64 M3MessageList の構造
M3MessageList クラス
項目毎のメッセージ
フィールド名
内容(M3Message)
Name
名前は15文字以内で指定してください。
Password
パスワードは英数字のみで指定してください。
項目に結びつかない既定のメッセージ(M3Message)
1.既定のエラーメッセージ1
2.既定のエラーメッセージ2
3.既定のエラーメッセージ3
例外クラス
M3 が提供する例外クラスのうち、ユーザーに表示可能なメッセージ(M3Message または
110 / 120
M3MessageList)を含む例外は、M3UserException かその派生クラスのみです。アプリケ
ーションでユーザーに表示可能な例外をスローする際には M3UserException かその派生
クラスをスローしてください。
ユーザーに表示できないエラーの場合には、M3Exception、M3ApplicationException その
他.NET Framework が提供する例外をスローしてください。
M3 が提供する例外クラスは、M3 のメッセージ機能と密接に結びついておりロケールに応
じた(言語別の)エラーメッセージを表示可能です。
表 21 M3UserException とその派生クラスの一覧
クラス名
ECOSS.M3.M3UserException
ECOSS.M3.InvalidValueException
ECOSS.M3.ValidationException
ECOSS.M3.Framework.AccessDeni
edException
ECOSS.M3.Framework.Job.Member
shipMembershipException
ECOSS.M3.Framework.UserConcur
rencyException
ECOSS.M3.Framework.UserDuplica
teDataException
ECOSS.M3.Framework.UserNoData
Exception
ECOSS.M3.Framework.UserNoRefe
renceException
説明
ユーザーに表示可能な例外のベースクラスです。
値が不正の場合にスローされる例外クラスです。この例外は、
エラーメッセージの他にエラーとなった項目名と値を保持しま
す。
入力値の検証実行時、エラーが発生した場合の例外クラスで
す。複数のエラーを保持可能で M3MessageList クラスを保持し
ます。
アクセス権チェックを実行した時、アクセス権がない場合の例外
クラスです。
メンバーシッププロバイダを利用したビジネスロジッククラスで、
利用される例外クラスです。
同時実行エラーの際にスローされる例外クラスです。通常この
例外の回避策は実行中の処理を、最初から再度実行する必要
があります。
データ登録する時に登録対象のデータが既に存在する場合に
スローされる例外クラスです。
データ登録・更新する時に対象のデータが存在しない場合にス
ローされる例外クラスです。
参照先のデータが存在しない場合にスローされる例外クラスで
す。
111 / 120
メッセージ表示用サーバーコントロール
Web アプリケーションでエラーメッセージを表示するために、M3 では「表 22 メッセー
ジ表示用クラス」のようなコントロールを提供しています。
表 22 メッセージ表示用クラス
クラス名
ErrorLabel
MessageLabel
ErrorList
WarningList
M3Validator
説明
1件のエラーを表示します。
メッセージを表示します。Type プロパティを設定することによりエラーメッセージ、
警告メッセージとメッセージ形式を選択可能です。
複数件のエラーを表示します。
複数件の警告を表示します。
このクラスは検証コントロールですが、エラーメッセージ表示時にも利用されま
す。
入力値グループ化コントロールのユーティリティ
M3 で提供する入力値グループ化コントロールでは、配下の M3Validator、ErrorLabel と
いったエラー表示コントロールのディクショナリ(ErrorControlCollection クラス)を取得
するためのメソッド(GetErrorCollection)を提供しています。
ErrorControlCollection クラスを利用することにより、簡単に項目毎のエラーの表示が可能
です。
5.8.2. ユーザーインターフェース層でのエラー処理
ユーザーインターフェース層では、データベースへのアクセスを行うコードの記述、ビジ
ネスロジック呼び出しコードは、try...catch ブロックで囲むようにしてください。
catch ブロックでは、M3UserException およびその派生クラスがキャッチされた場合には、
M3UserException クラスの Message プロパティから取得できるメッセージをそのまま表
示し、それ以外の例外の場合は、想定外のエラーとみなしたログ出力などの適切な処理を
行うようにする必要があります。その際は、ユーザーフレンドリーなエラーメッセージを
表示してください。
M3 では、定型的なエラー処理を行うために、ASPX ページのベースクラスである M3Page
クラスで、HandleError メソッドを提供しています。
実際の HandleError メソッドの利用方法については、
「例外処理のハンドリング(P. 91)」を
参照してください。
また HandleError メソッド以外に提供されている、エラー処理関連のユーティリティは
112 / 120
FWUIUtil クラス(ECOSS.M3.Framework.Web.UI.FWUIUtil)で提供されています。
詳細については、FWUIUtil クラスのヘルプを参照してください。
5.8.3. ビジネスロジック層でのエラー処理
エラーが発生した場合は、なるべく M3UserException クラス、およびその派生クラスをス
ローします。それ以外の例外をスローする場合は、呼び出し側では、汎用エラーメッセー
ジしか設定できない点を留意してください。
5.9.
エラーメッセージを設定ファイルから取得する
エラーメッセージを、メッセージ設定ファイルから取得する場合について説明します。
今回は「5.5 登録実行時の検証ロジックを変更 (P.100)」で行ったカスタマイズを変更しま
すので、カスタマイズを行っていない場合は、先に「5.5 登録実行時の検証ロジックを変更
(P.100)」を実践してください。
「5.5 登録実行時の検証ロジックを変更」では、検証エラーとなった際に以下のようなコー
ドで直接エラーメッセージを設定しました。今回はこのエラーメッセージを設定ファイル
から取得するよう変更します。
リスト 39 エラーメッセージを直接設定 (C#)
// エラーメッセージを設定する
errors.AddDefault(M3Message.FromText("項目名に「テスト」は指定できません"));
カスタマイズ手順
本項では以下の手順でカスタマイズを行います。
1.
メッセージ定義書の作成
M3 のメッセージ定義書に、利用するエラーメッセージを定義します。
2.
メッセージ定義書変換、生成物の配置
作成したメッセージ定義書を変換し、生成物をソリューションに配置します。
3.
エラーメッセージを取得するコードを記述
「リスト 39 エラーメッセージを直接設定」のエラーメッセージ取得のコードを、メッセ
ージ設定を利用してエラーメッセージを取得するよう変更します。
以降、この手順に沿って説明します。
113 / 120
1. メッセージ定義書の作成
メッセージ定義書を作成します。
編集済みのメッセージ定義書が「%DOC_HOME%¥Support Files¥チュートリアル¥5 章
¥5.9-1-メッセージ」以下にありますのでそちらを利用しても構いません。
表 23 編集内容
項目
パッケージ
AP
入力値
クラス名
BugItem
メッセージ ID APEBO1000
発生条件
メッセージ
パラメータ
不具合情報登録入力の
項目名にテストを入力し
て登録ボタンを押下
項目名に「テスト」は指定
できません。入力値({0})
―
説明
メッセージのパッケージ名を指定します。パッケージ名毎
に設定ファイルが作成されます。
メッセージを発生させるクラス名、コンポーネント名を指定
します。コードジェネレータ変換時には参照されませんの
で、管理用に利用します。
プログラムでメッセージにアクセスする場合の ID として利
用されます。
メッセージの発生条件を記入します。コードジェネレータ変
換時には参照されませんので、管理用に利用します。
メッセージ内容を指定します。
メッセージに動的なパラメータを指定する場合は、パラメ
ータの意味を指定します。管理用に利用します。
上記のメッセージ定義では、
「APEBO1000」という ID で「項目名に「テスト」は指定で
きません。入力値({0})
」というメッセージを取得できるように定義しています。なお、{0}
は「項目名」に入力された文字列に変換されます。
図 65 メッセージ定義書
114 / 120
2. メッセージ定義書変換、生成物の配置
編 集 が 終 了 し た ら コ ー ド ジ ェ ネ レ ー タ で 変 換 し 、 生 成 さ れ た 「 AP.config 」 を
「¥App_Data¥M3¥messages¥message」以下に配置します。配置ディレクトリが存在し
ない場合は作成してください。なお、変換時の設定は次のように行ってください。
表 24 メッセージ定義書変換時の設定
項目
ExcelFile
入力値
作成したメッセージ定義
書(Excel)を指定します。
MessageCharset utf-8
説明
変換するメッセージ定義書を指定します。
メッセージ設定ファイルの文字コードを指定します。
コードジェネレータの利用方法と生成物の配置先、また、メッセージ定義書の記述方法の
詳細については「%DOC_HOME%¥技術ドキュメント¥M3 定義書とコードジェネレータ利
用方法.doc」の「9. メッセージ定義書変換」を参照してください。
3. エラーメッセージを取得するコードを記述
不具合情報登録入力 ASPX(BugItemRegister.aspx)の doNext_Click イベントのエラーメ
ッセージ設定部分を、次のように設定ファイルからメッセージを取得するようコードを編
集してください。
編集したコード(①)では、AP というパッケージ名を指定していますが、このパッケージ
名は「¥App_Data¥M3¥messages¥message」以下の設定名(=ファイル名)を表します。
よ っ て こ こ で は 「 ¥App_Data¥M3¥messages¥message¥AP.config 」 に 定 義 さ れ た
「APEBO1000」という ID のメッセージを指定していることになります。
リスト 40 エラーメッセージを設定ファイルから取得(C#)
// 入力値をコピーし、次のページに遷移します。
protected void doNext_Click(object sender, EventArgs e)
{
if (!this.IsValid) return;
try
{
―中略―
// 入力値を検証しながらコピーします。
M3MessageList errors =
InputRuleManager.AssureSection("BugItem").SetValues(inputs, dao, false);
if (dao.Subject.Equals("テスト"))
{
// エラーメッセージを設定する
errors.AddDefault(new M3Message("AP::APEBO1000",
dao.Subject)); //-①
}
115 / 120
―中略―
}
リスト 41 エラーメッセージを設定ファイルから取得(VB)
' 入力値をコピーし、次のページに遷移します。
Protected Sub doNext_Click(ByVal sender As Object, ByVal e As EventArgs)
―中略―
Try
Dim inputs As IDataAccessor = ctlData.CurrentInputs
Dim dao As BugItem = CType(ctlData.Target, BugItem)
' 入力値を検証しながらコピーします。
Dim errors As M3MessageList = InputRuleManager.AssureSection("BugItem") _
.SetValues(inputs, dao, False)
If (dao.Subject.Equals("テスト")) Then
' エラーメッセージを設定する
errors.AddDefault(new M3Message("AP::APEBO1000", _
dao.Subject)) '//-①
End If
―中略―
End Sub
全ての手順が終了したら[ビルド]-[デバッグ実行]を行ってください。
図 66 実行結果
項目名に「テスト」を入力して「登録」をクリックするとメッセージ定義書に定義したエ
ラーメッセージが表示されます。
116 / 120
メッセージの追加、変更について
本項で説明しましたが、M3 ではメッセージ設定ファイルはメッセージ定義書(Excel)を
変換することによって生成されます。
既存のメッセージの変更や新しいメッセージを追加する場合などは、メッセージ設定ファ
イルは編集せず、メッセージ定義書を編集して再度メッセージ設定ファイルを生成して既
存の設定ファイルに上書きしてください。
補足:例外を利用したエラー処理
M3 では、エラー発生時にユーザーに表示する例外は M3UserException かその派生クラス
を利用します。エラー処理の詳細については「5.8 M3 を利用して開発する際のエラー処理
について(P.110)」を参照してください。
ここでは、エラー表示用のコントロールにメッセージを表示する代わりに、例外をスロー
し、登録コントローラの既定のエラー処理を利用してエラーメッセージを表示する方法を
検証します。
M3UserException をスロー
不具合情報登録入力 ASPX(BugItemRegister.aspx)の doNext_Click イベントを次のよう
に M3UserException を利用したエラー処理に変更してください。
リスト 42
M3UserException を利用したエラー処理(C#)
// 入力値をコピーし、次のページに遷移します。
protected void doNext_Click(object sender, EventArgs e)
{
―中略―
// 入力値を検証しながらコピーします。
M3MessageList errors =
InputRuleManager.AssureSection("BugItem").SetValues(inputs, dao, false);
if (dao.Subject.Equals("テスト"))
{
// エラーメッセージを設定した M3UserException を throw
throw new M3UserException(new M3Message("AP::APEBO1000", dao.Subject));
}
―中略―
}
リスト 43
M3UserException を利用したエラー処理(VB)
' 入力値をコピーし、次のページに遷移します。
Protected Sub doNext_Click(ByVal sender As Object, ByVal e As EventArgs)
―中略―
117 / 120
' 入力値を検証しながらコピーします。
Dim errors As M3MessageList = InputRuleManager.AssureSection("BugItem") _
.SetValues(inputs, dao, False)
If (dao.Subject.Equals("テスト")) Then
' エラーメッセージを設定した M3UserException を throw
Throw new M3UserException(New M3Message("AP::APEBO1000", dao.Subject))
End If
―中略―
End Sub
コードの変更が終了したら[ビルド]-[デバッグ実行]を行い、
「図 66 実行結果」と同様の実
行結果が得られることを確認してください。
M3UserException 以外の例外をスロー
M3UserException 以外の例外クラスをスローした場合、ユーザーインターフェースではハ
ンドリングされないことを確認します。
不具合情報登録入力 ASPX(BugItemRegister.aspx)の doNext_Click イベントを、次のよ
うに M3UserException ではなく Exception をスローするように変更してください。
リスト 44 スローする例外を Exception クラスに変更 (C#)
// 入力値をコピーし、次のページに遷移します。
protected void doNext_Click(object sender, EventArgs e)
{
―中略―
// 入力値を検証しながらコピーします。
M3MessageList errors =
InputRuleManager.AssureSection("BugItem").SetValues(inputs, dao, false);
if (dao.Subject.Equals("テスト"))
{
// エラーメッセージを設定した Exception を throw
throw new Exception("Exception が発生しました");
}
―中略―
}
リスト 45 スローする例外を Exception クラスに変更 (VB)
' 入力値をコピーし、次のページに遷移します。
Protected Sub doNext_Click(ByVal sender As Object, ByVal e As EventArgs)
―中略―
' 入力値を検証しながらコピーします。
118 / 120
Dim errors As M3MessageList = InputRuleManager.AssureSection("BugItem") _
.SetValues(inputs, dao, False)
If (dao.Subject.Equals("テスト")) Then
' エラーメッセージを設定した Exception を throw
Throw new Exception("Exception が発生しました")
End If
―中略―
End Sub
コードの変更が終了したら[ビルド]-[デバッグ実行]を行ってください。
図 67 実行結果
ユーザーインターフェースでは例外がハンドリングされず、システムエラーが発生するこ
とがわかります。
また、コンソールを見てください。想定外のエラー時には以下のようにエラー内容がログ
出力されています。
リスト 46 想定外のエラー時のコンソール出力(C#)
… ‾/Tutorial/BugItemRegister.aspx の Execute:BugItem で想定外の例外が発生しました …
ソース:App_Web_dfj25yaj
-Stack Trace[Exception] 場所 BugItemRegister.ctlData_Execute(Object sender, DataObjectEventAr …
場所 ECOSS.M3.Framework.Web.UI.Controllers.DataUpdateControllerBase …
場所 ECOSS.M3.Framework.Web.UI.Controllers.DataUpdateControllerBase. …
119 / 120
6. おわりに
以上で、チュートリアルは終了です。さらに、M3 について学習するには以下のドキュメン
トを参考にしてください。
M3 に つ い て 、 M3 が 提 供 す る 機 能 に つ い て の 概 要 を 理 解 す る に は 、
「%DOC_HOME%¥M3 ファーストステップガイド.doc」を参照してください。
M3 が 提 供 す る 機 能 を 、 実 際 に プ ロ グ ラ ム を 書 き な が ら 学 習 す る 場 合 は 、
「%DOC_HOME%¥自習書」以下の各ドキュメントを参照してください。
コードジェネレータの利用方法については、
「%DOC_HOME%¥技術ドキュメント¥M3
定義書とコードジェネレータ利用方法.doc」を参照してください。
M3 が提供するデータアクセス機能について確認するためには、
「%DOC_HOME%¥技
術ドキュメント¥M3 データアクセス機能.doc」を参照してください。
M3 が 提 供 す る ラ イ ブ ラ リ の API に つ い て 確 認 す る た め に は 、 M3 の ヘ ル プ
「%DOC_HOME%¥M3.chm」を参照してください。
M3 が提供する機能ごとの技術的説明については、
「%DOC_HOME%¥技術ドキュメン
ト」以下の各ドキュメントを参照してください。
※
M3 が提供するドキュメントについてお知りになりたい方は、
「%DOC_HOME%¥M3 で提供するド
キュメント.doc」を参照してください。
以上
120 / 120
Fly UP