
LECCIÓN 6 SENTENCIA SELECT:
En ABAP existen un conjunto de sentencias que se utilizan para acceder a las tablas de la base de datos. La más importante de estas sentencias es SELECT.
A través de la sentencia SELECT podremos acceder a los registros almacenados en cada una de las tablas que componen a la base de datos de SAP.
La sentencia SELECT presenta muchas variantes de ejecución que utilizaremos en base a la necesidad de información que se nos requiera.
Algunos ejemplos de las variantes más utilizadas de la sentencia SELECT son las siguientes:
- SELECT *: mediante esta sentencia se seleccionan todos los campos y todos registros de la tabla base de datos. Es aconsejable minimizar la utilización del SELECT * ya que consume muchos recursos del sistema
- SELECT SINGLE: utilizaremos esta cláusula para seleccionar un solo registros de la tabla base de datos.
- SELECT… INTO TABLE: mediante esta cláusula almacenaremos el resultado de la selección en la tabla interna que se especifique a continuación de TABLE.
Para evitar que se pisen los datos de la Tabla Interna, se usa la sentencia APPENDING TABLE en vez de INTO TABLE.
Es recomendable usar CLEAR y REFRESH antes de realizar la selección.
- SELECT… INTO CORRESPONDING FIELDS OF TABLE: mediante esta cláusula almacenaremos el resultado de la selección en la tabla interna que se especifique a continuación de TABLE pero esta tabla interna puede no tener la misma estructura que la tabla base de datos.
- SELECT SINGLE: obtenemos la primera ocurrencia dada una condición
- SELECT SINGLE MAX: mediante esta cláusula obtendremos el campo de mayor valor que se especifique a la derecha de MAX.
- SELECT COUNT(*): utilizaremos esta sentencia si quisiéramos contabilizar la cantidad de registros que cumplen con una condición especifica.
- SELECT….FOR ALL ENTRIES: utilizaremos esta sentencia si quisiéramos obtener de una tabla base de datos, todos los registros que existan en una tabla interna cargada con datos.
Código Fuente Ejemplos:
*&---------------------------------------------------------------------*
*& Report Z_PRUEBA_ABAP_3_7
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z_prueba_abap_3_7.
* Tabla interna de proveedores
DATA: wa_usuarios TYPE ztabla_usuarios,
ti_usuarios LIKE STANDARD TABLE OF wa_usuarios.
DATA: BEGIN OF ti_usuarios_aux OCCURS 0,
dni TYPE z_dni,
END OF ti_usuarios_aux.
DATA: BEGIN OF ti_usuarios2 OCCURS 0,
nombre_ape TYPE z_nombre_ape,
estado_usu TYPE z_estado_usu,
END OF ti_usuarios2.
DATA: v_estado_usu TYPE z_estado_usu,
v_nombre_ape TYPE z_nombre_ape,
v_dni TYPE z_dni,
v_activos TYPE i.
DATA: BEGIN OF ti_proveedores OCCURS 0,
dni TYPE z_dni,
END OF ti_proveedores.
*---------------------------------------------------------------------*
* Pantalla de selección
*---------------------------------------------------------------------*
PARAMETERS: p_nomape LIKE v_nombre_ape OBLIGATORY.
SELECT-OPTIONS s_estado FOR v_estado_usu.
*----------------------------------------------------------------------*
START-OF-SELECTION.
*----------------------------------------------------------------------*
* Selecciono todos los registros
SELECT *
FROM ztabla_usuarios
INTO TABLE ti_usuarios.
* Selecciono de todos los registros el campo DNI
SELECT dni
FROM ztabla_usuarios
INTO TABLE ti_usuarios_aux.
* Selecciono el primer registro que cumpla la condición
CLEAR wa_usuarios.
SELECT SINGLE *
FROM ztabla_usuarios
INTO wa_usuarios
WHERE nombre_ape NE space.
* Selecciono el primer registro que cumpla la condición
CLEAR v_dni.
SELECT SINGLE dni
FROM ztabla_usuarios
INTO v_dni
WHERE nombre_ape NE space.
CLEAR ti_usuarios2.
REFRESH ti_usuarios2.
* Selecciono los registros que cumpla la condición
SELECT nombre_ape estado_usu
FROM ztabla_usuarios
INTO CORRESPONDING FIELDS OF TABLE ti_usuarios2
WHERE nombre_ape NE space
AND estado_usu = 'A'.
* Selecciono los registros que cumplan con los parámetros de pantalla
SELECT *
FROM ztabla_usuarios
INTO TABLE ti_usuarios
WHERE nombre_ape = p_nomape
AND estado_usu IN s_estado.
* Obtengo el usuario activo con DNI más alto
SELECT SINGLE MAX( dni )
INTO v_dni
FROM ztabla_usuarios
WHERE estado_usu = 'A'.
* Obtengo la cantidad de usuarios activos
SELECT COUNT(*)
INTO v_activos
FROM ztabla_usuarios
WHERE estado_usu = 'A'.
* Obtengo los registros de los usuarios que existan en la tabla
* interna TI_PROVEEDORES
SELECT *
INTO TABLE ti_usuarios
FROM ztabla_usuarios
FOR ALL ENTRIES IN ti_proveedores
WHERE dni = ti_proveedores-dni.