下面的操作,在我公司环境中操作,所以,本次内容,将适用与我的同事们,步骤如下
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步要记住的用户功能名