feat: 生物由来データに空文字→NULL変換を実装

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2023-09-16 13:56:34 +09:00
parent c38e3cb69e
commit a7d4033ca4
4 changed files with 171 additions and 155 deletions

View File

@ -1281,165 +1281,165 @@ class VjskReceiveFileMapper:
,dwh_upd_dt
)
SELECT
t.rec_data
,t.rec_whs_cd
,t.rec_whs_sub_cd
,t.rec_whs_org_cd
,t.rec_cust_cd
,t.rec_comm_cd
,t.rec_tran_kbn
,t.rev_hsdnymd_wrk
,t.rev_hsdnymd_srk
,t.rec_urag_num
,t.rec_comm_name
,t.rec_nonyu_fcl_name
,t.rec_nonyu_fcl_addr
,t.rec_lot_num1
,t.rec_qty1
,t.rec_lot_num2
,t.rec_qty2
,t.rec_lot_num3
,t.rec_qty3
,t.rec_ymd
,t.sale_data_cat
,t.slip_file_name
,t.slip_mgt_num
src05.convert_empty_to_null(t.rec_data)
,src05.convert_empty_to_null(t.rec_whs_cd)
,src05.convert_empty_to_null(t.rec_whs_sub_cd)
,src05.convert_empty_to_null(t.rec_whs_org_cd)
,src05.convert_empty_to_null(t.rec_cust_cd)
,src05.convert_empty_to_null(t.rec_comm_cd)
,src05.convert_empty_to_null(t.rec_tran_kbn)
,src05.convert_empty_to_null(t.rev_hsdnymd_wrk)
,src05.convert_empty_to_null(t.rev_hsdnymd_srk)
,src05.convert_empty_to_null(t.rec_urag_num)
,src05.convert_empty_to_null(t.rec_comm_name)
,src05.convert_empty_to_null(t.rec_nonyu_fcl_name)
,src05.convert_empty_to_null(t.rec_nonyu_fcl_addr)
,src05.convert_empty_to_null(t.rec_lot_num1)
,src05.convert_empty_to_null(t.rec_qty1)
,src05.convert_empty_to_null(t.rec_lot_num2)
,src05.convert_empty_to_null(t.rec_qty2)
,src05.convert_empty_to_null(t.rec_lot_num3)
,src05.convert_empty_to_null(t.rec_qty3)
,src05.convert_empty_to_null(t.rec_ymd)
,src05.convert_empty_to_null(t.sale_data_cat)
,src05.convert_empty_to_null(t.slip_file_name)
,src05.convert_empty_to_null(t.slip_mgt_num)
,t.row_num
,t.hsdn_ymd
,t.exec_dt
,src05.convert_empty_to_null(t.hsdn_ymd)
,src05.convert_empty_to_null(t.exec_dt)
,t.v_tran_cd
,t.tran_kbn_name
,t.whs_org_cd
,src05.convert_empty_to_null(t.tran_kbn_name)
,src05.convert_empty_to_null(t.whs_org_cd)
,t.v_whsorg_cd
,t.whs_org_name
,t.whs_org_kn
,src05.convert_empty_to_null(t.whs_org_name)
,src05.convert_empty_to_null(t.whs_org_kn)
,t.v_whs_cd
,t.whs_name
,t.nonyu_fcl_cd
,t.v_inst_cd
,t.v_inst_name
,t.v_inst_kn
,t.v_inst_addr
,t.comm_cd
,t.product_name
,t.htdnymd_err_kbn
,t.prd_exis_kbn
,t.fcl_exis_kbn
,src05.convert_empty_to_null(t.whs_name)
,src05.convert_empty_to_null(t.nonyu_fcl_cd)
,nullif(t.v_inst_cd,'')
,nullif(t.v_inst_name,'')
,nullif(t.v_inst_kn,'')
,nullif(t.v_inst_addr,'')
,nullif(t.comm_cd,'')
,nullif(t.product_name,'')
,nullif(t.htdnymd_err_kbn,'')
,nullif(t.prd_exis_kbn,'')
,nullif(t.fcl_exis_kbn,'')
,t.qty1
,t.qty2
,t.qty3
,t.slip_org_kbn
,t.bef_slip_mgt_num
,t.whs_rep_comm_name
,t.whs_rep_nonyu_fcl_name
,t.whs_rep_nonyu_fcl_addr
,t.err_flg1
,t.err_flg2
,t.err_flg3
,t.err_flg4
,t.err_flg5
,t.err_flg6
,t.err_flg7
,t.err_flg8
,t.err_flg9
,t.err_flg10
,t.err_flg11
,t.err_flg12
,t.err_flg13
,t.err_flg14
,t.err_flg15
,t.err_flg16
,t.err_flg17
,t.err_flg18
,t.err_flg19
,t.err_flg20
,t.kjyo_ym
,t.tksnbk_kbn
,t.fcl_exec_kbn
,t.rec_sts_kbn
,src05.convert_empty_to_null(t.bef_slip_mgt_num)
,src05.convert_empty_to_null(t.whs_rep_comm_name)
,src05.convert_empty_to_null(t.whs_rep_nonyu_fcl_name)
,src05.convert_empty_to_null(t.whs_rep_nonyu_fcl_addr)
,src05.convert_empty_to_null(t.err_flg1)
,src05.convert_empty_to_null(t.err_flg2)
,src05.convert_empty_to_null(t.err_flg3)
,src05.convert_empty_to_null(t.err_flg4)
,src05.convert_empty_to_null(t.err_flg5)
,src05.convert_empty_to_null(t.err_flg6)
,src05.convert_empty_to_null(t.err_flg7)
,src05.convert_empty_to_null(t.err_flg8)
,src05.convert_empty_to_null(t.err_flg9)
,src05.convert_empty_to_null(t.err_flg10)
,src05.convert_empty_to_null(t.err_flg11)
,src05.convert_empty_to_null(t.err_flg12)
,src05.convert_empty_to_null(t.err_flg13)
,src05.convert_empty_to_null(t.err_flg14)
,src05.convert_empty_to_null(t.err_flg15)
,src05.convert_empty_to_null(t.err_flg16)
,src05.convert_empty_to_null(t.err_flg17)
,src05.convert_empty_to_null(t.err_flg18)
,src05.convert_empty_to_null(t.err_flg19)
,src05.convert_empty_to_null(t.err_flg20)
,src05.convert_empty_to_null(t.kjyo_ym)
,src05.convert_empty_to_null(t.tksnbk_kbn)
,src05.convert_empty_to_null(t.fcl_exec_kbn)
,src05.convert_empty_to_null(t.rec_sts_kbn)
,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する
,t.ins_usr
,src05.convert_empty_to_null(t.ins_usr)
,SYSDATE()
FROM org05.bio_sales AS t
ON DUPLICATE KEY UPDATE
rec_data=t.rec_data
,rec_whs_cd=t.rec_whs_cd
,rec_whs_sub_cd=t.rec_whs_sub_cd
,rec_whs_org_cd=t.rec_whs_org_cd
,rec_cust_cd=t.rec_cust_cd
,rec_comm_cd=t.rec_comm_cd
,rec_tran_kbn=t.rec_tran_kbn
,rev_hsdnymd_wrk=t.rev_hsdnymd_wrk
,rev_hsdnymd_srk=t.rev_hsdnymd_srk
,rec_urag_num=t.rec_urag_num
,rec_comm_name=t.rec_comm_name
,rec_nonyu_fcl_name=t.rec_nonyu_fcl_name
,rec_nonyu_fcl_addr=t.rec_nonyu_fcl_addr
,rec_lot_num1=t.rec_lot_num1
,rec_qty1=t.rec_qty1
,rec_lot_num2=t.rec_lot_num2
,rec_qty2=t.rec_qty2
,rec_lot_num3=t.rec_lot_num3
,rec_qty3=t.rec_qty3
,rec_ymd=t.rec_ymd
,sale_data_cat=t.sale_data_cat
,slip_file_name=t.slip_file_name
,slip_mgt_num=t.slip_mgt_num
,row_num=t.row_num
,hsdn_ymd=t.hsdn_ymd
,exec_dt=t.exec_dt
,v_tran_cd=t.v_tran_cd
,tran_kbn_name=t.tran_kbn_name
,whs_org_cd=t.whs_org_cd
,v_whsorg_cd=t.v_whsorg_cd
,whs_org_name=t.whs_org_name
,whs_org_kn=t.whs_org_kn
,v_whs_cd=t.v_whs_cd
,whs_name=t.whs_name
,nonyu_fcl_cd=t.nonyu_fcl_cd
,v_inst_cd=t.v_inst_cd
,v_inst_name=t.v_inst_name
,v_inst_kn=t.v_inst_kn
,v_inst_addr=t.v_inst_addr
,comm_cd=t.comm_cd
,product_name=t.product_name
,htdnymd_err_kbn=t.htdnymd_err_kbn
,prd_exis_kbn=t.prd_exis_kbn
,fcl_exis_kbn=t.fcl_exis_kbn
,qty1=t.qty1
,qty2=t.qty2
,qty3=t.qty3
,slip_org_kbn=t.slip_org_kbn
,bef_slip_mgt_num=t.bef_slip_mgt_num
,whs_rep_comm_name=t.whs_rep_comm_name
,whs_rep_nonyu_fcl_name=t.whs_rep_nonyu_fcl_name
,whs_rep_nonyu_fcl_addr=t.whs_rep_nonyu_fcl_addr
,err_flg1=t.err_flg1
,err_flg2=t.err_flg2
,err_flg3=t.err_flg3
,err_flg4=t.err_flg4
,err_flg5=t.err_flg5
,err_flg6=t.err_flg6
,err_flg7=t.err_flg7
,err_flg8=t.err_flg8
,err_flg9=t.err_flg9
,err_flg10=t.err_flg10
,err_flg11=t.err_flg11
,err_flg12=t.err_flg12
,err_flg13=t.err_flg13
,err_flg14=t.err_flg14
,err_flg15=t.err_flg15
,err_flg16=t.err_flg16
,err_flg17=t.err_flg17
,err_flg18=t.err_flg18
,err_flg19=t.err_flg19
,err_flg20=t.err_flg20
,kjyo_ym=t.kjyo_ym
,tksnbk_kbn=t.tksnbk_kbn
,fcl_exec_kbn=t.fcl_exec_kbn
,rec_sts_kbn=t.rec_sts_kbn
,ins_dt=nullif(t.ins_dt, 0)
,ins_usr=t.ins_usr
rec_data=VALUES(rec_data)
,rec_whs_cd=VALUES(rec_whs_cd)
,rec_whs_sub_cd=VALUES(rec_whs_sub_cd)
,rec_whs_org_cd=VALUES(rec_whs_org_cd)
,rec_cust_cd=VALUES(rec_cust_cd)
,rec_comm_cd=VALUES(rec_comm_cd)
,rec_tran_kbn=VALUES(rec_tran_kbn)
,rev_hsdnymd_wrk=VALUES(rev_hsdnymd_wrk)
,rev_hsdnymd_srk=VALUES(rev_hsdnymd_srk)
,rec_urag_num=VALUES(rec_urag_num)
,rec_comm_name=VALUES(rec_comm_name)
,rec_nonyu_fcl_name=VALUES(rec_nonyu_fcl_name)
,rec_nonyu_fcl_addr=VALUES(rec_nonyu_fcl_addr)
,rec_lot_num1=VALUES(rec_lot_num1)
,rec_qty1=VALUES(rec_qty1)
,rec_lot_num2=VALUES(rec_lot_num2)
,rec_qty2=VALUES(rec_qty2)
,rec_lot_num3=VALUES(rec_lot_num3)
,rec_qty3=VALUES(rec_qty3)
,rec_ymd=VALUES(rec_ymd)
,sale_data_cat=VALUES(sale_data_cat)
,slip_file_name=VALUES(slip_file_name)
,slip_mgt_num=VALUES(slip_mgt_num)
,row_num=VALUES(row_num)
,hsdn_ymd=VALUES(hsdn_ymd)
,exec_dt=VALUES(exec_dt)
,v_tran_cd=VALUES(v_tran_cd)
,tran_kbn_name=VALUES(tran_kbn_name)
,whs_org_cd=VALUES(whs_org_cd)
,v_whsorg_cd=VALUES(v_whsorg_cd)
,whs_org_name=VALUES(whs_org_name)
,whs_org_kn=VALUES(whs_org_kn)
,v_whs_cd=VALUES(v_whs_cd)
,whs_name=VALUES(whs_name)
,nonyu_fcl_cd=VALUES(nonyu_fcl_cd)
,v_inst_cd=VALUES(v_inst_cd)
,v_inst_name=VALUES(v_inst_name)
,v_inst_kn=VALUES(v_inst_kn)
,v_inst_addr=VALUES(v_inst_addr)
,comm_cd=VALUES(comm_cd)
,product_name=VALUES(product_name)
,htdnymd_err_kbn=VALUES(htdnymd_err_kbn)
,prd_exis_kbn=VALUES(prd_exis_kbn)
,fcl_exis_kbn=VALUES(fcl_exis_kbn)
,qty1=VALUES(qty1)
,qty2=VALUES(qty2)
,qty3=VALUES(qty3)
,slip_org_kbn=VALUES(slip_org_kbn)
,bef_slip_mgt_num=VALUES(bef_slip_mgt_num)
,whs_rep_comm_name=VALUES(whs_rep_comm_name)
,whs_rep_nonyu_fcl_name=VALUES(whs_rep_nonyu_fcl_name)
,whs_rep_nonyu_fcl_addr=VALUES(whs_rep_nonyu_fcl_addr)
,err_flg1=VALUES(err_flg1)
,err_flg2=VALUES(err_flg2)
,err_flg3=VALUES(err_flg3)
,err_flg4=VALUES(err_flg4)
,err_flg5=VALUES(err_flg5)
,err_flg6=VALUES(err_flg6)
,err_flg7=VALUES(err_flg7)
,err_flg8=VALUES(err_flg8)
,err_flg9=VALUES(err_flg9)
,err_flg10=VALUES(err_flg10)
,err_flg11=VALUES(err_flg11)
,err_flg12=VALUES(err_flg12)
,err_flg13=VALUES(err_flg13)
,err_flg14=VALUES(err_flg14)
,err_flg15=VALUES(err_flg15)
,err_flg16=VALUES(err_flg16)
,err_flg17=VALUES(err_flg17)
,err_flg18=VALUES(err_flg18)
,err_flg19=VALUES(err_flg19)
,err_flg20=VALUES(err_flg20)
,kjyo_ym=VALUES(kjyo_ym)
,tksnbk_kbn=VALUES(tksnbk_kbn)
,fcl_exec_kbn=VALUES(fcl_exec_kbn)
,rec_sts_kbn=VALUES(rec_sts_kbn)
,ins_dt=VALUES(ins_dt)
,ins_usr=VALUES(ins_usr)
,dwh_upd_dt=SYSDATE()
;
""")

View File

@ -996,7 +996,7 @@ class TestImportFileToDb:
self.batch_context.is_vjsk_stock_import_day = True
self.db.execute(f"truncate table {table_name_src}")
# assertion1 (insert 4row)
# assertion1 (insert 6row)
# 処理実行
target_dict = {
@ -1012,7 +1012,7 @@ class TestImportFileToDb:
# 突合から除外する項目
ignore_columns = ['dwh_upd_dt']
# orgテーブル結果が期待値通りかを突合
assert_table_results(result_org, assert_list, ignore_columns)
assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True)
# srcテーブル結果を取得
result_src = self.db.execute_select(f"select * from {table_name_src}")
# 突合から除外する項目
@ -1036,18 +1036,18 @@ class TestImportFileToDb:
# 突合から除外する項目
ignore_columns = ['dwh_upd_dt']
# orgテーブル結果が期待値通りかを突合
assert_table_results(result_org, assert_list, ignore_columns)
assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True)
# srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得
result_src = self.db.execute_select(
f"select * from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)")
f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)")
# 突合から除外する項目
ignore_columns = ['dwh_upd_dt']
# srcテーブル結果が期待値通りかを突合
assert_table_results(result_src, assert_list, ignore_columns)
# srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row)
# srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row)
result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ")
assert result_src_count[0]['count(*)'] == 6
assert result_src_count[0]['count(*)'] == 8
# teardown

View File

@ -62,13 +62,14 @@ def is_valid_date_format(date_str: str, date_format):
return False
def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_names: list = None, force_cast_to_str_columns: list = []) -> None:
def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_names: list = None, force_cast_to_str_columns: list = [], is_loaddata=False) -> None:
"""テーブル同士の取得結果突き合わせ
Args:
actual_rows (list[dict]): テスト結果の辞書リスト
expect_rows (list[dict]): 期待値の辞書リスト
ignore_col_name (list): 比較を無視するDBのカラム名. Default None.
is_loaddata (bool): LOAD DATAで読み込むテーブルかどうかのフラグorg05の比較をするときにONにする. Default False.
"""
# 取得件数が一致すること
assert len(actual_rows) == len(expect_rows), f'レコード件数が一致しません。DBレコード数 : {len(actual_rows)} 期待値 : {len(expect_rows)}'
@ -113,8 +114,9 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor
elif actual_value == "0000-00-00 00:00:00" and expect_value == "":
# DB項目(datetime)がゼロ日付(NULL代替値)の場合、期待値が""であれば"0000-00-00 00:00:00"に置換する
expect_value = "0000-00-00 00:00:00"
elif actual_value == "" and expect_value == "":
elif actual_value == "" and expect_value == "" and not is_loaddata:
# DB項目値が空文字のかつ期待値が""のパターンは想定外のパターンであるため、期待値をNoneに置換して失敗させる
# LOAD文では空文字で登録されるので除外する
expect_value = None
# 検証

View File

@ -0,0 +1,14 @@
-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する
-- 空文字→NULL変換
CREATE FUNCTION src05.convert_empty_to_null(column_value VARCHAR(500))
RETURNS VARCHAR(500) DETERMINISTIC
BEGIN
RETURN (
CASE
WHEN column_value IS NULL THEN NULL
WHEN LENGTH(column_value) = 0 THEN NULL
ELSE column_value
END
);
END
;