FUNCTION zwm_get_qtbarcode.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_PRINT) TYPE CHAR1 OPTIONAL
*" VALUE(I_RET) TYPE CHAR1 OPTIONAL
*" VALUE(I_COMMIT) TYPE CHAR1 OPTIONAL
*" VALUE(I_LGORT) TYPE LGORT_D OPTIONAL
*" VALUE(I_NLPLA) TYPE LTAP_NLPLA OPTIONAL
*" EXPORTING
*" REFERENCE(E_TYPE) TYPE BAPI_MTYPE
*" REFERENCE(E_MSG) TYPE BAPI_MSG
*" REFERENCE(E_ZSWM050) TYPE ZSWM050
*" TABLES
*" T_ZTWM0326 STRUCTURE ZTWM0326 OPTIONAL
*" T_ZTWM0333 STRUCTURE ZTWM0333 OPTIONAL
*" T_ZTWM0276 STRUCTURE ZTWM0276 OPTIONAL
*" T_ZTWM0277 STRUCTURE ZTWM0277 OPTIONAL
*" T_ZTWM0030 STRUCTURE ZTWM0030 OPTIONAL
*"----------------------------------------------------------------------
*&----------------------------------------------------------------------*
*& 抬头 : 前台使用:供应商设备推送箱包关系接口函数 *
*& 模块 : WM *
*& 作者 : JHwjc *
*& 业务顾问 : 张海 *
*& 创建日期 : 2021-02-27 * *
*& 描述 : 从原函数(ZWM_GET_BARCODE) 复制后,区分前台后台使用逻辑分离 *
*& 修改记录 : *
*& 日期 修改人 请求号 业务顾问 修改内容 *
*& 2021-02-27 JHwjc EC3K912428 张海 新建 *
*& 2021-03-24 HANDZX EC3K913006 茹书亭 海外工厂翻包逻辑调整
*& 2021-04-13 HANDZX EC3K913333 茹书亭 自动生成批次长度问题处理
*& 2021-04-22 HANDZX EC3K913006 施冬梅 国内翻包拉线字段逻辑调整 *
*& 2021-05-14 HANDZX EC3K913683 茹舒亭 客退翻包处理 *
*& 2021-05-27 HANDZX EC3K914085 茹舒亭 德国BMW和沈阳BMW翻包数量不一致,所以翻包环节需要数量校验 (ZTWM0346该表增加两个字段 工厂、库存地点)
*& 2021-06-08 JHwjc EC3K914218 JHply 新增更新ztwm0275的zqm状态
*& 2021-07-16 HANDZX EC3K915145 刘腾 海外翻包异常多个BIN位问题调整
*& 2021-07-24 JHwjc EC3K915243 张海 优化翻包过程中WM层数据的处理逻辑 -开发
*&----------------------------------------------------------------------*
"清空全局变量
CLEAR: gt_ztwm0030, gw_ztwm0030, gt_ztwm0275, gw_ztwm0275, gt_ztwm0004, gw_ztwm0004,
gt_ztwm0326_db, gt_ztwm0333, gw_ztwm0333, gt_ztwm0368, gw_ztwm0368, gt_ztwm0276,
gw_ztwm0276, gt_ztwm0277, gw_ztwm0277.
CLEAR: gv_varkey_charg, gv_varkey_setno, gv_varkey_lotno, gv_nlpla, gv_lgort, gv_weekno .
TYPES: BEGIN OF ty_zmacls,
matnr TYPE mara-matnr,
zmacls TYPE zmdmatkl-zmacls,
END OF ty_zmacls.
DATA: gt_list TYPE TABLE OF zdt_get_barcode_req_list,
gw_list TYPE zdt_get_barcode_req_list.
DATA: lw_ztwm0030 TYPE ztwm0030.
DATA: gt_zmacls TYPE TABLE OF ty_zmacls,
gw_zmacls TYPE ty_zmacls.
DATA: gv_logsys TYPE logsys.
DATA: lv_first TYPE c,
lv_setno TYPE ztwm0326-lot_no_n.
TYPES: BEGIN OF ty_ztwm0030,
store_name TYPE ztwm0030-store_name,
END OF ty_ztwm0030.
DATA: lt_ztwm0030 TYPE TABLE OF ty_ztwm0030.
DATA: lv_lines TYPE i.
****BEGIN OF ADD EC3K914085****
DATA: lv_werks TYPE ztwm0346-werks.
****END OF ADD EC3K914085****
DATA gt1_ztwm0326 TYPE TABLE OF ztwm0326.
DATA gt2_ztwm0326 TYPE TABLE OF ztwm0326.
"获取数据
IF t_ztwm0326[] IS INITIAL .
e_type = '2'.
e_msg = text-002.
RETURN.
ENDIF.
gv_lgort = i_lgort.
gv_nlpla = i_nlpla.
****BEGIN OF ADD EC3K913683****
*---add
SELECT lot_no
zbarcode
matnr
zreceipt
erdat
erzet
INTO TABLE gt_ztwm0275
FROM ztwm0275
FOR ALL ENTRIES IN t_ztwm0326
WHERE zbarcode = t_ztwm0326-zbarcode.
SORT gt_ztwm0275 BY zbarcode ASCENDING erdat DESCENDING erzet DESCENDING.
DELETE ADJACENT DUPLICATES FROM gt_ztwm0275 COMPARING zbarcode.
SORT gt_ztwm0275 BY zbarcode.
*---del
*SELECT lot_no
* zbarcode
* matnr
* zreceipt
* INTO CORRESPONDING FIELDS OF TABLE gt_ztwm0275
* FROM ztwm0275
* FOR ALL ENTRIES IN t_ztwm0326
* WHERE zbarcode = t_ztwm0326-zbarcode.
*
* SORT gt_ztwm0275 BY zbarcode.
****END OF ADD EC3K913683****
CLEAR: gt1_ztwm0326.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt1_ztwm0326
FROM ztwm0326
FOR ALL ENTRIES IN t_ztwm0326
WHERE lot_no_n = t_ztwm0326-lot_no_n .
IF gt1_ztwm0326[] IS NOT INITIAL.
READ TABLE gt1_ztwm0326 INTO DATA(ls1_ztwm0326) INDEX 1.
IF sy-subrc EQ 0 .
e_type = 'E'.
e_msg = text-014 && ls1_ztwm0326-lot_no_n && text-015.
ENDIF.
ENDIF.
" 存在错误直接返回
CHECK e_type IS INITIAL .
*****barcode重复校验
CLEAR: gt2_ztwm0326.
****BEGIN OF ADD EC3K913683****
*---DEL
* SELECT * INTO CORRESPONDING FIELDS OF TABLE gt2_ztwm0326
* FROM ztwm0326
* FOR ALL ENTRIES IN t_ztwm0326
* WHERE zbarcode = t_ztwm0326-zbarcode .
*---ADD 当客退BARCODE重新翻包时,ztwm0326会存在多条需关联最新LOTID
IF gt_ztwm0275 IS NOT INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt2_ztwm0326
FROM ztwm0326
FOR ALL ENTRIES IN gt_ztwm0275
WHERE zbarcode = gt_ztwm0275-zbarcode
AND lot_no = gt_ztwm0275-lot_no.
ENDIF.
****END OF ADD EC3K913683****
IF gt2_ztwm0326[] IS NOT INITIAL.
READ TABLE gt2_ztwm0326 INTO DATA(ls2_ztwm0326) INDEX 1.
IF sy-subrc EQ '0'.
e_type = 'E'.
e_msg = text-012 && ls2_ztwm0326-zbarcode && text-015.
ENDIF.
ENDIF.
" 存在错误直接返回
CHECK e_type IS INITIAL .
DATA: ls_ztwm0326 TYPE ztwm0326.
LOOP AT t_ztwm0326 INTO ls_ztwm0326.
READ TABLE gt_ztwm0275 TRANSPORTING NO FIELDS
WITH KEY zbarcode = ls_ztwm0326-zbarcode.
IF sy-subrc <> 0.
e_type = 'E'.
e_msg = text-012 && ls_ztwm0326-zbarcode && text-013.
ENDIF.
ENDLOOP.
" 存在错误直接返回
CHECK e_type IS INITIAL .
SELECT lot_no_n
zbarcode
INTO CORRESPONDING FIELDS OF TABLE gt_ztwm0326_db
FROM ztwm0326
FOR ALL ENTRIES IN t_ztwm0326
WHERE zbarcode = t_ztwm0326-zbarcode
AND lot_no_n = t_ztwm0326-lot_no_n.
SORT gt_ztwm0326_db BY zbarcode lot_no_n.
IF gt_ztwm0275[] IS NOT INITIAL.
SELECT lot_no
werks
zwerks
INTO CORRESPONDING FIELDS OF TABLE gt_ztwm0030
FROM ztwm0030
FOR ALL ENTRIES IN gt_ztwm0275
WHERE lot_no = gt_ztwm0275-lot_no.
****BEGIN OF ADD EC3K914085****
IF sy-subrc = 0.
"获取当前翻包工厂
READ TABLE gt_ztwm0030 INTO DATA(ls_0030) INDEX 1.
IF sy-subrc = 0.
lv_werks = ls_0030-werks.
IF ls_0030-zwerks IS NOT INITIAL.
lv_werks = ls_0030-zwerks.
ENDIF.
ENDIF.
ENDIF.
****END OF MOD EC3K914085****
SORT gt_ztwm0030 BY lot_no.
IF sy-cprog = 'ZWMP357'. "主调程序
SELECT store_name FROM ztwm0030 INTO TABLE lt_ztwm0030
FOR ALL ENTRIES IN gt_ztwm0275
WHERE lot_no = gt_ztwm0275-lot_no.
DESCRIBE TABLE lt_ztwm0030 LINES lv_lines.
IF lv_lines > 1.
e_type = 'E'.
e_msg = text-008.
RETURN.
ENDIF.
ENDIF.
"物料数量校验
TYPES: BEGIN OF ty_ztwm0326_cl,
lot_no TYPE ztwm0326-lot_no,
times TYPE i,
END OF ty_ztwm0326_cl.
DATA: lt_ztwm0346 TYPE TABLE OF ztwm0346,
ls_ztwm0346 TYPE ztwm0346,
ls_ztwm0275 TYPE ztwm0275.
DATA: lv_mod TYPE i,
lv_times TYPE i.
SELECT * FROM ztwm0346 INTO TABLE lt_ztwm0346
FOR ALL ENTRIES IN gt_ztwm0275
WHERE matnr = gt_ztwm0275-matnr
****BEGIN OF ADD EC3K914085****
AND werks = lv_werks
AND lgort = i_lgort.
****END OF ADD EC3K914085****
SORT lt_ztwm0346 BY matnr.
lv_times = lines( gt_ztwm0275[] ).
CLEAR gw_ztwm0275.
READ TABLE gt_ztwm0275 INTO gw_ztwm0275 INDEX 1.
CLEAR ls_ztwm0346.
IF i_ret = abap_false.
READ TABLE lt_ztwm0346 INTO ls_ztwm0346 WITH KEY matnr = gw_ztwm0275-matnr
BINARY SEARCH.
IF sy-subrc = 0 AND ls_ztwm0346-menge <> 0.
IF lv_times <> ls_ztwm0346-menge.
e_type = 'E'.
e_msg = text-009 && gw_ztwm0275-matnr && text-010 && ls_ztwm0346-menge.
ENDIF.
****BEGIN OF ADD EC3K914085****
ELSE.
e_type = 'E'.
e_msg = text-019.
****END OF ADD EC3K914085****
ENDIF.
ENDIF.
IF e_type = 'E'.
RETURN.
ENDIF.
" 存在错误直接返回
CHECK e_type IS INITIAL .
SELECT mara~matnr
zmdmatkl~zmacls
INTO TABLE gt_zmacls
FROM mara JOIN zmdmatkl
ON mara~matkl = zmdmatkl~matkl
FOR ALL ENTRIES IN gt_ztwm0275
WHERE mara~matnr = gt_ztwm0275-matnr.
SORT gt_zmacls BY matnr.
ENDIF.
"填充数据
LOOP AT t_ztwm0326 INTO DATA(gw_ztwm0326).
MOVE-CORRESPONDING gw_ztwm0326 TO gw_ztwm0333.
gw_ztwm0333-erdat = sy-datum.
gw_ztwm0333-erzet = sy-uzeit.
APPEND gw_ztwm0333 TO gt_ztwm0333.
****BEGIN OF ADD EC3K913006****
MOVE-CORRESPONDING gw_ztwm0326 TO gw_ztwm0368.
gw_ztwm0368-erdat = sy-datum.
gw_ztwm0368-erzet = sy-uzeit.
APPEND gw_ztwm0368 TO gt_ztwm0368.
****END OF ADD EC3K913006****
IF i_print IS INITIAL.
* IF e_type EQ '1'.
* DELETE t_ztwm0326[].
* CONTINUE.
* ENDIF.
READ TABLE gt_ztwm0326_db TRANSPORTING NO FIELDS WITH KEY zbarcode = gw_ztwm0326-zbarcode lot_no_n = gw_ztwm0326-lot_no_n BINARY SEARCH.
IF sy-subrc = 0.
e_type = 'E'.
e_msg = e_msg && gw_ztwm0326-zbarcode && text-003.
DELETE t_ztwm0326[].
* CONTINUE.
RETURN .
ENDIF.
ENDIF.
READ TABLE gt_ztwm0275 INTO gw_ztwm0275 WITH KEY zbarcode = gw_ztwm0326-zbarcode BINARY SEARCH.
IF sy-subrc = 0.
gw_ztwm0326-lot_no = gw_ztwm0275-lot_no.
READ TABLE gt_ztwm0030 INTO gw_ztwm0030 WITH KEY lot_no = gw_ztwm0275-lot_no BINARY SEARCH.
IF sy-subrc = 0.
gw_ztwm0326-werks = gw_ztwm0030-werks.
****BEGIN OF MOD EC3K913006****
"海外工厂逻辑
IF gw_ztwm0030-zwerks IS NOT INITIAL.
gw_ztwm0326-werks = gw_ztwm0030-zwerks.
ENDIF.
****END OF MOD EC3K913006****
ENDIF.
READ TABLE gt_zmacls INTO gw_zmacls WITH KEY matnr = gw_ztwm0275-matnr BINARY SEARCH.
IF sy-subrc = 0.
gw_ztwm0326-zmacls = gw_zmacls-zmacls.
ENDIF.
IF i_print = abap_true.
IF lv_first = abap_false.
IF gw_ztwm0326-zmacls = '01'.
"生成新LOT
PERFORM frm_get_lotno USING i_ret
CHANGING lv_setno.
ELSEIF gw_ztwm0326-zmacls = '02'.
"生成新SETNO
PERFORM frm_get_setno USING i_ret
CHANGING lv_setno.
ENDIF.
lv_first = abap_true.
ENDIF.
gw_ztwm0326-lot_no_n = lv_setno.
ENDIF.
CLEAR: gv_logsys.
CALL FUNCTION 'ZWM_GET_LOTID_WERKS'
EXPORTING
lot_no = gw_ztwm0326-lot_no
IMPORTING
logsys = gv_logsys.
gw_ztwm0326-zsourcebox = gv_logsys.
ENDIF.
MODIFY t_ztwm0326 FROM gw_ztwm0326.
ENDLOOP.
DATA(lt_ztwm0326_01) = t_ztwm0326[].
DATA(lt_ztwm0326_02) = t_ztwm0326[].
"过滤掉不需要更新贴纸表的数据
DELETE lt_ztwm0326_01 WHERE zmacls <> '01'.
DELETE lt_ztwm0326_02 WHERE zmacls <> '02'.
DATA:e_mblnr TYPE mkpf-mblnr,
e_mjahr TYPE mkpf-mjahr.
CLEAR: gt_ztwm0276[],gt_ztwm0277[],e_mblnr,e_mjahr.
IF lt_ztwm0326_01[] IS NOT INITIAL.
PERFORM frm_process_01 TABLES lt_ztwm0326_01[]
t_ztwm0326[]
t_ztwm0030[]
USING i_print
i_ret
i_commit
i_lgort
CHANGING e_type
e_msg
e_mblnr
e_mjahr.
ENDIF.
IF lt_ztwm0326_02[] IS NOT INITIAL.
PERFORM frm_process_02 TABLES lt_ztwm0326_02[]
t_ztwm0326[]
t_ztwm0030[]
USING i_print
i_ret
i_commit
i_lgort
CHANGING e_type
e_msg
e_mblnr
e_mjahr.
..
ENDIF.
* LOOP AT gt_ztwm0333 INTO gw_ztwm0333.
* gw_ztwm0333-type = e_type.
* gw_ztwm0333-msg = e_msg.
* MODIFY gt_ztwm0333 FROM gw_ztwm0333.
* ENDLOOP.
*
* IF e_type = 'E' AND i_print = abap_false.
* CLEAR: e_type ,e_msg..
* ENDIF.
CHECK e_type IS INITIAL .
"更新数据库表
IF e_type IS INITIAL.
e_type = '0'.
e_msg = text-001.
ENDIF.
IF i_commit = abap_true AND e_type <> 'E'.
*** BEGIN OF ADD EC3K914218 ***
IF gt_ztwm0277[] IS NOT INITIAL .
REFRESH : gt_ztwm0275_mod .
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_ztwm0275_mod
FROM ztwm0275
FOR ALL ENTRIES IN gt_ztwm0277
WHERE zbarcode = gt_ztwm0277-zbarcode .
SORT gt_ztwm0277 BY zbarcode .
LOOP AT gt_ztwm0275_mod ASSIGNING FIELD-SYMBOL(<ls_ztwm0275_mod>).
READ TABLE gt_ztwm0277 ASSIGNING FIELD-SYMBOL(<ls_ztwm0277>)
WITH KEY zbarcode = <ls_ztwm0275_mod>-zbarcode BINARY SEARCH .
IF sy-subrc EQ 0.
IF <ls_ztwm0277>-zmarkcks EQ 'OK' AND <ls_ztwm0277>-zocvcks EQ 'OK'
AND <ls_ztwm0277>-zwgcks EQ 'OK' AND <ls_ztwm0277>-zairtcks EQ 'OK'.
<ls_ztwm0275_mod>-zqm = 'OK'.
ELSE.
<ls_ztwm0275_mod>-zqm = 'NG'.
ENDIF.
ENDIF.
ENDLOOP.
IF gt_ztwm0275_mod[] IS NOT INITIAL .
MODIFY ztwm0275 FROM TABLE gt_ztwm0275_mod .
ENDIF.
ENDIF.
*** END OF ADD EC3K914218 ***
MODIFY ztwm0326 FROM TABLE t_ztwm0326.
MODIFY ztwm0333 FROM TABLE gt_ztwm0333.
MODIFY ztwm0276 FROM TABLE gt_ztwm0276.
MODIFY ztwm0277 FROM TABLE gt_ztwm0277.
COMMIT WORK AND WAIT.
*** BEGIN OF ADD EC3K915243 *** F
DATA : lt_mseg_311 TYPE TABLE OF mseg ,
lw_mseg_311 TYPE mseg ,
lw_lqua_311 TYPE lqua ,
lt_lubqu_311 TYPE TABLE OF lubqu,
lw_lubqu_311 TYPE lubqu,
lv_tanum_311 TYPE ltak-tanum .
CLEAR : lw_mseg_311 , lw_lqua_311 , lw_lubqu_311 , lv_tanum_311 .
REFRESH : lt_mseg_311 , lt_lubqu_311 .
WAIT UP TO 1 SECONDS .
SELECT SINGLE mblnr mjahr lgnum matnr charg werks menge ubnum
INTO CORRESPONDING FIELDS OF lw_mseg_311
FROM mseg
WHERE mblnr = e_mblnr
AND mjahr = e_mjahr
AND xauto = ''.
SELECT COUNT(*)
FROM ltak
WHERE lgnum = lw_mseg_311-lgnum
AND mblnr = lw_mseg_311-mblnr
AND mjahr = lw_mseg_311-mjahr .
IF sy-subrc NE 0.
" 当TO并未产生时 ,获取数据生成TO
CLEAR lw_lqua_311 .
SELECT SINGLE lqnum lgnum matnr charg werks lgpla
INTO CORRESPONDING FIELDS OF lw_lqua_311
FROM lqua
WHERE lgnum = lw_mseg_311-lgnum
AND matnr = lw_mseg_311-matnr
AND charg = lw_mseg_311-charg
AND werks = lw_mseg_311-werks
AND lgtyp = '601'
AND bestq = ''
AND verme GE lw_mseg_311-menge .
IF lw_lqua_311 IS NOT INITIAL .
CLEAR: lw_lubqu_311.
REFRESH : lt_lubqu_311.
lw_lubqu_311-lqnum = lw_lqua_311-lqnum.
lw_lubqu_311-menge = lw_mseg_311-menge.
lw_lubqu_311-nltyp = '601'.
lw_lubqu_311-nlpla = lw_lqua_311-lgpla.
APPEND lw_lubqu_311 TO lt_lubqu_311.
CALL FUNCTION 'L_TO_CREATE_POSTING_CHANGE'
EXPORTING
i_lgnum = lw_mseg_311-lgnum
i_ubnum = lw_mseg_311-ubnum
i_commit_work = 'X'
i_bname = sy-uname
IMPORTING
e_tanum = lv_tanum_311
TABLES
t_lubqu = lt_lubqu_311
EXCEPTIONS
foreign_lock = 1
tp_completed = 2
xfeld_wrong = 3
ldest_wrong = 4
drukz_wrong = 5
tp_wrong = 6
squit_forbidden = 7
no_to_created = 8
update_without_commit = 9
no_authority = 10
i_ubnum_or_i_lubu = 11
bwlvs_wrong = 12
material_not_found = 13
manual_to_forbidden = 14
bestq_wrong = 15
sobkz_missing = 16
sobkz_wrong = 17
meins_wrong = 18
conversion_not_found = 19
no_quants = 20
t_lubqu_required = 21
le_bulk_quant_not_selectable = 22
quant_not_selectable = 23
quantnumber_initial = 24
kzuap_or_bin_location = 25
date_wrong = 26
nltyp_missing = 27
nlpla_missing = 28
lgber_wrong = 29
lenum_wrong = 30
menge_wrong = 31
menge_to_big = 32
open_tr_kzuap = 33
lock_exists = 34
double_quant = 35
quantity_wrong = 36
OTHERS = 37.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT gt_ztwm0368 ASSIGNING FIELD-SYMBOL(<ls_ztwm0368>).
<ls_ztwm0368>-ztoflag = 'X' .
<ls_ztwm0368>-ztoinfo = sy-subrc .
ENDLOOP.
IF gt_ztwm0368[] IS NOT INITIAL.
MODIFY ztwm0368 FROM TABLE gt_ztwm0368.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
*** END OF ADD EC3K915243 ***
ENDIF.
PERFORM frm_unlock.
t_ztwm0333[] = gt_ztwm0333[].
t_ztwm0276[] = gt_ztwm0276[].
t_ztwm0277[] = gt_ztwm0277[].
IF e_mblnr IS NOT INITIAL.
PERFORM frm_l_createto USING i_nlpla e_mblnr e_mjahr i_print CHANGING e_type e_msg.
ENDIF.
ENDFUNCTION.