SAP MM BAPI
From SapWiki
BAPI_PO_CREATE1
form crear_pedido CHANGING p_oc. * Rutina que crea los pedidos de traslado (ME21N) DATA: ls_header TYPE bapimepoheader, ls_headerx TYPE bapimepoheaderx, lt_items TYPE STANDARD TABLE OF bapimepoitem, ls_items TYPE bapimepoitem, lt_itemsx TYPE STANDARD TABLE OF bapimepoitemx, ls_itemsx TYPE bapimepoitemx, lt_schedules TYPE STANDARD TABLE OF bapimeposchedule, ls_schedules TYPE bapimeposchedule, lt_schedulesx TYPE STANDARD TABLE OF bapimeposchedulx, ls_schedulesx TYPE bapimeposchedulx, lt_return TYPE TABLE OF bapiret2, ls_return TYPE bapiret2, l_item_idx TYPE I, l_numped TYPE bapiekkoc-po_number. CLEAR: ls_header, ls_headerx. ls_header-doc_type = 'ZXXX'. SELECT SINGLE EKORG EKGRP BUKRS lifnr INTO (ls_header-purch_org,ls_header-pur_group,ls_header-comp_code,ls_header-VENDOR) FROM ekko WHERE ebeln = wa_data-zzcontrato. ls_header-suppl_plnt = wa_data-werks_ori. ls_header-doc_date = sy-datum. ls_header-REF_1 = wa_data-vbeln. ls_headerx-doc_type = 'X'. ls_headerx-purch_org = 'X'. ls_headerx-pur_group = 'X'. ls_headerx-comp_code = 'X'. ls_headerx-suppl_plnt = 'X'. ls_headerx-doc_date = 'X'. ls_headerX-REF_1 = 'X'. ls_headerX-VENDOR = 'X'. *Grabamos las tablas correspondientes a los materiales y repartos l_item_idx = wa_data-posnr. ls_items-po_item = l_item_idx. ls_items-material = wa_data-matnr. ls_items-plant = wa_data-werks_sumi. ls_items-stge_loc = wa_data-lgort_sumi. *ls_items-item_cat = '7'. ls_items-po_unit = wa_data-VRKME. ls_items-TRACKINGNO = wa_data-posnr. "wa_data-vbeln. "N° necesidad ls_items-QUANTITY = wa_data-KWMENG. ls_items-agreement = wa_data-zzcontrato. select SINGLE * into @data(ls_ekpo) from ekpo where ebeln = @wa_data-zzcontrato and LOEKZ <> 'X'. ls_items-agmt_item = ls_ekpo-ebelp. select SINGLE NETWR INTO ls_items-net_price from vbap where vbeln = wa_data-vbeln and posnr = wa_data-posnr. *ls_items-no_rounding = 'X'. APPEND ls_items TO lt_items. ls_itemsx-po_item = l_item_idx. ls_itemsx-po_itemx = 'X'. ls_itemsx-material = 'X'. ls_itemsx-plant = 'X'. ls_itemsx-stge_loc = 'X'. *ls_itemsx-item_cat = 'X'. ls_itemsx-po_unit = 'X'. *ls_itemsx-no_rounding = 'X'. ls_itemsx-TRACKINGNO = 'X'. ls_itemsX-QUANTITY = 'X'. ls_itemsX-agreement = 'X'. ls_itemsX-agmt_item = 'X'. ls_itemsX-net_price = 'X'. APPEND ls_itemsx TO lt_itemsx. ls_schedules-po_item = l_item_idx. ls_schedules-quantity = wa_data-KWMENG. ls_schedules-delivery_date = wa_data-edatu. APPEND ls_schedules TO lt_schedules. ls_schedulesx-po_item = l_item_idx. ls_schedulesx-po_itemx = 'X'. ls_schedulesx-quantity = 'X'. ls_schedulesx-delivery_date = 'X'. APPEND ls_schedulesx TO lt_schedulesx. * Llamamos a la BAPI para crear el pedido de traslados CALL FUNCTION 'BAPI_PO_CREATE1' EXPORTING poheader = ls_header poheaderx = ls_headerx IMPORTING exppurchaseorder = l_numped TABLES RETURN = lt_return poitem = lt_items poitemx = lt_itemsx poschedule = lt_schedules poschedulex = lt_schedulesx . if l_numped is INITIAL. * 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>). ENDLOOP. EXIT. ENDLOOP. IF sy-subrc = 0. move <ls_return>-message to g_message. PERFORM add_news USING 'Crear Pedido:' icon_red_light. wa_data-stat = icon_red_light. ENDIF. else. * éxito CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'. p_oc = l_numped. * Pedido grabado correctamente, lo informamos en el log MESSAGE i000(0K) WITH 'Pedido grabado correctamente' l_numped INTO g_message. PERFORM add_news USING 'Crear Pedido:' icon_green_light. wa_data-stat = icon_green_light. endif. CLEAR: lt_items, lt_schedules, lt_itemsx, lt_schedulesx. REFRESH: lt_items, lt_schedules, lt_itemsx, lt_schedulesx. ENDFORM.
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