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