如图,实现点击打印时,自动调用并发请求打印报表
点击
点击后的效果
1. 数据定义
2. 上传模板,记住代码,第5步用到
3. 打开pl/sql新建包,包名我这里为print_by_code,然后定义过程,过程名为print,使用 fnd_file.put_line(fnd_file.output,'<xxxxx>');输出,具体输出什么,应该与模板保持一致,例如,模板的格式入下
其他也是在添加帮助文字里边看,所以pl/sql格式应如下,注意替换 'XXX' 为你的内容
create or replace package body print_by_code is
procedure print( Errbuf In Out Varchar2,
Retcode In Out Varchar2,
F_orgid In Varchar2(50)
) is
begin
fnd_file.put_line(fnd_file.output,'<ROW>');
fnd_file.put_line(fnd_file.output,'<ORGID>'|| 'XXX' ||'</ORGID>');
fnd_file.put_line(fnd_file.output,'<ORGNAME>'|| 'XXX' ||'</ORGNAME>');
fnd_file.put_line(fnd_file.output,'<TOTLENUM>'|| 'XXX' ||'</TOTLENUM>');
fnd_file.put_line(fnd_file.output,'<LEADNAME>'|| 'XXX' ||'</LEADNAME>');
fnd_file.put_line(fnd_file.output,'<DESR>'||ups.desr||'</DESR>');
fnd_file.put_line(fnd_file.output,'</ROW>');
end;
end print_by_code;
4. 定义可执行,进入EBS系统,选择系统管理员->并发->程序->可执行
5. 定义程序,系统管理员->并发->程序->定义,这里说错,是有参数的,所以参数我补一张图
6. 为了能做浏览器打开我们应该添加如下库
7. 新建form表单,新建窗口WINEN,子类选择window,新建画布CANEM,子类选择canvas,
窗口主画布选择CANEM,画布窗口选择WINEN,新建数据块FLQFD,自行调整位置
8. 在数据块下新建项,项类型选择按钮,子类选择button,项下建立触发器,WHEN-BUTTON-PRESSED,标签写打印,然后输入如下内容 ButtonAct.Print_data;最终如下图
8.程序单元新建规格和主题,名字为 ButtonAct,然后写入新建过程,过程的代码如下
procedure Print_data is
orgid varchar2(30);
trs BOOLEAN :=false;
l_request_id NUMBER; --返回请求id
l_wait_req BOOLEAN;
x_child_phase VARCHAR2(50);
x_child_status VARCHAR2(50);
x_dev_phase VARCHAR2(50); --返回请求是否完成
x_dev_status VARCHAR2(50); --返回请求状态
x_message VARCHAR2(50);
l_exc exception;
begin
--判断是否有数据
IF :FLQFD.ORGID is null then
x_message:='没有需要打印的数据';
raise l_exc;
END IF;
--调用模板
trs := fnd_request.add_layout(template_appl_name => 'CUX',
template_code => 'FLQ_C',
template_language => 'ZHS',
template_territory => 'CN',
output_format => 'PDF');
/*IF trs than
x_message:='找不到'||FLQ_C||'的模板';
raise l_exc;
END IF; */
l_request_id := fnd_request.submit_request(application => 'CUX',
program => 'FLQ_C', --CUX:清智采购入库单报表
description => '',
start_time => '',
sub_request => FALSE,
argument1 => :FLQFD.ORGID
);
IF l_request_id=0 then
x_message:='找不到并发请求';
raise l_exc;
ELSE
----------------提交请求
trs := app_form.quietcommit;
END IF;
l_wait_req := fnd_concurrent.wait_for_request(request_id => l_request_id,
INTERVAL => 1,
max_wait => 0,
phase => x_child_phase,
status => x_child_status,
dev_phase => x_dev_phase,
dev_status => x_dev_status,
message => x_message);
IF x_dev_phase = 'COMPLETE'
AND x_dev_status = 'NORMAL' THEN
--完成请求,并且是正常状态后的处理,如:立即查询、显示报表等
-----注意,第6步如果不做,这里会报错,记得加上第6步
editor_pkg.report(l_request_id,
'Y'); --使输出的报表pdf文件在浏览器中显示。
ELSE
x_message:='请求出错,原因是: '||x_message;
raise l_exc;
END IF;
Exception
when l_exc then
fnd_message.set_STRING(x_message);
fnd_message.error;
END;
9. 挂载,参考EBS之挂载表单的详细步骤_最菜的黑客的博客-CSDN博客
10 最终效果:
11 代码解释
- 首先调用函数 fnd_request.add_layout 来确定输出文件
调用方法: 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 => :output_format,
nls_language => :nls_language);
其中 result 为 boolean 类型的变量
template_appl_name 指请求模板对应的应用简称
template_code 指请滶模板的简称,一般与请求的简称相同
template_language 指运行请求时模板的语言,中文为 zh,英文为 us,此参数必需在挂模板时所选的语言范围内
template_territory 指语言对应的区域,中国为 CN
output_format 指报表输出时的格式类型,如 PDF,EXCEL等
nls_language 留空即可 - 在 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);
其中 ln_request_id 为数值类型的变量
application 指请求对应的应用简称,必须
program 指请求的简称,必须
description 描述,在调用时留空即可
start_time 指请求开始运行的时间,在调用时留空即可,表求即时执行
sub_request 指当前请求是否是子请求,一般在调用时赋值 false,必须
argument1..100 指调用请求时的参数,最多100个,在form中调用时可在最后一个参数后用 chr(0)来表示为最后一个参数,不用写满100个参数,如果在pl/sql中调用则需要写满100个参数---注:参数顺序,必须与EBS中程序定义的参数顺序一致!!
3. 2步执行后如果 ln_request_id > 0 表示提交成功,则需要显性执行 commit 才可最终提交成功 - l_wait_req := fnd_concurrent.wait_for_request(request_id => l_request_id,
INTERVAL => 1,
max_wait => 0,
phase => x_child_phase,
status => x_child_status,
dev_phase => x_dev_phase,
dev_status => x_dev_status,
message => x_message);
l_wait_req 程序运行状态,true,运行完成,false异常终止
request_id 是第(2)步生成的id
INTERVAL 间隔n秒检查并发请求是否完成,间隔中间程序会休息
max_wait 最长等待时长,如果运行时长超过这个值,请求将会终止
phase 未知
status 未知
dev_phase 当前运行状态,COMPLETE表示完成
dev_status 当前状态,NORMAL表示正常
message 消息,一般是异常时的原因
dev_phase,dev_status,message是out类型