资产数据导入数据拆分
<font color="#FF0000">注意点:</font>
<font color="#FF0000">导入数据前核查是否缺少关键字段,如:资产编号,资产金额,数量,入库日期,领用人,使用单位,分类号,现状</font>
<font color="#FF0000">拆分数据如果有折旧也需要拆分</font>
<font color="#FF0000">数据字典需要转换</font>
1.导入学校提供的excel数据到临时库sec_import
打开excel,复制表头
创建和表头一样的表到sec_import
create table sec_import.ustb_20220315(
资产编号 varchar2(4000),
资产名称 varchar2(4000),
明细类别 varchar2(4000),
资产分类代码 varchar2(4000),
数量 varchar2(4000),
价值 varchar2(4000),
财务入账日期 varchar2(4000),
现状 varchar2(4000),
使用部门编号 varchar2(4000),
使用部门 varchar2(4000),
价值类型 varchar2(4000),
使用人 varchar2(4000),
存放地点 varchar2(4000),
折旧摊销状态 varchar2(4000)
)
使用kettle工具导入,导入过后核查金额数量是否和excel一致
2.对应资产表字段导入到资产的临时表
创建一个和资产表表结构一样的临时表
create table sec_import.ustb_assets20220315 as select * from sec_bl_assets.assets where 1=2;
--复制表结构并且创建表名为ustb_assets20220315
对应字段过后插入到刚刚创建的临时表
insert into ustb_assets20220315
(
code,
name,
type_name,
assets_sort_gb_code,
num,
price,
stock_date,
state,
base_dep_code,
base_dep_name,
jiazlx,
base_teacher_name_keeper,
base_room_name,
ZJZT,
assets_sort_code,
country,
belong,
attach_num,
attach_price,
source,
direction,
type
)
select
资产编号 ,
资产名称 ,
明细类别 ,
资产分类代码 ,
数量 ,
价值 ,
to_date(财务入账日期 ,'yyyy-mm-dd') ,
现状 ,
使用部门编号 ,
使用部门 ,
价值类型 ,
使用人 ,
存放地点 ,
'02' 折旧摊销状态 ,
'0000','156','1','0','0','1','1',
'furniture'
from ustb_20220315
3.数据拆分(如果资产数量都为一就跳过这一步)
由于资产系统的资产数量都是1,所以需要拆分,不过也有特殊情况不需要拆分,因此在拆分数据的时候询问发起任务的人数据是否需要拆分
先创建一个和资产表一个一样的临时表用于存放拆分过后的数据
create table ustb_assets20220315_cf as select * from sec_bl_assets.assets where 1=2;
核查拆分的数据,数量大于1的是否都是家具,如果设备也有大于1的也要询问任务发起人,设备是否也要拆分
select distinct type from ustb_assets20220315 where num>1
核查最大的数量是多少
select max(num ) from ustb_assets20220315
修改拆分的存储过程
开始和结束都有这个存储过程名称IMPORT_FURNITURE_QXN,每次根据自己情况修改
--开始
create or replace procedure IMPORT_FURNITURE_QXN(prmMsg out varchar2) is
imCount number;
fNum number;
i number;
fCode varchar2(32);
begin
--查询出需要转入的家具信息并循环生成子家具信息
imCount := 0;
--for循环 括号里面的是导入的资产临时表,需要修改条件限制拆分的数据
for FurnitureData in (
select * from sec_import.ustb_assets20220315 where NUM>1 and type='furniture'
) loop
imCount := imCount + 1;
--获取数量
fNum := to_number(TRIM(FurnitureData.NUM));
i := 0;
while i < fNum loop
--计算家具子号编码。
i := i + 1;
if i <= 9999 then
fCode := lpad(i, 4, '0');
else
fCode := to_char(i + 30961, 'XXXX');
end if;
--插入拆分数据到新创建的数据拆分表,这里需要自己添加缺少的字段,temp8到temp6这几个字段的位置不要变动
INSERT INTO SEC_IMPORT.ustb_assets20220315_cf
(
temp8,
FURNITURE_BATCH_CODE,
CODE,
PRICE,
NUM,
TEMP7,
TEMP6,
name,
type_name,
stock_date,
state,
base_dep_code,
base_dep_name,
jiazlx,
base_teacher_name_keeper,
base_room_name,
ZJZT,
country,
belong,
attach_num,
attach_price,
source,
direction,
type,
ASSETS_SORT_CODE,
ASSETS_SORT_NAME,
ASSETS_SORT_GB_CODE,
ASSETS_SORT_GB_NAME
)
values
(
TRIM(FurnitureData.LEIJZJ),
TRIM(FurnitureData.code),
TRIM(FurnitureData.CODE)||fCode,
TRIM(FurnitureData.PRICE)/TRIM(FurnitureData.NUM),
'1',
TRIM(FurnitureData.PRICE),
TRIM(FurnitureData.NUM),
TRIM(FurnitureData.NAME),
TRIM(FurnitureData.type_name),
TRIM(FurnitureData.stock_date),
TRIM(FurnitureData.state),
TRIM(FurnitureData.base_dep_code),
TRIM(FurnitureData.base_dep_name),
TRIM(FurnitureData.jiazlx),
TRIM(FurnitureData.base_teacher_name_keeper),
TRIM(FurnitureData.base_room_name),
TRIM(FurnitureData.ZJZT),
TRIM(FurnitureData.country),
TRIM(FurnitureData.belong),
TRIM(FurnitureData.attach_num),
TRIM(FurnitureData.attach_price),
TRIM(FurnitureData.source),
TRIM(FurnitureData.direction),
TRIM(FurnitureData.type),
TRIM(FurnitureData.ASSETS_SORT_CODE),
TRIM(FurnitureData.ASSETS_SORT_NAME),
TRIM(FurnitureData.ASSETS_SORT_GB_CODE),
TRIM(FurnitureData.ASSETS_SORT_GB_NAME)
);
end loop;
end loop;
prmMsg := '成功导入' || imCount || '批家具。';
commit;
exception
when others then
prmMsg := '导入失败。' || sqlerrm;
rollback;
end IMPORT_FURNITURE_QXN;
--结束
存储过程修改完毕直接创建就会在下面查看
找到创建的存储过程查看是否报错
有就是有错,就需要自己查看错误并改正
没有错误就直接右键测试 执行存储过程
执行成功,输出
查看数据拆分表是否有数据,比较金额数量是否和拆分前一致
select count(*),sum(price) from ustb_assets20220315_cf;
select sum(num), sum(price) from sec_import.ustb_assets20220315 where NUM>1 and type='furniture'
金额不对用下面的sql补全
--金额是否对
SELECT to_char(SUM(差距),'fm90.09') FROM (
SELECT FURNITURE_BATCH_CODE,TEMP7,EE ,TO_NUMBER(TEMP7)-TO_NUMBER(EE) 差距 FROM (
SELECT FURNITURE_BATCH_CODE,TEMP7,SUM(PRICE) EE FROM SEC_IMPORT.asss_cf WHERE TEMP6>1 GROUP BY FURNITURE_BATCH_CODE,TEMP7,TEMP6) WHERE TEMP7<>EE
)
--获取拆分金额不对的资产数据
SELECT 'update asss_cf set price =price'||'' || case when cj like '-%' then cj else '+'||cj end || '' ||' where code =' || '''' || FURNITURE_BATCH_CODE||'0001' || '''' || ';',cj
FROM (
SELECT FURNITURE_BATCH_CODE,TEMP7,EE ,to_char(TO_NUMBER(TEMP7)-TO_NUMBER(EE),'fm90.09') cj,cnt FROM (
SELECT FURNITURE_BATCH_CODE,TEMP7,SUM(PRICE) EE ,count(*) cnt FROM SEC_IMPORT.asss_cf WHERE TEMP6>1 GROUP BY FURNITURE_BATCH_CODE,TEMP7,TEMP6) WHERE TEMP7<>ee
);
最后把数量为1的数据插入到拆分表,形成完整的数据
insert into ustb_assets20220315_cf select * from ustb_assets20220315 where num='1';
4.更新相关缺少的数据:单位编号,领用人工号,6大类分类号,16大类分类号
更新完成过后插入主表sec_bl_assets, 登陆系统查询
5.插入入账记录到sec_assets.assets_work
insert into sec_assets.assets_work
(id,
WORK_STATE,
WORK_TIME,
WORK_PRICE,
WORK_DEP,
WORK_REMARK,
WORK_AVAILABLE,
WORK_TEACHER,
base_dep_code,
base_dep_name,
code,
assets_sort_code,
name,
model,
spec,
price,
PRODUCER,
PROVIDER,
INVOICE_NO,
FACTORY_NO,
FACTORY_DATE,
PURCHASE_DATE,
base_room_name,
state,
OUTLAY_SUBJECT,
direction,
source,
CGZZXS,
keeper_name,
PURCHASER,
ASSESSOR,
STOCK_DATE,
remark,
assets_sort_gb_code,
assets_sort_gb_name,
FINANCE_BILL,
bill_no,
SR_NO,
OUTLAY_CARD_NAME,
TEMP1,
TEMP2,
TEMP3,
TEMP4,
TEMP5,
country,
attach_num,
attach_price,
type,
CHECK_METHOD,
LAST_CHECK_DATE,
/* CHECK_RESULT,*/
CHECKER,
FINANCE_DATE,
FINANCE_ASSESSOR,
CAMPUS,
TEMP7,
SERVICE_DATE,
num,
JIAZLX,
DEPRESIATION_METHOD,
YUJSMZL,
UNIT,
base_teacher_no_keeper,
temp8,
belong,
temp9,
DISPDATE)
select sec_base.seq_assets_default.nextval,
'1',
stock_date,
0,
null,
'入账',
/*0,*/
1,
null,
base_dep_code,
base_dep_name,
code,
assets_sort_code,
name,
model,
spec,
price,
PRODUCER,
PROVIDER,
INVOICE_NO,
FACTORY_NO,
FACTORY_DATE,
PURCHASE_DATE,
base_room_name,
state,
OUTLAY_SUBJECT,
direction,
source,
CGZZXS,
keeper_name,
PURCHASER,
ASSESSOR,
STOCK_DATE,
remark,
assets_sort_gb_code,
assets_sort_gb_name,
FINANCE_BILL,
bill_no,
SR_NO,
OUTLAY_CARD_NAME,
TEMP1,
TEMP2,
TEMP3,
TEMP4,
TEMP5,
country,
attach_num,
attach_price,
type,
CHECK_METHOD,
LAST_CHECK_DATE,
/* CHECK_RESULT,*/
CHECKER,
FINANCE_DATE,
FINANCE_ASSESSOR,
CAMPUS,
TEMP7,
SERVICE_DATE,
num,
JIAZLX,
DEPRESIATION_METHOD,
YUJSMZL,
UNIT,
base_teacher_no_keeper,
temp8,
belong,
temp9,
DISPDATE
from sec_bl_assets.assets; --这个改成你导入的临时表
--如果没有sequence 就 查询最大的 创建一个
SELECT MAX(ID) FROM sec_assets.assets_work WHERE LENGTH(ID)='11'
create sequence SEQ_ASSETSTMP
minvalue 1
maxvalue 999999999999999
start with 3761630
increment by 1
cache 10;
最后要修改 系统的system_sequence 的值为你最后最大的值往后加几个
select a.*,rowid from system_sequence a where code ='assets_default'