FORMがクエリーを実行する様々な方法



一.FORMがFORMを呼び出してクエリーを実行する
1.APPSTANDを開く.fmb,Object Group下のQUERY_をFINDオブジェクトグループを自分のformのObject Groupの下にドラッグし、copyをクリックします.
2.このときblock、canvases、windowsでQUERY_を多くしましたFIND修正Data BlocksのQUERY_FIND下NEWボタンとFINDボタンのwhen-button-pressdのコード、New下のコード:app_find.new('クエリーを実行するデータブロック')FINDの下のコード::parameter.G_query_find := 'TRUE'; app_find.find('クエリーを実行するデータブロック');parameter.G_query_find := 'FALSE';
3.QUERY_の修正FINDデータブロックの下のKEY-NXTBLKのコードは、以下の通りである:parameter.G_query_find := 'TRUE'; app_find.find('クエリーを実行するデータブロック');parameter.G_query_find := 'FALSE';
4.QUERY_でFINDデータブロックの下でクエリー条件を作成するために必要なITEM、データベース属性をNo、キャンバス属性をnullに設定
5.データブロックの下にuser_を作成するnamedトリガ、名前をQUERY_に変更FIND、次のコードapp_を追加find.query_find('MAIN','QUERY_FIND','QUERY_FIND'); 1番目のパラメータMAINがメインウィンドウのウィンドウ名2番目のパラメータQUERY_FINDは、所在するウィンドウ名(ドラッグ時にwindowsで自動的に生成される)を検索する3番目のパラメータQUERY_FINDはQUERY_FINDデータブロック名
6.検索するデータブロックの下にpre-query tirggerを追加します.コードは次のとおりです.
if :parameter.g_query_find = 'TRUE' then
copy(name_in('query_find.ORG_ID'),'HEADER.ORG_ID');
 copy(name_in('query_find.VENDOR_ID'),'HEADER.VENDOR_ID');
/* app_find.query_range(name_in('query_find.AVAILABLE_AMOUNT'),
  name_in('query_find.AMOUNT_LOWER_RANGE'),'query_find.AMOUNT_HEIGHT_RANGE');*/
  app_find.query_range(:query_find.AMOUNT_LOWER_RANGE, :query_find.AMOUNT_HEIGHT_RANGE,'HEADER.AVAILABLE_AMOUNT');
:parameter.G_query_find := 'FALSE';
end if;

説明:copyは、ある値に等しい条件app_をクエリーできます.find.query_rangeでは、検索するデータ範囲を設定できます.最初のパラメータは開始値が存在し、2番目のパラメータは終了値が存在し、(開始終了と同様に現在の値が検索されます)3番目のパラメータは、データブロックのitemを検索し、開始値と終了値はデータブロックのitemに対して設定されます.以下の図
7.検索データブロックのwhen-new-record-instance triggerの実行レベルをafter 8とする.FORMレベルフリップフロップWHEN-NEW-FORM-INSTANCEで呼び出しFORMから渡されたパラメータをQUERY_に付与FINDデータブロックのITEM
:query_find.INVOICE_ID    := :parameter.G_INVOICE_ID; :query_find.org_id    := :parameter.g_org_id; :query_find.vendor_id := :parameter.g_vendor_id;
9.FORMレベルトリガWHEN-NEW-FORM-INSTANCEでクエリーgo_を実行するblock('HEADER');       :parameter.g_query_find := 'TRUE';     app_find.find('HEADER');     -- app_find.find('HEADER');     :parameter.g_query_find := 'FALSE';
二.FormでのBlockの条件付き再照会
Formの一部のボタンはPackageを呼び出してテーブルの一部のフィールドを更新する可能性がありますが、データベースのフィールドの変更はformのインタフェースにすぐに反映されませんので、再クエリーを行いますが、ユーザーはクエリーウィンドウを使用してクエリーを行った後、ボタンを押す操作をクリックして、簡単にexecute_を使用するとqueryがクエリーを行うと、元のクエリー条件が消去されます.ここにはクエリーのための共通のパッケージが書かれています
procedure query_block(p_block_name varchar2)
is
  l_cursor_block     varchar2(50);
  l_cursor_record    number;
  l_cursor_item      varchar2(50);
  l_trigger_record   number;
  l_default_where    varchar2(1000);
  l_last_query       varchar2(2000);
  l_where_anchor     number;
  l_order_anchor     number;
  l_where_clause     varchar2(1000);
  l_message_level    number;
begin
  l_cursor_item    := name_in(‘SYSTEM.CURSOR_ITEM’);
  l_cursor_record  := name_in(‘SYSTEM.CURSOR_RECORD’);
  l_cursor_block   := name_in(‘SYSTEM.CURSOR_BLOCK’);
  l_trigger_record := l_cursor_record;
  l_message_level  := :system.message_level;
  if l_cursor_block <> p_block_name then
     l_trigger_record := get_block_property(p_block_name, CURRENT_RECORD);
     go_block(p_block_name);
       if name_in(‘SYSTEM.CURSOR_BLOCK’) <> p_block_name then
         fnd_message.debug(‘DEVELOPER ERROR: To select records ‘||
                          ‘in another block, you must be able to navigate.’);
         raise FORM_TRIGGER_FAILURE;
       end if;
  end if;
  l_default_where := get_block_property(p_block_name, DEFAULT_WHERE);
  l_last_query    := get_block_property(p_block_name, LAST_QUERY);               
  //     Order By  
  if instr(upper(l_last_query), ‘ORDER BY’) = 0 then
    l_order_anchor := length(l_last_query);
  else
    l_order_anchor := instr(upper(l_last_query), ‘ORDER BY’) – 1;
  end if;
  if instr(upper(l_last_query), ‘WHERE’) = 0 then
    l_where_anchor := l_order_anchor – 5;
  else
    l_where_anchor := instr(upper(l_last_query), ‘WHERE’) + 1;
  end if; 
  l_where_clause  := substr(l_last_query, l_where_anchor+6, l_order_anchor-l_where_anchor-5);       
 
  set_block_property(p_block_name,default_where,l_where_clause);
  :system.message_level := 25;
  execute_query;
  :system.message_level := l_message_level;
  set_block_property(p_block_name,default_where,l_default_where);
  go_block(p_block_name);
  go_record(l_trigger_record);
  go_block(l_cursor_block);
  go_record(l_cursor_record);
  go_item(l_cursor_item);
end query_block;

プログラムはまず、現在のblock、record、およびItemを保存し、実行後もカーソルがジャンプせずに元の位置にとどまるようにします.現在のBlockとパラメータが入ってくるP_Blockが一致し、一致しなければgoからP_Blockで、BlockのLast_を取得します.Queryは、Order Byを持つクエリがある可能性があるので、Order Byがあるかどうかを判断して切り取りの最終位置を決定する必要があります.where条件を取得したらset_を使用block_property(p_block_name,default_where,l_where_clause)およびexecute_queryはblockをクエリーします.その前に元のdefault whereを保存し、クエリーの後にdefault_を保存する必要があります.whereはデフォルトに設定されています.最後にカーソルを元の位置に合わせます.
呼び出すときにBlock Nameを入力すると、Blockのクエリー条件を切り取ってBlockをクエリーできます.