sistemas grainhill

Inicio » SAP » ABAP » Crear dinámicamente una cláusula where en ABAP

Crear dinámicamente una cláusula where en ABAP

En ciertos casos nos encontramos que el usuario pide parámetros ,para filtrar un reporte , que se encuentran en una misma tabla transparente. En este escenario podemos tomar varios opciones, utilizar la cláusula OR o un if anidado con diferentes combinaciones de parámetros que nos podamos encontrar. La primera opción es la de mas fácil aplicación, podemos implementar un OR entre los diferentes parámetros, pero hay un problema, para que sea excluyente entre los parámetros debemos crear varias combinaciones que resultan tediosas si el número de parámetros es mayor que dos y requerirá un esfuerzo más a la base de datos. El segundo escenario es similar solo que se repetiría el código del cuerpo del select cambiando los elementos del where, jugando con las diferentes combinaciones posibles para que el resultado sea el deseado. En estos casos una mala combinación y un parámetro vacío afectaran el resultado final de la selección.

En vista de esto es más eficiente implementar la construcción de la clausula where de manera dinámica, jugando con los parámetros que han sido llenados por el usuario. Para esto simplemente haremos uso de una tabla interna que nos contenga las líneas que agregaremos al where de nuestro open sql.

DATA: cond(72) TYPE c,
itab_cond LIKE TABLE OF cond.

la tabla interna la creamos a partir de un arreglo de tipo char.

Luego comenzamos a agregar las líneas de nuestro where

clear cond.
cond = ‘mblnr  = ti_mkpf-mblnr  and  mjahr = ti_mkpf-mjahr ‘ INTO cond.
APPEND cond TO itab_cond.

if p_prov is not initial.
clear cond.
CONCATENATE ‘and lifnr = ”’ p_prov ”” INTO cond.
APPEND cond TO itab_cond.
endif.

if p_tmov is not initial.
clear cond.
cond = ‘and bwart IN p_tmov’ .
APPEND cond TO itab_cond.
endif.

Como ejemplo tres casos, el primero agregando una linea que utiliza un for all entries, el Segundo que se ingresa un parametro y el tercero un select-options. El primero y el ultimo se ingresan como texto y el segundo caso se hace un concatenate para agregar el parámetro dentro del texto.

Por ultimo agregamos la tabla interna como dato dinamico a nuestro open sql.

SELECT
mseg~mjahr
mseg~bwart
mseg~matnr
FROM mseg
INTO CORRESPONDING FIELDS OF TABLE ti_mseg
FOR ALL ENTRIES IN ti_mkpf “ti_epedido
WHERE (itab_cond).

 

Espero les haya servido, no duden en brindar sus comentarios.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: