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 camposLOWyHIGHde 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:
SIGN(Character 1): Contiene ‘I’ para Inclusivo (Include) o ‘E’ para Exclusivo (Exclude).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)
LOW: El limite inferior o el valor individual. El tipo de datos se hereda del campo en la clausulaFOR.HIGH: El limite superior (solo relevante cuandoOPTION=BToNB). Mismo tipo de datos queLOW.
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-OPTIONSse definen en la parte de declaracion de programas que deben tener una pantalla de seleccion.- La clausula
FORes 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
INen la clausulaWHERE. - Usa
PARAMETERSpara valores de entrada simples ySELECT-OPTIONSpara criterios de seleccion mas complejos.