1. 程式人生 > >Form中Block的重新查詢

Form中Block的重新查詢

Form中某些按鈕可能呼叫了Package對錶中某些欄位進行更新,但是資料庫中欄位的修改不會馬上反映到form的介面上,所以要進行重新查詢,但是使用者可能使用了查詢視窗進行查詢之後然後再點選按鈕動作,如果簡單的使用execute_query進行查詢的話那麼就會把原來的查詢條件沖掉。所以這裡寫了一個公用的包進行查詢:

--重新execute_query的資料塊為:

  1. PROCEDURE query_block(p_block_name varchar2) is  
  2.   l_cursor_block   varchar2(50);  
  3.   l_cursor_record  NUMBER;  
  4.   l_cursor_item    VARCHAR2(50);  
  5.   l_trigger_record NUMBER;  
  6.   l_default_where  VARCHAR2(1000);  
  7.   l_last_query     VARCHAR2(2000);  
  8.   l_where_anchor   NUMBER;  
  9.   l_order_anchor   NUMBER;  
  10.   l_where_clause   VARCHAR2(1000);  
  11.   l_message_level  NUMBER;  
  12. BEGIN  
  13.   l_cursor_item    :name_in('SYSTEM.CURSOR_ITEM');  
  14.   l_cursor_record  :name_in('SYSTEM.CURSOR_RECORD');  
  15.   l_cursor_block   :name_in('SYSTEM.CURSOR_BLOCK');  
  16.   l_trigger_record :l_cursor_record;  
  17.   l_message_level  := :system.message_level;  
  18.   --如果游標不在目標塊。則go_block到目標塊  
  19.   IF l_cursor_block <> p_block_name THEN  
  20.     --游標定位  
  21.     l_trigger_record :
    get_block_property(p_block_name, CURRENT_RECORD);  
  22.     go_block(p_block_name);  
  23.      IF name_in('SYSTEM.CURSOR_BLOCK') <> p_block_name THEN  
  24.       fnd_message.debug('DEVELOPER ERROR :To  
  25.         SELECT records ' ||  
  26.                         'in another block,  
  27.                you     must be able to navigate');  
  28.       RAISE FORM_TRIGGER_FAILURE;  
  29.      END IF; --IF name_in('SYSTEM.CURSOR_BLOCK') <> p_block_name THEN  
  30.   END IF;--IF l_cursor_block <> p_block_name THEN     
  31.     l_default_where :get_block_property(p_block_name, DEFAULT_WHERE);--資料塊的預設查詢條件  
  32.     l_last_query    :get_block_property(p_block_name, LAST_QUERY);--最後查詢語句  
  33.     -- 檢查是否有Order By語句   
  34.   IF instr(upper(l_last_query), 'ORDER BY') = 0 THEN   
  35.      l_order_anchor :length(l_last_query);  
  36.   ELSE  
  37.     l_order_anchor :instr(upper(l_last_query), 'ORDER BY')-1;  
  38.   END IF; --IF instr(upper(l_last_query), 'ORDER BY') = 0 THEN   
  39.   IF instr(upper(l_last_query), 'WHERE') = 0 THEN  
  40.     l_where_anchor :l_order_anchor - 5;  
  41.   ELSE  
  42.     l_where_anchor :instr(upper(l_last_query), 'WHERE') + 1;  
  43.   END IF; --IF instr(upper(l_last_query), 'WHERE') = 0 THEN  
  44.   --得到上一次的查詢條件  
  45.   l_where_clause :substr(l_last_query,  
  46.                            l_where_anchor + 6,  
  47.                            l_order_anchor - l_where_anchor - 5);  
  48.   --設定資料塊得查詢條件                           
  49.   set_block_property(p_block_name, default_where, l_where_clause);  
  50.   --設定訊息級別  
  51.   :system.message_level :25;  
  52.   --執行查詢  
  53.   execute_query;  
  54.   :system.message_level :l_message_level;  
  55.   set_block_property(p_block_name, default_where, l_default_where);  
  56.   go_block(p_block_name);  
  57.   go_record(l_trigger_record);  
  58.   fnd_message.debug('p_block_name'||p_block_name);  
  59.   fnd_message.debug('l_trigger_record'||l_trigger_record);  
  60.   fnd_message.debug('l_cursor_block'||l_cursor_block);  
  61.   fnd_message.debug('l_cursor_record'||l_cursor_record);  
  62.   fnd_message.debug('l_cursor_item'||l_cursor_item);      
  63.   go_block(l_cursor_block);  
  64.   go_record(l_cursor_record);  
  65.   go_item(l_cursor_item);  
  66. 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。

程式首先儲存當前的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。

程式首先儲存當前的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。

程式首先儲存當前的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。