Oracle® Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド 11g リリース2(11.1.2.3.0) B69399-02 |
|
前 |
次 |
この付録では、一部の一般的なOracle FormsのタスクがOracle ADFにどのように実装されているかについて説明します。Oracle Formsでは、一部のタスクをデータ・ブロックで実行し、その他のタスクをUIで実行します。このため、この付録はデータに関連するタスクと、UIに関連するタスクの2つの項に分けられています。
この付録には、次の項が含まれます。
Oracle Formsでは、データにのみ関連するタスクはデータ・ブロックで実行されます。Oracle ADFでは、これらのタスクは、データを保持するビジネス・コンポーネント(エンティティ・オブジェクト)と、データを問い合せるオブジェクト(ビュー・オブジェクト)で実行されます。
Oracle Formsでは多くの場合、編集可能な表に別の表への外部キー検索列があります。この表示値はわかりやすく、関連表に存在する外部キー列の値に対応しています。一般的には、このような関連表示値は、ユーザーに対して表示される必要があります。
Formsでは、非データベースのアイテムをデータ・ブロックに追加し、ブロックレベルのPOST-QUERY
トリガーをデータ・ブロックに追加し、さらにそれぞれの外部キー属性にSQLのSELECT文を記述する必要があったため、これは複雑なタスクでした。また、ユーザーがデータを変更する場合は、外部キーの値をアイテム・レベルのWHEN-VALIDATE-ITEM
トリガーで同期化させる必要がありました。Oracle ADFでは、この処理ははるかに簡単です。
Oracle ADFでのタスクの実装
次を含むビュー・オブジェクトを作成します。
プライマリ・エンティティ・オブジェクトの慣用名として、メインとなる編集可能なエンティティ・オブジェクト
基礎となる表が表示テキストを含む、1つ以上の関連エンティティに対するセカンダリ「参照」エンティティ・オブジェクトの慣用名
詳細は、5.5.1項「エンティティ・ベースのビュー・オブジェクトに対する結合の作成方法」を参照してください。
5.5.2項「参照エンティティ・オブジェクトの慣用名からの追加属性の選択方法」で説明したとおり、必要な属性(表示テキストが最低限必要です)をセカンダリ・エンティティ・オブジェクトの慣用名から選択します。
実行時には、メイン・エンティティのデータおよび関連する検索表示フィールドすべてのデータが単一結合でデータベースから取得されます。
ユーザーがデータを変更できる場合、追加の手順は必要ありません。ユーザーが外部キー属性の値を変更する場合は、関連付けられた表の新規の関連行について参照情報を自動的に取得します。
Oracle Formsでは、現在の日時を取得する場合はデータベースからsysdate
を取得します。Oracle ADFでは、JavaメソッドやGroovy式を使用してシステム日付を取得するオプションもあります。
Oracle ADFでのタスクの実装
データベースからシステム日付を取得するには、次のGroovy式をエンティティ・レベルで使用します。
DBTransaction.currentDbTime
注意:
|
このGroovy式を使用してデフォルト値を属性に割り当てる場合は、4.10.7項「式を使用してデフォルト値を定義する方法」を参照してください。
Javaからシステム日付を取得するには、getCurrentDate()
メソッドをコールします。詳細は、8.10項「現在の日時へのアクセス」を参照してください。
Oracle Formsでは、読取り一貫性、つまりSQL文が発行されたタイミングのデータの状態を示すデータベースの機能が考慮されます。
Oracle ADFでのタスクの実装
エンティティ・ベースのビュー・オブジェクトを使用する場合は、問合せにより、保留中のトランザクションで、現在のユーザーのセッションごとに処理中の変更を参照できます。これはデフォルト動作であり、最も正確なものです。
また、現在のユーザーによる保留中の変更を考慮せず、データベースのデータのスナップショットを必要とする場合は、読取り専用ビュー・オブジェクトを使用し、問合せを再実行して、最新のコミット済データベース値を参照できます。読取り専用ビュー・オブジェクトの詳細は、5.2.3項「エキスパート・モードの読取り専用ビュー・オブジェクトの作成方法」を参照してください。
計算済フィールドは通常、2つの値の合計を示す場合に使用されますが、2つ以上のフィールドの連結値またはメソッド・コールの結果にも使用できます。
Oracle ADFでのタスクの実装
計算属性はその値がプログラムで容易に取得できるため、データベースには保存されません。中間層で使用されるが、データベースには格納されない属性は一時属性と呼ばれます。一時属性はエンティティ・オブジェクト・レベルまたはビュー・オブジェクト・レベルで定義できます。
一時属性が、1つのエンティティ・オブジェクトをベースとしている可能性がある複数のビュー・オブジェクトで使用されている場合は、エンティティ・オブジェクト・レベルの属性を定義します。これを定義しない場合は、特定のビュー・オブジェクトに対するビュー・オブジェクト・レベルの一時属性を定義します。
エンティティ・オブジェクト・レベルでの一時属性の定義については、4.11項「エンティティ・オブジェクトへの一時属性および計算属性の追加」を参照してください。ビュー・オブジェクト・レベルでの一時属性の定義については、5.14項「ビュー・オブジェクトへの計算属性および一時属性の追加」を参照してください。
Oracle Formsでは、ミラー・アイテムを使用して同一の値を共有する2つ以上のフィールドを表示できます。
Oracle ADFでのタスクの実装
UIとデータは分離されるため、ミラー・アイテムをOracle ADFで保持する必要はありません。同一の値を持つミラー・アイテムを作成しなくても、任意の数のページに同一のビュー・オブジェクトを表示できます。同様に、1つのフォームの複数の箇所に同一のフィールドを表示できますが、これをミラーリングする必要はありません。
標準データベース型で作業する場合、Oracle ADFでCLOB
およびBLOB
タイプの使用方法を把握する必要があります。
Oracle ADFでのタスクの実装
Oracle ADFでは、組込みデータ型ClobDomain
またはBlobDomain
を使用します。これらは、このような列タイプのある既存の表から、エンティティ・オブジェクトまたはビュー・オブジェクトをリバース・エンジニアリングする場合に自動的に作成されます。ADFビジネス・コンポーネントは、Intermedia列型に対するデータ型であるOrdImage
、OrdAudio
、OrdDoc
およびOrdVideo
もサポートしています。詳細は、4.10.1項「エンティティ・オブジェクト属性のデータベースおよびJavaデータ型を設定する方法」を参照してください。
Oracle ADFとOracle Formsでは、一般的なUI関連タスク(マスター/ディテール画面、値のポップアップ・リスト、ページ・レイアウトなど)の処理が大きく異なります。この項では、Oracle ADFでのUIに関連する、一部の一般的なOracle Formsのタスクの実行方法について説明します。
JSFのコンテナベースの方法、およびADF Swingのレイアウト・マネージャの方法とは異なり、Oracle Formsは絶対ピクセルまたはポイントベースのレイアウトに基づいています。
Oracle ADFでのタスクの実装
Oracle ADFでのページのレイアウト方法に関する詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』を参照してください。
Oracle Formsでは、スタック・キャンバスは通常、画面領域の表示および非表示に使用されていました。
Oracle ADFでのタスクの実装
Oracle ADFで、スタック・キャンバスに相当するのは、renderedプロパティをtrue
またはfalse
に設定したパネル(レイアウト・コンテナ)です。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』を参照してください。
Oracle ADFでは、マスター/ディテール関係は、ビュー・リンクを介して調整されます。ビュー・リンクは、概念的にはOracle Formsのリレーションに類似しています。
Oracle ADFでのタスクの実装
ビュー・リンクの作成方法の詳細は、5.6項「マスター/ディテール階層における複数表の使用」を参照してください。ビュー・リンクで2つのビュー・オブジェクトの関係を確立した後は、5.6.4項「データ・モデルでアクティブなマスター/ディテール調整を有効化する方法」を参照してください。
Oracle Formsには、問合せ入力画面の作成という一般的なタスクもありました。つまり、画面は検索モードで始まります。
Oracle ADFでのタスクの実装
Oracle ADFでは、これは検索フォームで行われます。検索フォームの作成方法に関する詳細は、第31章「ADFによるデータバインドされた検索フォームの作成」で説明されています。特に、31.3.1項「ビュー基準に検索フォーム・プロパティを設定する方法」が参考になるでしょう。
Oracle Formsでは、多数のレコードを同時に編集および挿入できる表を作成できます。Oracle ADFでは、既存レコードの編集と新規レコードの作成の操作は同じではないため、JSFページを使用する場合は若干複雑になります。
Oracle ADFでのタスクの実装
Oracle ADFでは、この場合、入力表を使用します。入力表を作成するには、27.4項「入力表の作成」を参照してください。
Oracle Formsでは、簡単に値リスト(LOV)オブジェクトを作成し、そのオブジェクトを宣言でフィールドに関連付けることができました。このLOVにより、ポップアップ・ウィンドウが表示され、次のことが可能になります。
モーダル値の選択
LOVダイアログの最上部での問合せ
複数列の表示
LOVを起動したフィールドのコンテンツに基づく、LOVコンテンツの自動縮小
LOV機能の起動時に、フィールドの値に一致する値が1つのみの場合のリスト値の自動選択
LOVでキャッシュされた値に基づく、フィールド値の検証
フィールド・コンテンツが有効でない場合のLOVの自動ポップアップ
Oracle ADFでのタスクの実装
Oracle ADFにポップアップ・リストを実装するには、LOV型となるビュー・オブジェクトの属性のいずれかを構成し、UIヒントのスタイルとして、「値リストを使用した入力テキスト」を選択します。手順の詳細は、5.12項「ビュー・オブジェクト属性の値リスト(LOV)での作業」を参照してください。
Oracle Formsでは、値リスト(LOV)オブジェクトを作成し、そのオブジェクトを宣言でフィールドに関連付けることができました。Oracle ADFでは、複数の利用可能な値がある検索フィールドに使用できる、検索項目のあるLOV(検索値)画面を実装できます。
Oracle ADFでのタスクの実装
Oracle ADFにドロップダウン・リストを実装するには、LOV型となるビュー・オブジェクトの属性のいずれかを構成し、UIヒントのスタイルとして、「値リストを使用した入力テキスト」を選択します。手順の詳細は、5.12項「ビュー・オブジェクト属性の値リスト(LOV)での作業」を参照してください。
Oracle Formsでは、値リスト(LOV)オブジェクトを作成し、そのオブジェクトを宣言でフィールドに関連付けることができました。Oracle ADFでは、別のテーブルにある文字列値を使って、ドロップダウン・リストを実装できます。これらの文字列値は、画面がベースとしている表への有効な入力であるIDコードとともに、フィールドに移入されます。
Oracle ADFでのタスクの実装
Oracle ADFにこのタイプのドロップダウン・リストを実装するには、LOV型となるビュー・オブジェクトの属性のいずれかを構成し、UIヒントのスタイルとして、「選択リスト」を選択します。手順の詳細は、5.12項「ビュー・オブジェクト属性の値リスト(LOV)での作業」を参照してください。
Oracle ADFでは、ユーザーが特定のレコードを変更しようとしていることが明確になった瞬間に、データベースのレコードをロックできます。
Oracle ADFでのタスクの実装
行の即時ロックは、デフォルトではなく、Webアプリケーション・シナリオでは通常使用されませんが、ADFビジネス・コンポーネントで構成できます。Webアプリケーションでは、デフォルトの構成設定jbo.locking.mode=optimistic
を使用します。詳細は、43.11.1項「アプリケーションがオプティミスティック・ロックを使用していることを確認する方法」を参照してください。
レコードがユーザーによってロックされた場合、レコードが更新不可になっていることをエラーのスローによって別のユーザーに通知すると便利です。
Oracle ADFでのタスクの実装
行のロック、および行がロックされている場合の例外スローは、ADF Business Componentsの機能に組み込まれています。エラー・メッセージを処理する方法は、静的エラー・メッセージ、または現在行に関する情報を含むカスタム・メッセージのどちらが必要かによって異なります。
静的メッセージをスローするには、データ・モデル・プロジェクトにバンドルされているカスタム・メッセージを登録し、デフォルトのRowAlreadyLockedException
のエラー・メッセージをより明確でわかりやすいものに置き換えます。
行に関する情報を含むメッセージをスローするには、RowAlreadyLocked
例外を取得するtry/catchブロックを使用して、エンティティ・オブジェクトのlock()
メソッドをオーバーライドします。例外を取得したら、現在行に関するより詳細な情報を含むエラー・メッセージをスローできます。