FUNCTION /sc1/ftd_mm_migo.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" ET_RETURN STRUCTURE /SC1/FTD_MM_BAPIRET
*" IT_INPUT STRUCTURE /SC1/S_WIS_INPUT
*"----------------------------------------------------------------------
DATA: lt_po TYPE STANDARD TABLE OF /sc1/s_wis_input,
lt_inbound_do TYPE STANDARD TABLE OF /sc1/s_wis_input,
lt_outbound_do TYPE STANDARD TABLE OF /sc1/s_wis_input,
lt_tl TYPE STANDARD TABLE OF /sc1/s_wis_input,"铁笼物料做无采购订单收货
lt_ekpo TYPE STANDARD TABLE OF ty_ekpo,
lt_return TYPE STANDARD TABLE OF /sc1/ftd_mm_bapiret,
lt_/sc1/mm_migo_log TYPE STANDARD TABLE OF /sc1/mm_migo_log.
"拆分数据&过滤掉已经收货成功的数据
PERFORM split_data TABLES it_input "传入参数
lt_po "采购订单
lt_inbound_do "内向交货
lt_outbound_do "外向交货
lt_tl "铁笼物料
lt_ekpo.
"采购订单收货
PERFORM action_po TABLES lt_po lt_ekpo lt_return lt_/sc1/mm_migo_log.
"内向交货单收货
PERFORM action_inbound_do TABLES lt_inbound_do lt_return lt_/sc1/mm_migo_log.
"外向交货单收货
PERFORM action_outbound_do TABLES lt_outbound_do lt_return lt_/sc1/mm_migo_log.
"铁笼物料收货
PERFORM action_tl TABLES lt_tl lt_return lt_/sc1/mm_migo_log.
"保存日志
PERFORM save_log TABLES lt_return lt_/sc1/mm_migo_log.
"编辑消息
PERFORM edit_msg TABLES lt_return et_return .
ENDFUNCTION.
*----------------------------------------------------------------------*
***INCLUDE /SC1/LFTD_MM_WISF03.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form GET_DATA_MIO1_NEW
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_ITEM[] text
* -->P_LS_HEAD text
* <--P_LT_RETURN1 text
* <--P_LV_EBELN text
* <--P_LV_VBELN text
*----------------------------------------------------------------------*
FORM action_po TABLES pt_po STRUCTURE /sc1/s_wis_input
pt_ekpo TYPE ty_t_ekpo
et_return STRUCTURE /sc1/ftd_mm_bapiret
et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log.
DATA: lt_po_sh TYPE STANDARD TABLE OF ty_po_sh.
DATA: ls_po_sh TYPE ty_po_sh.
DATA: lt_ekbe TYPE STANDARD TABLE OF ekbe,
lt_ekbe_sum TYPE STANDARD TABLE OF ekbe,
ls_ekbe_sum TYPE ekbe,
ls_po TYPE /sc1/s_wis_input,
lv_menge_temp TYPE ekpo-menge,
lv_end_flg TYPE char1,
lt_ekpo_temp TYPE ty_t_ekpo.
DATA:ls_return TYPE /sc1/ftd_mm_bapiret .
FIELD-SYMBOLS:<ls_ekpo> TYPE ty_ekpo,
<ls_po> TYPE /sc1/s_wis_input.
CHECK pt_po[] IS NOT INITIAL.
READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .
CHECK sy-subrc <> 0.
"(2)根据上一步获得的信息,获取每个项目当前待入库的剩余量;
"(2)-1:获取采购订单历史数据
IF pt_ekpo[] IS NOT INITIAL.
SELECT ebeln
ebelp
menge
shkzg
FROM ekbe
INTO CORRESPONDING FIELDS OF TABLE lt_ekbe
FOR ALL ENTRIES IN pt_ekpo[]
WHERE ebeln = pt_ekpo-ebeln
AND ebelp = pt_ekpo-ebelp.
ENDIF.
"(2)-2:计算已收货总数量
LOOP AT lt_ekbe ASSIGNING FIELD-SYMBOL(<ls_ekbe>).
IF <ls_ekbe>-shkzg = 'H'.
<ls_ekbe>-menge = <ls_ekbe>-menge * -1.
ENDIF.
CLEAR <ls_ekbe>-shkzg.
COLLECT <ls_ekbe> INTO lt_ekbe_sum.
ENDLOOP.
"(2)-3:计算每个行项目的剩余库存
LOOP AT pt_ekpo ASSIGNING <ls_ekpo>.
READ TABLE lt_ekbe_sum INTO ls_ekbe_sum
WITH KEY ebeln = <ls_ekpo>-ebeln
ebelp = <ls_ekpo>-ebelp .
IF sy-subrc = 0."采购订单部分收货
<ls_ekpo>-menge_re = <ls_ekpo>-menge - ls_ekbe_sum-menge.
ELSE."采购订单没有进行过收货
<ls_ekpo>-menge_re = <ls_ekpo>-menge.
ENDIF.
ENDLOOP.
"(3)(4)入库数量分配
SORT pt_po BY matnr.
LOOP AT pt_po ASSIGNING <ls_po>.
MOVE-CORRESPONDING <ls_po> TO ls_po_sh.
"先本单全收货
LOOP AT pt_ekpo ASSIGNING <ls_ekpo> WHERE matnr = <ls_po>-matnr AND ebeln = <ls_po>-vbeln.
"(本次收货数量 - 采购单剩余数量) 大于0说明采购订单剩余量不够收货用,采购订单剩余收货数量一定为0
IF ( <ls_po>-lfimg - <ls_ekpo>-menge_re ) >= 0.
<ls_ekpo>-menge_sh = <ls_ekpo>-menge_sh + <ls_ekpo>-menge_re.
"SKU入库数量
<ls_po>-lfimg = <ls_po>-lfimg - <ls_ekpo>-menge_re.
ls_po_sh-lfimg = <ls_ekpo>-menge_re."采购订单本次收货数量=采购订单剩余数量 1
<ls_ekpo>-menge_re = 0. "采购订单剩余收货数量一定为0 2,1和2的赋值顺序不能变
ls_po_sh-ebeln = <ls_ekpo>-ebeln.
ls_po_sh-ebelp = <ls_ekpo>-ebelp.
COLLECT ls_po_sh INTO lt_po_sh.
ELSE."采购订单剩余量>本次收货量
<ls_ekpo>-menge_sh = <ls_ekpo>-menge_sh + <ls_po>-lfimg .
<ls_ekpo>-menge_re = <ls_ekpo>-menge_re - <ls_po>-lfimg.
ls_po_sh-lfimg = <ls_po>-lfimg. "收货数量
ls_po_sh-ebeln = <ls_ekpo>-ebeln.
ls_po_sh-ebelp = <ls_ekpo>-ebelp.
COLLECT ls_po_sh INTO lt_po_sh.
<ls_po>-lfimg = 0. "待收货数量为0,结束
EXIT.
ENDIF.
ENDLOOP.
"如果本单全收货后还有剩余,则在剩下的po中同物料进行收货
IF <ls_po>-lfimg > 0."
LOOP AT pt_ekpo ASSIGNING <ls_ekpo> WHERE matnr = <ls_po>-matnr .
IF <ls_ekpo>-ebeln <> <ls_po>-vbeln.
IF ( <ls_po>-lfimg - <ls_ekpo>-menge_re ) >= 0.
ls_po_sh-lfimg = <ls_ekpo>-menge_re."收货数量
ELSE.
ls_po_sh-lfimg = <ls_po>-lfimg."收货数量
ENDIF.
ls_po_sh-ebeln = <ls_ekpo>-ebeln.
ls_po_sh-ebelp = <ls_ekpo>-ebelp.
COLLECT ls_po_sh INTO lt_po_sh.
"SKU入库数量
<ls_po>-lfimg = <ls_po>-lfimg - <ls_ekpo>-menge_re.
"SKU剩余入库数量
<ls_ekpo>-menge_re = <ls_ekpo>-menge_re - <ls_po>-lfimg.
IF <ls_po>-lfimg <= 0."SKU入库数量已分配完成,结束分配
EXIT.
ELSEIF <ls_po>-lfimg > 0."SKU入库数量未分配完,需要继续分配
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.
SORT pt_ekpo BY matnr.
LOOP AT pt_po INTO ls_po.
IF ls_po-lfimg > 0."没有
ls_return-uuid = ls_po-uuid.
ls_return-type = 'E'.
ls_return-message = '库存数量不足'.
APPEND ls_return TO et_return.
DELETE lt_po_sh WHERE matnr = ls_po-matnr.
ENDIF.
ENDLOOP.
"收货
SORT lt_po_sh BY ebeln ebelp.
PERFORM goodsmvt_create_new TABLES et_return USING lt_po_sh.
PERFORM edit_log TABLES pt_po
et_return
et_/sc1/mm_migo_log.
ENDFORM. " GET_DATA_MIO1_NEW
*&---------------------------------------------------------------------*
*& Form GOODSMVT_CREATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM goodsmvt_create TABLES et_return STRUCTURE /sc1/ftd_mm_bapiret
USING pt_ekpo TYPE ty_t_ekpo
ps_po TYPE /sc1/s_wis_input.
"BAPI_GOODSMVT_CREATE 用内表 begin
DATA lv_mblnr TYPE mseg-mblnr.
DATA ls_goodsmvt_header TYPE bapi2017_gm_head_01.
DATA ls_code LIKE bapi2017_gm_code.
DATA ls_goodsmvt_item TYPE bapi2017_gm_item_create.
DATA lt_goodsmvt_item TYPE STANDARD TABLE OF bapi2017_gm_item_create.
DATA lt_return TYPE STANDARD TABLE OF bapiret2.
DATA ls_return TYPE bapiret2.
"BAPI_GOODSMVT_CREATE 用内表 end
DATA: ls_ekpo TYPE ty_ekpo.
DATA: ls_et_return TYPE /sc1/ftd_mm_bapiret.
LOOP AT pt_ekpo INTO ls_ekpo.
CLEAR ls_goodsmvt_item.
ls_goodsmvt_item-material = ps_po-matnr.
ls_goodsmvt_item-move_type = '101'. "移动类型
ls_goodsmvt_item-mvt_ind = 'B'. "移动标识
ls_goodsmvt_item-entry_qnt = ls_ekpo-menge_sh.
ls_goodsmvt_item-entry_uom = ps_po-meins.
ls_goodsmvt_item-plant = ps_po-werks.
ls_goodsmvt_item-stge_loc = ps_po-lgort.
ls_goodsmvt_item-batch = ps_po-charg.
ls_goodsmvt_item-prod_date = ps_po-hsdat."生产日期
ls_goodsmvt_item-expirydate = ps_po-vfdat."货架寿命到期日
ls_goodsmvt_item-vendrbatch = ps_po-licha."供应商批次
ls_goodsmvt_item-stck_type = ps_po-insmk.
ls_goodsmvt_item-po_number = ls_ekpo-ebeln.
ls_goodsmvt_item-po_item = ls_ekpo-ebelp.
IF ls_goodsmvt_item-entry_qnt IS NOT INITIAL.
APPEND ls_goodsmvt_item TO lt_goodsmvt_item.
ENDIF.
ENDLOOP.
ls_goodsmvt_header-pstng_date = ps_po-wadat_ist."凭证中的过帐日期
ls_goodsmvt_header-doc_date = sy-datum."凭证中的凭证日期
ls_goodsmvt_header-pr_uname = sy-datum. "用户名
ls_goodsmvt_header-ref_doc_no = ls_ekpo-ebeln.
ls_code-gm_code = '01'. "按照采购订单收货
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = ls_goodsmvt_header
goodsmvt_code = ls_code
IMPORTING
materialdocument = lv_mblnr
TABLES
goodsmvt_item = lt_goodsmvt_item
return = lt_return.
READ TABLE lt_return WITH KEY type = 'E' INTO ls_return.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
ls_et_return-uuid = ps_po-uuid.
ls_et_return-type = 'E'.
LOOP AT lt_return INTO ls_return WHERE type = 'E' .
CONCATENATE ls_et_return-message ls_return-message '|' INTO ls_et_return-message.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ls_et_return-uuid = ps_po-uuid.
ls_et_return-type = 'S'.
ls_et_return-message = ps_po-vbeln && '收货成功'.
ENDIF.
APPEND ls_et_return TO et_return.
ENDFORM. " GOODSMVT_CREATE
*&---------------------------------------------------------------------*
*& Form ACTION_INBOUND_DO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_INBOUND_DO text
* -->P_LT_EKPO text
* -->P_ET_RETURN text
*----------------------------------------------------------------------*
FORM action_inbound_do TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log.
DATA: lt_do_temp TYPE STANDARD TABLE OF /sc1/s_wis_input,
ls_inbound_do TYPE /sc1/s_wis_input,
lv_end_flg TYPE char1,
lv_exec_flg TYPE char1.
CHECK pt_inbound_do[] IS NOT INITIAL.
READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .
CHECK sy-subrc <> 0.
SORT pt_inbound_do BY vbeln posnr.
LOOP AT pt_inbound_do INTO ls_inbound_do.
APPEND ls_inbound_do TO lt_do_temp.
AT END OF vbeln.
lv_end_flg = 'X'.
ENDAT.
IF lv_end_flg = 'X'.
CLEAR: lv_end_flg,lv_exec_flg.
"如果遇出错,剩余数据不进行收货
READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
CLEAR: lt_do_temp.
CONTINUE.
ENDIF.
"比较接口传入的信息和系统中的内向交货单信息,行项目数或者数量不相同,则进行修改操作
PERFORM inbound_do_update TABLES lt_do_temp et_return
CHANGING lv_exec_flg.
"批次拆分
PERFORM inbound_do_batch_split TABLES lt_do_temp et_return
CHANGING lv_exec_flg.
"拣配
PERFORM do_picking TABLES lt_do_temp et_return
CHANGING lv_exec_flg.
"过账
PERFORM inbound_do_confirm TABLES lt_do_temp et_return
CHANGING lv_exec_flg.
PERFORM edit_log TABLES lt_do_temp
et_return
et_/sc1/mm_migo_log.
CLEAR: lt_do_temp,lv_end_flg.
ENDIF.
ENDLOOP.
ENDFORM. " ACTION_INBOUND_DO
*&---------------------------------------------------------------------*
*& Form ACTION_OUTBOUND_DO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_INBOUND_DO text
* -->P_LT_EKPO text
* -->P_ET_RETURN text
*----------------------------------------------------------------------*
FORM action_outbound_do TABLES pt_outbound_do STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log.
DATA: lt_do_temp TYPE STANDARD TABLE OF /sc1/s_wis_input,
ls_outbound_do TYPE /sc1/s_wis_input,
lv_end_flg TYPE char1,
lv_exec_flg TYPE char1.
CHECK pt_outbound_do[] IS NOT INITIAL.
READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .
CHECK sy-subrc <> 0.
SORT pt_outbound_do BY vbeln posnr.
"从数据库表获取交货单数量并与传入数量进行对比(以传入数量为准) 在小于等于数据库交货单数量的情况下对交货单进行修改
LOOP AT pt_outbound_do INTO ls_outbound_do.
APPEND ls_outbound_do TO lt_do_temp.
AT END OF vbeln.
lv_end_flg = 'X'.
ENDAT.
IF lv_end_flg = 'X'.
CLEAR: lv_end_flg,lv_exec_flg.
READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
CLEAR lt_do_temp.
CONTINUE.
ENDIF.
"收货
PERFORM goodsmvt_create_outbound_do TABLES lt_do_temp et_return
CHANGING lv_exec_flg.
PERFORM edit_log TABLES lt_do_temp
et_return
et_/sc1/mm_migo_log.
CLEAR lt_do_temp.
ENDIF.
ENDLOOP.
ENDFORM. " ACTION_INBOUND_DO
*&---------------------------------------------------------------------*
*& Form GR_INBOUND_DO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_DO_TEMP text
*----------------------------------------------------------------------*
FORM inbound_do_update TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
CHANGING pv_exec_flg TYPE c. .
"BAPI_INB_DELIVERY_CHANGE 用变量 begin
DATA:ls_header_data TYPE bapiibdlvhdrchg.
DATA:ls_header_control TYPE bapiibdlvhdrctrlchg.
DATA:ls_delivery TYPE bapiibdlvhdrchg-deliv_numb.
DATA:lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE.
DATA:ls_return LIKE bapiret2 .
DATA:ls_item_data TYPE bapiibdlvitemchg,
lt_item_data TYPE STANDARD TABLE OF bapiibdlvitemchg.
DATA:ls_item_control TYPE bapiibdlvitemctrlchg,
lt_item_control TYPE STANDARD TABLE OF bapiibdlvitemctrlchg.
"BAPI_INB_DELIVERY_CHANGE 用变量 end
DATA: lt_lips TYPE STANDARD TABLE OF lips,
ls_lips TYPE lips,
ls_inbound_do TYPE /sc1/s_wis_input,
ls_do TYPE /sc1/s_wis_input,
lv_end_flg TYPE char1,
lv_msg TYPE char255,
ls_et_return TYPE /sc1/ftd_mm_bapiret,
lt_inbound_do_temp TYPE STANDARD TABLE OF /sc1/s_wis_input,
ls_inbound_do_temp TYPE /sc1/s_wis_input.
CHECK pv_exec_flg IS INITIAL.
LOOP AT pt_inbound_do INTO ls_inbound_do.
ls_inbound_do_temp-vbeln = ls_inbound_do-vbeln.
ls_inbound_do_temp-posnr = ls_inbound_do-posnr.
ls_inbound_do_temp-lfimg = ls_inbound_do-lfimg.
COLLECT ls_inbound_do_temp INTO lt_inbound_do_temp.
ENDLOOP.
READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.
SELECT * FROM lips
INTO CORRESPONDING FIELDS OF TABLE lt_lips
WHERE vbeln = ls_inbound_do-vbeln.
"1.比较订单行项目数和传入信息一致(接口传入行项目3条,订单4条,修改内向交货的行项目为3条(删除未传入的行项目))
"2.比较行项目数量,同理(数量以接口传入数量为主)
LOOP AT lt_lips INTO ls_lips .
READ TABLE lt_inbound_do_temp INTO ls_inbound_do_temp WITH KEY vbeln = ls_lips-vbeln
posnr = ls_lips-posnr .
IF sy-subrc = 0.
IF ls_lips-lfimg <> ls_inbound_do_temp-lfimg.
CLEAR ls_item_data.
ls_item_data-deliv_numb = ls_lips-vbeln. "被拆分DN号
ls_item_data-deliv_item = ls_lips-posnr. "被拆分DN Item
ls_item_data-material = ls_lips-matnr. "物料
ls_item_data-dlv_qty = ls_inbound_do_temp-lfimg. "交货数量,
ls_item_data-dlv_qty_imunit = ls_inbound_do_temp-lfimg.
ls_item_data-sales_unit = ls_lips-vrkme. "被拆分DN销售单位
ls_item_data-sales_unit_iso = ls_lips-meins. "被拆分DN基本单位
ls_item_data-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子)
ls_item_data-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(分母)
APPEND ls_item_data TO lt_item_data.
CLEAR ls_item_control.
ls_item_control-deliv_numb = ls_lips-vbeln. "被拆分DN号
ls_item_control-deliv_item = ls_lips-posnr. "被拆分DN Item
ls_item_control-chg_delqty = 'X'. "数量修改标志
APPEND ls_item_control TO lt_item_control.
ENDIF.
ELSE."如果没有找到对应的行项目,则删除操作
CLEAR:ls_item_data.
ls_item_data-deliv_numb = ls_lips-vbeln.
ls_item_data-deliv_item = ls_lips-posnr.
ls_item_data-material = ls_lips-matnr.
ls_item_data-batch = ls_lips-charg.
ls_item_data-dlv_qty = ls_lips-lfimg.
ls_item_data-dlv_qty_imunit = '0'.
ls_item_data-hieraritem = ls_lips-posnr.
ls_item_data-usehieritm = 1.
ls_item_data-fact_unit_nom = ls_lips-umvkz.
ls_item_data-fact_unit_denom = ls_lips-umvkn.
ls_item_data-base_uom = ls_lips-meins.
ls_item_data-sales_unit = ls_lips-vrkme.
APPEND ls_item_data TO lt_item_data.
CLEAR ls_item_data.
ls_item_control-deliv_numb = ls_lips-vbeln.
ls_item_control-deliv_item = ls_lips-posnr.
ls_item_control-del_item = 'X'.
APPEND ls_item_control TO lt_item_control.
ENDIF.
ENDLOOP.
IF lt_item_data IS NOT INITIAL.
DATA: ls_techn_control TYPE bapidlvcontrol.
ls_header_data-deliv_numb = ls_inbound_do-vbeln.
ls_header_control-deliv_numb = ls_inbound_do-vbeln.
ls_delivery = ls_inbound_do-vbeln.
ls_techn_control-upd_ind = 'U'.
CALL FUNCTION 'BAPI_INB_DELIVERY_CHANGE'
EXPORTING
header_data = ls_header_data
header_control = ls_header_control
delivery = ls_delivery
techn_control = ls_techn_control
TABLES
item_data = lt_item_data
item_control = lt_item_control
return = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E' .
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
LOOP AT lt_return INTO ls_return WHERE type = 'E'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = lv_msg.
CLEAR ls_et_return.
ENDLOOP.
ls_et_return-message = '交货单'&& ls_lips-vbeln && lv_msg.
ls_et_return-type = 'E'.
ls_et_return-uuid = ls_inbound_do-uuid.
APPEND ls_et_return TO lt_return.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDIF.
ENDFORM. " GR_INBOUND_DO
*&---------------------------------------------------------------------*
*& Form ACTION_TL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_OUTBOUND_DO text
* -->P_ET_RETURN text
*----------------------------------------------------------------------*
FORM action_tl TABLES pt_tl STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log. .
"BAPI_GOODSMVT_CREATE 用内表 begin
DATA lv_mblnr TYPE mseg-mblnr.
DATA ls_goodsmvt_header TYPE bapi2017_gm_head_01.
DATA ls_code LIKE bapi2017_gm_code.
DATA ls_goodsmvt_item TYPE bapi2017_gm_item_create.
DATA lt_goodsmvt_item TYPE STANDARD TABLE OF bapi2017_gm_item_create.
DATA lt_return TYPE STANDARD TABLE OF bapiret2.
DATA ls_return TYPE bapiret2.
"BAPI_GOODSMVT_CREATE 用内表 end
DATA: ls_tl TYPE /sc1/s_wis_input.
DATA: ls_et_return TYPE /sc1/ftd_mm_bapiret.
CHECK pt_tl[] IS NOT INITIAL.
READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .
CHECK sy-subrc <> 0.
LOOP AT pt_tl INTO ls_tl.
CLEAR ls_goodsmvt_item.
ls_goodsmvt_item-material = ls_tl-matnr.
ls_goodsmvt_item-move_type = '501'. "无采购订单的收货
ls_goodsmvt_item-mvt_ind = ''. "移动标识
ls_goodsmvt_item-entry_qnt = ls_tl-lfimg.
ls_goodsmvt_item-entry_uom = ls_tl-meins.
ls_goodsmvt_item-plant = ls_tl-werks.
ls_goodsmvt_item-stge_loc = ls_tl-lgort.
ls_goodsmvt_item-batch = ls_tl-charg.
ls_goodsmvt_item-prod_date = ls_tl-hsdat."生产日期
ls_goodsmvt_item-expirydate = ls_tl-vfdat."货架寿命到期日
ls_goodsmvt_item-vendrbatch = ls_tl-licha."供应商批次
ls_goodsmvt_item-stck_type = ls_tl-insmk.
IF ls_goodsmvt_item-entry_qnt IS NOT INITIAL.
APPEND ls_goodsmvt_item TO lt_goodsmvt_item.
ENDIF.
ENDLOOP.
ls_goodsmvt_header-pstng_date = ls_tl-wadat_ist."凭证中的过帐日期
ls_goodsmvt_header-doc_date = sy-datum."凭证中的凭证日期
ls_goodsmvt_header-pr_uname = sy-uname. "用户名
ls_code-gm_code = '05'. "其他
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = ls_goodsmvt_header
goodsmvt_code = ls_code
IMPORTING
materialdocument = lv_mblnr
TABLES
goodsmvt_item = lt_goodsmvt_item
return = lt_return.
READ TABLE lt_return WITH KEY type = 'E' INTO ls_return.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
ls_et_return-uuid = ls_tl-uuid.
ls_et_return-type = 'E'.
LOOP AT lt_return INTO ls_return WHERE type = 'E' .
CONCATENATE ls_et_return-message ls_return-message '|' INTO ls_et_return-message.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ls_et_return-uuid = ls_tl-uuid.
ls_et_return-type = 'S'.
ls_et_return-message = ls_tl-vbeln && '收货成功'.
ENDIF.
APPEND ls_et_return TO et_return.
PERFORM edit_log TABLES pt_tl
et_return
et_/sc1/mm_migo_log.
ENDFORM. " ACTION_TL
*&---------------------------------------------------------------------*
*& Form INBOUND_DO_PICKING
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_DO_TEMP text
* -->P_ET_RETURN text
* -->P_ENDIF text
*----------------------------------------------------------------------*
FORM do_picking TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
CHANGING pv_exec_flg TYPE c. .
"BAPI用变量 begin
DATA: lt_vbpok TYPE TABLE OF vbpok,
ls_vbpok TYPE vbpok,
lt_prott TYPE TABLE OF prott,
ls_prott TYPE prott,
ls_vbkok TYPE vbkok.
"BAPI用变量 end
DATA: lt_lips TYPE STANDARD TABLE OF lips,
ls_lips TYPE lips,
ls_inbound_do TYPE /sc1/s_wis_input,
lv_msg TYPE char255,
ls_et_return TYPE /sc1/ftd_mm_bapiret.
CHECK pv_exec_flg IS INITIAL.
READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.
SELECT * FROM lips
INTO CORRESPONDING FIELDS OF TABLE lt_lips
WHERE vbeln = ls_inbound_do-vbeln.
LOOP AT lt_lips INTO ls_lips.
ls_vbpok-vbeln_vl = ls_lips-vbeln.
ls_vbpok-posnr_vl = ls_lips-posnr.
ls_vbpok-vbeln = ls_lips-vgbel.
ls_vbpok-posnn = ls_lips-vgpos.
ls_vbpok-meins = ls_lips-meins.
ls_vbpok-vrkme = ls_lips-vrkme.
ls_vbpok-pikmg = ls_lips-lfimg.
ls_vbpok-ndifm = 0.
ls_vbpok-brgew = ls_lips-brgew.
ls_vbpok-gewei = ls_lips-gewei.
ls_vbpok-volum = ls_lips-volum.
ls_vbpok-voleh = ls_lips-voleh.
ls_vbpok-charg = ls_lips-charg.
ls_vbpok-matnr = ls_lips-matnr.
ls_vbpok-orpos = 0.
APPEND ls_vbpok TO lt_vbpok.
CLEAR: ls_vbpok.
ENDLOOP.
ls_vbkok-vbeln_vl = ls_inbound_do-vbeln.
CALL FUNCTION 'SD_DELIVERY_UPDATE_PICKING'
EXPORTING
vbkok_wa = ls_vbkok
synchron = 'X'
TABLES
vbpok_tab = lt_vbpok
prot = lt_prott
EXCEPTIONS
error_message = 1.
LOOP AT lt_prott INTO ls_prott WHERE msgty CA 'EA'.
EXIT.
ENDLOOP.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
pv_exec_flg = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = ls_prott-msgid
no = ls_prott-msgno
v1 = ls_prott-msgv1
v2 = ls_prott-msgv2
v3 = ls_prott-msgv3
v4 = ls_prott-msgv4
IMPORTING
msg = lv_msg
EXCEPTIONS
not_found = 1
OTHERS = 2.
ls_et_return-uuid = ls_inbound_do-uuid.
ls_et_return-type = 'E'.
ls_et_return-message = lv_msg.
APPEND ls_et_return TO et_return.
ENDIF.
ENDFORM. " INBOUND_DO_PICKING
*&---------------------------------------------------------------------*
*& Form INBOUND_DO_CONFIRM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_DO_TEMP text
* -->P_ET_RETURN text
* <--P_LV_EXEC_FLG text
*----------------------------------------------------------------------*
FORM inbound_do_confirm TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
CHANGING pv_exec_flg TYPE c.
"bapi 用变量---begin
DATA: ls_header_data TYPE bapiibdlvhdrcon,
ls_header_control TYPE bapiibdlvhdrctrlcon,
lw_delivery TYPE bapiobdlvhdrcon-deliv_numb,
lt_return TYPE TABLE OF bapiret2 ,
ls_return TYPE bapiret2.
"bapi 用变量---end
DATA: ls_inbound_do TYPE /sc1/s_wis_input,
ls_et_return TYPE /sc1/ftd_mm_bapiret,
lv_msg TYPE char255.
CHECK pv_exec_flg IS INITIAL.
READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.
ls_header_data-deliv_numb = ls_inbound_do-vbeln."交货单号.
ls_header_control-deliv_numb = ls_inbound_do-vbeln."交货单号.
ls_header_control-post_gi_flg = 'X' .
lw_delivery = ls_inbound_do-vbeln."交货单号.
CALL FUNCTION 'BAPI_INB_DELIVERY_CONFIRM_DEC'
EXPORTING
header_data = ls_header_data
header_control = ls_header_control
delivery = lw_delivery
TABLES
return = lt_return.
LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
EXIT.
ENDLOOP.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ls_et_return-uuid = ls_inbound_do-uuid.
ls_et_return-type = 'S'.
ls_et_return-message = '收货成功'.
APPEND ls_et_return TO et_return.
ELSE.
pv_exec_flg = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = ls_return-id
no = ls_return-number
v1 = ls_return-message_v1
v2 = ls_return-message_v2
v3 = ls_return-message_v3
v4 = ls_return-message_v4
IMPORTING
msg = lv_msg
EXCEPTIONS
not_found = 1
OTHERS = 2.
ls_et_return-uuid = ls_inbound_do-uuid.
ls_et_return-type = 'E'.
ls_et_return-message = lv_msg.
APPEND ls_et_return TO et_return.
ENDIF.
ENDFORM. " INBOUND_DO_CONFIRM
*&---------------------------------------------------------------------*
*& Form INBOUND_DO_CONFIRM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_DO_TEMP text
* -->P_ET_RETURN text
* <--P_LV_EXEC_FLG text
*----------------------------------------------------------------------*
FORM outbound_do_confirm TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
CHANGING pv_exec_flg TYPE c.
"bapi 用变量---begin
DATA: ls_header_data TYPE bapiobdlvhdrcon,
ls_header_control TYPE bapiobdlvhdrctrlcon,
lw_delivery TYPE bapiobdlvhdrcon-deliv_numb,
lt_return TYPE TABLE OF bapiret2 ,
ls_return TYPE bapiret2.
"bapi 用变量---end
DATA: ls_inbound_do TYPE /sc1/s_wis_input,
ls_et_return TYPE /sc1/ftd_mm_bapiret,
lv_msg TYPE char255.
CHECK pv_exec_flg IS INITIAL.
READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.
ls_header_data-deliv_numb = ls_inbound_do-vbeln."交货单号.
ls_header_control-deliv_numb = ls_inbound_do-vbeln."交货单号.
ls_header_control-post_gi_flg = 'X' .
lw_delivery = ls_inbound_do-vbeln."交货单号.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
EXPORTING
header_data = ls_header_data
header_control = ls_header_control
delivery = lw_delivery
TABLES
return = lt_return.
LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
EXIT.
ENDLOOP.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ls_et_return-uuid = ls_inbound_do-uuid.
ls_et_return-type = 'S'.
ls_et_return-message = '收货成功'.
APPEND ls_et_return TO et_return.
ELSE.
pv_exec_flg = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = ls_return-id
no = ls_return-number
v1 = ls_return-message_v1
v2 = ls_return-message_v2
v3 = ls_return-message_v3
v4 = ls_return-message_v4
IMPORTING
msg = lv_msg
EXCEPTIONS
not_found = 1
OTHERS = 2.
ls_et_return-uuid = ls_inbound_do-uuid.
ls_et_return-type = 'E'.
ls_et_return-message = lv_msg.
APPEND ls_et_return TO et_return.
ENDIF.
ENDFORM. " INBOUND_DO_CONFIRM
*&---------------------------------------------------------------------*
*& Form SPLIT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_INPUT text
* -->P_LT_PO text
* -->P_LT_INBOUND_DO text
* -->P_LT_OUTBOUND_DO text
* -->P_LT_TL text
*----------------------------------------------------------------------*
FORM split_data TABLES pt_input STRUCTURE /sc1/s_wis_input
pt_po STRUCTURE /sc1/s_wis_input
pt_inbound_do STRUCTURE /sc1/s_wis_input
pt_outbound_do STRUCTURE /sc1/s_wis_input
pt_tl STRUCTURE /sc1/s_wis_input
pt_ekpo TYPE ty_t_ekpo.
DATA: ls_input TYPE /sc1/s_wis_input,
lv_new_flg TYPE char1,
lv_action TYPE char15,
lv_matkl TYPE mara-matkl,
lt_/sc1/mm_migo_log TYPE STANDARD TABLE OF /sc1/mm_migo_log,
ls_/sc1/mm_migo_log TYPE /sc1/mm_migo_log.
FIELD-SYMBOLS: <ls_input> TYPE /sc1/s_wis_input.
"检查此次需要收货是否有已经处理完成的数据,已完成数据不再处理
IF pt_input[] IS NOT INITIAL.
SELECT * FROM /sc1/mm_migo_log INTO TABLE lt_/sc1/mm_migo_log
FOR ALL ENTRIES IN pt_input
WHERE uuid = pt_input-uuid.
ENDIF.
SORT pt_input BY action vbeln posnr.
LOOP AT pt_input ASSIGNING <ls_input>.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <ls_input>-vbeln
IMPORTING
output = <ls_input>-vbeln.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <ls_input>-posnr
IMPORTING
output = <ls_input>-posnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <ls_input>-matnr
IMPORTING
output = <ls_input>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
ENDLOOP.
LOOP AT pt_input INTO ls_input.
AT NEW vbeln.
lv_new_flg = 'X'.
ENDAT.
IF lv_new_flg = 'X'.
CLEAR:lv_new_flg.
IF ls_input-action = '1'.
SELECT *
FROM ekpo
APPENDING CORRESPONDING FIELDS OF TABLE pt_ekpo
WHERE ebeln = ls_input-vbeln.
IF sy-subrc = 0.
lv_action = 'PO'.
ELSE.
lv_action = 'INBOUND_DO'.
ENDIF.
ELSEIF ls_input-action = '2'.
lv_action = 'OUTBOUND_DO'.
ENDIF.
ENDIF.
"检查此次需要收货是否有已经处理完成的数据,已完成数据不再处理
READ TABLE lt_/sc1/mm_migo_log INTO ls_/sc1/mm_migo_log with KEY uuid = ls_input-uuid.
IF sy-subrc = 0.
CONTINUE.
ENDIF.
SELECT SINGLE matkl FROM mara INTO lv_matkl
WHERE matnr = ls_input-matnr
AND matkl = 'YS000013'."铁笼
IF sy-subrc = 0.
APPEND ls_input TO pt_tl.
CONTINUE.
ENDIF.
CASE lv_action.
WHEN 'PO'.
APPEND ls_input TO pt_po.
WHEN 'INBOUND_DO'.
APPEND ls_input TO pt_inbound_do.
WHEN 'OUTBOUND_DO'.
APPEND ls_input TO pt_outbound_do.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDFORM. " SPLIT_DATA
*&---------------------------------------------------------------------*
*& Form INBOUND_DO_BATCH_SPLIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_DO_TEMP text
* -->P_ET_RETURN text
* <--P_LV_EXEC_FLG text
*----------------------------------------------------------------------*
FORM inbound_do_batch_split TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input
et_return STRUCTURE /sc1/ftd_mm_bapiret
CHANGING pv_exec_flg TYPE c. .
"bapi用变量begin
DATA: ls_header_data TYPE bapiobdlvhdrchg, "Delivery header
ls_header_control TYPE bapiobdlvhdrctrlchg, "delivery header control
lt_item_data TYPE STANDARD TABLE OF bapiobdlvitemchg,
ls_item_data TYPE bapiobdlvitemchg,
lt_item_control TYPE STANDARD TABLE OF bapiobdlvitemctrlchg,
ls_item_control TYPE bapiobdlvitemctrlchg,
lt_item_data_spl TYPE STANDARD TABLE OF /spe/bapiobdlvitemchg,
ls_item_data_spl TYPE /spe/bapiobdlvitemchg,
ls_techn_control TYPE bapidlvcontrol,
lt_return TYPE STANDARD TABLE OF bapiret2,
ls_return type bapiret2.
DATA: lv_message TYPE c LENGTH 220.
"bapi用变量end
DATA: ls_inbound_do TYPE /sc1/s_wis_input,
lt_lips TYPE STANDARD TABLE OF lips,
ls_lips TYPE lips,
ls_et_teturn TYPE /sc1/ftd_mm_bapiret,
lv_vbeln_batch TYPE lips-vbeln..
READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.
SELECT *
FROM lips
INTO TABLE lt_lips
WHERE vbeln = ls_inbound_do-vbeln.
lv_vbeln_batch = '900000'.
LOOP AT pt_inbound_do INTO ls_inbound_do.
READ TABLE lt_lips INTO ls_lips WITH KEY vbeln = ls_inbound_do-vbeln
posnr = ls_inbound_do-posnr.
"批次拆分出来的新行
CLEAR: ls_item_data.
lv_vbeln_batch = lv_vbeln_batch + 1.
ls_item_data-deliv_numb = ls_inbound_do-vbeln..
ls_item_data-deliv_item = lv_vbeln_batch.
ls_item_data-hieraritem = ls_inbound_do-posnr. "项目层次中的高级项目-批次拆分字段
ls_item_data-usehieritm = '1'. "使用层次项目-批次拆分字段
ls_item_data-material = ls_inbound_do-matnr.
ls_item_data-batch = ls_inbound_do-charg.
ls_item_data-dlv_qty = ls_inbound_do-lfimg.
ls_item_data-fact_unit_nom = ls_lips-umvkz.
ls_item_data-fact_unit_denom = ls_lips-umvkn.
APPEND ls_item_data TO lt_item_data.
"批次拆分出来的新行
CLEAR: ls_item_control.
ls_item_control-deliv_numb = ls_inbound_do-vbeln.
ls_item_control-deliv_item = lv_vbeln_batch.
ls_item_control-chg_delqty = 'X'.
APPEND ls_item_control TO lt_item_control.
CLEAR: ls_item_control.
ls_item_data_spl-deliv_numb = ls_inbound_do-vbeln.
ls_item_data_spl-deliv_item = lv_vbeln_batch.
ls_item_data_spl-stge_loc = ls_inbound_do-lgort."库存地点
APPEND ls_item_data_spl TO lt_item_data_spl.
ENDLOOP.
ls_header_data-deliv_numb = ls_inbound_do-vbeln.
ls_header_control-deliv_numb = ls_inbound_do-vbeln.
ls_techn_control-upd_ind = 'U'.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = ls_header_data
header_control = ls_header_control
delivery = ls_inbound_do-vbeln
techn_control = ls_techn_control
TABLES
item_data = lt_item_data
item_control = lt_item_control
item_data_spl = lt_item_data_spl
return = lt_return.
LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
EXIT.
ENDLOOP.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
"更改库存地点
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = ls_header_data
header_control = ls_header_control
delivery = ls_inbound_do-vbeln
techn_control = ls_techn_control
TABLES
item_data = lt_item_data
item_control = lt_item_control
item_data_spl = lt_item_data_spl
return = lt_return.
ELSE.
pv_exec_flg = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = ls_return-id
no = ls_return-number
v1 = ls_return-message_v1
v2 = ls_return-message_v2
v3 = ls_return-message_v3
v4 = ls_return-message_v4
IMPORTING
msg = lv_message
EXCEPTIONS
not_found = 1
OTHERS = 2.
ls_et_teturn-uuid = ls_inbound_do-uuid.
ls_et_teturn-type = 'E'.
ls_et_teturn-message = lv_message.
APPEND ls_et_teturn TO et_return.
ENDIF.
ENDFORM. " INBOUND_DO_BATCH_SPLIT
帮我分析一下,让你写出这样的代码,你作为顾问应该提怎么样的需求,总结一下