Skip to Content
Technical Articles

Extraer datos de ALV

En esta oportunidad escribiré esta entrada sobre un proceso quizá sencillo para unos, y complejo para otros. (siéntase libre de comentar en el espacio indicado para tal, al final del post). Comencemos….

En ocasiones extraer datos para determinado proceso o informe puede ser tarea complicada, mas aún cuando entre las posibilidades no haz conseguido usar una mágica BAPI, o de ponerte a lidiar con consultas a tablas de base de datos; y luego te das cuenta que el objetivo es conseguir unos datos que  se generan ya sea por una transacción estándar o Z y cuya salida es un ALV. Seamos sinceros en este punto, no vale reinventar la rueda, pero podemos mejorarla…

Bien en esta entrada trataré de plasmar una solución ya sea el caso de obtener datos para procesarlos y obtener otros datos, o si simplemente obtener esos datos y mostrarlos en formato distinto (adaptado al requerimiento).

Para efectos de que sea sencillo de comprender, comenzare planteando una caso práctico, luego ver las opciones, y posterior la solución (es posible no sea el mejor de los ejemplos en cuanto a lo funcional).

Caso Práctico: Supongamos que requerimos de los datos que nos ofrece la Tx. MB52, de acá tomar los materiales y demás datos para realizar un proceso particular de negocio.

Opciones: si bien tenemos la opciones de buscar datos en tablas, cruzarlas y obtener una salida deseada; o hacer un submit al report existente con estructura similar a la deseada y tomar los datos que genera como salida (esta es la opción que tomaremos para efectos de esta entrada).

Solución: He aquí el fin de este post, y comencemos por identificar los elementos necesarios para la construcción del report.

Por tanto, de la tx. MB52 tomamos datos importantes, tal como:

  • Nombre del report:  RM07MLBS
  • Variante(opcional)
  • Algún Campo de selección que queramos calcular previa llamada del report fuente (opcional)
  • Nombre de la estructura de tabla de salida (por lo general busco el método ALV usado y tomo la estructura que tenga la tabla de datos que le es enviada)

Entonces digamos que todo se traduce a este código:

*&---------------------------------------------------------------------*
*& Report  Y_TEST_YO
*&
*&---------------------------------------------------------------------*
*& Extraer datos de ALV de Tx. MB52 para su tratamiento (DEMO)
*& Autor: Yorman Oviedo
*& Fecha: 23/02/2020
*&---------------------------------------------------------------------*

REPORT y_test_yo.

DATA: co_variante(8) TYPE c VALUE 'VARIANT1'.

"--- Estructura de salida del ALV del report Fuente (debe ser igual)
TYPES: BEGIN OF ty_alv_total,
*        Key fields
       matnr LIKE mara-matnr,
       werks LIKE t001w-werks,
       lgort LIKE mard-lgort,
       sobkz LIKE mkol-sobkz,
       ssnum LIKE  bickey-ssnum,
       pspnr LIKE  mspr-pspnr,
       vbeln LIKE  mska-vbeln,
       posnr LIKE  mska-posnr,
       lifnr LIKE mkol-lifnr,
       kunnr LIKE msku-kunnr,
       kzbws LIKE mssa-kzbws,
       charg LIKE mchb-charg,
*        Additional data (texts, unit, ...)
       maktx LIKE marav-maktx,
       bwkey LIKE mbew-bwkey,
       mtart LIKE marav-mtart,
       matkl LIKE marav-matkl,
       meins LIKE marav-meins,
       bwtty LIKE marc-bwtty,
       xchar LIKE marc-xchar,
       lgobe LIKE t001l-lgobe,
       bwtar LIKE mcha-bwtar,
       waers LIKE t001-waers,
       name1 LIKE t001w-name1,
*        Quantities and currencies
       labst LIKE mard-labst,
       wlabs LIKE mbew-salk3,
       insme LIKE mard-insme,
       winsm LIKE mbew-salk3,
       speme LIKE mard-speme,
       wspem LIKE mbew-salk3,
       einme LIKE mard-einme,
       weinm LIKE mbew-salk3,
       retme LIKE mard-retme,
       wretm LIKE mbew-salk3,
       umlme LIKE mard-umlme,
       wumlm LIKE mbew-salk3,
       glgmg LIKE marc-glgmg,
       wglgm LIKE mbew-salk3,
       trame LIKE marc-trame,
       wtram LIKE mbew-salk3,
       umlmc LIKE marc-umlmc,
       wumlc LIKE mbew-salk3,
       dummy TYPE  alv_dummy,
       farbe TYPE slis_t_specialcol_alv,
       lvorm LIKE  mard-lvorm,
       bwesb LIKE  marc-bwesb,
       wbwesb LIKE  mbew-salk3,
     END OF ty_alv_total.

DATA: gt_alv_total TYPE TABLE OF ty_alv_total,
      gs_alv_total LIKE LINE OF gt_alv_total.

DATA: gr_matart TYPE RANGE OF mara-mtart,
      ls_matart LIKE LINE OF gr_matart.

DATA: lv_alv TYPE REF TO cl_salv_table.

START-OF-SELECTION.

  "---Damos valor a parametro de selección de Entrada a MB52 (opcional)
  ls_matart-sign   = 'I'.
  ls_matart-option = 'EQ'.
  ls_matart-low    = 'Z001'.
  APPEND ls_matart TO gr_matart.

  "--- Llamammos rutina para obtener datos de report RM07MLBS
  PERFORM get_datos.

  IF gt_alv_total[] IS NOT INITIAL.
    "--- En este punto podria hacer algun proceso con los datos obtenidos

    "--- y luego mostrarlos en ALV o enviarlos a ITAB
    CALL METHOD cl_salv_table=>factory
      IMPORTING
        r_salv_table = lv_alv
      CHANGING
        t_table      = gt_alv_total.

    lv_alv->display( ).
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  get_datos
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_datos.

  DATA: lr_data              TYPE REF TO data.
  FIELD-SYMBOLS: <lt_data>   TYPE ANY TABLE.
  FIELD-SYMBOLS: <lt_test>   TYPE any.

  "--- Determinar que cuando se presnete el resulatado ALV, este no se muestre
  cl_salv_bs_runtime_info=>set( EXPORTING display  = abap_false
                                          metadata = abap_false
                                          data     = abap_true ).
  "--- Lllamda del Report estandar o Zxxxx
  SUBMIT rm07mlbs
     USING SELECTION-SET co_variante
     WITH matart IN gr_matart
     AND RETURN.

  TRY.
      "--- Obtener los datos en memoria del ALV Resultante
      cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_data ).
      ASSIGN lr_data->* TO <lt_data>.

      IF <lt_data> IS ASSIGNED.
        CLEAR gt_alv_total.
        FREE  gt_alv_total[].

        LOOP AT <lt_data> ASSIGNING <lt_test>.
          MOVE-CORRESPONDING  <lt_test> TO gs_alv_total .
          APPEND gs_alv_total TO gt_alv_total[].
        ENDLOOP.

        cl_salv_bs_runtime_info=>clear_all( ).
      ELSE.
        CLEAR gt_alv_total.
        FREE  gt_alv_total[].
      ENDIF.

    CATCH cx_salv_bs_sc_runtime_info.
      MESSAGE 'No se pueden recuperar los datos ALV' TYPE 'E'.
  ENDTRY.

ENDFORM.                    "get_datos

 

Recuerden que es un report sencillo y con fines demostrativo; acá puedes ser tan abstracto como quieras y usar las técnicas de programación que desees.

Espero les sea de utilidad.

1 Comment
You must be Logged on to comment or reply to a post.