EBS之实现代码调用并发请求

如图,实现点击打印时,自动调用并发请求打印报表

点击

点击后的效果

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 代码解释

  1. 首先调用函数 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 留空即可
  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);
    其中 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 才可最终提交成功 
  3. 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类型

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值