Form中Block的重新查詢
Form中某些按鈕可能呼叫了Package對錶中某些欄位進行更新,但是資料庫中欄位的修改不會馬上反映到form的介面上,所以要進行重新查詢,但是使用者可能使用了查詢視窗進行查詢之後然後再點選按鈕動作,如果簡單的使用execute_query進行查詢的話那麼就會把原來的查詢條件沖掉。所以這裡寫了一個公用的包進行查詢:
--重新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;
- --如果游標不在目標塊。則go_block到目標塊
- IF l_cursor_block <> p_block_name THEN
- --游標定位
-
l_trigger_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; --IF name_in('SYSTEM.CURSOR_BLOCK') <> p_block_name THEN
- END IF;--IF l_cursor_block <> p_block_name THEN
- 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), 'ORDER BY') = 0 THEN
- 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; --IF instr(upper(l_last_query), 'WHERE') = 0 THEN
- --得到上一次的查詢條件
- 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);
- fnd_message.debug('p_block_name'||p_block_name);
- fnd_message.debug('l_trigger_record'||l_trigger_record);
- fnd_message.debug('l_cursor_block'||l_cursor_block);
- fnd_message.debug('l_cursor_record'||l_cursor_record);
- fnd_message.debug('l_cursor_item'||l_cursor_item);
- 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。
程式首先儲存當前的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。