Ayuda con un select

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.

2 select, en el primero buscas el registro y traes los datos. después si sy-subrc es distinto de cero (no lo encontró) traes todo en otro select.

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!.

los 2 select son igual, salvo en 1º que estas filtrando por el valor

ahora si no es un campo y son muchos, tendrías que cambiar los AND del where por OR.

es como se me ocurre, puede que los maestros @abapers sepan un metodo diferente.
Saludos.

Crea una variable tipo range y utilizas un in en el where. Similar a si utilizaras un parámetro tipo select-options.

1 me gusta

La sentencia seria algo como esto para lo que buscas hacer:

SELECT * 
INTO CORRESPONDING FIELDS OF TABLE LTD_TABX
FROM TABXWHERE TABX~VAL1 IN VALOR1 AND TABX~VAL2 IN VALOR2.

y el valor1 y valor2 tendrian que ser rangos o select-options, espero te sirva.

Saludos.

1 me gusta

Mmmmm

Porque no usas If? lo mas básico y cochino jaja.

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.

y tu Select, quedaria mas o menos asi:

SELECT SINGLE * FROM TABLA WHERE (it_where)

2 Me gusta

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.

RESTO DE TU CÓDIGO.

1 me gusta

Muchas gracias por la solución.
Agradezco tu tiempo.

@abapero podrías explicar a más detalle el porqué no se debe utilizar el INTO, es que siempre lo he estado utilizando :confused:

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…

Saludos!

1 me gusta

no se si sea SQL Server, pero en si fuera asi lo haria de la siguiente manera.

select * from TABX
where isnull(@Valor1,-1) in (-1,TABX.Val1)
and isnull(@Valor2,-1) in (-1,TABX.Val2)