Cuando el usuario introduce un texto para buscar (por ejemplo, parte del nombre de un material, cliente o proveedor), tienes dos opciones principales para filtrar los datos:
- Filtrar directamente en la SELECT (más eficiente, recomendable).
- Obtener todos los datos y luego borrar en memoria (cuando no puedes modificar la SELECT o el origen es complejo).
Filtrar en la SELECT
Aplica el patrón de búsqueda directamente en la base de datos. Usa LIKE o CP (patrón) en el WHERE.
DATA: lv_search TYPE string.
lv_search = |%{ lv_user_input }%|.
SELECT matnr, maktx
FROM makt
INTO TABLE @DATA(lt_result)
WHERE spras = @sy-langu
AND maktx LIKE @lv_search. " ← Filtro en BD
Ventajas:
- Solo se transfieren los registros que coinciden.
- Menor consumo de memoria y red.
- Más rápido en tablas grandes con índices adecuados.
Si quieres que la búsqueda sea insensible a mayúsculas/minúsculas, puedes convertir a mayúsculas en ambos lados (o usar LIKE con % y datos normalizados).
Filtrar en memoria (DELETE)
Cuando no puedes modificar la SELECT (por ejemplo, porque los datos vienen de una función que ya devuelve todo), filtras la tabla interna con DELETE o LOOP.
DATA(lv_name) = |*{ lv_user_input }*|.
DELETE lt_employees WHERE NOT xnombre CP lv_name.
Menos eficiente si la tabla es muy grande (todos los datos viajan desde la BD).
Útil cuando ya tienes la tabla completa y necesitas refinar la búsqueda varias veces (por ejemplo, si el usuario cambia el filtro sin nueva SELECT).




