SAP MM BAPI
From SapWiki
Contents
- 1 Orden de Compra ME21N
- 2 Crear Material MM01
- 3 Creación de vista calidad materiales
- 4 Crear Lista de Material CS01
- 5 Crear una entrega de Pedido de traslado VL10B, contabilizarla y realizar picking
- 6 BAPI_GOODSMVT_CREATE entrada de mercancía para pedido de traslado MIGO con referencia a entrega
- 7 Crear entrega de salida según pedido(VL01N), contabilizarla y realizar picking
Orden de Compra ME21N
Crear Material MM01
Creación de vista calidad materiales
Crear Lista de Material CS01
Crear una entrega de Pedido de traslado VL10B, contabilizarla y realizar picking
*&---------------------------------------------------------------------*
*& Form CREAR_ENTREGA
*&---------------------------------------------------------------------*
* Crear una entrega de Pedido de traslado VL10B
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CREAR_ENTREGA using p_ebeln
CHANGING p_entrega
p_cont.
* Crear una entrega de Pedido de traslado VL10B
DATA: begin of lt_ekpo occurs 1.
include structure ekpo.
data n_doc type i.
data end of lt_ekpo.
data : begin of lt_entregas occurs 1,
vbeln type vbeln,
num type i,
end of lt_entregas.
data: lt_stock_trans_items like BAPIDLVREFTOSTO occurs 0 with header line,
lt_return like BAPIRET2 occurs 0 with header line,
l_ship_point like BAPIDLVCREATEHEADER-SHIP_POINT,
l_due_date like BAPIDLVCREATEHEADER-DUE_DATE,
l_delivery like BAPISHPDELIVNUMB-DELIV_NUMB.
data: lt_DELIVERIES like BAPISHPDELIVNUMB occurs 0 with header line,
lt_CREATED_ITEMS like BAPIDLVITEMCREATED occurs 0 with header line.
data: ls_vbkok like vbkok,
lt_vbpok like vbpok occurs 0 with header line,
lt_prot like prott occurs 0 with header line,
l_error_any_0 type c length 1,
l_error_in_item_deletion_0 type c length 1,
l_error_in_pod_update_0 type c length 1,
l_error_in_interface_0 type c length 1,
l_error_in_goods_issue_0 type c length 1,
l_error_in_final_check_0 type c length 1,
l_error_partner_update type c length 1,
l_error_sernr_update type c length 1.
SELECT SINGLE vstel
FROM ekpv
INTO l_ship_point
WHERE ebeln EQ p_ebeln.
SELECT *
FROM ekpo UP TO 1 ROWS
INTO table lt_ekpo
WHERE ebeln EQ p_ebeln
ORDER BY ebelp.
**********************************************************************
* crear entrega
**********************************************************************
IF p_entrega IS INITIAL.
REFRESH lt_stock_trans_items.
LOOP AT lt_ekpo.
CLEAR lt_stock_trans_items.
lt_stock_trans_items-ref_doc = lt_ekpo-ebeln.
lt_stock_trans_items-ref_item = lt_ekpo-ebelp.
lt_stock_trans_items-dlv_qty = lt_ekpo-menge.
lt_stock_trans_items-sales_unit = lt_ekpo-meins.
APPEND lt_stock_trans_items.
ENDLOOP.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
EXPORTING
ship_point = l_ship_point
due_date = sy-datum
IMPORTING
delivery = l_delivery
TABLES
stock_trans_items = lt_stock_trans_items
DELIVERIES = lt_DELIVERIES
CREATED_ITEMS = lt_CREATED_ITEMS
RETURN = lt_return.
IF l_delivery IS INITIAL.
LOOP AT lt_return WHERE TYPE EQ 'E'.
MESSAGE ID lt_return-ID TYPE 'I' NUMBER lt_return-NUMBER WITH
lt_return-MESSAGE_V1
lt_return-MESSAGE_V2
lt_return-MESSAGE_V3
lt_return-MESSAGE_V4 INTO g_message.
PERFORM add_news USING 'Creación de entrega:' icon_red_light.
wa_data-stat = icon_red_light.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
.
p_entrega = l_delivery.
MESSAGE s000(0k) WITH l_delivery 'creada con éxito' INTO g_message.
PERFORM add_news USING 'Creación de entrega:' icon_green_light.
wa_data-stat = icon_green_light.
ENDIF.
* Entrega creada asigna en ITAB.
LOOP AT lt_CREATED_ITEMS.
lt_entregas-vbeln = lt_CREATED_ITEMS-DELIV_NUMB.
lt_entregas-num = 1.
COLLECT lt_entregas.
ENDLOOP.
ELSE.
l_delivery = p_entrega.
lt_entregas-vbeln = l_delivery.
lt_entregas-num = 1.
COLLECT lt_entregas.
ENDIF.
*--------------------------------------------------------------------*
* contabiliza SM & picking entregas.
*--------------------------------------------------------------------*
DATA lt_return2 TYPE bapiret2_t.
DATA lt_lips TYPE TABLE OF lips WITH HEADER LINE.
DATA: ls_data TYPE bapiobdlvhdrchg,
ls_control TYPE bapiobdlvhdrctrlchg,
lt_item_control TYPE TABLE OF bapiobdlvitemctrlchg WITH HEADER LINE,
lt_item_data TYPE TABLE OF bapiobdlvitemchg WITH HEADER LINE,
lt_item_spl TYPE TABLE OF /spe/bapiobdlvitemchg WITH HEADER LINE,
ls_techn_control TYPE bapidlvcontrol.
loop at lt_entregas.
REFRESH lt_return.
* modificar entrega
REFRESH lt_lips.
* si no tiene almacen => actualizar con almacén de origen
select * into TABLE lt_lips from lips where vbeln = l_delivery and lgort = space.
IF sy-subrc = 0.
LOOP AT lt_lips.
lt_item_spl-deliv_numb = lt_lips-vbeln.
lt_item_spl-deliv_item = lt_lips-posnr.
lt_item_control-deliv_numb = lt_lips-vbeln.
lt_item_control-deliv_item = lt_lips-posnr.
lt_item_data-deliv_numb = lt_lips-vbeln.
lt_item_data-deliv_item = lt_lips-posnr.
lt_item_data-dlv_qty = lt_lips-lfimg.
lt_item_spl-stge_loc = wa_data-lgort_ori. "almacén de origen
lt_item_data-material = lt_lips-matnr.
lt_item_data-fact_unit_nom = lt_lips-umvkz.
lt_item_data-fact_unit_denom = lt_lips-umvkn.
lt_item_data-base_uom = lt_lips-meins.
lt_item_data-sales_unit = lt_lips-vrkme.
APPEND lt_item_spl.
APPEND lt_item_control.
APPEND lt_item_data.
ENDLOOP.
*—–> modificar la entrega
ls_data-deliv_numb = l_delivery.
ls_control-deliv_numb = l_delivery.
ls_techn_control-upd_ind = 'U'.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = ls_data
header_control = ls_control
delivery = l_delivery
techn_control = ls_techn_control
TABLES
item_data = lt_item_data[]
item_control = lt_item_control[]
RETURN = lt_return
item_data_spl = lt_item_spl[]
.
LOOP AT lt_return WHERE TYPE = 'E'.
MOVE lt_return-MESSAGE TO g_message.
PERFORM add_news USING 'Modif. Almacén de Entrega:' icon_red_light.
wa_data-stat = icon_red_light.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
CONTINUE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
ENDIF.
l_delivery = lt_entregas-vbeln.
ls_vbkok-vbeln_vl = l_delivery.
ls_vbkok-wabuc = 'X'. "contabilizar Salida merc.
SELECT vbeln AS vbeln_vl
posnr AS posnr_vl
matnr
charg
lfimg
lgmng
umvkz
umvkn
vrkme
meins
werks FROM lips
INTO CORRESPONDING FIELDS OF TABLE lt_vbpok
WHERE vbeln EQ l_delivery.
LOOP AT lt_vbpok.
lt_vbpok-vbeln = lt_vbpok-vbeln_vl.
lt_vbpok-posnn = lt_vbpok-posnr_vl.
lt_vbpok-lgort = wa_data-lgort_ori. "lt_ekpo-lgort. "p_lgort.
lt_vbpok-mdiff_lgort = wa_data-lgort_ori. "lt_ekpo-lgort. "p_lgort.
MODIFY lt_vbpok.
ENDLOOP.
CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
EXPORTING
vbkok_wa = ls_vbkok
* commit = 'X'
delivery = l_delivery
update_picking = 'X'
if_error_messages_send = ' '
IMPORTING
ef_error_any = l_error_any_0
ef_error_in_item_deletion = l_error_in_item_deletion_0
ef_error_in_pod_update = l_error_in_pod_update_0
ef_error_in_interface = l_error_in_interface_0
ef_error_in_goods_issue = l_error_in_goods_issue_0
ef_error_in_final_check = l_error_in_final_check_0
ef_error_partner_update = l_error_partner_update
ef_error_sernr_update = l_error_sernr_update
TABLES
vbpok_tab = lt_vbpok
prot = lt_prot.
IF l_error_any_0 EQ 'X'.
LOOP AT lt_prot where msgty eq 'E'.
MESSAGE ID lt_prot-msgid
TYPE 'I'
NUMBER lt_prot-msgno
WITH lt_prot-msgv1
lt_prot-msgv2
lt_prot-msgv3
lt_prot-msgv4 into g_message.
PERFORM add_news USING 'Contabilización de entrega:' icon_red_light.
wa_data-stat = icon_red_light.
* error = 'X'.
ENDLOOP.
ELSE.
COMMIT WORK AND WAIT.
MESSAGE S000(0k) WITH 'Se contabilizó la entrega' l_delivery into g_message.
PERFORM add_news USING 'Contabilización de entrega:' icon_green_light.
wa_data-stat = icon_green_light.
p_cont = 'X'.
ENDIF.
endloop.
ENDFORM. " CREAR_ENTREGA
BAPI_GOODSMVT_CREATE entrada de mercancía para pedido de traslado MIGO con referencia a entrega
form recepcion USING p_oc p_entrega CHANGING p_materialdocument
p_MATDOCUMENTYEAR.
* entrada de mercancía para pedido de traslado MIGO con referencia
* a entrega
DATA: lt_item TYPE TABLE OF bapi2017_gm_item_create,
lt_ekpo TYPE TABLE OF ekpo,
lt_return TYPE TABLE OF bapiret2.
data: ls_ekpo TYPE ekpo,
ls_header LIKE bapi2017_gm_head_01,
ls_code LIKE bapi2017_gm_code,
ls_item LIKE LINE OF lt_item,
ls_return LIKE LINE OF lt_return.
DATA: l_materialdocument TYPE bapi2017_gm_head_ret-mat_doc,
l_MATDOCUMENTYEAR TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR,
l_testrun TYPE testrun VALUE space.
CLEAR: lt_item[],
ls_header,
ls_code,
l_materialdocument.
SELECT * FROM ekpo INTO TABLE lt_ekpo
WHERE ebeln = p_oc.
IF sy-subrc = 0.
ls_header-pstng_date = sy-datum.
ls_header-doc_date = sy-datum.
ls_header-ref_doc_no = p_entrega.
ls_header-header_txt = wa_data-vbeln.
ls_code-gm_code = '01'. "MB1C ver tabla T158G
LOOP AT lt_ekpo INTO ls_ekpo.
CLEAR ls_item.
ls_item-move_type = '101'.
ls_item-material = ls_ekpo-matnr.
ls_item-plant = ls_ekpo-werks.
ls_item-stge_loc = ls_ekpo-lgort.
* si material esta sujeto a lote => lote = pedido de traslado
SELECT COUNT(*) FROM MARc WHERE MATNR = ls_ekpo-matnr
AND WERKS = ls_ekpo-werks
AND XCHAR = 'X'.
IF sy-subrc = 0.
ls_item-batch = p_oc.
ENDIF.
ls_item-entry_qnt = ls_ekpo-menge.
ls_item-po_number = ls_ekpo-ebeln.
ls_item-po_item = ls_ekpo-ebelp.
ls_item-val_type = ls_ekpo-bwtar.
ls_item-mvt_ind = 'B'. "indicador de movimiento
ls_item-DELIV_NUMB = p_entrega.
APPEND ls_item TO lt_item.
ENDLOOP.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = ls_header
goodsmvt_code = ls_code
testrun = l_testrun
IMPORTING
materialdocument = l_materialdocument
MATDOCUMENTYEAR = l_MATDOCUMENTYEAR
TABLES
goodsmvt_item = lt_item
RETURN = lt_return
.
IF lt_return[] IS INITIAL.
* proceso OK
p_materialdocument = l_materialdocument.
p_MATDOCUMENTYEAR = l_MATDOCUMENTYEAR.
MESSAGE S000(0k) WITH 'Se creo documento de material'
l_materialdocument l_MATDOCUMENTYEAR INTO g_message.
PERFORM add_news USING 'Recepción:' icon_green_light.
* commit work
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ELSE.
* error
LOOP AT lt_return INTO ls_return
GROUP BY COND string( WHEN ls_return-TYPE = 'E' THEN |EQ 1|
WHEN ls_return-TYPE = 'A' THEN |EQ 2|
WHEN ls_return-TYPE = 'W' THEN |EQ 3|
WHEN ls_return-TYPE = 'I' THEN |EQ 4|
)
ASCENDING
ASSIGNING FIELD-SYMBOL(<group>).
LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_return>).
EXIT.
ENDLOOP.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
MOVE <ls_return>-MESSAGE TO g_message.
PERFORM add_news USING 'Recepción:' icon_red_light.
wa_data-stat = icon_red_light.
ENDIF.
ENDIF.
ELSE.
ENDIF.
ENDFORM. " f_entrada_merc_pedido
Crear entrega de salida según pedido(VL01N), contabilizarla y realizar picking
form entrega_cliente_final USING p_pedido p_oc CHANGING p_entrega
p_contabilizado_cli.
* VL01N
DATA: lt_sales_order TYPE TABLE OF bapidlvreftosalesorder WITH HEADER LINE,
lt_return type TABLE OF bapiret2,
lt_ekpo type TABLE OF ekpo WITH HEADER LINE,
ls_return like LINE OF lt_return,
l_delivery TYPE bapishpdelivnumb-deliv_numb,
l_num_deliveries TYPE bapidlvcreateheader-num_deliveries,
l_VSTEL type VSTEL.
if p_entrega is INITIAL.
lt_sales_order-ref_doc = p_pedido.
lt_sales_order-REF_ITEM = wa_data-posnr.
APPEND lt_sales_order.
SELECT SINGLE vstel into l_VSTEL from vbap where vbeln = wa_data-vbeln and
posnr = wa_data-posnr.
* crear la entrega
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
EXPORTING
SHIP_POINT = l_vstel
IMPORTING
delivery = l_delivery
num_deliveries = l_num_deliveries
TABLES
sales_order_items = lt_sales_order
return = lt_return
.
IF l_delivery IS INITIAL.
LOOP AT lt_return INTO ls_return
GROUP BY COND string( WHEN ls_return-type = 'E' THEN |EQ 1|
WHEN ls_return-type = 'A' THEN |EQ 2|
WHEN ls_return-type = 'W' THEN |EQ 3|
WHEN ls_return-type = 'I' THEN |EQ 4|
)
ASCENDING
ASSIGNING FIELD-SYMBOL(<group>).
LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_return>).
exit.
ENDLOOP.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
move <ls_return>-message to g_message.
PERFORM add_news USING 'Entrega Cliente Final:' icon_red_light.
return.
ENDIF.
else.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
p_entrega = l_delivery.
MESSAGE s000(0k) WITH l_delivery 'creada con éxito' into g_message.
PERFORM add_news USING 'Entrega Cliente Final:' icon_green_light.
endif.
else.
l_delivery = p_entrega.
endif.
*--------------------------------------------------------------------*
* contabiliza SM & picking entregas.
*--------------------------------------------------------------------*
DATA lt_return2 TYPE bapiret2_t.
DATA lt_lips TYPE TABLE OF lips WITH HEADER LINE.
DATA: ls_data TYPE bapiobdlvhdrchg,
ls_control TYPE bapiobdlvhdrctrlchg,
lt_item_control TYPE TABLE OF bapiobdlvitemctrlchg WITH HEADER LINE,
lt_item_data TYPE TABLE OF bapiobdlvitemchg WITH HEADER LINE,
lt_item_spl TYPE TABLE OF /spe/bapiobdlvitemchg WITH HEADER LINE,
ls_techn_control TYPE bapidlvcontrol.
check l_delivery is NOT INITIAL.
* modificar entrega
REFRESH lt_lips.
* si no tiene lote => actualizar
select * into TABLE lt_lips from lips where vbeln = l_delivery and charg = space.
IF sy-subrc = 0.
LOOP AT lt_lips.
select COUNT(*) from marc where matnr = lt_lips-matnr and
werks = lt_lips-werks and
xchar = 'X'. "sujeto a lote
check sy-subrc = 0.
lt_item_data-deliv_numb = lt_lips-vbeln.
lt_item_data-deliv_item = lt_lips-posnr.
lt_item_data-dlv_qty = lt_lips-lfimg.
lt_item_data-batch = p_oc. "lote => pedido de traslado
lt_item_data-material = lt_lips-matnr.
lt_item_data-fact_unit_nom = lt_lips-umvkz.
lt_item_data-fact_unit_denom = lt_lips-umvkn.
lt_item_data-base_uom = lt_lips-meins.
lt_item_data-sales_unit = lt_lips-vrkme.
lt_item_control-deliv_numb = lt_lips-vbeln.
lt_item_control-deliv_item = lt_lips-posnr.
lt_item_control-chg_delqty = 'X'.
APPEND lt_item_spl.
APPEND lt_item_control.
APPEND lt_item_data.
ENDLOOP.
*—–> modificar la entrega
if lt_item_data[] is NOT INITIAL.
ls_data-deliv_numb = l_delivery.
ls_control-deliv_numb = l_delivery.
ls_techn_control-upd_ind = 'U'.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = ls_data
header_control = ls_control
delivery = l_delivery
techn_control = ls_techn_control
TABLES
item_data = lt_item_data[]
item_control = lt_item_control[]
RETURN = lt_return
* item_data_spl = lt_item_spl[]
.
LOOP AT lt_return INTO ls_return WHERE TYPE = 'E'.
MOVE ls_return-MESSAGE TO g_message.
PERFORM add_news USING 'Modif. Almacén de Entrega:' icon_red_light.
wa_data-stat = icon_red_light.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
RETURN. "------------------------->
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
ENDIF.
ENDIF.
**********************************************************************
***picking
**********************************************************************
data: lt_vbpok type TABLE OF vbpok WITH HEADER LINE,
lt_prot type TABLE OF prott WITH HEADER LINE,
ls_vbkok like vbkok,
l_error_any_0 type c length 1,
l_error_in_item_deletion_0 type c length 1,
l_error_in_pod_update_0 type c length 1,
l_error_in_interface_0 type c length 1,
l_error_in_goods_issue_0 type c length 1,
l_error_in_final_check_0 type c length 1,
l_error_partner_update type c length 1,
l_error_sernr_update type c length 1.
REFRESH lt_return.
select * into TABLE lt_ekpo from ekpo where ebeln = p_oc.
ls_vbkok-vbeln_vl = l_delivery.
ls_vbkok-wabuc = 'X'. "contabilizar Salida merc.
SELECT vbeln AS vbeln_vl
posnr AS posnr_vl
matnr
charg
lfimg
lgmng
umvkz
umvkn
vrkme
meins
FROM lips
INTO CORRESPONDING FIELDS OF TABLE lt_vbpok
WHERE vbeln EQ l_delivery.
LOOP AT lt_vbpok.
lt_vbpok-vbeln = lt_vbpok-vbeln_vl.
lt_vbpok-posnn = lt_vbpok-posnr_vl.
lt_vbpok-taqui = 'X'. "confirmar picking
MODIFY lt_vbpok.
ENDLOOP.
CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
EXPORTING
vbkok_wa = ls_vbkok
commit = 'X'
delivery = l_delivery
update_picking = 'X'
if_error_messages_send = ' '
IMPORTING
ef_error_any = l_error_any_0
ef_error_in_item_deletion = l_error_in_item_deletion_0
ef_error_in_pod_update = l_error_in_pod_update_0
ef_error_in_interface = l_error_in_interface_0
ef_error_in_goods_issue = l_error_in_goods_issue_0
ef_error_in_final_check = l_error_in_final_check_0
ef_error_partner_update = l_error_partner_update
ef_error_sernr_update = l_error_sernr_update
TABLES
vbpok_tab = lt_vbpok
prot = lt_prot.
IF l_error_any_0 EQ 'X'.
LOOP AT lt_prot where msgty eq 'E'.
MESSAGE ID lt_prot-msgid
TYPE 'I'
NUMBER lt_prot-msgno
WITH lt_prot-msgv1
lt_prot-msgv2
lt_prot-msgv3
lt_prot-msgv4 into g_message.
PERFORM add_news USING 'Entrega Cliente Final:' icon_red_light.
ENDLOOP.
ELSE.
MESSAGE S000(0k) WITH 'Se contabilizó la entrega' l_delivery into g_message.
PERFORM add_news USING 'Entrega Cliente Final:' icon_green_light.
p_contabilizado_cli = 'X'.
ENDIF.
endform.