REPORT ZPRG_COPIA_PEDIDO.
tables: DD03L.
PARAMETERS: p_pedido type EBELN MATCHCODE OBJECT MEKK_C OBLIGATORY.
SELECTION-SCREEN skip 1.
PARAMETERS p_test as CHECKBOX DEFAULT 'X'.
DATA: ls_header_po TYPE bapimepoheader,
ls_header_pox TYPE bapimepoheaderx,
lt_return_po TYPE TABLE OF bapiret2,
lt_item_po TYPE TABLE OF bapimepoitem,
lt_item_pox TYPE TABLE OF bapimepoitemx,
lt_addr_po TYPE TABLE OF bapimepoaddrdelivery,
lt_sched_po TYPE TABLE OF bapimeposchedule,
lt_sched_pox TYPE TABLE OF bapimeposchedulx,
lt_cond_po TYPE TABLE OF bapimepocond,
lt_cond_pox TYPE TABLE OF bapimepocondx,
lt_extin_po TYPE TABLE OF bapiparex,
lc_item_po TYPE bapimepoitem,
lc_item_pox TYPE bapimepoitemx,
lc_addr_po TYPE bapimepoaddrdelivery,
lc_sched_po TYPE bapimeposchedule,
lc_sched_pox TYPE bapimeposchedulx,
lc_cond_po TYPE bapimepocond,
lc_cond_pox TYPE bapimepocondx,
lc_extin_po TYPE bapiparex,
lt_return type TABLE OF BAPIRET2,
lv_rc TYPE return.
TYPES: BEGIN OF ty_log_propuesta,
ICON(4),
ebeln(10),
des_error(255),
END OF ty_log_propuesta.
data: t_alv_log type table of ty_log_propuesta,
c_alv_log type ty_log_propuesta.
include /GECI/MM_I_COPIA_PEDIDO_ALV.
end-of-SELECTION.
PERFORM load_data.
perform check_data.
form check_data.
if ls_header_po-DOC_TYPE ne 'XXX'.
perform procesa_pox.
perform procesa_poext.
perform procesa_po.
perform list_data.
else.
message s398(00) with text-e02. "<- Tipo de pedido incorrecto
endif.
ENDFORM.
form list_data.
CREATE OBJECT lv_zcl_alv." EXPORTING i_titulo = 'Título'.
lv_zcl_alv->puv_data->puv_t_data[] = t_alv_log[].
lv_zcl_alv->alv_display( ).
endform.
form procesa_pox.
*--[ Borramos los campos que ha pedido
clear: ls_header_po-REF_1, ls_header_po-OUR_REF.
perform tables_pox USING 'ls_header_po' 'ls_header_pox'.
loop at lt_item_po into lc_item_po.
* MOVE-CORRESPONDING lc_item_po to lc_item_pox.
clear lc_item_pox.
perform tables_pox USING 'lc_item_po' 'lc_item_pox'.
lc_item_pox-PO_ITEM = lc_item_po-PO_ITEM.
append lc_item_pox to lt_item_pox.
endloop.
LOOP AT lt_sched_po INTO lc_sched_po.
* move-CORRESPONDING lc_sched_po to lc_sched_pox.
clear lc_sched_pox.
PERFORM tables_pox USING 'lc_sched_po' 'lc_sched_pox'.
lc_sched_pox-PO_ITEM = lc_sched_po-PO_ITEM.
lc_sched_pox-SCHED_LINE = lc_sched_po-SCHED_LINE.
APPEND lc_sched_pox TO lt_sched_pox.
ENDLOOP.
LOOP AT lt_cond_po INTO lc_cond_po.
* MOVE-CORRESPONDING lc_cond_po to lc_cond_pox.
*--[ Borramos las condiciones
clear lc_cond_po-CONDITION_NO.
lc_cond_po-CHANGE_ID = 'I'.
modify lt_cond_po from lc_cond_po INDEX sy-tabix.
clear lc_cond_pox.
PERFORM tables_pox USING 'lc_cond_po' 'lc_cond_pox'.
lc_cond_pox-CONDITION_NO = lc_cond_po-CONDITION_NO.
lc_cond_pox-ITM_NUMBER = lc_cond_po-ITM_NUMBER.
lc_cond_pox-COND_ST_NO = lc_cond_po-COND_ST_NO.
APPEND lc_cond_pox TO lt_cond_pox.
ENDLOOP.
endform.
form tables_pox using origen destino.
FIELD-SYMBOLS: <campo_ori> TYPE any,
<campo_des> TYPE any,
<fs_origen> type any,
<fs_destino> type any.
data: lv_tabla(50).
case destino.
wHEN 'ls_header_pox'. lv_tabla = 'bapimepoheaderx'.
WHEN 'lc_item_pox'. lv_tabla = 'bapimepoitemx'.
WHEN 'lc_sched_pox'. lv_tabla = 'bapimeposchedulx'.
WHEN 'lc_cond_pox'. lv_tabla = 'bapimepocondx'.
when OTHERS.
exit.
endcase.
TRANSLATE lv_tabla to UPPER CASE.
SELECT * FROM DD03L
WHERE TABNAME = lv_tabla
and INTLEN = 1
order by position.
CONCATENATE origen '-' DD03L-FIELDNAME into sy-lisel.
assign (sy-lisel) to <fs_origen>.
if sy-subrc eq 0.
CONCATENATE destino '-' DD03L-FIELDNAME into sy-lisel.
assign (sy-lisel) to <fs_destino>.
if sy-subrc eq 0.
if not <fs_origen> is INITIAL.
<fs_destino> = 'X'.
endif.
endif.
else.
sy-pagno = strlen( sy-lisel ) - 1.
if sy-lisel+sy-pagno(1) = 'X'.
sy-lisel+sy-pagno(1) = ' '.
assign (sy-lisel) to <fs_origen>.
if sy-subrc eq 0.
CONCATENATE destino '-' DD03L-FIELDNAME into sy-lisel.
assign (sy-lisel) to <fs_destino>.
if sy-subrc eq 0.
if not <fs_origen> is INITIAL.
<fs_destino> = 'X'.
endif.
endif.
endif.
endif.
endif.
ENDSELECT.
* assign (origen) to <fs_origen>.
* assign (destino) to <fs_destino>.
* DO.
* ASSIGN COMPONENT sy-INDEX OF STRUCTURE <fs_origen> TO <campo_ori>.
* ASSIGN COMPONENT sy-INDEX OF STRUCTURE <fs_destino> TO <campo_des>.
* IF sy-subrc <> 0.
* EXIT.
* ENDIF.
* if not <campo_ori> is INITIAL.
* <campo_des> = 'X'.
* endif.
* ENDDO.
endform.
form procesa_poext.
data: lv_ext type ZGECI_MM_ST_POITEM,
lv_ext_aux type ZGECI_MM_ST_POITEM,
lv_extx type BAPI_TE_MEPOITEMX,
lv_extx_aux type BAPI_TE_MEPOITEMX,
lv_BAPI_TE_MEPOHEADER type BAPI_TE_MEPOHEADER,
lv_BAPI_TE_MEPOHEADER_aux type BAPI_TE_MEPOHEADER,
lv_BAPI_TE_MEPOHEADERX type BAPI_TE_MEPOHEADERX,
lv_BAPI_TE_MEPOHEADERX_aux type BAPI_TE_MEPOHEADERX,
lv_ebelp type ebelp,
lv_sytabix type sytabix,
lt_extin_po_aux TYPE TABLE OF bapiparex.
clear lt_extin_po_aux.
refresh lt_extin_po_aux.
loop at lt_extin_po into lc_extin_po.
clear lv_ext_aux.
lv_sytabix = sy-tabix.
lv_ebelp = lc_extin_po-VALUEPART1+0(5).
if lc_extin_po-STRUCTURE eq 'BAPI_TE_MEPOITEM'.
CALL METHOD /GECI/MM_CL_PO_UTILITIES=>MAPPING_EXT_TO_STRUC
EXPORTING
EXTENSION = lc_extin_po
IMPORTING
FIELDS_Z = lv_ext.
*--[ Movemos sólo los campos que nos indica
* lv_ext_aux-ZZ.... = lv_ext-ZZ.... "<-- Aquí movemos los campos Z que necesitamos
CALL METHOD /GECI/MM_CL_PO_UTILITIES=>MAPPING_STRUC_TO_EXT
EXPORTING
EBELP = lv_ebelp
IM_STRUC = lv_ext_aux
IMPORTING
CADENA = lc_extin_po-VALUEPART1.
append lc_extin_po to lt_extin_po_aux.
* endif.
* if lc_extin_po-STRUCTURE cp '*POITEMX'.
clear lv_extx_aux.
*--[ Movemos sólo los campos que nos indica
CONCATENATE lc_extin_po-STRUCTURE 'X' into lc_extin_po-STRUCTURE.
lv_extx_aux-PO_ITEM = lv_ebelp.
* lv_ext_aux-ZZ.... = 'X'. "<-- Aquí movemos los campos Z que necesitamos
lc_extin_po-VALUEPART1 = lv_extx_aux.
append lc_extin_po to lt_extin_po_aux.
elseif lc_extin_po-STRUCTURE eq 'BAPI_TE_MEPOHEADER'.
lv_BAPI_TE_MEPOHEADER = lc_extin_po-VALUEPART1.
clear lv_BAPI_TE_MEPOHEADER_aux.
* lv_BAPI_TE_MEPOHEADER_aux-ZZ... = lv_BAPI_TE_MEPOHEADER-ZZ... . "<-- Aquí movemos los campos Z que necesitamos
lc_extin_po-VALUEPART1 = lv_BAPI_TE_MEPOHEADER_aux.
append lc_extin_po to lt_extin_po_aux.
* endif.
* if lc_extin_po-STRUCTURE cp '*HEADER*X'.
CONCATENATE lc_extin_po-STRUCTURE 'X' into lc_extin_po-STRUCTURE.
lv_BAPI_TE_MEPOHEADERX = lc_extin_po-VALUEPART1.
clear lv_BAPI_TE_MEPOHEADERX_aux.
* lv_BAPI_TE_MEPOHEADERX_aux-ZZ... = 'X' . "<-- Aquí movemos los campos Z que necesitamos
lc_extin_po-VALUEPART1 = lv_BAPI_TE_MEPOHEADERX_aux.
append lc_extin_po to lt_extin_po_aux.
else.
append lc_extin_po to lt_extin_po_aux.
endif.
*--[ Restauramos
ENDLOOP.
lt_extin_po[] = lt_extin_po_aux[].
ENDFORM.
form load_data.
CALL FUNCTION 'BAPI_PO_GETDETAIL1'
EXPORTING
PURCHASEORDER = p_pedido
* ACCOUNT_ASSIGNMENT = ' '
* ITEM_TEXT = ' '
* HEADER_TEXT = ' '
DELIVERY_ADDRESS = 'X'
* VERSION = ' '
* SERVICES = ' '
* SERIALNUMBERS = ' '
* INVOICEPLAN = ' '
IMPORTING
POHEADER = ls_header_po
* POEXPIMPHEADER =
TABLES
RETURN = lt_return
POITEM = lt_item_po
POADDRDELIVERY = lt_addr_po
POSCHEDULE = lt_sched_po
* POACCOUNT =
* POCONDHEADER =
POCOND = lt_cond_po
* POLIMITS =
* POCONTRACTLIMITS =
* POSERVICES =
* POSRVACCESSVALUES =
* POTEXTHEADER =
* POTEXTITEM =
* POEXPIMPITEM =
* POCOMPONENTS =
* POSHIPPINGEXP =
* POHISTORY =
* POHISTORY_TOTALS =
* POCONFIRMATION =
* ALLVERSIONS =
* POPARTNER =
EXTENSIONOUT = lt_extin_po
* SERIALNUMBER =
* INVPLANHEADER =
* INVPLANITEM =
* POHISTORY_MA =
.
endform .
form procesa_po.
clear LS_HEADER_PO-PO_NUMBER. "<-- Creamos un nuevo registro?
PERFORM process_document TABLES
lt_item_po
lt_item_pox
lt_addr_po
lt_sched_po
lt_sched_pox
lt_cond_po
lt_cond_pox
lt_extin_po
CHANGING ls_header_po
ls_header_pox
lv_rc.
endform.
FORM process_document TABLES
pt_item_po STRUCTURE bapimepoitem
pt_item_pox STRUCTURE bapimepoitemx
pt_addr_po STRUCTURE bapimepoaddrdelivery
pt_sched_po STRUCTURE bapimeposchedule
pt_sched_pox STRUCTURE bapimeposchedulx
pt_cond_po STRUCTURE bapimepocond
pt_cond_pox STRUCTURE bapimepocondx
pt_extin_po STRUCTURE bapiparex
CHANGING ps_header_po TYPE bapimepoheader
ps_header_pox TYPE bapimepoheaderx
p_rc.
DATA: lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2,
ls_error TYPE ty_log_propuesta,
lt_item TYPE TABLE OF bapimepoitem,
lt_itemx TYPE TABLE OF bapimepoitemx,
lt_lug_ent TYPE TABLE OF BAPIMEPOADDRDELIVERY,
lt_posch TYPE TABLE OF BAPIMEPOSCHEDULE,
lt_extension TYPE TABLE OF bapiparex,
lt_partner TYPE BAPIEKKOP_TP.
lt_item[] = pt_item_po[].
lt_itemx[] = pt_item_pox[].
lt_lug_ent[] = pt_addr_po[].
lt_posch[] = pt_sched_po[].
lt_extension[] = pt_extin_po[].
CLEAR p_rc.
"Llamamos a la BAPI para generar el pedido de propuesta
*--[ Nos cargamos la memoria intermedia (Visto en la SDN)
PERFORM MEPO_REFRESH(SAPLMEPO).
DATA: MEM_OPTN LIKE CSDATA-XFELD VALUE '0'.
EXPORT MEM_OPTN TO MEMORY ID 'CSIO_MEM_OPTN'.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ps_header_po "Cabecera
poheaderx = ps_header_pox "Campos UPDATE en cabecera
TESTRUN = p_test
NO_PRICE_FROM_PO = 'X'
TABLES
RETURN = lt_return "Resultado
poitem = lt_item "Posiciones
poitemx = lt_itemx "Campos UPDATE en posiciones
poaddrdelivery = lt_lug_ent "Lugares de entrega pt_addr_po
poschedule = lt_posch "Repartos pt_sched_po
poschedulex = pt_sched_pox "Campos UPDATE en repartos
pocond = pt_cond_po "Condiciones
pocondx = pt_cond_pox "Campos UPDATE en condiciones
extensionin = lt_extension. "Campos Z de cabecera y posición
"Buscamos si ha dado algún error la creación del pedido
READ TABLE lt_return INTO ls_return WITH KEY TYPE = 'E'.
"Si no hay errores guardamos realizamos COMMIT a la BBDD
IF sy-subrc NE 0 and p_test is INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
CLEAR ls_return.
LOOP AT lt_return INTO ls_return WHERE TYPE EQ 'S' OR TYPE EQ 'E'.
IF ls_return-TYPE = 'S'.
p_rc = 'X'.
ls_error-ICON = icon_green_light.
ls_error-ebeln = ls_return-message_v2.
ls_error-des_error = TEXT-e01.
* ps_header-prop_ebeln = ls_error-ebeln.
COMMIT WORK.
ELSE.
ls_error-ICON = icon_red_light.
* IF ls_return-parameter <> 'POHEADER'.
* ls_error-ebeln = ls_return-row.
* ENDIF.
ls_error-des_error = ls_return-MESSAGE.
ENDIF.
APPEND ls_error TO t_alv_log.
ENDLOOP.
REFRESH lt_return.
CLEAR ls_return.
ENDFORM. " PROCESS_DOCUMENT