diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 4ffaa652..dbd94d28 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -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() ; """) diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index a4f6383e..a2088ae5 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -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 diff --git a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py index 06173c2e..52969c49 100644 --- a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py @@ -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 # 検証 diff --git a/rds_mysql/stored_procedure/src05/convert_empty_to_null.sql b/rds_mysql/stored_procedure/src05/convert_empty_to_null.sql new file mode 100644 index 00000000..339bbe44 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/convert_empty_to_null.sql @@ -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 +;