Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
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.
2 Comments
Labels in this area