EBS初识

来源:互联网 发布:python namespace 编辑:程序博客网 时间:2024/04/29 05:25

首次参与项目,以前几乎没有接触过EBS系统,缺乏对EBS最基础的认识。我的心情是有点忐忑的,不知道能不能顺利的完成任务。

第一天并没有对新人进行额外的培训,而是发了一份模板代码让我学习。看模板代码的第一感觉是代码规范,确实与之前所编写的代码有很大不同。包名,函数名,参数名,变量名,包括异常都有明确的命名规范。规范基本如下

/*****************************************************************************************  * Package Name     : packge name  * Description      : ...  * Function Id      :   * Version          : 1.0  * $Author          : Yusen.Yang$  * $Date$           : 2014/08/14 09:29:30$  * $Revision        :   *  * Program List  * ----------------------------------- ---- ----- -----------------------------------------  *  Name                               Type  Ret   Description  * ----------------------------------- ---- ----- -----------------------------------------  *  init_process_code_p                 P          ...  *  feedback_to_itfs_p                  p          ...  *  lock_fetch_data_p                   P          ....  *  interface_operation_p               P          ....  *  process_data_p                      P          ...  *  submain                             P          the main processing procedure  *  main                                P          ...  *  * Change Record  * ------------ ------ ---------------- -------------------------------------------------  *  Date         Ver.   Editor           Description  * ------------ ------ ---------------- -------------------------------------------------  *  2014/08/14   1.0    YuSen.Yang         Creation  *****************************************************************************************/--这是对包的注释,写在包的声明之后。其中需要注意的是,Program List 中函数的顺序一般要与实际顺序一致。procedure 的命名需要在过程名后加_p,function的命名需要在函数名后加_f,而main和submain则为默认过程,不需要添加_p  -- ================================  -- global constant  -- ================================  --在这里定义全局常量  --================================  --global variables  --================================  --在这里定义全局变量  --*** common exception ***--  --在这里定义全局异常  --*** Commom functions exception ***--  --在这里定义全局函数异常 --  /**********************************************************************************  * Procedure Name :   procedure name  * Description    :   description  * @param   p1                description  * @param   p2                description  * @param   p3                description  ***********************************************************************************/--这是对过程的注释,写在过程的声明之前,p1,p2,p3也与之前的要求相同,顺序与过程声明中引用顺序一致 --############## Fixed constant local variable declaration START   #############    --    -- ===============================    -- fixed local constants    -- ===============================    -- 局部常量    -- ===============================    -- local variables    -- ===============================    -- 局部变量    -- ===============================    --    --###########################  Fixed part END   ################################    --    -- ===============================    -- user declaration     -- ===============================    -- 用户自定义变量或常量     -- ===============================--这是对过程里变量的注释,Fixed part是固定区域,用于固定格式变量的声明,例如error_buf,error_message,program_name等    --############### Fixed portion initialization status START   ##################    --    --###########################  Fixed part END   ################################--这块注释的作用是用来初始化固定变量,例如return_code等--每个模块写完之后,都要在下一行添加 -- 表明一个模块的结束,增强代码的可读性

这个包的框架也基本是这次项目主要的开发框架。即各个函数的命名和作用基本一致。看完代码,只是对开发框架有了初步的认识,对于代码的内部逻辑可以说是一窍不通。枯坐了一整天之后,由业务顾问给我讲我要开发的code的业务逻辑。

我首次被分配的任务名为Resource Transaction Import

每个单词我都认识,可是堆到了一起就失去了概念。大概翻译为 资源事务处理,对于资源这个概念,业务顾问对我解释了很多,可我还是不太理解。大概就是企业的各项资源,如生产资料,包括人事资源等,Resource Transaction 就是资源的移动,Import 就是数据的批量导入。完整来看,我本次的任务就是将资源移动等事务的信息,批量导入到EBS系统中。任务原因是,在EBS中只能逐条处理数据,对于大的企业来说,信息量很大,逐条处理显然不现实,因此我们需要进行二次开发,使得数据能够批量处理。清楚了任务目的后,由同事对我经行EBS基本操作的培训,培训非常简单,只介绍了EBS大概分为哪些模块,如何提交一个并发请求。对于我而言没有太大的帮助,因为我对于EBS几乎完全没有了解,同事的介绍听的也只是云里雾里,一知半解。唯一的感觉就是EBS的操作界面简直简陋的不堪入目。同事告诉我,毕竟是企业级的应用,更重要的是功能,而不是界面。我也只能勉强接受。

第一天就这样结束了。我只能用糊里糊涂来形容。

代码开发正式开始后,我开始在网上下载了海量的EBS入门资料,看了个昏天黑地。可惜的是,这些入门资料对我而言依旧不够入门。

我感觉对我帮助最大的就是  EBS操作手册中文版 里前几页的内容:

我花了很长时间去了解EBS里的各个模块,可惜由于EBS系统非常庞大和复杂,仅仅只找到了自己负责的代码所在模块。WORK IN PROCESS,一般简称为WIP,->resource transaction。

当我想要随便建立一条测试数据,模拟界面操作流程的时候,EBS系统的复杂又一次教我做人。各个表之间的关系非常复杂,组织,工单,流程号,等等都有内在约束。想要建立一条测试数据对于我这种菜鸟来说十分困难。没办法,只能请求同事帮忙生成一条测试数据。后来这条数据被我反复用了上百次。。。

向EBS系统导入数据有两种方式,一种是用API导入,另一种是利用接口表。本次任务我使用的是接口表的方式。即将数据批量导入接口表中,提交请求,EBS处理接口表中的数据,处理完成后,再读接口表,将反馈信息回写入原表。起初我并未完整理解接口表的含义,以为将数据放入接口表之后,还要根据业务逻辑,在后台更改所有数据的相应状态。当然我想多了。EBS提供接口表的作用就是按照一定的业务逻辑处理数据。不需要再额外的更改其他表中的相应数据状态。

OK,有了任务目的和业务逻辑之后,我终于清楚我需要做什么了。其实我的任务非常简单,把一堆数据从一个表挪到另一个表。

但是Resource Transaction 的接口表比较特殊,这个接口表的请求是由系统自动提交的,每5分钟提交一次。我们不能主动提交这个请求。这给我回写数据带来了很大困难。经过同事的帮助,我得到了一个等待请求完成的代码:

 SELECT fcr.requested_start_date        INTO ld_request_start_date1        FROM fnd_concurrent_requests fcr,             fnd_concurrent_programs fcp       WHERE 1 = 1         AND fcr.phase_code IN ('P', 'R')         AND fcr.concurrent_program_id = fcp.concurrent_program_id         AND fcp.concurrent_program_name = cv_cst_concurrent       ORDER BY fcr.request_date DESC;      ld_request_start_date2 := ld_request_start_date1;          WHILE ld_request_start_date2 = ld_request_start_date1 LOOP        dbms_lock.sleep(20);        SELECT fcr.requested_start_date          INTO ld_request_start_date2          FROM fnd_concurrent_requests fcr,               fnd_concurrent_programs fcp         WHERE 1 = 1           AND fcr.phase_code IN ('P', 'R')           AND fcr.concurrent_program_id = fcp.concurrent_program_id           AND fcp.concurrent_program_name = cv_cst_concurrent         ORDER BY fcr.request_date DESC;      END LOOP;
代码非常简单,等待一个名为 ‘CMCTCM’ 请求的完成。

这里需要自我检讨一下。这个问题本来是在我能力范围之内的,我是应该可以独立解决的。可实际上并没有。原因是,我对于EBS系统的相关问题产生了惯性:每当有关于EBS系统的问题发生,我都下意识的认为这个问题我无法解决,甚至还没有着手去解决,就惯性的依赖同事帮助。这是非常错误的想法。同时也值得深思。在其它地方,我们有没有因为  ‘一个没有接触过的事物产生的问题我们总是无法处理’  ,就发生 ’ 只要产生问题‘  我们就认为  ’这个问题是无法解决‘  的幻觉,总是去麻烦别人去解决本来应该自己解决的问题。

代码编写还算比较顺利。大概使用了一天的时间就完成了。离DEADLINE还有两周。我感到很满足。并没有影响项目进度。之后就是DEBUG和完善代码了。

分享两个对EBS新手可能很有用的东西:

在查询窗口中,点中某个数据,Help->Record,可以看到这个数据是依附于哪个表(视图),Update date等信息。

在查询窗口中,点中某个数据,Help->Diagnostics->Examine,可以看到这个数据是在哪个表中得到,Value等信息。

再分享一段我感觉如获至宝的代码:

declare  cursor cur_lov_sql(p_pre_sql_addr varchar2) is   select t.SQL_TEXT   from v$sqltext_with_newlines t   where t.ADDRESS = p_pre_sql_addr   order by t.PIECE;  --  l_lov_sql  varchar2(2400);  l_prev_sql_addr varchar2(200);begin  begin    select v.PREV_SQL_ADDR    into   l_prev_sql_addr    from v$session v    where v.SID = &sid;--输入Session id    exception      when others then       dbms_output.put_line('get prev sql addr error,'||sqlcode||':'||sqlerrm);  end;  --  for rec in cur_lov_sql(l_prev_sql_addr) loop      l_lov_sql := nvl(l_lov_sql,'')||rec.sql_text;  end loop;  --  dbms_output.put_line('sqlΪ:');  dbms_output.put_line(l_lov_sql);end;

可以得到当前SESSION下,EBS系统所执行的最后一条SQL语句。

当我们不知道当前数据EBS是从哪查询得来的时候,就可以用以上代码。得到相关的表的信息和where条件。

得到当前session id 的方法:Help->About Oracle Applications...

找到Session SID 即可

0 0
原创粉丝点击