查詢FORM中F11,F12按鈕功能的小探討
在咱們ERP系統中,F11和F12按鈕是大家經常使用的,它們給查詢工作帶來了很多方便。但是在開發的查詢FORM中若不做任何設置,F11和F12按鈕的作用就沒有完全體現出來了。
如當你輸入了查詢條件點擊“FIND”按鈕後得到了你想要的一些記錄,然後針對這些記錄我們想繼續進行相關條件的查詢(F11按鈕功能)或者想查詢記錄的數目(F12按鈕功能)。但如果未做任何設置,F11和F12功能將在查詢結果塊所在資料源的範圍內查詢而不是你輸入查詢條件查到的結果內查詢,這顯然沒有實現我們想要的功能。
一般情況下,我們開發的查詢FORM均是在資料塊QUERY_FIND按鈕項FIND的WHEN-BUTTON-PRESSED觸發器中寫入(例如查詢結果塊名為“RESULT”):
:parameter.G_query_find := 'TRUE';
app_find.find('RESULT');
:parameter.G_query_find := 'FALSE';
然後我們在查詢結果塊(RESULT)的block級觸發器PRE-QUERY中寫入:
IF :parameter.G_query_find = 'TRUE' THEN
: RESULT.ID := :QUERY_FIND.ID; --查詢條件之ID
app_find.query_range(:QUERY_FIND.date_from,
:QUERY_FIND.date_to,
RESULT.DATE'); --查詢條件之DATE範圍
COPY (:QUERY_FIND.status,'RESULT.STATUS'); --查詢條件之STATUS
:parameter.G_query_find := 'FALSE';
END IF;
我們可以看出parameter.G_query_find的作用是標記查詢來源,若:parameter.G_query_find = 'TRUE'則意味著查詢來源於查詢資料塊QUERY_FIND點擊“FIND”按鈕後。顯然查詢來源是F11、F12按鈕查詢的情況沒有在這個範圍內,所以只要將此來源考慮進來就可以了。
針對本例情況,查詢來源除了查詢塊QUERY_FIND就只有F11和F12的查詢了,所以可以將F11、F12查詢動作控制放在查詢結果塊(RESULT)的block級觸發器PRE-QUERY的IF語句的ELSE情況中就可以了。
其實很多情況下例如本例中兩種查詢來源的查詢動作控制是一致的,所以本例我們可以用這種方法來解決:
1、資料塊QUERY_FIND按鈕項FIND的WHEN-BUTTON-PRESSED觸發器中改為:
app_find.find('RESULT');
2、查詢結果塊(RESULT)的block級觸發器PRE-QUERY中改為:
lv_where_string VARCHAR2(32767);
begin
lv_where_string :=’(:QUERY_FIND.ID is null or ID = :QUERY_FIND.ID)
and (date >= :QUERY_FIND.date_from or :QUERY_FIND.date_from is null )
and (date <= :QUERY_FIND.date_to or :QUERY_FIND.date_to is null)
and (:QUERY_FIND.status is null or status = :QUERY_FIND.status)’;
SET_BLOCK_PROPERTY('RESULT',DEFAULT_WHERE,lv_where_string);
exception when others then
fnd_message.debug(SQLCODE||'is'||SQLERRM);
end;
這種解決方法是取消了查詢來源標記,將兩種查詢動作合二為一了(其實算是偷懶了)。
我這種方法應該不太規範,現在向大家請教一下規範的方法,望不吝賜教。