MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   error en creacion pedido de servicio (foro/showthread.php?t=77027)

jessiepeque 20/04/17 21:44:56

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


Husos Horarios son GMT. La hora en este momento es 13:12:10.

www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web