Office2010开发BI Publisher RTF模版的若干疑难问题

1、图表刷新问题:

     现象:使用BI publisher在Word中插入图表以后,右键单击图表没有“BI Publisher 图表…”菜单项,且预览时,不会因为xml数据变化而使得图表跟着变化,感觉是一幅静态图片。

     分析:在把文档另存为97-2003的兼容格式后,再另存为RTF格式文档后,发现在图片上右键菜单有“BI Publisher 图表…”菜单项了,预览时图形也确实会跟着xml数据变化而变化。

     解决方法:按照分析中的方法创建RTF文档 ,这可能是一个兼容性问题。

 

2、模板文档属性问题:

     现象:在RTF模版的Advanced例子中有一个需要通过设置文档属性来控制的例子 Properties, 但很难找到自定义文档属性的地方。

     分析与解决:word2010设置自定义属性的地方确实够隐蔽,但也很容易找到,看下图:

     在文件->信息->属性->高级属性

image

    

    image

FROM批量处理界面效果

FROM批量处理界面效果

当遇到对FORM上记录进行批量处理时,一般情况下都会选择在记录前面加上复选框,然后勾选上需要处理的数据,最后获取勾选的记录数据进行业务处理:

clip_image002

如果只是添加复选框,显得界面效果太单调,勾选结果显示也不够明显,将勾选的行进行特殊显示,会使得勾选效果更好。

通过在标准界面查找类似业务,找到对应API:

app_record.highlight(‘SELECTED_DATA’);高亮显示当前行所有ITEM

app_record.highlight(”);取消高亮显示当前行所有ITEM

效果如下图:

clip_image004

这样看起来用户会更明确的看到选择的行。

效果已经做出来,但是在操作上,用户会有一些不便,选择几行或者全选还好。但是如果一次连续选择50条,100条用户需要点击100次?用户会疯掉。

解决方法:

在我们用电脑选择多个对象时,习惯性使用CTRL或者SHIFT键来多选记录,可以考虑使用这个方法来处理。

通过查找标准FORM的库代码,找到了解决方法。

核心在一个SYSTEM属性

name_in(‘SYSTEM.MOUSE_BUTTON_MODIFIERS’);

返回varchar2。

在WHEN-MOUSE-CLICK触发器时,这个属性会返回在你点击鼠标时,同时按住的那些按键名称用’+’拼接起来,如:同时按住Ctrl和Shift时返回Shift+Control+。有了这个后面问题就好解决了,只需要判断返回值是否包含Control或者Shift即可。

处理逻辑:

1. 按住Ctrl点击左键,如果原来勾选高亮显示,则变成取消勾选高亮显示,反之,则变成勾选高亮。

2. 按住Shift时需要增加一个变量记录上一次点击行Last_record

然后再根据当前点击行,循环中间所有行,勾选高亮显示,按住Shift的优先级应该高于Ctrl。

注意:因为勾选复选框时会触发WHEN-CHECKBOX-CHANGED,然后也触发WHEN-MOUSE-CLICK事件,这样按住CTRL会导致做两次事件,此时需要判断去跳过其中一个事件。

这样,就有多种操作方式选择记录了,使用户操作更加个性化,同时节省操作时间。

附:批量处理界面数据获取的心得:

对于这种勾选批量处理界面数据获取,首先想到的就是去循环界面所有记录去检查是否勾选,从而获取数据。这种方法简单,代码也很好写。但是当在界面操作时,问题就会出现:只勾选一条记录,却要去循环整个界面所有数据,还包含没有fetch到界面的数据。使得处理速度大大增加。“想尽办法去避免循环界面“这是我在做这个功能一个的体会(全选是不可避免的要循环界面了)。所以这种勾选模式要提前去获取数据。首先定义一个全局Table类型的变量,当勾选某一条记录时,将值存在Table(:SYSTEM.CURSOR_RECORD)里,取消勾选时Table.delete(:SYSTEM.CURSOR_RECORD)。这样在最后处理逻辑是只需要循环Table就行了。避免去Fetch不需要的数据(处理过程中,Table中间delete掉的记录在获取时会报No_data_found异常,只需要抛出异常跳过就行了)。即使勾选第一条和最后一条,虽然循环Table和循环界面次数一样,但是速度却有很大差别。

oracle EBS User Profile使用举例

Oracle EBS 用户配置文件使用举例:

用户配置文件相当于系统参数,可以在不同层级(Site层、应用模块层、责任层、用户层)设置不同的值; 作用范围小的覆盖范围大的层,系统已经预设了很多user profile; 开发人员也可以定义User profile;

对开发人员如果要新定义user profile 并使用之,步骤一般包括三步

第一步:定义user profile (Nav:应用开发员责任->配置文件)

user_profile_define

上例中定义了一个User profile : ORG_ID, SQL验证用于提供用户在设置该Profile值的时候提供LOV数据来源; 开发者只需要依葫芦画瓢即可。

如果LOV来源不是系统原有表中的数据,而是需要自己定义的,那么可使用值集定义好数据源,然后在这里的SQL中使用,下面的例子就是这样的:

user_profile_define2

上述例子中,lov数据来源于fnd_flex_values_vl视图,该视图中的内容是用户可以在界面上定义增加的,一般步骤是:

a) 先定义一个值集(Nav: 系统管理员责任->应用产品->验证->请求集:

值集名将用在上面的sql中,验证类型为独立。

user_profile_define3

b) 为新定义的值集添加值(NAV: 系统管理员责任->应用产品->验证->值)

在名称处输入刚才定义的值集名作为查询条件,然后点查找

user_profile_define4

在该界面可以为上面定义的值集添加值。

user_profile_define5

第二步:设置User Profile的值(Nav:系统管理员责任-> 配置文件-> 系统)

user_profile_setup_1

如果需要同时设置责任层和用户层的值,则把两者都勾选上。

user_profile_setup_2

上例中,责任 order Management user,… 和 用户Operations 层都设置了值; 且值是不一样的。 由于用户层的值可以覆盖责任层的值,当operations 用户以 order Management user,..责任登录系统是,Form中取到的值是: Vision ADB;

三、 程序中获取User profile 值:

在程序中可以使用fnd_profile.value(‘ORG_ID’) 来获取 ORG_ID这个user profile的值; 有关用户配置文件的详细概念和API,请参考120devg.pdf 第249页。

接收事务处理接口错误处理日志1例

/*******************************************************************************
date : 2007-05-08
处理者: yunfang.shang
*******************************************************************************/

select * from rcv_transactions_interface
–查接收接口中来自销售订单退货的记录(error_message是错误信息提示)
SELECT rti.processing_request_id,
       rti.creation_date,
       rti.transaction_date,
       rti.group_id,
       oeh.order_number,
       rti.item_id,
       item_description,
       rti.unit_of_measure,
       rti.quantity,
       rti.source_document_code,
       rti.subinventory,
       oel.flow_status_code,
       pie.error_message
  FROM rcv_transactions_interface rti,
       oe_order_headers_all       oeh,
       oe_order_lines_all         oel,
       PO_INTERFACE_ERRORS        pie
 WHERE rti.oe_order_header_id = oeh.header_id
   AND rti.oe_order_line_id = oel.line_id
   AND rti.oe_order_header_id = oel.header_id
   AND rti.interface_transaction_id = pie.interface_line_id(+)
 ORDER BY oeh.order_number
—       
/*
364244 2007-5-7 16:57:22 2007-4-12 16:57:14 1310 1000000933 1898 振华P999手机(银) 部 1 RMA 111216601 CLOSED “RVTII-&ERR_NUMBER:子例行程序 rvtiicreate() 返回的错误原因:子例行程序 rvtiicreate() 返回时出现内部错误。措施:请记录此错误编号以及您尝试进行的活动。 请与系统管理员联系以寻”
364881 2007-5-7 20:54:16 2007-4-12 20:54:01 1312 1000000933 1898 振华P999手机(银) 部 1 RMA 111216601 CLOSED “RVTII-&ERR_NUMBER:子例行程序 rvtiicreate() 返回的错误原因:子例行程序 rvtiicreate() 返回时出现内部错误。措施:请记录此错误编号以及您尝试进行的活动。 请与系统管理员联系以寻”
366128 2007-5-8 9:13:45 2007-5-8 9:13:45 1521 1000000998 3489 天时达TS933手机(黑) 部 1 RMA 111217801 CLOSED RCV_TP_ACCT_PERIOD_CLOSED
366133 2007-5-8 9:14:13 2007-5-8 9:14:13 1524 1000000998 111 诺基亚N2610手机(黑) 部 1 RMA 111217801 CLOSED RCV_TP_ACCT_PERIOD_CLOSED
366131 2007-5-8 9:14:06 2007-5-8 9:14:06 1523 1000000998 111 诺基亚N2610手机(黑) 部 1 RMA 111217801 CLOSED RCV_TP_ACCT_PERIOD_CLOSED
366129 2007-5-8 9:13:53 2007-5-8 9:13:53 1522 1000000998 3489 天时达TS933手机(黑) 部 1 RMA 111217801 CLOSED RCV_TP_ACCT_PERIOD_CLOSED
366613 2007-5-8 4:37:32 2007-5-8 4:37:32 1519 1000001000 101 诺基亚N1112 手机(浅蓝) 部 1 RMA 111217801 AWAITING_RETURN RCV_TP_ACCT_PERIOD_CLOSED
366613 2007-5-8 4:37:32 2007-5-8 4:37:32 1519 1000001000 101 诺基亚N1112 手机(浅蓝) 部 1 RMA 111217801 AWAITING_RETURN RCV_TP_ACCT_PERIOD_CLOSED
366613 2007-5-8 4:37:32 2007-5-8 4:37:32 1519 1000001000 101 诺基亚N1112 手机(浅蓝) 部 1 RMA 111217801 AWAITING_RETURN RCV_TP_ACCT_PERIOD_CLOSED
366613 2007-5-8 4:37:32 2007-5-8 4:37:32 1519 1000001000 101 诺基亚N1112 手机(浅蓝) 部 1 RMA 111217801 AWAITING_RETURN RCV_TP_ACCT_PERIOD_CLOSED
366613 2007-5-8 4:37:32 2007-5-8 4:37:32 1519 1000001000 101 诺基亚N1112 手机(浅蓝) 部 1 RMA 111217801 AWAITING_RETURN RCV_TP_ACCT_PERIOD_CLOSED
*/

–错误信息的具体内容可以查:
select * from fnd_new_messages where message_name = ‘RCV_TP_ACCT_PERIOD_CLOSED’

/*您的事务处理日期必须在打开的会计期内

原因:您提交的接收事务处理的日期不在打开的会计期内。

措施:重新输入事务处理,使事务处理日期在打开的会计期内,或者打开事务处理日期所在的会计期。*/

–上述接口数据  有5条在 Awaiting_return,其他已经Close
–已经Close 的数据是因为,李进做了手工接收。
–前两条自动处理失败是因为 当时1000000933 订单的销售员没有定义收入帐户导致Cogs出错。进而导致接收失败。
–李进手工接收时,把订单对应的销售员的收入帐户添加好才处理过去。
–后几条自动处理失败是因为 当时1000000998 订单的事务处理日期在5月份,而5月份的库存会计期还没开。
–李进手工接收时,把事务日期改成4月份才处理过去。

–RMA订单行已经关闭说明接收已经被手工处理。这种接口数据需要删除
–create table rcv_trx_interface_bak as select * from rcv_transactions_interface where 1=2;
–create unique index rcv_trx_interface_u1 on rcv_trx_interface_bak(INTERFACE_TRANSACTION_ID);
–备份
INSERT INTO rcv_trx_interface_bak
  (SELECT *
     FROM rcv_transactions_interface
    WHERE INTERFACE_TRANSACTION_ID IN
          (SELECT INTERFACE_TRANSACTION_ID
             FROM rcv_transactions_interface rti, oe_order_lines_all oel
            WHERE rti.oe_order_line_id = oel.line_id
              AND rti.oe_order_header_id = oel.header_id
              AND oel.flow_status_code = ‘CLOSED’
              AND rti.transaction_status_code = ‘ERROR’
              AND rti.source_document_code = ‘RMA’));
–6行被插入
–删除
DELETE FROM rcv_transactions_interface
 WHERE INTERFACE_TRANSACTION_ID IN
       (SELECT INTERFACE_TRANSACTION_ID
          FROM rcv_transactions_interface rti, oe_order_lines_all oel       
         WHERE rti.oe_order_line_id = oel.line_id
           AND rti.oe_order_header_id = oel.header_id
           AND oel.flow_status_code = ‘CLOSED’
           AND rti.transaction_status_code = ‘ERROR’
           and rti.source_document_code = ‘RMA’);
–6行被删除

/*
在用户层打开如下系统配置文件:
a. RCV: Debug Mode=Yes
b. PO:Enable Sql Trace for Receiving Processor=Yes
c. FND: Debug Log Enabled=Yes
d. FND: Debug Log Level=Statement
e. FND: Debug Log Module=%
*/

 

 — 查看PO接收接口处理器的错误方法 :参见Metalink Note : Note:299497.1   [ (老版本 Note:50903.1)]
 — 更改因为事务处理日期不在打开的会计期内的错误,可以更改事务处理日期
 — 然后提交接口处理程序。如下面的Sql
 declare
        l_request_id number ;
        X_Group_Id  number := 182;         — 输入接口表中出错记录的 group_id
        X_Transaction_date date :=  to_date(‘2007-4-29′,’YYYY-MM-DD’)   ;– 输入一个打开会计期内的日期:比如 to_date(‘2007-4-29′,’YYYY-MM-DD’);
 begin
 
 –注意,这里的user_id,resp_id,resp_appl_id 在不同的环境可能不同。
 fnd_global.APPS_INITIALIZE(user_id => 1111,
                            resp_id => 50260,
                            resp_appl_id => 660);
                           
 UPDATE rcv_transactions_interface
   SET processing_status_code  = ‘PENDING’,
       transaction_status_code = ‘PENDING’,
       processing_request_id = NULL,
       transaction_date = X_Transaction_date,
       expected_receipt_date = X_Transaction_date      
 WHERE group_id = X_Group_Id;                          
                           
                           
  l_request_id := fnd_request.submit_request(‘PO’,
                                               ‘RVCTP’,
                                               ”,
                                               to_char(sysdate+0.0003,
                                                       ‘YYYY/MM/DD HH24:MI:SS’),
                                               false,
                                               ‘IMMEDIATE’,
                                               X_Group_Id,
                                               chr(0)); 
  dbms_output.put_line(to_char(l_request_id));
 end ;
 
 –得到的request_id
 –查request的运行结果
 SELECT request_id,
        last_update_date,
        requested_start_date,
        phase_code,
        status_code,
        argument_text
   FROM fnd_concurrent_requests
  WHERE request_id = &p_request_id
 
 –如果有错误,查错误日志
SELECT to_char(TIMESTAMP, ‘DD-MON-YY HH24:MI:SS’),
       SUBSTR(message_text, 1, 300),
       SUBSTR(module, 1, 30),
       log_sequence
  FROM fnd_log_messages
 WHERE trunc(TIMESTAMP) = trunc(SYSDATE)
   AND process_id = (SELECT os_process_id
                       FROM fnd_concurrent_requests
                      WHERE request_id = &p_request_id)
   AND module NOT LIKE ‘fnd%’
 ORDER BY log_sequence;
 
 —
/* 146 08-5月 -07 21:40:24 ”          ORA-01405: 读取的列值为 NULL
” po.src.rvtp.rvtii.RVTIICREATE. 94948
147 08-5月 -07 21:40:24 ”          RVTII:076 OE COGS API returned Error 销货成本帐户生成失败,并出现以下错误:ORA-20002: 3135: ‘在同步进程中,不允许出现 ‘Wf_Item_Activity_Status.Set_Error(error_process)’。 ‘

” po.src.rvtp.rvtii.RVTIICREATE. 94950
148 08-5月 -07 21:40:24 ”          ORA-01405: 读取的列值为 NULL
” po.src.rvtp.rvtii.RVTIICREATE. 94952*/

–可见是COGS 帐户生成失败
–可能是某个COGS要取的某个帐户没有设置
— 20070508 21:54 接口中一些错误的接收,被李进手工接收了,订单行已经关闭
— 备份
INSERT INTO rcv_trx_interface_bak
  (SELECT *
     FROM rcv_transactions_interface
    WHERE INTERFACE_TRANSACTION_ID IN
          (SELECT INTERFACE_TRANSACTION_ID
             FROM rcv_transactions_interface rti, oe_order_lines_all oel
            WHERE rti.oe_order_line_id = oel.line_id
              AND rti.oe_order_header_id = oel.header_id
              AND oel.flow_status_code = ‘CLOSED’
              AND rti.transaction_status_code = ‘ERROR’
              AND rti.source_document_code = ‘RMA’));
–7行被插入
–删除
DELETE FROM rcv_transactions_interface
 WHERE INTERFACE_TRANSACTION_ID IN
       (SELECT INTERFACE_TRANSACTION_ID
          FROM rcv_transactions_interface rti, oe_order_lines_all oel       
         WHERE rti.oe_order_line_id = oel.line_id
           AND rti.oe_order_header_id = oel.header_id
           AND oel.flow_status_code = ‘CLOSED’
           AND rti.transaction_status_code = ‘ERROR’
           and rti.source_document_code = ‘RMA’);
–7行被删除