error en creacion pedido de servicio

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jessiepeque
    Junior Member
    • sep
    • 7

    #1

    error en creacion pedido de servicio

    Hola a todos

    Tengo que crear un pedido de servicio mediante la BAPI_PO_CREATE1, con varias posiciones y estas asociadas a uno ó mas servicios.
    He logrado crear un pedido de servicio con 3 posiciones y cada una de estas con 3 servicios asociados,
    El problema que tengo que intento crear una cuarta posición y me arroja el siguiente error :.

    E - BAPI - 001 - No se ha creado ninguna instancia de tipo objeto PurchaseOrder; ref.externa: - PurchaseOrd
    E - MEPO - 000 - El pedido todavía contiene posiciones erróneas -
    E - SE - 518 - No existe ninguna imputación para la línea de servicios 0000000010 - 0000000010


    La idea es, crear una posicion por cada mes del año y sus respectivos servicios, es decir, deben ir 12 posiciones.

    Adjunto programa

    include zceros_materiales.

    tables : ekko.

    Data: Begin Of tab_grilla Occurs 0,
    marca,
    asnum Like zt001wservicios-asnum, " numero de servicio
    fecini Like zt001wservicios-fecini,
    fecter Like zt001wservicios-fecter,
    waers Like zt001wservicios-waers,
    asktx Like asmdt-asktx,
    enero Type P Decimals 3,
    febrero Type P Decimals 3,
    marzo Type P Decimals 3,
    abril Type P Decimals 3,
    mayo Type P Decimals 3,
    junio Type P Decimals 3,
    julio Type P Decimals 3,
    agosto Type P Decimals 3,
    septiembre Type P Decimals 3,
    octubre Type P Decimals 3,
    noviembre Type P Decimals 3,
    diciembre Type P Decimals 3,
    * datos que no se muestran en la grilla
    tbtwr Like zt001wservicios-tbtwr,
    End of tab_grilla.

    Data: Begin Of tab_pedido Occurs 0,
    monat Type monat,
    asnum Like zt001wservicios-asnum, " numero de servicio
    waers Like zt001wservicios-waers,
    asktx Like asmdt-asktx,
    netwr Type P Decimals 3,
    texto Type TXZ01,
    End of tab_pedido.

    DATA: w_poheader LIKE bapimepoheader,
    w_poheaderx LIKE bapimepoheaderx.

    DATA: gv_pedido LIKE bapimepoheader-po_number.

    DATA: poaccount LIKE bapimepoaccount OCCURS 0 WITH HEADER LINE,
    poaccountx LIKE bapimepoaccountx OCCURS 0 WITH HEADER LINE,
    po_item LIKE bapimepoitem OCCURS 0 WITH HEADER LINE,
    po_itemx LIKE bapimepoitemx OCCURS 0 WITH HEADER LINE,
    service LIKE bapiesllc OCCURS 0 WITH HEADER LINE,
    srvaccessvalues LIKE bapiesklc OCCURS 0 WITH HEADER LINE,
    poextensionin TYPE bapiparex OCCURS 0 WITH HEADER LINE,
    pocond LIKE bapimepocond OCCURS 0 WITH HEADER LINE,
    pocondx LIKE bapimepocondx OCCURS 0 WITH HEADER LINE.

    DATA: return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
    DATA : purchaseorder LIKE BAPIMEPOHEADER-PO_NUMBER,
    lc_resp.

    data : lc_mensaje TYPE string,
    short_text_w Type TXZ01.

    data : w_lt_services_line_no LIKE bapiesllc-line_no.

    data : x_monat Type monat.
    data : x_ebelp Like ekpo-ebelp,
    x_ebelp_s Like ekpo-ebelp,
    x_matkl Like mara-matkl,
    x_total TYPE ukurs,
    x_serial(02) Type n,
    x_pckg Type packno,
    s_pckg Type packno,
    x_line_no(10) Type n,
    l_extrow TYPE extrow.

    * criterios de seleccion
    SELECTION-SCREEN BEGIN OF BLOCK block03 WITH FRAME TITLE text-001.
    PARAMETERS : x_bukrs Type bukrs DEFAULT 'BP01'.
    PARAMETERS : x_bsart Like ekko-bsart DEFAULT 'ZARR'.
    PARAMETERS : x_ekorg Like ekko-ekorg DEFAULT 'OC01'.
    PARAMETERS : x_ekgrp Like ekko-ekgrp DEFAULT 'G04'.
    PARAMETERS : x_waers Like ekko-waers DEFAULT 'UF'.
    PARAMETERS : x_ernam Like ekko-ernam. " DEFAULT 'JVELASQUEZ'.
    PARAMETERS : x_werks Like zt001wcontrato-werks. " DEFAULT 'CD00'.
    PARAMETERS : x_kostl Like zt001wcontrato-kostl. " DEFAULT 'BP01145002'.
    PARAMETERS : x_lifnr Like ekko-lifnr. " DEFAULT '1000004332'.
    PARAMETERS : x_gjahr Type gjahr.
    SELECTION-SCREEN END OF BLOCK block03.

    START-OF-SELECTION.
    perform traspaso_servicios.
    If tab_pedido[] is not initial.
    perform crear_cabecera.
    perform CREAR_ORDEN_SERVICIO.
    EndIf.
    END-OF-SELECTION.

    form traspaso_servicios.

    refresh : tab_grilla, tab_pedido.

    IMPORT tab_grilla FROM MEMORY ID 'Z010_C'.

    Loop AT tab_grilla.

    If tab_grilla-enero is not initial.
    tab_pedido-monat = '01'.
    tab_pedido-netwr = tab_grilla-enero.
    tab_pedido-texto = 'Enero'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-febrero is not initial.
    tab_pedido-monat = '02'.
    tab_pedido-netwr = tab_grilla-febrero.
    tab_pedido-texto = 'Febrero'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-marzo is not initial.
    tab_pedido-monat = '03'.
    tab_pedido-netwr = tab_grilla-marzo.
    tab_pedido-texto = 'Marzo'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-abril is not initial.
    tab_pedido-monat = '04'.
    tab_pedido-netwr = tab_grilla-abril.
    tab_pedido-texto = 'Abril'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-mayo is not initial.
    tab_pedido-monat = '05'.
    tab_pedido-netwr = tab_grilla-mayo.
    tab_pedido-texto = 'Mayo'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-junio is not initial.
    tab_pedido-monat = '06'.
    tab_pedido-netwr = tab_grilla-junio.
    tab_pedido-texto = 'Junio'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-julio is not initial.
    tab_pedido-monat = '07'.
    tab_pedido-netwr = tab_grilla-julio.
    tab_pedido-texto = 'Julio'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-agosto is not initial.
    tab_pedido-monat = '08'.
    tab_pedido-netwr = tab_grilla-agosto.
    tab_pedido-texto = 'Agosto'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-septiembre is not initial.
    tab_pedido-monat = '09'.
    tab_pedido-netwr = tab_grilla-septiembre.
    tab_pedido-texto = 'Septiembre'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-octubre is not initial.
    tab_pedido-monat = '10'.
    tab_pedido-netwr = tab_grilla-octubre.
    tab_pedido-texto = 'Octubre'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    * If tab_grilla-noviembre is not initial.
    tab_pedido-monat = '11'.
    tab_pedido-netwr = tab_grilla-noviembre.
    tab_pedido-texto = 'Noviembre'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    If tab_grilla-diciembre is not initial.
    tab_pedido-monat = '12'.
    tab_pedido-netwr = tab_grilla-diciembre.
    tab_pedido-texto = 'Diciembre'.
    tab_pedido-asnum = tab_grilla-asnum.
    tab_pedido-asktx = tab_grilla-asktx.
    tab_pedido-waers = tab_grilla-waers.
    append tab_pedido.
    EndIf.
    EndLoop.
    endform.

    form crear_cabecera.

    * Carga datos de Cabecera del pedido de Compra
    CLEAR w_poheader.

    w_poheader-doc_type = x_bsart. " Clase de documento de compras
    w_poheader-vendor = x_lifnr. " Número de cuenta del proveedor
    w_poheader-langu = sy-langu. " Clave de idioma
    w_poheader-purch_org = x_ekorg. " Organización de compras
    w_poheader-pur_group = x_ekgrp. " Grupo de compras
    w_poheader-currency = x_waers. " Clave de moneda
    w_poheader-comp_code = x_bukrs. " Sociedad
    w_poheader-creat_date = sy-datum. " Fecha de creación del registro
    w_poheader-created_by = sy-uname. " Nombre del responsable que ha añadido el objeto

    CLEAR w_poheaderx.

    * Marca los campos para que se tomen.
    w_poheaderx-doc_type = 'X'.
    w_poheaderx-vendor = 'X'.
    w_poheaderx-purch_org = 'X'.
    w_poheaderx-pur_group = 'X'.
    w_poheaderx-currency = 'X'.
    w_poheaderx-comp_code = 'X'.
    w_poheaderx-creat_date = 'X'.
    w_poheaderx-created_by = 'X'.
    endform.

    FORM CREAR_ORDEN_SERVICIO.

    x_matkl = '096001001'.
    x_ebelp = 10.
    x_monat = 1.
    x_pckg = 1.

    While x_monat <= 12.

    read table tab_pedido with key monat = x_monat.
    If Sy-Subrc eq 0.
    clear short_text_w.

    concatenate 'Arriendo' tab_pedido-texto x_gjahr into short_text_w separated by space.

    *Posiciones de pedido
    po_item-po_item = x_ebelp. " Número de posición del documento de compras
    po_item-short_text = short_text_w. " Texto breve
    po_item-distrib = space. " Distribución
    po_item-part_inv = space. " Indicador de factura parcial
    po_item-plant = x_werks. " Centro
    po_item-matl_group = x_matkl. " Grupo Artículos
    po_item-pckg_no = x_pckg. " Nº paquete 2748
    po_item-po_unit = 'ST'. " Unidad de medida de pedido
    po_item-acctasscat = 'S'. " Tipo de imputación
    po_item-item_cat = 'F'. " Tipo de posición del documento de compras
    po_item-conv_num1 = '1'. " Numerador para la conversión UMPRP en UMP
    po_item-conv_den1 = '1'. " Denominador para la conversión UMPRP en UMP
    po_item-price_unit = '1'. " cantidad base
    po_item-prnt_price = 'X'. " Impresión de precio
    po_item-unlimited_dlv = 'X'. " Indicador: Exceso de suministro ilimitado
    po_item-gr_ind = 'X' . " Indicador de entrada de mercancías
    po_item-ir_ind = 'X' . " Indicador de recepción de factura
    po_item-gr_basediv = 'X'. " Indicador p.verificación de facturas sobre la base de la EM
    po_item-preq_name = sy-uname. " Nombre del solicitante
    po_item-quantity = 1.
    append po_item.

    CLEAR po_item.

    *Flags de Posiciones de pedido
    po_itemx-po_item = x_ebelp.
    po_itemx-po_itemx = 'X'.
    po_itemx-short_text = 'X'.
    po_itemx-distrib = 'X'.
    po_itemx-part_inv = 'X'.
    po_itemx-plant = 'X'.
    po_itemx-matl_group = 'X'.
    po_itemx-pckg_no = 'X'.
    po_itemx-acctasscat = 'X'.
    po_itemx-item_cat = 'X'.
    po_itemX-po_unit = 'X'.
    po_itemx-conv_num1 = 'X'.
    po_itemx-conv_den1 = 'X'.
    po_itemx-price_unit = 'X'.
    po_itemx-prnt_price = 'X'.
    po_itemx-unlimited_dlv = 'X'.
    po_itemx-gr_ind = 'X' .
    po_itemx-ir_ind = 'X' .
    po_itemx-gr_basediv = 'X'.
    po_itemx-preq_name = 'X'.
    po_itemx-quantity = 'X'.
    append po_itemx.

    CLEAR po_itemx.

    EndIf.

    x_ebelp_s = 10.
    x_serial = 1.
    x_line_no = 1.
    s_pckg = x_pckg.
    l_extrow = 0.

    sort tab_pedido by monat asnum.
    Loop AT tab_pedido Where monat eq x_monat.

    *Imputacion de pedido
    poaccount-po_item = x_ebelp_s. " Número de posición del documento de compras
    poaccount-serial_no = x_serial. "'01'. " Número actual de la imputación
    poaccount-profit_ctr = ''. "x_kostl. " centro de beneficio
    poaccount-creat_date = sy-datum . " Fecha de creación del registro
    poaccount-quantity = 1. " cantidad
    poaccount-costcenter = x_kostl. " Centro de coste
    poaccount-distr_perc = '0'.
    append poaccount.

    CLEAR poaccount.

    *Flags de imputacion
    poaccountx-po_item = x_ebelp_s.
    poaccountx-po_itemx = 'X' .
    poaccountx-serial_no = x_serial.
    poaccountx-serial_nox = 'X'.
    poaccountx-profit_ctr = 'X'.
    poaccountx-creat_date = 'X'.
    poaccountx-quantity = 'X'.
    poaccountx-costcenter = 'X'.
    poaccountx-distr_perc = 'X'.
    append poaccountx.
    CLEAR poaccountx.

    ****** Datos del Encabezado del servicio ******
    add : 1 to l_extrow.
    s_pckg = x_pckg + 1.
    If x_line_no = 1.
    service-pckg_no = x_pckg. " 2748
    service-line_no = x_line_no. "‘0000000001’.
    service-ext_line = '0000000000'. " x_ebelp_s
    service-outl_ind = 'X'.
    service-subpckg_no = s_pckg. " 2749
    service-from_line = '1'.
    service-distrib = space. " 2
    append service.
    CLEAR service.

    x_line_no = x_line_no + 1.
    EndIf.

    ****** Servicio asociado al encabezado ******
    perform ceros_izquierda using tab_pedido-asnum.

    service-pckg_no = s_pckg.
    service-line_no = x_line_no.
    service-ext_line = l_extrow.
    service-subpckg_no = '000000000'.
    service-quantity = '1' .
    service-short_text = tab_pedido-asktx.
    service-service = matnr_w. " Nro de Servicio (ESLL-SRVPOS)
    service-gr_price = tab_pedido-netwr.
    service-distrib = space.
    append service.
    CLEAR service .

    ****** Datos de asignaciones de cuentas – Imputación (en este caso es imputación simple)******
    * Si fuera imputación múltiple hay que agregar más registros, uno por cada distribución
    s_pckg = x_pckg + 1.
    perform Ceros_Izquierda_pos using s_pckg.

    srvaccessvalues-pckg_no = codsap_w.
    srvaccessvalues-line_no = x_line_no. " '0000000002'
    srvaccessvalues-serial_no = x_serial. " '01'
    srvaccessvalues-serno_line = x_serial.
    srvaccessvalues-percentage = '0'.
    srvaccessvalues-quantity = '1'.
    append srvaccessvalues.
    CLEAR srvaccessvalues.

    add : 10 to x_ebelp_s.
    add : 10 to x_serial,
    10 to x_line_no.

    EndLoop.

    add : 10 to x_ebelp.
    add : 10 to x_pckg.
    add : 1 to x_monat.
    EndWhile.

    *Creamos el Pedido de Servicio
    CALL FUNCTION 'BAPI_PO_CREATE1'
    EXPORTING
    poheader = w_poheader
    poheaderx = w_poheaderx
    no_price_from_po = 'X'
    IMPORTING
    exppurchaseorder = purchaseorder
    TABLES
    return = return
    poitem = po_item
    poitemx = po_itemx
    poaccount = poaccount
    poaccountx = poaccountx
    poservices = service
    posrvaccessvalues = srvaccessvalues
    extensionin = poextensionin.
    IF NOT purchaseorder IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

    Do 20 TIMES.
    SELECT SINGLE *
    FROM ekko client specified
    WHERE mandt eq sy-mandt
    And ebeln eq purchaseorder.
    If sy-subrc = 0.
    EXIT.
    Else.
    WAIT UP TO 3 SECONDS.
    EndIf.
    EndDo.

    CONCATENATE 'Generado pedido:' purchaseorder ' ' INTO lc_mensaje.
    MESSAGE : lc_mensaje TYPE 'I'.
    EXPORT purchaseorder TO MEMORY ID 'Z011_C'.

    Else.

    *revierte acciones bapi
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    *notifica error
    CLEAR lc_resp.

    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
    EXPORTING
    defaultoption = 'Y'
    textline1 = 'Error al generar documento.'
    textline2 = '¿Visualiza el LOG de ejecución?'
    titel = 'Confirmación'
    start_column = 20
    start_row = 12
    cancel_display = space
    IMPORTING
    answer = lc_resp.

    If lc_resp = 'J'. "respuesta ‘SI’
    perform visualiza_log_ejecucion.
    EndIf.
    ENDIF.
    ENDFORM.

    FORM visualiza_log_ejecucion.

    DATA: lt_log TYPE TABLE OF string WITH HEADER LINE.

    *PREPARA LOG
    CLEAR lt_log[].

    LOOP AT return.

    CLEAR lt_log.

    CONCATENATE return-type(1)
    '-'
    return-id(20)
    '-'
    return-number(3)
    '-'
    return-message(100)
    '-'
    return-message_v1(50)
    INTO lt_log SEPARATED BY space.
    APPEND lt_log.

    ENDLOOP. "F1_RETURN

    *MUESTRA LOG
    CALL FUNCTION 'POPUP_WITH_TABLE'
    EXPORTING
    endpos_col = 170
    endpos_row = 20
    startpos_col = 10
    startpos_row = 5
    titletext = 'LOG de ejecución'
    TABLES
    valuetab = lt_log
    EXCEPTIONS
    break_off = 1
    OTHERS = 2.

    ENDFORM. "visualiza_log_ejecución

    Espero que alguien me pueda ayudar.
    Saludos
    Jessie
Trabajando...