AAAAA

Lo MeJoR De Lo MeJoR TiPs.
Este blog esta Pensado para aportar tips y ejemplos de Programas SAP - ABAP.

viernes, 26 de octubre de 2018

7. ME23N, Cambiar la información a mostrar en Orden de compra SAP

En este ejemplo vamos a modificar la información que se muestra en una orden de compra ME23N,

Reemplazará solo al visualizar la OC,  la información que se tiene en la Base de datos.


1. Debemos identificar la BAPI a modificar,
 para el caso de la orden de compra es la siguiente:

TX: SE18
BAPI: ME_PROCESS_PO_CUST (sino esta implementada la BAPI deben hacerlo)



Vamos a ingresar el código correspondiente en el Método IF_EX_ME_PROCESS_PO_CUST~OPEN, el cual se ejecuta antes de mostrar la pantalla de la ME23N.



Código y explicación de cada paso.



Ejemplo del reemplazo.
Valores Reales:



Nuevos Valores reemplazados (Solo en tiempo de ejecución).


***************************************Código**********************

METHOD if_ex_me_process_po_cust~open.
*********************************************************************
*********************************************************************
  " Obtenemos los datos de la cabecera
  DATA:
    lw_mepoheader TYPE mepoheader,                 "Datos a Nivel cabecera
    lc_po_header  TYPE REF TO cl_po_header_handle_mm,"Clase Manejo OC a nivel cabecera
    lt_items      TYPE purchase_order_items,             "Tabla de posiciones de la OC
    lw_item       TYPE purchase_order_item,             "Posición de la OC
    lw_detail     TYPE mepoitem.                      "Posición de la OC (Valores)

  IF sy-tcode 'ME23N'.

*** Modificar cabecera Orden de compra.
    lw_mepoheader im_header->get_data).
    lc_po_header ?= im_header.
    lc_po_header->my_ibs_firewall_on 'X'.                    " Variable para que permita modificar

    lw_mepoheader-ekgrp '201'.             " Nuevo valor a mostrar a nivel Cab. 
    CALL METHOD im_header->set_dataim_data lw_mepoheader ).

*** Obtener y modificar posición.
    lt_items im_header->get_items).

    LOOP AT lt_items INTO lw_item.
      lw_detail lw_item-item->get_data).
      lw_detail-idnlf 'AA'.                  " Nuevo valor a mostrar a nivel Pos.
      lw_item-item->set_dataim_data lw_detail ).
    ENDLOOP.
  ENDIF.
*********************************************************************
ENDMETHOD.





martes, 6 de marzo de 2018

5. Fecha liberación Orden de compra (SAP) (Pedido de compra)

Muchas veces se requiere obtener la fecha de liberación de una Orden de compra (pedido de compra),
ME21N, funciona para bienes y servicios.

En caso se haya modificado más de 1 vez la liberación final también funciona.

Para ello NO se tiene un campo especifico, de forma estándar. así que para obtener la fecha de la liberación final se obtendrá del Log de modificación de la Orden de compra.

Tablas a utilizar.
EKKO    = Cabecera del documento de compras
CDHDR = Cabecera del documento de modificación
CDPOS  = Posiciones en el documento de modificación

Este código Abap esta con HANA, pero fácilmente puede ser cambiado a forma ABAP sin Hana.

1. Para este caso tenemos una orden de compra que requiere 3 aprobaciones. 
el campo "Ind.liberación" será de gran importancia.


2. Visualizar Log de modificación de cabecera.


El valor a obtener es el marcado.



3. Código ABAP

REPORT ycrprueba2.

"Camp de la tabla EKKO
"FRGKE SI esta vacío  "No tiene estrategia de liberación"
"FRGKE Si igual a 'X' "No esta liberado".
"FRGKE si igual a '1' "Liberado completamente".

"Revisamos si esta liberado, para luego buscar su fecha de liberación final.
SELECT SINGLE ebelnfrgke
  INTO @DATA(lw_ekko)
  FROM ekko
 WHERE ebeln '4500308595'  "Ingresar su Orden de compra
   AND frgke '1'.           "Valor que vemos en Orden compra "Ind.liberación"

IF sy-subrc 0.      "Pedido esta liberado

"Obtener detalle de los cambios para el campo de liberación
  SELECT *
    INTO TABLE @DATA(lt_cdpos)
    FROM cdpos
   WHERE objectclas 'EINKBELEG'
     AND tabname    'EKKO'
     AND fname      'FRGKE'
     AND objectid   @lw_ekko-ebeln.

  IF lt_cdpos[] IS NOT INITIAL.
    SORT lt_cdpos[] BY changenr DESCENDING.

" Nos quedamos con la actualización final.
    DELETE ADJACENT DUPLICATES FROM lt_cdpos COMPARING objectid.
    READ TABLE lt_cdpos INDEX INTO DATA(lw_cdpos).

" Obtener el cambio a nivel de cabecera para obtener fecha requerida.
    SELECT SINGLE *
      INTO @DATA(lw_cdhdr)
      FROM cdhdr
     WHERE objectclas 'EINKBELEG'
       AND change_ind 'U'
       AND objectid @lw_cdpos-objectid
       AND changenr @lw_cdpos-changenr.

    WRITE'Usuario de liberación:'.
    WRITE/ lw_cdhdr-username.
    WRITE'Fecha de liberación:'.
    WRITE/ lw_cdhdr-udate.
    WRITE'Hora de liberación:'.
    WRITE/ lw_cdhdr-utime.

  ENDIF.

ENDIF.


Fotos de las tablas

Si les fue útil, comentan.