EBS 报表开发:标准报表Text输出改为XML输出

很多EBS的标准报表,特别是EBS R11都只有text格式输出,输出结果不好整理数据,需修改为Excel格式输出。

下面介绍两种类型(Oracle Report, Spawned)的报表如何修改。

Oracle Report类型@ Cost Type Comparison Report
Step1. 复制text格式输出的请求,建立一个XML输出的新的请求。
在这里插入图片描述在这里插入图片描述
Step2. 运行请求,得到XML文件
在这里插入图片描述
Step3: 根据XML文件编写rtf模块并上传(略)

Spawned Report类型@ Applied Receipts Register
Spawned类型的报表用例1的方式修改行不通,且此类报表是用Pro*C编译上传的,无法看到源码。

但可以通过Trace查看SQL源码,再根据SQL结果编写XML文件。

Step1: 定义请求可调试
在这里插入图片描述
Step2: 系统配置文件
如果仅仅是"Enable Trace",收集到的Sql Trace并不包含binds and waits,可通过配置文件设置。(建议设置用户层)

Concurrent: Allow Debugging Yes
在这里插入图片描述
Step3: 运行请求
在这里插入图片描述勾选SQL Trace,并选择"SQL Trace with Binds and Waits"
在这里插入图片描述
Step4: 查询Trace文件

select name, value
from v$parameter
where name like 'user_dump_dest';

Trace文件中的SQL语句。SQL语句很多,最好是用text输出中的已知字段进行搜索。
在这里插入图片描述
Step5: 开发新请求,执行方式为SQL*PLUS
Spawned类型的请求会触发另一个子请求,子请求查询数据存入表中,父请求再输出数据。
在这里插入图片描述
子请求参数: 3000, 82, , 50428, 415, 415, 2019/01/01 00:00:00, 2019/01/31 00:00:00, , , , , , , , , , , , , , ,

父请求参数:SUBMIT, AR, RXARARRG, 217, DEFAULT, TEXT, 3000, 82, , 50428, 415, 415, 2019/01/01 00:00:00, 2019/01/31 00:00:00, , , , , , , , , , , , , , ,

那我们可以用执行方式为SQL*PLUS的请求,语句中触发子请求查询数据,再将结果生成XML数据或者直接用HTML显示数据。
–SQL文件

declare
    retcode                 NUMBER;
    errbuf                  VARCHAR2(1000);

    --等待程序:
    v_request_id            number;
    l_phase                 varchar2(200); 
    l_status                varchar2(200);  
    l_dev_phase             varchar2(200); 
    l_dev_status            varchar2(200); 
    l_message               varchar2(200); 
    l_request_status        boolean;   
    
    CURSOR user_cursor IS
        SELECT 
            DEBIT_BALANCING
           ,RECEIPT_CURRENCY_CODE
           ,fnd_date.date_to_displaydate(APPLY_DATE)  APPLY_DATE
           ,CUSTOMER_NUMBER
           ,CUSTOMER_NAME
           ,BATCH_NAME
           ,TRX_NUMBER
           ,RELATED_CUSTOMER
           ,RECEIPT_NUMBER
           ,TRX_CURRENCY_CODE
           ,AMOUNT_APPLIED_TO
           ,AMOUNT_APPLIED_FROM
           ,ACCTD_EARNED_DISCOUNT_TAKEN
           ,ACCTD_UNEARNED_DISCOUNT_TAKEN
           ,ACCTD_AMOUNT_APPLIED_TO
           ,FUNCTIONAL_CURRENCY_CODE
        FROM AR_RECEIPTS_REP_ITF  --object_type: Table
        WHERE REQUEST_ID = v_request_id
        ORDER BY DEBIT_BALANCING,
                 RECEIPT_CURRENCY_CODE,
                 APPLY_DATE;
BEGIN
    fnd_file.put_line(fnd_file.log,'Start request:'||'ARRXARRG  '||CURRENT_TIMESTAMP);
    
  --submit request: RXARARRG
    v_request_id := FND_request.SUBMIT_request( 'AR',
                                                'RXARARRG',
                                                '', 
                                                '', 
                                                false, 
                                                '&7',
                                                '&8',
                                                '',
                                                '&10',
                                                '', 
                                                '',           
                                                '&13',
                                                '&14',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                '',
                                                CHR(0));

    Commit;
    fnd_file.put_line(fnd_file.log,'v_request_id:'||v_request_id);
  
  --等待请求
  fnd_file.put_line(fnd_file.log,'Wait request ARRXARRG,begin:'||CURRENT_TIMESTAMP);
    l_request_status :=  fnd_concurrent.wait_for_request(v_request_id,
                                                         5, 
                                                         120, 
                                                         l_phase, 
                                                         l_status, 
                                                         l_dev_phase, 
                                                         l_dev_status, 
                                                         l_message);
    fnd_file.put_line(fnd_file.log,'Wait request ARRXARRG,end: '||CURRENT_TIMESTAMP);
    IF l_request_status THEN 
      IF l_dev_status = 'NORMAL' THEN 
         fnd_file.put_line(fnd_file.log,'Request:'||v_request_id || ' run successfully.'); 
      ELSE 
        fnd_file.put_line(fnd_file.log,'Request '||v_request_id||' did not complete normally ,status :' || l_dev_status); 
         RETURN; 
      END IF; 
    ELSE 
     fnd_file.put_line(fnd_file.log,'Request '||v_request_id||'not finished ,can not see its report!');
      RETURN; 
    END IF;
  
  --generate XML data
        fnd_file.put_line(fnd_file.output,'<?xml version="1.0" encoding="UTF-8"?>');
        fnd_file.put_line(fnd_file.output,'<G_XML>');
  
  FOR temp in user_cursor LOOP

    fnd_file.put_line(fnd_file.output,'<G_LINE>');
        fnd_file.put_line(fnd_file.output,'<DEBIT_BALANCING>' || temp.DEBIT_BALANCING || '</DEBIT_BALANCING>');
        fnd_file.put_line(fnd_file.output,'<RECEIPT_CURRENCY_CODE>' || temp.RECEIPT_CURRENCY_CODE || '</RECEIPT_CURRENCY_CODE>');
        fnd_file.put_line(fnd_file.output,'<APPLY_DATE>' || temp.APPLY_DATE || '</APPLY_DATE>');
        fnd_file.put_line(fnd_file.output,'<CUSTOMER_NUMBER>' || temp.CUSTOMER_NUMBER || '</CUSTOMER_NUMBER>');   
      -- "<" and "&" is illegal in xml, need to put the data in CDATA   
        fnd_file.put_line(fnd_file.output,'<CUSTOMER_NAME> <![CDATA[' || temp.CUSTOMER_NAME || ']]> </CUSTOMER_NAME>');
        fnd_file.put_line(fnd_file.output,'<BATCH_NAME>' || temp.BATCH_NAME || '</BATCH_NAME>');
        fnd_file.put_line(fnd_file.output,'<TRX_NUMBER>' || temp.TRX_NUMBER || '</TRX_NUMBER>');   
        fnd_file.put_line(fnd_file.output,'<RELATED_CUSTOMER>' || temp.RELATED_CUSTOMER || '</RELATED_CUSTOMER>');
        fnd_file.put_line(fnd_file.output,'<RECEIPT_NUMBER>' || temp.RECEIPT_NUMBER || '</RECEIPT_NUMBER>');
        fnd_file.put_line(fnd_file.output,'<TRX_CURRENCY_CODE>' || temp.TRX_CURRENCY_CODE || '</TRX_CURRENCY_CODE>');   
        fnd_file.put_line(fnd_file.output,'<AMOUNT_APPLIED_TO>' || temp.AMOUNT_APPLIED_TO || '</AMOUNT_APPLIED_TO>');    
        fnd_file.put_line(fnd_file.output,'<AMOUNT_APPLIED_FROM>' || temp.AMOUNT_APPLIED_FROM || '</AMOUNT_APPLIED_FROM>');   
        fnd_file.put_line(fnd_file.output,'<ACCTD_EARNED_DISCOUNT_TAKEN>' || temp.ACCTD_EARNED_DISCOUNT_TAKEN || '</ACCTD_EARNED_DISCOUNT_TAKEN>'); 
        fnd_file.put_line(fnd_file.output,'<ACCTD_UNEARNED_DISCOUNT_TAKEN>' || temp.ACCTD_UNEARNED_DISCOUNT_TAKEN || '</ACCTD_UNEARNED_DISCOUNT_TAKEN>');       
        fnd_file.put_line(fnd_file.output,'<ACCTD_AMOUNT_APPLIED_TO>' || temp.ACCTD_AMOUNT_APPLIED_TO || '</ACCTD_AMOUNT_APPLIED_TO>'); 
        fnd_file.put_line(fnd_file.output,'<FUNCTIONAL_CURRENCY_CODE>' || temp.FUNCTIONAL_CURRENCY_CODE || '</FUNCTIONAL_CURRENCY_CODE>');  
    fnd_file.put_line(fnd_file.output,'</G_LINE>');
    
  END LOOP;
  
      fnd_file.put_line(fnd_file.output,'</G_XML>');

END;
/

将SQL文件上传到FTP服务器上
在这里插入图片描述
定义执行档
在这里插入图片描述
复制text格式输出的请求,建立一个XML输出的新的请求,执行档改为SQL文件。
在这里插入图片描述在这里插入图片描述

运行新请求:HUH Applied Receipts Register,点击输出发现能输出部分XML数据,但还是有问题。
在这里插入图片描述
是因为XML不支持解析带有“&”字符的数据,加上“<![CDATA[ 内容 ]]>”可解决问题

Step6: 根据XML文件编写rtf模块并上传(略)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值