ABAP SELECT-OPTIONS: Definir criterios de seleccion complejos

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La sentencia SELECT-OPTIONS es una palabra clave especial de ABAP que se utiliza exclusivamente en la parte de declaracion de programas ejecutables (REPORT), grupos de funciones o module pools. Sirve para definir criterios de seleccion complejos en la pantalla de seleccion estandar (Dynpro 1000) de un programa.

A diferencia de los simples PARAMETERS, que solo generan un unico campo de entrada, SELECT-OPTIONS permite al usuario introducir en tiempo de ejecucion:

  • Valores individuales
  • Intervalos (rangos De-Hasta)
  • Multiples valores individuales e intervalos (mediante el boton de seleccion multiple)
  • Exclusiones de valores o intervalos
  • Comparaciones de patrones (por ejemplo, ‘ABC*’)

Las opciones de seleccion definidas se utilizan tipicamente en la clausula WHERE de sentencias SELECT para filtrar consultas de base de datos de forma dinamica y flexible.

Sintaxis

SELECT-OPTIONS <selcrit> FOR <campo>
[DEFAULT <valor> [TO <valor2>] [OPTION <op>] [SIGN <sg>]] " Valores por defecto
[OBLIGATORY] " Entrada requerida
[NO-EXTENSION] " Sin seleccion multiple (solo una linea)
[NO INTERVALS] " Sin entrada de intervalos (solo valores individuales/patrones)
[LOWER CASE] " Permitir/mantener minusculas
[MEMORY ID <pid>] " SAP Memory ID para prellenado
[VISIBLE LENGTH <vlen>] " Longitud visible de los campos en pantalla
[MODIF ID <mid>]. " Grupo de modificacion para adaptacion dinamica de pantalla
" [MATCHCODE OBJECT ...] " Obsoleto para ayuda F4, mejor via referencia de diccionario en FOR
" [NO DATABASE SELECTION] " Principalmente para propositos internos de SAP
  • <selcrit>: El nombre del criterio de seleccion (por ejemplo, s_kunnr, so_matnr). Bajo este nombre se crea internamente una tabla Ranges.
  • FOR <campo>: Muy importante! Especifica el objeto de datos al que se refiere el criterio y del que hereda su tipo de datos. A menudo es un campo de tabla de base de datos (por ejemplo, mara-matnr) o una variable local (my_variable). El tipo determina las propiedades de los campos LOW y HIGH de la tabla Ranges e influye en las verificaciones de entrada asi como en la ayuda F4.

Funcionamiento (Que pasa internamente?)

La sentencia SELECT-OPTIONS <selcrit> FOR ... declara implicitamente una tabla interna llamada <selcrit>. Esta tabla tiene una estructura fija (estructura Ranges) con cuatro columnas:

  1. SIGN (Character 1): Contiene ‘I’ para Inclusivo (Include) o ‘E’ para Exclusivo (Exclude).
  2. OPTION (Character 2): Contiene el operador de comparacion. Valores comunes son:
    • EQ: Equals (Igual)
    • NE: Not Equal (No igual)
    • BT: Between (Entre)
    • NB: Not Between (No entre)
    • CP: Contains Pattern (Contiene patron, por ejemplo, A*)
    • NP: Not contains Pattern (No contiene patron)
    • GT: Greater Than (Mayor que)
    • GE: Greater Equal (Mayor o igual)
    • LT: Less Than (Menor que)
    • LE: Less Equal (Menor o igual)
  3. LOW: El limite inferior o el valor individual. El tipo de datos se hereda del campo en la clausula FOR.
  4. HIGH: El limite superior (solo relevante cuando OPTION = BT o NB). Mismo tipo de datos que LOW.

En la pantalla de seleccion, el usuario introduce valores que el sistema inserta en esta tabla interna <selcrit> al ejecutar el informe.

Opciones importantes explicadas

  • DEFAULT <valor> [TO <valor2>] ...: Prellena el criterio en la pantalla con uno o mas valores por defecto.
  • OBLIGATORY: Hace obligatoria al menos una entrada en este criterio. El programa no puede iniciarse sin entrada.
  • NO-EXTENSION: Oculta el boton de “seleccion multiple” (a la derecha de los campos de entrada). El usuario solo puede introducir la linea directamente visible (un valor o un intervalo).
  • NO INTERVALS: Oculta el campo “Hasta” (campo HIGH). El usuario solo puede introducir valores individuales (EQ, NE, GT, etc.) o patrones (CP, NP), no rangos (BT, NB).
  • LOWER CASE: Permite la entrada de minusculas e impide la conversion automatica a mayusculas.

Uso en ABAP SQL (consultas de base de datos)

La tabla Ranges <selcrit> llenada por el usuario se utiliza en la clausula WHERE de una sentencia SELECT con el operador IN para filtrar la seleccion de base de datos:

SELECT carrid, connid, fldate
FROM spfli
WHERE carrid IN @s_carrid " s_carrid es el SELECT-OPTIONS
AND connid IN @s_connid " s_connid es otro SELECT-OPTIONS
INTO TABLE @DATA(lt_flights).

La base de datos entonces solo selecciona las filas cuyos valores de campo cumplen las condiciones definidas en la tabla Ranges.

Diferencia con PARAMETERS

  • PARAMETERS: Define un unico campo de entrada para exactamente un valor en la pantalla de seleccion.
  • SELECT-OPTIONS: Define posibilidades de entrada mas complejas (rangos, multiples valores, exclusiones, patrones) y crea internamente una tabla para ello.

Ejemplos

1. Select-Option estandar para numero de material

REPORT z_demo_selopt.
TABLES: mara. " Para clausula FOR (o declarar variable local)
SELECT-OPTIONS s_matnr FOR mara-matnr.
START-OF-SELECTION.
SELECT matnr, mtart, matkl
FROM mara
WHERE matnr IN @s_matnr " Filtrar por numeros de material
INTO TABLE @DATA(lt_mara).
cl_demo_output=>display( lt_mara ).

(Genera campos en la pantalla de seleccion para Material de/hasta y el boton de seleccion multiple)

2. Rango de fechas con valor por defecto (hoy) y entrada obligatoria

SELECT-OPTIONS s_date FOR sy-datum OBLIGATORY DEFAULT sy-datum.

(Genera un campo de fecha de/hasta que esta prellenado con la fecha actual y debe rellenarse)

3. Solo aerolineas individuales (sin rangos, sin seleccion multiple)

SELECT-OPTIONS s_carrid FOR spfli-carrid NO INTERVALS NO-EXTENSION.

(Genera solo un unico campo de entrada para el ID de aerolinea, sin campo “hasta” y sin boton de seleccion multiple)

Notas importantes / Mejores practicas

  • SELECT-OPTIONS se definen en la parte de declaracion de programas que deben tener una pantalla de seleccion.
  • La clausula FOR es decisiva para el tipo, las verificaciones y la ayuda F4. Debe referirse a un campo de diccionario o una variable con el tipo apropiado.
  • La tabla Ranges generada se utiliza con el operador IN en la clausula WHERE.
  • Usa PARAMETERS para valores de entrada simples y SELECT-OPTIONS para criterios de seleccion mas complejos.