SAP MM BAPI OC

From SapWiki
Revision as of 18:45, 4 April 2020 by WikiSysop (talk | contribs)

BAPI_PO_CREATE1

Ejemplo 1

 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.

Ejemplo 2, Crear orden de compra con referencia a una factura(al momento de crear factura)

*----------------------------------------------------------------------*
*      Print of a invoice by SAPscript SMART FORMS               *
*----------------------------------------------------------------------*

REPORT zsd_crear_pcompra.

* declaration of data
INCLUDE rlb_invoice_data_declare.
* definition of forms
INCLUDE rlb_invoice_form01.
INCLUDE rlb_print_forms.

*---------------------------------------------------------------------*
*       FORM ENTRY
*---------------------------------------------------------------------*
FORM entry USING return_code us_screen.

  DATA: lf_retcode TYPE sy-subrc.
  CLEAR retcode.
  xscreen = us_screen.
  PERFORM processing USING us_screen
                     CHANGING lf_retcode.
  IF lf_retcode NE 0.
    return_code = 1.
  ELSE.
    return_code = 0.
  ENDIF.

ENDFORM.                    "ENTRY
*---------------------------------------------------------------------*
*       FORM PROCESSING                                               *
*---------------------------------------------------------------------*
FORM processing USING proc_screen
                CHANGING cf_retcode.

  DATA: ls_print_data_to_read TYPE lbbil_print_data_to_read.
  DATA: ls_bil_invoice TYPE lbbil_invoice.
  DATA: lf_fm_name            TYPE rs38l_fnam.
  DATA: ls_control_param      TYPE ssfctrlop.
  DATA: ls_composer_param     TYPE ssfcompop.
  DATA: ls_recipient          TYPE swotobjid.
  DATA: ls_sender             TYPE swotobjid.
  DATA: lf_formname           TYPE tdsfname.
  DATA: ls_addr_key           LIKE addr_key.
  DATA: ls_dlv-land           LIKE vbrk-land1.
  DATA: ls_job_info           TYPE ssfcrescl.

   DATA ld_vbeln LIKE vbrk-vbeln.

* SmartForm from customizing table TNAPR
  lf_formname = tnapr-sform.

  IF nast-objky+10 NE space.
    nast-objky = nast-objky+16(10).
  ELSE.
    nast-objky = nast-objky.
  ENDIF.

  ld_vbeln = nast-objky.


*  IF cf_retcode = 0.
    CALL FUNCTION 'Z_MM_BAPI_PO_CREATE1' in BACKGROUND TASK
*    AS SEPARATE UNIT DESTINATION 'NONE'
      EXPORTING
        I_VBELN       = ld_vbeln
        i_nast        = nast
*     IMPORTING
*       O_EBELN       =
              .
*  ENDIF.

* get SmartForm protocoll and store it in the NAST protocoll
* PERFORM ADD_SMFRM_PROT.

* get SmartForm protocoll and store it in the NAST protocoll
* PERFORM ADD_SMFRM_PROT.

ENDFORM.                    "PROCESSING

FUNCTION Z_MM_BAPI_PO_CREATE1.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     VALUE(I_VBELN) TYPE  VBRK-VBELN
*"     VALUE(I_NAST) TYPE  NAST OPTIONAL
*"  EXPORTING
*"     VALUE(O_EBELN) TYPE  EKKO-EBELN
*"  EXCEPTIONS
*"      DOC_NO_EXISTE
*"----------------------------------------------------------------------
  data ls_knmt type knmt.
  data ld_AMOUNT_EXTERNAL LIKE  BAPICURR-BAPICURR.

  nast = i_nast.

  select single * into gs_vbrk from vbrk where vbeln = i_vbeln.
  if sy-subrc <> 0.
    if nast is NOT INITIAL.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3.
      CALL FUNCTION 'NAST_PROTOCOL_INITIALIZE'.
      sy-msgid = 'VN'.
      sy-msgno = '056'.
      sy-msgty = 'I'.
      sy-msgv1 = 'ZSD_CREAR_PCOMPRA'  .
      sy-msgv2 = 'ENTRY'.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = sy-msgid
          msg_nr    = sy-msgno
          msg_ty    = sy-msgty
          msg_v1    = sy-msgv1
          msg_v2    = sy-msgv2
        EXCEPTIONS
          OTHERS    = 0.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3.
      syst-msgid = 'VF'.
      syst-msgno = '041'.
      syst-msgty = 'E'.
      syst-msgv1 = i_vbeln.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = syst-msgid
          msg_nr    = syst-msgno
          msg_ty    = syst-msgty
          msg_v1    = syst-msgv1
          msg_v2    = syst-msgv2
          msg_v3    = syst-msgv3
        EXCEPTIONS
          OTHERS    = 1.
      NAST-VSTAT = '2'.
      PERFORM protocol_store USING    nast-kappl
                                nast-kschl
                       CHANGING nast-cmfpnr.
      PERFORM nast_update.
      COMMIT WORK AND WAIT.
    endif.
    RAISE doc_no_existe.
  endif.

  if gs_vbrk-FKSTO = 'X'.
    if nast is NOT INITIAL.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3.
      CALL FUNCTION 'NAST_PROTOCOL_INITIALIZE'.
      sy-msgid = 'VN'.
      sy-msgno = '056'.
      sy-msgty = 'I'.
      sy-msgv1 = 'ZSD_CREAR_PCOMPRA'  .
      sy-msgv2 = 'ENTRY'.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = sy-msgid
          msg_nr    = sy-msgno
          msg_ty    = sy-msgty
          msg_v1    = sy-msgv1
          msg_v2    = sy-msgv2
        EXCEPTIONS
          OTHERS    = 0.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3.
      syst-msgid = 'VF'.
      syst-msgno = '041'.
      syst-msgty = 'E'.
      syst-msgv1 = 'Factura está anulada'.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = syst-msgid
          msg_nr    = syst-msgno
          msg_ty    = syst-msgty
          msg_v1    = syst-msgv1
          msg_v2    = syst-msgv2
          msg_v3    = syst-msgv3
        EXCEPTIONS
          OTHERS    = 1.
      NAST-VSTAT = '2'.
      PERFORM protocol_store USING    nast-kappl
                                nast-kschl
                       CHANGING nast-cmfpnr.
      PERFORM nast_update.
      COMMIT WORK AND WAIT.
    endif.
    RAISE doc_no_existe.
  endif.


  select * into table gt_vbrp from vbrp where vbeln = i_vbeln.

  read TABLE gt_vbrp into gs_VBRP index 1.
*--------------------------------------------------------------------*
* datos cabecera
*--------------------------------------------------------------------*
  CLEAR: gs_poheader,
         gs_poheaderx.

*---- Clase Documento
  gs_poheader-doc_type  = 'ZCAD'.
  gs_poheaderx-doc_type = 'X'.

*---- Proveedor
  select single EIKTO into gs_poheader-VENDOR from KNVV
                where KUNNR = gs_VBRK-KUNRG
                and VKORG = gs_VBRK-VKORG
                and VTWEG = gs_VBRK-VTWEG
                and SPART = gs_VBRK-SPART.
*  gs_poheader-VENDOR     = gs_vbrk-kunrg.
*  gs_poheader-VENDOR     = 'COMPANY'.
  gs_poheaderx-VENDOR    = 'X'.

****FECHA CREACION
  gs_poheader-CREAT_DATE   = gs_VBRP-PRSDT.
  gs_poheaderx-CREAT_DATE = 'X'.

*---- Org. de Compra
  gs_poheader-purch_org  = 'OCCA'.
  gs_poheaderx-purch_org = 'X'.

*---- Grupo de Compra
  gs_poheader-PUR_GROUP   = 'C15'.
  gs_poheaderx-PUR_GROUP  = 'X'.

*---- Sociedad
  gs_poheader-comp_code  = '8000'.
  gs_poheaderx-comp_code = 'X'.

****tipo de cambio
  gs_poheader-EXCH_RATE   = gs_VBRK-KURRF.
  gs_poheaderx-EXCH_RATE = 'X'.

****tipo de cambio fijado
  gs_poheader-EX_RATE_FX  = 'X'. "gs_VBRK-CPKUR.
  gs_poheaderx-EX_RATE_FX = 'X'.

****factura
  gs_poheader-COLLECT_NO = gs_VBRK-VBELN.
  gs_poheaderx-collect_no = 'X'.

****moneda
  gs_poheader-CURRENCY = gs_VBRK-waerk.
  gs_poheaderx-CURRENCY = 'X'.

****fecha documento
  gs_poheader-DOC_DATE = gs_VBRP-PRSDT.
  gs_poheaderx-doc_date = 'X'.
*--------------------------------------------------------------------*
* datos posición
*--------------------------------------------------------------------*
  CLEAR  : gt_poitem[],
           gt_poitemx[],
           gt_POSCHEDULE[],
           gt_POSCHEDULEx[],
           gt_POACCOUNT[],
           gt_POACCOUNTx[],
           gt_return[].

*---- Actualizar posiciones del documento
  LOOP AT gt_vbrp INTO gs_vbrp.
    clear: gs_poitemx,
           gs_poitem,
           gs_POSCHEDULE,
           gs_POSCHEDULEx,
           gs_POACCOUNT,
           gs_POACCOUNTx,
           ls_knmt.

*---- Posición
    gs_poitem-po_item   = gs_VBRP-POSNR.
    gs_poitemx-po_item  = gs_VBRP-POSNR.
    gs_poitemx-po_itemx = 'X'.

    gs_POSCHEDULE-po_item = gs_VBRP-POSNR.
    gs_POSCHEDULEx-po_item = gs_VBRP-POSNR.
    gs_POSCHEDULEx-po_itemx = 'X'.

    gs_POACCOUNT-po_item =  gs_VBRP-POSNR.
    gs_POACCOUNTx-po_item = gs_VBRP-POSNR.
    gs_POACCOUNTx-po_itemx = 'X'.

*---- Material
    SELECT single * into ls_knmt FROM  knmt
           WHERE  vkorg  = gs_vbrk-vkorg
           AND    vtweg  = gs_vbrk-vtweg
           AND    kunnr  = gs_vbrk-kunrg
           AND    matnr  = gs_vbrp-matnr.


    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = ls_knmt-KDMAT
      IMPORTING
        output       = gs_poitem-material
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.

** tipo imputacion
    case ls_knmt-VWPOS.
      when 'ZK'."Centro de costo
        gs_poitem-ACCTASSCAT  = 'J'.
        data: v_tabla like ausp occurs 0 with header line, "v_tabla TYPE TABLE OF ausp,
              v_OBJECT like KSSK-OBJEK.
        move gs_poitem-material to v_OBJECT.
        CALL FUNCTION 'CLA2_GET_ALL_ALLOCATIONS'
          EXPORTING
            OBJECT                   = v_OBJECT
            CLASS_TYPE               = '001'
            ALLOC_ID                 = 'O'
            TABLE                    = 'MARA'
           KEY_DATE                 = SY-DATUM
          TABLES
           VALUES                   = v_tabla
*           ALLOCATIONS              =
*         EXCEPTIONS
*           INVALID_CLASS_TYPE       = 1
*           INVALID_OBJECT           = 2
*           OTHERS                   = 3
.
        IF SY-SUBRC = 0.
          read TABLE v_tabla WITH KEY ATINN = 'ZMAT_CECO_CCNI'.
          data V_CECO(10) type N.
          move V_TABLA-ATWRT to V_CECO.
          gs_POACCOUNT-COSTCENTER = V_CECO.
*         move V_TABLA-ATWRT to gs_POACCOUNT-COSTCENTER.
*         gs_POACCOUNT-COSTCENTER = '0080100100'.
          gs_POACCOUNTx-COSTCENTER = 'X'.
        ENDIF.
      when 'ZP'."Elemento PEP
        gs_poitem-ACCTASSCAT  = 'X'.
        data V_IHREZ like vbkd-IHREZ.
        select single IHREZ into V_IHREZ from vbkd
          where VBELN = GS_VBRP-AUBEL
          and POSNR = GS_VBRP-AUPOS.
        if sy-subrc <> 0.
          select single IHREZ into V_IHREZ from vbkd
          where VBELN = GS_VBRP-AUBEL.
        endif.
        data: V_EQUNR(18) type N..
        move V_IHREZ to V_EQUNR.
*        CONDENSE V_EQUNR.
        select single ZZPOSID into gs_POACCOUNT-WBS_ELEMENT from EQUI
          where EQUNR = V_EQUNR.
        gs_POACCOUNTx-WBS_ELEMENT = 'X'.

    endcase.
    gs_poitemx-ACCTASSCAT = 'X'.

*    gs_poitem-material  = ls_knmt-KDMAT.
    gs_poitemx-material = 'X'.

*---- Cantidad
    gs_poitem-quantity  = gs_VBRP-FKIMG.
    gs_poitemx-quantity = 'X'.

***fecha entrega
    gs_POSCHEDULE-DELIVERY_DATE = gs_VBRP-PRSDT.
    gs_POSCHEDULEx-DELIVERY_DATE =  gs_VBRP-PRSDT.

* monto neto
    CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
      EXPORTING
        CURRENCY        = gs_vbrk-waerk
        AMOUNT_INTERNAL = gs_VBRP-NETWR
      IMPORTING
        AMOUNT_EXTERNAL = ld_AMOUNT_EXTERNAL.
    .

    move ld_AMOUNT_EXTERNAL to gs_poitem-NET_PRICE .
*    gs_poitem-NET_PRICE    = gs_VBRP-NETWR.
    gs_poitemx-NET_PRICE   = 'X'.

    gs_poitem-PO_PRICE = '2'.
    gs_poitemx-PO_PRICE = 'X'.

*gs_poaccount-NET_VALUE =
*gs_poaccountx-NET_VALUE =

*---- Centro Destino
    gs_poitem-plant  = 'CC04'.
    gs_poitemx-plant = 'X'.

*---- División
    gs_POACCOUNT-BUS_AREA  = 'CL01'.
    gs_POACCOUNTx-BUS_AREA = 'X'.


***ind impuesto
    case gs_vbrk-FKART.
      when 'ZFEA'.
        gs_poitem-TAX_CODE  = 'A0'.
        gs_poitemx-TAX_CODE = 'X'.
      when 'ZFEN'.
        gs_poitem-TAX_CODE  = 'E0'.
        gs_poitemx-TAX_CODE = 'X'.
    endcase.

* nro necesidad
    gs_poitem-TRACKINGNO = gs_VBRP-vbelv.
    gs_poitemx-TRACKINGNO = 'X'.

* Verif MIGO
    gs_poitem-GR_BASEDIV  = space.
    gs_poitemx-GR_BASEDIV = 'X'.

*---- Grabar Datos
    APPEND gs_poitem TO  gt_poitem.
    APPEND gs_poitemx TO gt_poitemx.

    append gs_POSCHEDULE to gt_POSCHEDULE.
    append gs_POSCHEDULEx to gt_POSCHEDULEx.

    append gs_POACCOUNT to gt_POACCOUNT.
    append gs_POACCOUNTx to gt_POACCOUNTx.

  ENDLOOP.

  CALL FUNCTION 'BAPI_PO_CREATE1'
    EXPORTING
      poheader         = gs_poheader
      poheaderx        = gs_poheaderx
    IMPORTING
      exppurchaseorder = gd_ebeln
    TABLES
      return           = gt_return
      poitem           = gt_poitem
      poitemx          = gt_poitemx
      POSCHEDULE       = gt_POSCHEDULE
      POSCHEDULEx      = gt_POSCHEDULEx
      POACCOUNT        = gt_POACCOUNT
      POACCOUNTx       = gt_POACCOUNTx.

*error
  LOOP AT gt_return  into gs_return WHERE type = 'E'
                OR type = 'A'.
  ENDLOOP.
  IF sy-subrc = 0.
    if nast is NOT INITIAL.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3.
      CALL FUNCTION 'NAST_PROTOCOL_INITIALIZE'.
      sy-msgid = 'VN'.
      sy-msgno = '056'.
      sy-msgty = 'I'.
      sy-msgv1 = 'ZSD_CREAR_PCOMPRA'  .
      sy-msgv2 = 'ENTRY'.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = sy-msgid
          msg_nr    = sy-msgno
          msg_ty    = sy-msgty
          msg_v1    = sy-msgv1
          msg_v2    = sy-msgv2
        EXCEPTIONS
          OTHERS    = 0.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3.
      syst-msgid = gs_return-id.
      syst-msgno = gs_return-number.
      syst-msgty = 'E'.
      syst-msgv1 = gs_return-message_v1.
      syst-msgv2 = gs_return-message_v2.
      syst-msgv3 = gs_return-message_v3.
      syst-msgv4 = gs_return-message_v4.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = syst-msgid
          msg_nr    = syst-msgno
          msg_ty    = syst-msgty
          msg_v1    = syst-msgv1
          msg_v2    = syst-msgv2
          msg_v3    = syst-msgv3
        EXCEPTIONS
          OTHERS    = 1.
      NAST-VSTAT = '2'.
      PERFORM protocol_store USING    nast-kappl
                                nast-kschl
                       CHANGING nast-cmfpnr.
      PERFORM nast_update.
      COMMIT WORK AND WAIT.
    endif.
    return.   "<------------------------

*---- Grabar Documento
  elseIF ( NOT gd_ebeln IS INITIAL ).
    if nast is NOT INITIAL.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3.
      CALL FUNCTION 'NAST_PROTOCOL_INITIALIZE'.
      sy-msgid = 'VN'.
      sy-msgno = '056'.
      sy-msgty = 'S'.
      sy-msgv1 = 'ZSD_CREAR_PCOMPRA'  .
      sy-msgv2 = 'ENTRY'.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = sy-msgid
          msg_nr    = sy-msgno
          msg_ty    = sy-msgty
          msg_v1    = sy-msgv1
          msg_v2    = sy-msgv2
        EXCEPTIONS
          OTHERS    = 0.
      CLEAR : syst-msgv1, syst-msgv2, syst-msgv3,syst-msgv4.
      syst-msgid = '06'.
      syst-msgno = '017'.
      syst-msgty = 'S'.
      syst-msgv1 = 'PED.CCNI'.
      syst-msgv2 = gd_ebeln.
      CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
        EXPORTING
          msg_arbgb = syst-msgid
          msg_nr    = syst-msgno
          msg_ty    = syst-msgty
          msg_v1    = syst-msgv1
          msg_v2    = syst-msgv2
        EXCEPTIONS
          OTHERS    = 1.
      NAST-VSTAT = '1'.
      PERFORM protocol_store USING nast-kappl
                                   nast-kschl
                          CHANGING nast-cmfpnr.
      PERFORM nast_update.
    endif.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.

    o_ebeln = gd_ebeln.
  Endif.

ENDFUNCTION.

FORM PROTOCOL_STORE USING    VALUE(PI_KAPPL) LIKE NAST-KAPPL
                            VALUE(PI_KSCHL) LIKE NAST-KSCHL
                   CHANGING P_CMFPNR  LIKE NAST-CMFPNR.
 DATA: L_NAST_CMFPNR LIKE NAST-CMFPNR.
* store protocol entries for this message type?
   CALL FUNCTION 'NAST_PROTOCOL_STORE'
        IMPORTING
             MSG_CMFPNR         = L_NAST_CMFPNR
        EXCEPTIONS
             NO_PROTOCOL_UPDATE = 01.
   IF SY-SUBRC EQ 0.
     P_CMFPNR = L_NAST_CMFPNR.
   ENDIF.
ENDFORM.

FORM NAST_UPDATE .
   UPDATE NAST.
   IF SY-SUBRC NE 0.
     INSERT NAST.
     IF SY-SUBRC NE 0.
     ENDIF.
   ENDIF.
ENDFORM.                    " NAST_UPDATE