EBS之实现excel批量导入数据库

下面的操作,在我公司环境中操作,所以,本次内容,将适用与我的同事们,步骤如下

1. 表介绍

本次操作主要用到3个表,cux_dataimport_templet,cux_dataimport_fields,cux_dataimport_iface_temp

(1) cux_dataimport_templet:此表用来存放一些HTML页面显示的东西,如下图,看出什么东西了吗,就是只要我们按字段填入信息,就会在页面中显示出来哦

     1-1

1-2

顺便说一下图一的VALIDATE_PKG,和IMPORT_PKG字段有什么用,VALIDATE_PKG表示当你点击页面的验证时,会自动调用字段里的过程,IMPORT_PKG,当你点击导入的时候会自动调用字段里的过程,如图

1-3

(2) cux_dataimport_fields:这个表用于存储Excel显示的字段,并且根据这些字段生成excel表格,如图,是不是有发现了新大陆?

2-1

 2-2

 (3) cux_dataimport_iface_temp: 这个表用于存储未验证的数据,只有,验证通过了,才能导入你的表,同时也是存放错误信息的表,如图

3-1

3-2

2 编写代码了,首先,我们编写一个过程,用于导入 cux_dataimport_templet,用于在页面显示

代码如下

PROCEDURE setup is
l_templet_id NUMBER;
CURSOR c_fields IS
  SELECT df.field_code
        ,df.field_name
  FROM   cux_dataimport_fields  df
        ,cux_dataimport_templet dt
  WHERE  df.templet_id = dt.templet_id
  AND    dt.templet_code = '你的模板代码'
  ORDER  BY df.order_num;

l_insert_templet cux_dataimport_templet%ROWTYPE;
l_insert_field   cux_dataimport_fields%ROWTYPE;
l_fields         VARCHAR2(2000);
i                INT;
l_index          NUMBER := 5;
BEGIN
  --为了避免未知错误,先删除templet_code相同的头表,和字段表
  DELETE FROM cux_dataimport_fields df
         WHERE  df.templet_id IN
               (SELECT dt.templet_id
                  FROM cux_dataimport_templet dt
                 WHERE dt.templet_code = '你的模板代码');

  --为了避免未知错误,先删除templet_code相同的头表,和字段表
  DELETE FROM cux_dataimport_templet dt
  WHERE  upper(dt.templet_code) = upper('你的模板代码');

  --删除后,我们自己重新写入

--模板的id,这是是自增,你也可以自己写其他的
  l_templet_id := cux_dataimport_templet_s.nextval;
  l_insert_templet.templet_id := l_templet_id;

--模板代码,这里可以随便写,一会挂载到EBS就是用这个
  l_insert_templet.templet_code := 'CUX_Excel_IMP';

--模板名,就是在页面显示的,如上图1-2的  导入类型 社团导入
  l_insert_templet.templet_name := '你的模板名';

--验证数据时,系统会调用这个包,如上图1-3 的 验证按钮
  l_insert_templet.validate_pkg := '换成你的  包.过程';

--数据导入时,会字段调用这个包,如上图1-3 的导入按钮
  l_insert_templet.import_pkg := '换成你的  包.过程';

---按照我写的就行
  l_insert_templet.enable_flag := 'Y';

--按照我写的就行
  l_insert_templet.creation_date := SYSDATE;

------按照我写的就行
  l_insert_templet.created_by := fnd_global.user_id;

------按照我写的就行
  l_insert_templet.last_updated_by := fnd_global.user_id;

-----------按照我写的就行
  l_insert_templet.last_update_date := SYSDATE;

-----------按照我写的就行
  l_insert_templet.last_update_login := fnd_global.login_id;

-----------按照我写的就行
  l_insert_templet.import_guid := '1、EXCEL表第一行为标题行,第二行开始为需要导入的数据行。' ||
                                  chr(13) ||
                                  '2、导入数据时,先点[浏览...]按钮选择需导入的文件;然后按[上传]按钮,按[导入]按钮,完成数据验证并导入。' ||
                                  chr(13) || '3、导入模版列:@@FIELDS';
  INSERT INTO cux_dataimport_templet
  VALUES l_insert_templet;

  --字段表的id,这里确保和头表的id一致
  l_insert_field.templet_id := l_templet_id;

-----------按照我写的就行
  l_insert_field.enable_flag := 'Y';

-----------按照我写的就行
  l_insert_field.creation_date := SYSDATE;

-----------按照我写的就行
  l_insert_field.created_by := fnd_global.user_id;

-----------按照我写的就行
  l_insert_field.last_updated_by := fnd_global.user_id;

-----------按照我写的就行
  l_insert_field.last_update_date := SYSDATE;

-----------按照我写的就行
  l_insert_field.last_update_login := fnd_global.login_id;
  

-----------按照我写的就行

  l_index := l_index + 5;
  l_insert_field.order_num := l_index;

------这里要改,改id和name,生成Excel显示的第一列,如图 3-1的 社团编号
  l_insert_field.field_code := 'ORGID';
  l_insert_field.field_name := '*社团编号';

-----------按照我写的就行
  INSERT INTO cux_dataimport_fields df
  VALUES l_insert_field;
  

-----------按照我写的就行
  l_index := l_index + 5;
  l_insert_field.order_num := l_index;

------这里要改,改id和name,生成Excel显示的第一列,如图 3-1的 社团名称
  l_insert_field.field_code := 'ORGNAME';
  l_insert_field.field_name := '*社团名称';

-----------按照我写的就行
  INSERT INTO cux_dataimport_fields df
  VALUES l_insert_field;
  

-----------按照我写的就行
  l_index := l_index + 5;
  l_insert_field.order_num := l_index;

------这里要改,改id和name,生成Excel显示的第一列,如图 3-1的 总人数
  l_insert_field.field_code := 'TOTLENUM';
  l_insert_field.field_name := '*总人数';

-----------按照我写的就行
  INSERT INTO cux_dataimport_fields df
  VALUES l_insert_field;
  

-----------按照我写的就行
   l_index := l_index + 5;
  l_insert_field.order_num := l_index;

------这里要改,改id和name,生成Excel显示的第一列,如图 3-1的 社团负责人
  l_insert_field.field_code := 'LEADNAME';
  l_insert_field.field_name := '*社团负责人';

-----------按照我写的就行
  INSERT INTO cux_dataimport_fields df
  VALUES l_insert_field;
  

-----------按照我写的就行
   l_index := l_index + 5;
  l_insert_field.order_num := l_index;

------这里要改,改id和name,生成Excel显示的第一列,如图 3-1的 社团描述
  l_insert_field.field_code := 'DESR';
  l_insert_field.field_name := '社团描述';

-----------按照我写的就行
  INSERT INTO cux_dataimport_fields df
  VALUES l_insert_field;
  
  
 
  
  
  -------------按照我写的就行
  l_fields := '';
  i := 0;
  FOR r_fi IN c_fields
  LOOP
    i := i + 1;
    l_fields := l_fields || '[' || r_fi.field_name || ']、';
    IF (i MOD 8 = 0) THEN
      l_fields := l_fields || chr(13);
    END IF;
  END LOOP;
  l_fields := substr(l_fields, 1, instr(l_fields, '、', -1) - 1);
  UPDATE cux_dataimport_templet dt
  SET    dt.import_guid = REPLACE(dt.import_guid, '@@FIELDS', l_fields)
  WHERE  dt.templet_id = l_templet_id;

  COMMIT;
end;
 

 代码写完后,别忘了执行一遍,在过程名上右键->测试->按F8

2  定义完了excel模板,接下来就是写验证,验证的话是看你的业务需求,所以这里只有不为空就行了,代码如下

------p_file_id    不用管,因为是由系统生成和调用的,写上就好

PROCEDURE validate_data(p_file_id     IN VARCHAR2
                       ,x_return_code IN OUT VARCHAR2
                       ,x_return_mesg IN OUT VARCHAR2) is
l_date date;
l_msg  varchar(100);

-------------按我写的就行
l_status  varchar2(50) :='S';
l_count number;
begin

  -------------按我写的就行
   x_return_code := 'S';
    x_return_mesg := '验证通过!';

-------------按我写的就行
  
    UPDATE cux_dataimport_iface_temp di
       SET di.status        = g_ret_sts_success,
           di.process_flag  = '0',
           di.error_message = ''
     WHERE di.file_id = p_file_id;

--------------这里做主要的验证,当我上传文件以后,所有的数据都存在临时表中


     
     FOR VV IN (select *
                 from cux_dataimport_iface_temp di
                where di.file_id = p_file_id) LOOP
                
        l_msg:=null;
     if VV.cell_1 is null then
       l_msg:='社团编号不能为空';
      end if;  
      
         if VV.cell_2 is null then
       l_msg:='社团名称不能为空';
      end if;  
      
         if VV.cell_3 is null then
       l_msg:='社团总人数不能为空';
      end if;  
      
         if VV.cell_4 is null then
       l_msg:='社团负责人不能为空';
      end if;   
      
      
          if l_msg is not  null then
         l_status:=g_ret_sts_error;
         END if;
 

/*****************************************************************************
*        di.status会根据这个状态判断你是否验证成功 
*        di.error_message,验证失败时的提示信息,如图3-2的 社团负责人不能为空
*         其他的不用变
*****************************************************************************/   
        UPDATE cux_dataimport_iface_temp di
         SET di.process_flag  = '1',
             di.status        = l_status,
             di.error_message = l_msg
       where di.file_id = p_file_id
         and di.cell_1 = vv.cell_1
         and di.cell_2 =vv.cell_2;       
     END LOOP;
     
      commit;
 


-------------按我写的就行  
   SELECT COUNT(1)
      INTO l_count
      FROM cux_dataimport_iface_temp di
     WHERE di.file_id = p_file_id
       AND di.status = g_ret_sts_error;
 

-------------按我写的就行 
    IF l_count > 0 THEN
      x_return_code := g_ret_sts_error;
      x_return_mesg := '验证不通过,请查看【错误信息】!';
      RETURN;
    END IF;

/***************************************************************************
*        x_return_mesg是返回的提示信息
***************************************************************************/
  EXCEPTION
    WHEN OTHERS THEN
      x_return_code := g_ret_sts_error;
      x_return_mesg := '校验异常:' || 'SQLCODE : ' || TO_CHAR(SQLCODE) ||
                       ' ERRORS : ' || SUBSTR(SQLERRM, 1, 150);   
       
   
end;

3.   导入数据,当验证通过时就能导入数据了

procedure import_done(p_file_id     IN VARCHAR2
                     ,x_return_code IN OUT VARCHAR2
                     ,x_return_mesg IN OUT VARCHAR2) is
                     
                     
---------按我写的就行

L_USER_ID NUMBER := FND_GLOBAL.USER_ID;
L_LOGIN_ID NUMBER := FND_GLOBAL.LOGIN_ID;
L_CURR_DATE DATE := SYSDATE;
begin
  x_return_code := 'S';
  x_return_mesg := '正常导入';


----------------在进行一次验证

  validate_data(p_file_id     => p_file_id
               ,x_return_code => x_return_code
               ,x_return_mesg => x_return_mesg);

----------这里从临时表拿数据然后写到你的表中


----------------按我写的就行
  FOR VV IN (SELECT *
               FROM emps_view DI
              WHERE DI.file_id = p_file_id
                AND DI.status = 'S') LOOP
----------------------读值出来,省略,就是 VV.Cell_X  X表示1到N,对应Excel第1到第N行
    
----------------------写入数据库省略,别跟我说写入你的表你都不会
    
---------------insert into 表名 values (值1,....,值n);
--------------------    commit;
    null;
  end loop;

EXCEPTION
  WHEN OTHERS THEN
    x_return_code := g_ret_sts_error;
    x_return_mesg := '导入异常:'||'SQLCODE : '||TO_CHAR(SQLCODE)||' ERRORS : '||SUBSTR(SQLERRM, 1, 150);
    ROLLBACK;
end;

4. 挂载到EBS系统上,系统管理员职责,应用产品->功能

填入如下内容,模板代码在我标记青色的地方,用心找找,在上面

OA.jsp?page=/common/oracle/apps/cux/dataimport/webui/UploadPG&TempletCode=你的模板代码&CanChangeTemplet=N 

在应用产品->菜单

(1) 搜索职责,请对应你EBS系统上的职责

(2) 先点左上角的添加,如图,然后输入第4步要记住的用户功能名

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值