W Pub: ABAPMM Cp Pedidos

  1.  
  2.  
  3. REPORT  ZPRG_COPIA_PEDIDO.
  4.  
  5. tables: DD03L.
  6.  
  7. PARAMETERS: p_pedido type EBELN MATCHCODE OBJECT MEKK_C OBLIGATORY.
  8. SELECTION-SCREEN skip 1.
  9. PARAMETERS p_test as CHECKBOX DEFAULT 'X'.
  10.  
  11. DATA: ls_header_po TYPE bapimepoheader,
  12.       ls_header_pox TYPE bapimepoheaderx,
  13.       lt_return_po TYPE TABLE OF bapiret2,
  14.       lt_item_po TYPE TABLE OF bapimepoitem,
  15.       lt_item_pox TYPE TABLE OF bapimepoitemx,
  16.       lt_addr_po TYPE TABLE OF bapimepoaddrdelivery,
  17.       lt_sched_po TYPE TABLE OF bapimeposchedule,
  18.       lt_sched_pox TYPE TABLE OF bapimeposchedulx,
  19.       lt_cond_po TYPE TABLE OF bapimepocond,
  20.       lt_cond_pox TYPE TABLE OF bapimepocondx,
  21.       lt_extin_po TYPE TABLE OF bapiparex,
  22.  
  23.       lc_item_po TYPE bapimepoitem,
  24.       lc_item_pox TYPE bapimepoitemx,
  25.       lc_addr_po TYPE bapimepoaddrdelivery,
  26.       lc_sched_po TYPE bapimeposchedule,
  27.       lc_sched_pox TYPE bapimeposchedulx,
  28.       lc_cond_po TYPE bapimepocond,
  29.       lc_cond_pox TYPE bapimepocondx,
  30.       lc_extin_po TYPE bapiparex,
  31.  
  32.       lt_return type TABLE OF BAPIRET2,
  33.  
  34.       lv_rc TYPE return.
  35.  
  36. TYPES: BEGIN OF ty_log_propuesta,
  37.   ICON(4),
  38.   ebeln(10),
  39.   des_error(255),
  40. END OF ty_log_propuesta.
  41.  
  42. data: t_alv_log type table of ty_log_propuesta,
  43.       c_alv_log type ty_log_propuesta.
  44.  
  45. include /GECI/MM_I_COPIA_PEDIDO_ALV.
  46.  
  47. end-of-SELECTION.
  48.   PERFORM load_data.
  49.   perform check_data.
  50.  
  51.  
  52.  
  53. form check_data.
  54.   if ls_header_po-DOC_TYPE ne 'XXX'.
  55.     perform procesa_pox.
  56.     perform procesa_poext.
  57.     perform procesa_po.
  58.     perform list_data.
  59.   else.
  60.     message s398(00) with text-e02. "<- Tipo de pedido incorrecto
  61.   endif.
  62. ENDFORM.
  63.  
  64. form list_data.
  65.   CREATE OBJECT lv_zcl_alv." EXPORTING i_titulo = 'Título'.
  66.   lv_zcl_alv->puv_data->puv_t_data[] = t_alv_log[].
  67.   lv_zcl_alv->alv_display( ).
  68. endform.
  69.  
  70. form procesa_pox.
  71.  
  72. *--[ Borramos los campos que ha pedido
  73.   clear: ls_header_po-REF_1, ls_header_po-OUR_REF.
  74.  
  75.   perform tables_pox USING 'ls_header_po' 'ls_header_pox'.
  76.  
  77.   loop at lt_item_po into lc_item_po.
  78. *    MOVE-CORRESPONDING lc_item_po to lc_item_pox.
  79.     clear lc_item_pox.
  80.     perform tables_pox USING 'lc_item_po' 'lc_item_pox'.
  81.     lc_item_pox-PO_ITEM = lc_item_po-PO_ITEM.
  82.     append lc_item_pox to lt_item_pox.
  83.   endloop.
  84.  
  85.  
  86.   LOOP AT lt_sched_po INTO lc_sched_po.
  87. *    move-CORRESPONDING lc_sched_po to lc_sched_pox.
  88.     clear lc_sched_pox.
  89.     PERFORM tables_pox USING 'lc_sched_po' 'lc_sched_pox'.
  90.     lc_sched_pox-PO_ITEM = lc_sched_po-PO_ITEM.
  91.     lc_sched_pox-SCHED_LINE = lc_sched_po-SCHED_LINE.
  92.     APPEND lc_sched_pox TO lt_sched_pox.
  93.   ENDLOOP.
  94.  
  95.   LOOP AT lt_cond_po INTO lc_cond_po.
  96. *    MOVE-CORRESPONDING lc_cond_po to lc_cond_pox.
  97.  
  98. *--[ Borramos las condiciones
  99.     clear lc_cond_po-CONDITION_NO.
  100.     lc_cond_po-CHANGE_ID = 'I'.
  101.     modify lt_cond_po from lc_cond_po INDEX sy-tabix.
  102.  
  103.     clear lc_cond_pox.
  104.     PERFORM tables_pox USING 'lc_cond_po' 'lc_cond_pox'.
  105.     lc_cond_pox-CONDITION_NO = lc_cond_po-CONDITION_NO.
  106.     lc_cond_pox-ITM_NUMBER = lc_cond_po-ITM_NUMBER.
  107.     lc_cond_pox-COND_ST_NO = lc_cond_po-COND_ST_NO.
  108.     APPEND lc_cond_pox TO lt_cond_pox.
  109.   ENDLOOP.
  110.  
  111. endform.
  112.  
  113. form tables_pox using origen destino.
  114.   FIELD-SYMBOLS: <campo_ori> TYPE any,
  115.                 <campo_des> TYPE any,
  116.                 <fs_origen> type any,
  117.                 <fs_destino> type any.
  118.   data: lv_tabla(50).
  119.  
  120.   case destino.
  121.     wHEN 'ls_header_pox'. lv_tabla = 'bapimepoheaderx'.
  122.     WHEN 'lc_item_pox'. lv_tabla = 'bapimepoitemx'.
  123.     WHEN 'lc_sched_pox'. lv_tabla = 'bapimeposchedulx'.
  124.     WHEN 'lc_cond_pox'. lv_tabla = 'bapimepocondx'.
  125.     when OTHERS.
  126.       exit.
  127.   endcase.
  128.   TRANSLATE lv_tabla to UPPER CASE.
  129.   SELECT        * FROM  DD03L
  130.          WHERE  TABNAME   = lv_tabla
  131.          and    INTLEN    = 1
  132.          order by position.
  133.  
  134.     CONCATENATE origen '-' DD03L-FIELDNAME into sy-lisel.
  135.     assign (sy-lisel) to <fs_origen>.
  136.     if sy-subrc eq 0.
  137.       CONCATENATE destino '-' DD03L-FIELDNAME into sy-lisel.
  138.       assign (sy-lisel) to <fs_destino>.
  139.       if sy-subrc eq 0.
  140.         if not <fs_origen> is INITIAL.
  141.           <fs_destino> = 'X'.
  142.         endif.
  143.       endif.
  144.     else.
  145.       sy-pagno = strlen( sy-lisel ) - 1.
  146.       if sy-lisel+sy-pagno(1) = 'X'.
  147.         sy-lisel+sy-pagno(1) = ' '.
  148.         assign (sy-lisel) to <fs_origen>.
  149.         if sy-subrc eq 0.
  150.           CONCATENATE destino '-' DD03L-FIELDNAME into sy-lisel.
  151.           assign (sy-lisel) to <fs_destino>.
  152.           if sy-subrc eq 0.
  153.             if not <fs_origen> is INITIAL.
  154.               <fs_destino> = 'X'.
  155.             endif.
  156.           endif.
  157.         endif.
  158.       endif.
  159.     endif.
  160.   ENDSELECT.
  161.  
  162.  
  163. *  assign (origen) to <fs_origen>.
  164. *  assign (destino) to <fs_destino>.
  165. *  DO.
  166. *    ASSIGN COMPONENT sy-INDEX OF STRUCTURE <fs_origen> TO <campo_ori>.
  167. *    ASSIGN COMPONENT sy-INDEX OF STRUCTURE <fs_destino> TO <campo_des>.
  168. *    IF sy-subrc <> 0.
  169. *      EXIT.
  170. *    ENDIF.
  171. *    if not <campo_ori> is INITIAL.
  172. *      <campo_des> = 'X'.
  173. *    endif.
  174. *  ENDDO.
  175. endform.
  176.  
  177. form procesa_poext.
  178.   data: lv_ext type ZGECI_MM_ST_POITEM,
  179.         lv_ext_aux type ZGECI_MM_ST_POITEM,
  180.  
  181.         lv_extx type BAPI_TE_MEPOITEMX,
  182.         lv_extx_aux type BAPI_TE_MEPOITEMX,
  183.  
  184.         lv_BAPI_TE_MEPOHEADER type BAPI_TE_MEPOHEADER,
  185.         lv_BAPI_TE_MEPOHEADER_aux type BAPI_TE_MEPOHEADER,
  186.  
  187.         lv_BAPI_TE_MEPOHEADERX type BAPI_TE_MEPOHEADERX,
  188.         lv_BAPI_TE_MEPOHEADERX_aux type BAPI_TE_MEPOHEADERX,
  189.  
  190.         lv_ebelp type ebelp,
  191.         lv_sytabix type sytabix,
  192.  
  193.         lt_extin_po_aux TYPE TABLE OF bapiparex.
  194.   clear lt_extin_po_aux.
  195.   refresh lt_extin_po_aux.
  196.   loop at lt_extin_po into lc_extin_po.
  197.     clear lv_ext_aux.
  198.     lv_sytabix = sy-tabix.
  199.     lv_ebelp = lc_extin_po-VALUEPART1+0(5).
  200.  
  201.  
  202.     if lc_extin_po-STRUCTURE eq 'BAPI_TE_MEPOITEM'.
  203.       CALL METHOD /GECI/MM_CL_PO_UTILITIES=>MAPPING_EXT_TO_STRUC
  204.         EXPORTING
  205.           EXTENSION = lc_extin_po
  206.         IMPORTING
  207.           FIELDS_Z  = lv_ext.
  208.  
  209. *--[ Movemos sólo los campos que nos indica
  210. *      lv_ext_aux-ZZ....     = lv_ext-ZZ.... "<-- Aquí movemos los campos Z que necesitamos
  211.  
  212.       CALL METHOD /GECI/MM_CL_PO_UTILITIES=>MAPPING_STRUC_TO_EXT
  213.         EXPORTING
  214.           EBELP    = lv_ebelp
  215.           IM_STRUC = lv_ext_aux
  216.         IMPORTING
  217.           CADENA   = lc_extin_po-VALUEPART1.
  218.       append lc_extin_po to lt_extin_po_aux.
  219. *     endif.
  220.  
  221. *     if lc_extin_po-STRUCTURE cp '*POITEMX'.
  222.       clear lv_extx_aux.
  223.  
  224. *--[ Movemos sólo los campos que nos indica
  225.       CONCATENATE lc_extin_po-STRUCTURE 'X' into lc_extin_po-STRUCTURE.
  226.       lv_extx_aux-PO_ITEM     = lv_ebelp.
  227. *      lv_ext_aux-ZZ....     = 'X'. "<-- Aquí movemos los campos Z que necesitamos
  228.  
  229.       lc_extin_po-VALUEPART1 = lv_extx_aux.
  230.       append lc_extin_po to lt_extin_po_aux.
  231.  
  232.     elseif lc_extin_po-STRUCTURE eq 'BAPI_TE_MEPOHEADER'.
  233.       lv_BAPI_TE_MEPOHEADER = lc_extin_po-VALUEPART1.
  234.       clear lv_BAPI_TE_MEPOHEADER_aux.
  235. *      lv_BAPI_TE_MEPOHEADER_aux-ZZ... = lv_BAPI_TE_MEPOHEADER-ZZ... . "<-- Aquí movemos los campos Z que necesitamos
  236.       lc_extin_po-VALUEPART1 = lv_BAPI_TE_MEPOHEADER_aux.
  237.       append lc_extin_po to lt_extin_po_aux.
  238. *     endif.
  239.  
  240. *     if lc_extin_po-STRUCTURE cp '*HEADER*X'.
  241.       CONCATENATE lc_extin_po-STRUCTURE 'X' into lc_extin_po-STRUCTURE.
  242.       lv_BAPI_TE_MEPOHEADERX = lc_extin_po-VALUEPART1.
  243.       clear lv_BAPI_TE_MEPOHEADERX_aux.
  244. *      lv_BAPI_TE_MEPOHEADERX_aux-ZZ... = 'X' . "<-- Aquí movemos los campos Z que necesitamos
  245.       lc_extin_po-VALUEPART1 = lv_BAPI_TE_MEPOHEADERX_aux.
  246.       append lc_extin_po to lt_extin_po_aux.
  247.     else.
  248.       append lc_extin_po to lt_extin_po_aux.
  249.     endif.
  250. *--[ Restauramos
  251.   ENDLOOP.
  252.   lt_extin_po[] = lt_extin_po_aux[].
  253.  
  254. ENDFORM.
  255.  
  256. form load_data.
  257.   CALL FUNCTION 'BAPI_PO_GETDETAIL1'
  258.     EXPORTING
  259.       PURCHASEORDER      = p_pedido
  260. *     ACCOUNT_ASSIGNMENT = ' '
  261. *     ITEM_TEXT          = ' '
  262. *     HEADER_TEXT        = ' '
  263.      DELIVERY_ADDRESS   = 'X'
  264. *     VERSION            = ' '
  265. *     SERVICES           = ' '
  266. *     SERIALNUMBERS      = ' '
  267. *     INVOICEPLAN        = ' '
  268.     IMPORTING
  269.       POHEADER           = ls_header_po
  270. *     POEXPIMPHEADER     =
  271.     TABLES
  272.       RETURN             = lt_return
  273.       POITEM             = lt_item_po
  274.       POADDRDELIVERY     = lt_addr_po
  275.       POSCHEDULE         = lt_sched_po
  276. *     POACCOUNT          =
  277. *     POCONDHEADER       =
  278.       POCOND             = lt_cond_po
  279. *     POLIMITS           =
  280. *     POCONTRACTLIMITS   =
  281. *     POSERVICES         =
  282. *     POSRVACCESSVALUES  =
  283. *     POTEXTHEADER       =
  284. *     POTEXTITEM         =
  285. *     POEXPIMPITEM       =
  286. *     POCOMPONENTS       =
  287. *     POSHIPPINGEXP      =
  288. *     POHISTORY          =
  289. *     POHISTORY_TOTALS   =
  290. *     POCONFIRMATION     =
  291. *     ALLVERSIONS        =
  292. *     POPARTNER          =
  293.       EXTENSIONOUT       = lt_extin_po
  294. *     SERIALNUMBER       =
  295. *     INVPLANHEADER      =
  296. *     INVPLANITEM        =
  297. *     POHISTORY_MA       =
  298.     .
  299.  
  300. endform .
  301.  
  302. form procesa_po.
  303.  
  304.   clear LS_HEADER_PO-PO_NUMBER. "<-- Creamos un nuevo registro?
  305.  
  306.   PERFORM process_document TABLES
  307.     lt_item_po
  308.     lt_item_pox
  309.     lt_addr_po
  310.     lt_sched_po
  311.     lt_sched_pox
  312.     lt_cond_po
  313.     lt_cond_pox
  314.     lt_extin_po
  315.   CHANGING ls_header_po
  316.     ls_header_pox
  317.     lv_rc.
  318.  
  319. endform.
  320.  
  321. FORM process_document  TABLES
  322.   pt_item_po STRUCTURE bapimepoitem
  323.   pt_item_pox STRUCTURE bapimepoitemx
  324.   pt_addr_po STRUCTURE bapimepoaddrdelivery
  325.   pt_sched_po STRUCTURE bapimeposchedule
  326.   pt_sched_pox STRUCTURE bapimeposchedulx
  327.   pt_cond_po STRUCTURE bapimepocond
  328.   pt_cond_pox STRUCTURE bapimepocondx
  329.   pt_extin_po STRUCTURE bapiparex
  330. CHANGING   ps_header_po TYPE bapimepoheader
  331.   ps_header_pox TYPE bapimepoheaderx
  332.   p_rc.
  333.  
  334.   DATA: lt_return TYPE TABLE OF bapiret2,
  335.         ls_return TYPE bapiret2,
  336.         ls_error TYPE ty_log_propuesta,
  337.         lt_item TYPE TABLE OF bapimepoitem,
  338.         lt_itemx TYPE TABLE OF bapimepoitemx,
  339.         lt_lug_ent TYPE TABLE OF BAPIMEPOADDRDELIVERY,
  340.         lt_posch TYPE TABLE OF BAPIMEPOSCHEDULE,
  341.         lt_extension TYPE TABLE OF bapiparex,
  342.         lt_partner TYPE BAPIEKKOP_TP.
  343.  
  344.   lt_item[] = pt_item_po[].
  345.   lt_itemx[] = pt_item_pox[].
  346.   lt_lug_ent[] = pt_addr_po[].
  347.   lt_posch[] = pt_sched_po[].
  348.   lt_extension[] = pt_extin_po[].
  349.  
  350.   CLEAR p_rc.
  351.  
  352.   "Llamamos a la BAPI para generar el pedido de propuesta
  353.  
  354. *--[ Nos cargamos la memoria intermedia (Visto en la SDN)
  355.   PERFORM MEPO_REFRESH(SAPLMEPO).
  356.   DATA: MEM_OPTN LIKE CSDATA-XFELD VALUE '0'.
  357.   EXPORT MEM_OPTN TO MEMORY ID 'CSIO_MEM_OPTN'.
  358.  
  359.   CALL FUNCTION 'BAPI_PO_CREATE1'
  360.     EXPORTING
  361.       poheader         = ps_header_po         "Cabecera
  362.       poheaderx        = ps_header_pox        "Campos UPDATE en cabecera
  363.       TESTRUN          = p_test
  364.       NO_PRICE_FROM_PO = 'X'
  365.     TABLES
  366.       RETURN         = lt_return         "Resultado
  367.       poitem         = lt_item           "Posiciones
  368.       poitemx        = lt_itemx          "Campos UPDATE en posiciones
  369.       poaddrdelivery = lt_lug_ent    "Lugares de entrega pt_addr_po
  370.       poschedule     = lt_posch      "Repartos   pt_sched_po
  371.       poschedulex    = pt_sched_pox         "Campos UPDATE en repartos
  372.       pocond         = pt_cond_po           "Condiciones
  373.       pocondx        = pt_cond_pox          "Campos UPDATE en condiciones
  374.       extensionin    = lt_extension.         "Campos Z de cabecera y posición
  375.  
  376.   "Buscamos si ha dado algún error la creación del pedido
  377.   READ TABLE lt_return INTO ls_return WITH KEY TYPE = 'E'.
  378.   "Si no hay errores guardamos realizamos COMMIT a la BBDD
  379.   IF sy-subrc NE 0 and p_test is INITIAL.
  380.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  381.       EXPORTING
  382.         WAIT = 'X'.
  383.   ENDIF.
  384.  
  385.   CLEAR ls_return.
  386.   LOOP AT lt_return INTO ls_return WHERE TYPE EQ 'S' OR TYPE EQ 'E'.
  387.     IF ls_return-TYPE = 'S'.
  388.       p_rc = 'X'.
  389.       ls_error-ICON = icon_green_light.
  390.       ls_error-ebeln = ls_return-message_v2.
  391.       ls_error-des_error = TEXT-e01.
  392. *      ps_header-prop_ebeln = ls_error-ebeln.
  393.  
  394.       COMMIT WORK.
  395.  
  396.     ELSE.
  397.       ls_error-ICON = icon_red_light.
  398. *      IF  ls_return-parameter <> 'POHEADER'.
  399. *        ls_error-ebeln = ls_return-row.
  400. *      ENDIF.
  401.       ls_error-des_error = ls_return-MESSAGE.
  402.     ENDIF.
  403.     APPEND ls_error TO t_alv_log.
  404.   ENDLOOP.
  405.  
  406.   REFRESH lt_return.
  407.   CLEAR ls_return.
  408.  
  409. ENDFORM.                    " PROCESS_DOCUMENT