1、首先调用函数 fnd_request.add_layout 来设置打印报表的rtf模板,
RESULT:= FND_REQUEST.ADD_LAYOUT(TEMPLATE_APPL_NAME => :TEMPLATE_APPL_NAME,
TEMPLATE_CODE => :TEMPLATE_CODE,
TEMPLATE_LANGUAGE => :TEMPLATE_LANGUAGE,
TEMPLATE_TERRITORY => :TEMPLATE_TERRITORY,
OUTPUT_FORMAT => UTPUT_FORMAT,
NLS_LANGUAGE => :NLS_LANGUAGE);
说明:
返回值:
boolean 类型的变量;
template_appl_name:为请求模板对应的应用简;
template_code :为请求模板的简称,一般与请求的简称相同;
template_language :指运行请求时模板的语言,中文为 ZH,英文为US,此参数必需在挂模板时所选的语言范围内;
template_territory :指语言对应的区域,中国为 CN;
output_format: 指报表输出时的格式类型,如 PDF,EXCEL等;
nls_language: 留空即可。
2、在 result 返回值为 true 时再调用函FND_REQUEST.SUBMIT_REQUEST 来正式提交请求:
ln_request_id := FND_REQUEST.SUBMIT_REQUEST(APPLICATION => :APPLICATION,
PROGRAM => :PROGRAM,
DESCRIPTION => :DESCRIPTION,
START_TIME => :START_TIME,
SUB_REQUEST => :SUB_REQUEST,
ARGUMENT1 .. 100 => :ARGUMENT1 .. 100);
说明:
返回值:数值类型的变量;
application :指请求对应的应用简称;
program :指请求的简称;
description :指描述,在调用时留空即可;
start_time :指请求开始运行的时间,在调用时留空即可,表示即时执行;
sub_request :指当前请求是否是子请求,一般在调用时赋值 false;
argument1..100 : 指调用请求时的参数,最多100个,在form中调用时可在最后一个参数后用 chr(0)来表示为最后一个参数,不用写满100个参数,如果在pl/sql中调用则需要写满100个参数。
3、执行后如果 ln_request_id > 0 表示提交成功,则需要显式执行 commit才可最终提交成功。
如果期间没有显式执行commit导致请求提交后不能立刻执行,而且会导致请求不成功。
4、 还可以使用函数
FND_CONCURRENT.WAIT_FOR_REQUEST(REQUEST_ID IN NUMBER DEFAULT NULL,
INTERVAL IN NUMBER DEFAULT 60,
MAX_WAIT IN NUMBER DEFAULT 0,
PHASE OUT VARCHAR2,
STATUS OUT VARCHAR2,
DEV_PHASE OUT VARCHAR2,
DEV_STATUS OUT VARCHAR2,
MESSAGE OUT VARCHAR2) RETURN BOOLEAN;
说明:
等待并发请求的完成,然后返回请求的阶段、状态以及完成消息。在等待的过程中每隔一段时间检查一下。其中,request_id指并发请求的id,interval指两次检查见等待的秒数,两次检查之间该程序会休息,max_wait指等待并发请求完成所能等待的的最长时间,单位为秒。
补充:
由于Oracle的请求操作时并发处理,执行此函数将很可能等待很长时间,因此,一般不建议使用该函数,其实fnd_request.submit_request函数返回值不为零已经表示成功提交请求了。
5、可以使用过程editor_pkg.report(REQUEST_ID,'Y')来显示成功执行请求之后生成的报表。但是因为Oracle的 并发处理机制,执行此函数将很可能等待很长时间才能够显示生成的报表,因为需要请求完成才能生成相应的报表,才能执行该过程。
例:
PROCEDURE PRINT IS
L_DEFAULT_LANGUAGE VARCHAR2(20);
L_DEFAULT_TERRITORY VARCHAR2(20);
L_TEMPLATE_CODE VARCHAR2(200);
REQUEST_ID NUMBER;
V_LAYOUT BOOLEAN;
BEGIN
BEGIN
SELECT XTV.DEFAULT_LANGUAGE,
XTV.DEFAULT_TERRITORY,
XTV.TEMPLATE_CODE
INTO L_DEFAULT_LANGUAGE,
L_DEFAULT_TERRITORY,
L_TEMPLATE_CODE
FROM XDO_TEMPLATES_VL XTV
WHERE XTV.APPLICATION_SHORT_NAME = 'CUX'
AND XTV.TEMPLATE_CODE = :PRINT_BANK_APY.TEMPLATE_CODE;
EXCEPTION
WHEN OTHERS THEN
FND_MESSAGE.SET_NAME('CUX',
'RTF文件有误!');
FND_MESSAGE.ERROR;
RAISE FORM_TRIGGER_FAILURE;
END;
V_LAYOUT := FND_REQUEST.ADD_LAYOUT('CUX',
L_TEMPLATE_CODE,
L_DEFAULT_LANGUAGE,
L_DEFAULT_TERRITORY,
'PDF');
REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST(APPLICATION => 'CUX',
PROGRAM => 'CUXAPYPNT',
DESCRIPTION => NULL,
START_TIME => NULL,
SUB_REQUEST => FALSE,
ARGUMENT1 => :CUX_EXP_CREDIT_HEADERS.CREDIT_HEADER_ID);
COMMIT;
IF REQUEST_ID IS NULL OR REQUEST_ID <= 0 THEN
FND_MESSAGE.SET_NAME('CUX',
'提交合同打印请求出错');
FND_MESSAGE.ERROR;
RAISE FORM_TRIGGER_FAILURE;
ELSE
FND_MESSAGE.SET_NAME('CUX',
'您提交了开证申请书打印请求,请求号为:' || REQUEST_ID);
FND_MESSAGE.SHOW;
CANCLE;
END IF;
END;