在代码中提交请求有两种情况:
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,根据需要选择我们要的模板。