ヘッダーをスキップ

Oracle Applications開発者ガイド
リリース12
E06048-01
目次へ
目次
前のページへ
前へ
次のページへ
次へ

問合せ動作の使用可能化

問合せ検索の概要

問合せ検索(ビュー検索とも呼ばれます)を実装するには2つの方法があります。1つは行の値リストを表示する方法で、使用できる行を表示してそこから1つを選択できます。もう1つは、ユーザーがデータ選択に使用するフィールドを示す「検索」ウィンドウを開く方法です。

指定したブロックに適用できる実装方法は1つのみです。フォーム内にある問合せ可能なブロックのすべては、問合せ検索をサポートしている必要があります。『Oracle Applicationsフォーム・ベース製品のユーザー・インタフェース標準』は、2つの実装について、どのような場合により適切であるかを説明しています。

フォーム・スタートアップでの問合せ検索の実行

フォームに入ると同時に行の値リストまたは「検索」ウィンドウを表示する場合には、WHEN-NEW-FORM- INSTANCEトリガーの終わりに次のファンクションをコールします。

EXECUTE_TRIGGER('QUERY_FIND'); 

これによって、フォームの最初のブロックにある間にユーザーがファンクションを起動することをシミュレートします。

行の値リストの実装

行の値リストを実装するには、まずフォーム・パラメータとしてユーザーが必要とする行の主キーを選択する値リストを作成し、次に問合せを実行する直前の結果ブロック内の主キー・フィールドに値をコピーします。

ここでは、DEPTブロックを例としてあげます。DEPTブロックはDEPT表に基づき、DEPTNO、DNAMEおよびLOCの3つの列で構成されています。この表の各行は会社の部門に対応しています。

主キーに対応するパラメータの作成

行の値リストに対して主キーを持つフォーム・パラメータを作成します。行の値リストが詳細ブロック向けの場合は、マスター・ブロック(結合列)に対する外部キー向けのパラメータは必要ありません。ただし、後の手順でレコード・グループのWHERE句の中にその列を含む必要があります。適切なデータ型とデータ長を設定してください。

たとえば、DEPTブロックに対しては、DEPTNO_QFと呼ばれるパラメータを作成します。

値リストの作成

要求された行についてユーザーによる識別が必要な列を含む値リストを作成します。行の値リストが詳細ブロック向けの場合は、レコード・グループのWHERE句の中にマスター・ブロック(結合列)に対する外部キーを含める必要があります。列に対する主キーをパラメータに返します。

ここでは、例としてDEPTNO列およびDNAME列を含む値リストとDEPT_QFを作成します。DEPTNOの戻り項目をパラメータDEPTNO_QFに設定します。ユーザーはDNAMEは見ることができますが、これはどのフィールドにも返されません。

PRE-QUERYトリガーの作成

次のコードを含むブロック・レベルのPRE-QUERYトリガーを作成します。(実行階層: 前)

IF :parameter.G_query_find = 'TRUE' THEN

  <Primary Key> := :parameter.<Your parameter>;

 :parameter.G_query_find := 'FALSE';

END IF;

複数部分に分割されたキーについては、主キーに対して複数の割当てを必要とします。

パラメータG_query_findは、TEMPLATEフォーム内にあります。

Deptの例では、PRE-QUERYトリガーは次のコードを含んでいます。

IF :parameter.G_query_find = 'TRUE' THEN

  :DEPT.DEPTNO := :parameter.DEPTNO_QF

  :parameter.G_query_find := 'FALSE';

END IF;

QUERY_FINDトリガーの作成

最後に、次のコードを含む結果ブロック(実行階層: オーバーライド)にブロック・レベルのユーザーが名前を付けたトリガーQUERY_FINDを作成します。

 APP_FIND.QUERY_FIND('<Your LOV Name>');

DEPTに対しては次のとおりです。

 APP_FIND.QUERY_FIND('DEPT_QF');

「検索」ウィンドウの実装

「検索」ウィンドウを実装するには、検索を開始してすべての項目値をそのブロックから問合せを実行する直前の結果ブロックにコピーするまで、ユーザーが検索するフィールドを含む別のウィンドウを作成します。

この例として、EMP表に基づくブロックの例があります。これは結果ブロックとして参照されます。この表の主キーはEMPNOです。このブロックには、データ・フィールド、HIREDATEも含まれています。「検索」ウィンドウは、EMPNOまたはHIREDATESの範囲によってレコードを検索するように設計されています。

「検索」ウィンドウのルック・アンド・フィールの詳細は、『Oracle Applicationsフォーム・ベース製品のユーザー・インタフェース標準』を参照してください。

「検索」ウィンドウのフレックスフィールドには特別な処理が必要です。詳細は、「「検索」ウィンドウでのキー・フレックスフィールドの使用」を参照してください。

APPSTANDからQUERY_FINDオブジェクト・グループをコピー

APPSTANDフォームから作成中のフォームへQUERY_FINDオブジェクト・グループをコピーします。これには、「検索」ウィンドウ作成時の最初のウィンドウ、ブロックおよびキャンバスが含まれています。

コピーを終了したらこのオブジェクト・グループを削除してください。ウィンドウ、キャンバスおよびブロックは残りますが、別の「検索」ウィンドウが必要な場合に再度このオブジェクト・グループをコピーすることが可能です。

警告: このオブジェクト・グループは参照しないでください。カスタマイズが必要です。

ブロック名、キャンバス名およびウィンドウ名の変更

ブロック名、キャンバス名およびウィンドウ名を変更します。ブロックの問合せ可能なプロパティを「No」に設定します。

この例では、ブロック名、キャンバス名、ウィンドウ名をそれぞれEMP_QF、EMP_QF_CANVAS、EMP_QF_WINDOWに変更します。

「新規」ボタンのトリガーの編集

結果ブロック名が引数となるように、「検索」ウィンドウ・ブロックの「新規」ボタンに対してWHEN-BUTTON-PRESSEDトリガーを編集します。Oracle Applicationsは、この情報を使用して作成したブロックにナビゲートしたり新しいレコードの位置に移動できます。このボタンが含まれているのは、最初にフォームを開いたときに「検索」ウィンドウが自動的に表示されるためです。ユーザーが新しいレコードの入力をすぐに行う場合には、このボタンを押すことで実行できます。

app_find.new('<Your results blockname here>');

これは次のようになります。

app_find.new('EMP');

「検索」ボタンのトリガーの編集

結果ブロック名が引数となるように、「検索」ボタンに対してWHEN-BUTTON-PRESSEDトリガーを編集します。この情報によって、Oracle Applicationsでブロックにナビゲートしたり問合せを実行することが可能になります。

app_find.find('<Your results blockname here>');

これは次のようになります。

app_find.find('EMP')   

「検索」ウィンドウにある項目についてさらに検証する必要がある場合は、APP_FIND.FINDのコール前に作成したコードを置きます。特に、最大/最小範囲のフィールドが正しいことを確認する必要があります。また、条件が何も入力されていない場合や入力された条件の処理に長時間を要する場合には、警告を発することもできます。

ナビゲーション・データ・ブロックのプロパティ設定

「検索」ブロックの「前のナビゲーション・データ・ブロック」プロパティが結果ブロックとなるように設定します。これによって、ユーザーは問合せを実行せずに「検索」ウィンドウから離れることができます。

次のデータ・ブロックおよび前のデータ・ブロックは、結果ブロックから上下のオブジェクト階層にのみ移動します。すなわち「検索」ウィンドウに戻ることはありません。

KEY-NXTBLKトリガーの編集

「検索」ボタンと同一の機能を持つように「検索」ブロックのKEY-NXTBLKトリガーを編集します。ユーザーが「実行」->「次のブロック」と選択した場合は、「検索」ボタンを押したのと同じ動作となります。

「検索」ウィンドウのタイトルの変更

「検索」ウィンドウのタイトルを変更します。

EMPの例では「従業員の検索」を使用します。

必要な項目の作成

ユーザーが「検索」ウィンドウ・ブロックで問合せを行うための項目を作成します。結果ブロックから「検索」ウィンドウ・ブロックにコピーをすることで簡単に作成できます。

「検索」ウィンドウの項目については次のガイドラインに従ってください。

「検索」ウィンドウをフォーム用に調整

「検索」ウィンドウを用途にあわせて調整します。ウィンドウ、位置、フィールドなどのサイズを変更します。

PRE-QUERYトリガーの作成

結果ブロック(実行階層: 前)でブロック・レベルのPre-Queryトリガーを作成します。ここでは、「検索」ウィンドウ・ブロックから(問合せが実際に生じる)結果ブロックに問合せ基準をコピーします。

文字データのコピーには、Oracle FormsのCOPYビルトインを使用できます。その他のデータ型に対しては「:=」を使用して値を直接代入できますが、その場合ユーザーはワイルドカードを使用できません。ただし、「検索」ウィンドウの項目の多くは、一意の値を提供するように値リストを使用しているため、ワイルドカードが必要となることありません。

IF :parameter.G_query_find = 'TRUE' THEN

   COPY (<find Window field>,'<results field>');

   :parameter.G_query_find := 'FALSE';

END IF;  

よく使用される特別な条件の例に、数値、日付、文字の範囲の問合せがあります。APP_FIND.QUERY_RANGEプロシージャは、問合せロジックを確認するために定義されています。最初の2つの引数として最小値と最大値が渡され、3番目の引数として実際に問合せが実行されるデータベース・フィールドの名前が渡されます。

EMPの例は次のとおりです。

IF :parameter.G_query_find = 'TRUE' THEN

   COPY(:EMP_QF.EMPNO, 'EMP.EMPNO');

   APP_FIND.QUERY_RANGE(:EMP_QF.Hiredate_from,

    :EMP_QF.Hiredate_to,

    'EMP.Hiredate');

   :parameter.G_query_find := 'FALSE';

END IF;

QUERY_FINDトリガーの作成

次のコードを含む結果ブロックに(実行階層: オーバーライド)ブロック・レベルのユーザーが名前を付けたトリガーQUERY_FINDを作成します。

 APP_FIND.QUERY_FIND('<results block window>',

    '<Find window>',

    '<Find window block>'); 

EMPの例は次のとおりです。

 APP_FIND.QUERY_FIND('EMP_WINDOW', 'EMP_QF_WINDOW',

   'EMP_QF');