在代碼中提交請求有兩種情況:
1、
在PL/SQL程式中提交請求
在PL/SQL中調用fnd_request.submit_request,
/* Submit a request where no setup is required */
DECLARE
REQ_ID NUMBER;
BEGIN
REQ_ID :=
FND_REQUEST.SUBMIT_REQUEST(’FND’, --應用程式名稱
’FNDMDGEN’,
--請求名
’MESSAGE
FILE GENERATOR’, --描述
’01–NOV–02 00 :00 :00’, --開始時間
FALSE, --是否是子請求 true/false
Arg1,--參數一
Arg2,--參數
Char(0)); --參數以char(0)結束
IF (REQ_ID = 0) THEN
/* Handle submission error */
……
ELSE
COMMIT;--一定要commit,因為這樣提交的請求,實際上是往表FND_CONCURRENT_QUEUES裡插了一條記錄,可以在這個表裡找到我們提交的請求的輸出檔案和記錄檔的儲存路徑
END IF;
END;
Fnd_request.submit_request()有一百多個參數,但是在Pl/SQL程式裡邊我們不用寫滿,只用在當參數結束時加一個char(0)就可以了,當返回的req_id是0的話表明提交請求不成功
2、
在Form中提交請求
在Form中提交請求我們得寫滿一百多個參數,如果不寫就會出錯,可以把給提交的程式的空參數寫到這樣:’’ 或是null,必須湊足一百個,例如:
declare
l_request_id number;
l_return_flag boolean;
L_BL_RESULT boolean;
X_PHASE
VARCHAR2(100);
X_STATUS
VARCHAR2(100);
X_DEV_PHASE
VARCHAR2(100);
X_DEV_STATUS VARCHAR2(100);
X_MESSAGE
VARCHAR2(100);
begin
l_request_id :=
FND_REQUEST.SUBMIT_REQUEST('CUX', 'CUXEXRENILE', '',
'',
FALSE, 'Hi man', 'It''s work!',
CHR(0),--參數結束
/*剩下的參數*/
'','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','');
l_return_flag := APP_FORM.QUIETCOMMIT; --commit
/*如果出錯提示*/
IF l_request_id IS NULL OR l_request_id
= 0 THEN
FND_MESSAGE.RETRIEVE;
FND_MESSAGE.ERROR;
END IF;
/*等待請求結束*/ L_BL_RESULT:=FND_CONCURRENT.WAIT_FOR_REQUEST(REQUEST_ID=>l_request_id,
INTERVAL =>1,
MAX_WAIT =>0,
PHASE =>X_PHASE,
STATUS =>X_STATUS,
DEV_PHASE =>X_DEV_PHASE,
DEV_STATUS =>X_DEV_STATUS,
MESSAGE
=>X_MESSAGE);
/*請求結束後開啟請求尋找from,找到提交的請求*/
FND_FUNCTION.EXECUTE( FUNCTION_NAME=>'FND_FNDRSRUN',
OPEN_FLAG=>'Y',
SESSION_FLAG=>'Y',
OTHER_PARAMS=>'CONCURRENT_PROGRAM_NAME="CUXEXRENILE"
PROGRAM_APPL_SHORT_NAME="CUX" DODT_REQ_ID="'||TO_CHAR(l_request_id)||'"');
end;
在From中提交請求除了要把參數寫完之外,我們應該把commit換到標準的寫法do_key(’commit_form’),上例中用的是app_from.quitecommit,也是一種from裡標準的寫法,它在後台悄悄地commit。當請求提交不成功時我們用fnd_message.retrieve,把訊息棧裡的錯誤訊息取出來,用fnd_message.error來顯示錯誤資訊,你可以不用擔心它會彈出別的進程的訊息,因為訊息棧是區分進程的。
提交請求時我們可以等待請求結束,上例中fnd_concurrent.wait_for_request()就是用來等待請求結束的,interval表示多長時間檢查一次請求的執行情況,max_wait表示最大等待多長時間,設為0時就等到它有結果,下面的幾個參數包括請求的執行情況。
Fnd_function.execute()用來執行一個function,function_name為function的簡稱,用other_params可以給這個function提供一些參數,當然這個function要支援這些參數,上例中我執行的function是請求尋找function,在other_params中我們傳了請求ID,這樣執行完成之後就可以直接跳到請求尋找form中並找出我們提交的請求。
再說一點和fnd_request.submit_request()有關係的東西,我提交一個請求時,很多情況下是列印一個報表,列印的報表可以是在PL/SQL中用HTML寫的報表,也可以是用XML publish做的報表,我們說說XML publish形式的報表,XML publish可以支援多種格式的報表,如PDF、TEXT、excel,一般我們在報表範本定義的時候就定好了格式,想在代碼中控制它的輸出格式可以這樣:
在fnd_request_submit_request()之前,我們寫這樣的代碼:
l_temp := fnd_request.add_layout(template_appl_name => 'CUX',--應用簡稱
template_code => 'CUXAPPMBL',
template_language => 'zh',--語言
template_territory => 'CN', --地區
output_format =>
l_output_format);--格式
fnd_request.add_layout()用來給報表添加部局,我們可以把l_output_format設成我們想要的格式,如’PDF’,’RTF’
當然一個報表要想有兩個模板也是可以的,只要在定義模板時選擇同一個資料定義就行了,在調用之前我們要選擇使用的模板,如下例:
--設定模板
IF l_show_list = 'Y' THEN
l_temp :=
fnd_request.add_layout(template_appl_name => 'CUX',
template_code => 'CUXAPPMBL',
template_language => 'zh',
template_territory => 'CN', --REC.default_territory
output_format =>
l_output_format);--'PDF');
ELSE
l_temp :=
fnd_request.add_layout(template_appl_name => 'CUX',
template_code => 'CUXAPPMBLSUM',
template_language => 'zh',
template_territory => 'CN', --REC.default_territory
output_format =>
l_output_format);--'PDF');
END IF;
有兩個模板:CUXAPPMBL、CUXAPPMBLSUM,根據需要選擇我們要的模板。