Hola a todos.
Estoy realizando un SELECT en la cual si el campo a comparar llega con valor me debe de traer todos los registros que coincidan con ese valor y si el campo llega vacío me debería de traer todos los registros en general.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LTD_TABX
FROM TABX
WHERE TABX~VAL1 = VALOR1 AND
TABX~VAL2 = VALOR2.
Como podría implementarlo, me sugirieron que se podría hacer mediante rango. Alguna idea ?
Gracias de antemano.
Hola @squall192, pero en el WHERE tengo aproximadamente 10 filtros y según lo que me recomiendas tendría que hacer una combinatoria de todos los casos posible 10!.
IF VALOR1 EQ '' and VALOR2 EQ ''.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LTD_TABX
FROM TABX.
ELSEIF VALOR1 EQ '' and VALOR2 NE ''.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LTD_TABX
FROM TABX
WHERE TABX~VAL2 = VALOR2.
ELSEIF VALOR1 NE '' and VALOR2 EQ ''.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LTD_TABX
FROM TABX
WHERE TABX~VAL1 = VALOR1.
ELSEIF VALOR1 NE '' and VALOR2 NE ''.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LTD_TABX
FROM TABX
WHERE TABX~VAL1 = VALOR1 AND
TABX~VAL2 = VALOR2..
ENDIF.
O puedes utilizar algo similar a un Where ‘dinamico’ … en una tabla interna de tipo C (con longitud de algunos 40 o 50 caracteres), vas agregando todas las condiciones necesarias para tu select… y si el campo llega vacio, simplemente no agregas esa condición a la tabla.
Te quedaria algo asi:
APPEND 'BUKRS EQ P_BUKRS' TO it_where.
IF campo IS NOT INITIAL.
APPEND 'AND CAMPOTABLA EQ campo' TO it_where.
ENDIF.
Buenoooo, no se recomienda mucho la sentencia into corresponding fields por cuestiones de rendimiento con la base de datos y eso, al igual que los seleccionar todo, una vez tengas en cuenta esos detallitos vamos a tu pregunta a ver si podría ayudarte:
Puedes usar check que es igual que un if hasta donde se hace un select , ejemplo:
SELECT CAMPO1 CAMPO1 CAMPO1 CAMPO1 CAMPO1 INTO TABLE ITAB FROM TABLA WHERE PARAMETRO1 (puede ser un rango, podrias usar una variable tipo range o declarar un parámetro de entrada (SELECT-OPTION) y tratar de usar campos clave o indices en el mismo orden que esta en la tabla) AND PARAMETRO2 AND ( PARAMETRO2 = ‘XX’ OR PARAMETRO2 = ‘XX’ )
PARAMETRO3 IN S_WERKS. (Suponiendo que declaraste ese “s_werks” como parametro en tu pantalla de inicio, te recomiendo que para identificarlos le pongas una s_nombre s de select-option jejeje o puedes construir tu rango pero no se como sería en tu caso)
IF SY-SUBRC <> 0.
Haces la otra búsqueda de selección de todo lo demás tomando en cuenta los tips de arriba. ENDIF.
Mmmmm… Se dice que el INTO CORRESPONDING FIELDS OF TABLE no es recomendable contra un INTO TABLE por cuestiones de performance (rendimiento, rapidez, etc, etc)… pero yo pienso que realmente depende mucho de lo que tratas de hacer y del volumen de los datos que estarás manipulando…
Ya que el usar INTO CORRESPONDING FIELDS indica que la tabla o estructura en donde guardaras la información no esta ordenada o tiene mas (o menos) campos que los que estas extrayendo en el Select, y puede que ni siquiera estén en el mismo orden… eso implicaria mas tiempo a la hora de guardar los registros en la tabla interna… Pero insisito en que depende mucho del volumen de información… quiza solo se tarde unos cuantos microsegundos mas… La experiencia nos aclarará este tipo de cosas…