✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
Resumen
Unidad 3 lección 6
Lenguaje SQL Y la sentencia SELECT
1- El lenguaje SQL. (lenguaje de consulta estructurado) => Este sirve xa acceder y manipular los datos =>lenguaje SQL.
= xa comunicarse con DB.
= Realizar operaciones de acceso.
= Manipulacion de la informacion en DB.
Lenguaje sencillo de consulta = Selección
= Inserción
= Actualización.
= Borrado
= Operaciones administrativas sobre DB.
El lenguaje SQL es un estándar mantenido por ANSI (Instituto Nacional Estadounidense de estándares).
Algunos sist de gestion de DB q utilizan SQL son: = Oracle
= SAP HANA
= Mysql
= Microsoft SQL
= Microsoft Access
= Ingres, entre otros
DB Oracle su lenguaje SQL no es el mismo q utiliza la DB SAP HANA.
La estructura de las consultas es practica/ igual, xo existen pequeñas diferencias a la hora de organizar los bloques de sentencias y especificar operaciones o las funciones de admon.
Las sentencias del lenguaje SQL tienen 3 grupos
- Lenguaje de definición de datos (DDL) se utiliza xa = Definir estructuras como esquemas
= La DB
= Las tablas de DB.
= Las restricciones
** CREATE => DB, tablas, vistas.
** ALTER => Modificar estructuras DB (borrar - añadir columnas)
** DROP => Eliminar objetos de la estructura ( un indice o una secuencia)
- Lenguaje de Manipulación de datos (DML) se utiliza = Realizar inserciones
= Actualizaciones
= Borrado de datos
= Extraer datos
** SELECT => consulta
** INSERT => insertar valores a la DB
** UPDATE => actualizar valores a uno o varios registros
** MODIFY => también xa modificar uno o varios registros
** DELETE => eliminar filas en una tabla de DB.
- Lenguaje de control de datos (DCL) = podemos quitar o ponerle permisos a los objetos a los usuarios
= permite admon del sist
= controlar acceso a los objetos
2- La sentencia SELECT.
Esta sentencia se utiliza xa recuperar info EN SQL permita obtener registros de la DB de una o varias tablas, hacer filtros.
En ABAP las sintaxis del select:
SELECT <resultado> campos
FROM <tabla> tabla o tablas
INTO <terget> destino donde serán alojados los datos
WHERE <condiciones> criterios de búsqueda
Ej: tabla ZTABLA_usuarios
2.1 SELECT *
FROM ztabla_usuario_g
INTO TABLE ti_usuarios (tabla interna)
==> Evitar el uso del asterisco (*) cuando solo se requiere obtener algunos campos de la tabla origen.
2.2 SELECT * APPENDING TABLE
podría ocurrir q quisieramos conservar el contenido de la tabla interna ti_usuarios luego de reiteradas selecciones en este caso usamos la cláusula APPENDING en lugar de INTO TABLE
Recomendable hacer un REFRESH de la tabla interna en donde se almacenaran los datos antes de realizar los mismos.
En caso de utilizar una variable o una estructura entonces utilizamos CLEAR
2-3 SELECT campo1
podemos traer todos los campos de una tabla ZTABLA_USUARIOS_G el campo DNI deberiamos crear una tabla interna auxiliar solo con este campo.
SELECT dni
from ZTABLA_USUARIOS
INTO table TI_USUARIOS_AUX
=> siempre despues de un select se debe preguntar x el sy-subrc xa saber como proseguir.
Lo mismo xa obtener dos campos:
SELECT nombre_ape estado_usu
FROM ZTABLA_USUARIOS
INTO TABLE ti_usuarios2.
=> si la variable estructura o tabla interna no coinciden en el formato con los datos recuperados entonces se produce un error, q dependiendo el caso puede ser de sintaxis o en tiempo de ejecución es decir DUMP.
2.4 SELECT SINGLE
si queremos obtener la primera ocurrencia de la tabla ZTABLA_USUARIOS_g donde se cumple determinada condición debemos ejecutar
* seleccionamos el prmer registro q cumpla la condición
CLEAR wa_usuarios
SELECT SINGLE *
FROM ZTABLA_USUARIOS
INTO wa_usuarios ==> estructura del mismo tipo q la tabla original
si queremos realizar la misma consulta anterior xo necesitamos obtener solo un campo DNI utilizaremos una variable y no en una estructura.
* seleccionamos el primer registro q cumpla la condición.
CLEAR v_dni
SELECT SINGLE dni
FROM ZTABLA_USUARIOS_g
INTO v_dni
WHERE nombre_ape NE space
2-5 SELECT INTO CORRESPONDING FIELDS OF TABLE
Si quisieramos obtener de una tabla DB los registros q cumplan una condición xo deseamos guardarlos en tabla interna q no tiene la misma estructura q la tabla DB entonces tenemos q usan
* seleccionamos los registros q cumplen la condicion
SELECT nombre_ape estado_usu
FROM ZTABLE_USUSARIOS_g
INTO CORRESPONDING FIELDS OF TABLE ti_usuarios2
WHERE nombre_ape NE 'A'
AND estado_usu EQ 'A'
En el ej anterior la tabla interna ti_usuaarios2 esta compuesta x los campos NOMBRE_APE y ESTADO_USU
2-6 SELECT ...WHERE IN
Ahora supongamos q tenemos en reporte q tiene la siguiente pantalla de seleccion
Donde nombre y apellido es el parametro p_nomape y estado del usuario q es SELECT-OPTIONS s_estado. si queremos hacer una seleccion a la tabla ZTABLA_USUARIOS_g en base a lo q los usuarios ingresan x pantalla haremos los siguiente
* seleccionamos a los registros q cumplan con los parametros de pantalla
SELECT *
FROM ZTABLA_USUARIOS_g
INTO TABLE ti_usuarios
WHERE nombre_ape EQ p_nomape
AND estado_usu IN s_estado
la clausula IN se utiliza xa los SELECT-OPTIONS en las condiciones de un select.
2-7 SELECT MAX
obtener el usuario activo con DNI mas alto tendremos q usar la clausula MAX
CLEAR v_dni
SELECT MAX(dni)
INTO v_dni
FROM ZTABLA_USUARIO_G
WHERE estado_usu EQ 'A'
Si colocamos la sentencia SELECT es igual xa el compilador si colocamos la sección from y luego las sección into o alrevés
2-8 SELECT COUNT(*)
*obtenemos la cantidad de usuarios activos
CLEAR v_activos
SELECT count(*)
INTO v_activos
FROM ZTABLA_USUARIOS_g
WHERE estado_usu EQ 'A'
2-9 SELECT FOR ALL ENTRIES IN
xa obtener todos los registros q existen en una tabla interna cargada con datos => cláusula FOR ALL ENTRIES IN q nos permite especificar en condiciones en tiempo de ejecución Ej:
SELECT *
INTO TABLE ti_usuarios_g
FROM ZTABLA_usuarios
FOR ALL ENTRIES IN ti_procveedores
WHERE dni EQ ti_proveedores-dni
dos cosas a tomar en cuenta depende de la situación y es validar q la tabla ti_proveedores tiene 3 registros, no importa recorrerla, pero si esta tabla tiene 100mil registros el costo de hacerlo es grandísimo.
2-10 SELECT ... LIKE
si quiesieramos obtener todos los registros q cumplan con un patron de texto en alguno de los campos con la cláusula LIKE (%)
SELECT *
FROM ZTABLA_USUARIOS_g
INTO ti_usuarios
WHERE nombre_ape LIKE 'A%'
2-11 SELECT .... INNER JOIN
Hacer un select a mas de una tabla, se conoce con el nombre JOIN.
tabla => factura cabecera VBRK y la tabla VBRP
Supongamos q deseamos recuperar de ambas tablas los registros en donde el campo VBELN (num de factura) esta es la condición de unión => campos de la tabla VBRK.
- Factura (VBELN)
- Clase de factura (FKART)
- Tipo de factura (FKTYP)
- Tipo de documento comercial (VBTYP)
- Moneda del documento comercial (WAERK)
- Organizcion de ventas (VKORG)
- Canal de distribucion (VTWEG)
Y los sgntes tablas (VBRP)
- Posicion de factura (POSNR)
- Valor neto de posicion factura (NETWR)
Ejecutamos la sentencia
SELECT INNER JOIN (unir internamente)
TYPES: BEGIN OF ty_facturas
vbeln LIKE vbrk-ubeln,
fkart LIKE vbrk-fkart,
fktyp LIKE vbrk-fktyp,
vbtyp LIKE vbrk-vbtyp,
waerk LIKE vbrk-waerk,
vkorg LIKE vbrk-vkorg,
vtmeg LIKE wbrk-vtweg,
posnr LIKE vbrp-posnr,
netwr LIKE vbrp-netwr,
END OF ty_facturas,
DATA: ti_facturas TYPE STANDARD TABLE OF ty_facturas,
wa_facturas LIKE LINE OF ti_facturas.
realizamos con JOIN entre las tablas VBRK Y VBRF
SELECT t1.vbeln t1.fkart t1.fktyp t1.vbtyp t1.waerk
t1.vkorg t1.vtweg t2.posnr t2.netwr
INTO CORRESPONDING FIELDS OF TABLE ti_facturas
FROM vbrk AS t1 INNER JOIN vbrp AS t2
ON t2-vbeln = t2-vbeln
La clausula INNER JOIN entre dos tablas DB A y B entregará el resultado de la intersección de conjuntos A y B en otras palabras, la parte interna, es decir los registros en común entre amabas tablas DB s/g la condición de conexión de ambas tablas. La clausula LEFT OUTER JOIN entre dos tablas A y B, en donde obtendremos como resultado la unión entre las tablas A y B + la parte de información exterior de la tablas DB A es de la tabla DB q se encuentra a la izquierda en la unión.
TX SE30 xa comparar 2 programas => nos da el rendimiento
 
 
 
Sobre el autor
Publicación académica de Gustavo Betancur Guzmán, en su ámbito de estudios para la Carrera Consultor ABAP.
Gustavo Betancur Guzmán
Profesión: Ingeniero de Sistemas - Colombia - Legajo: WS86O
✒️Autor de: 164 Publicaciones Académicas
🎓Egresado de los módulos:
- Carrera Consultor ABAP Nivel Avanzado
- Carrera Consultor ABAP Nivel Inicial
- Carrera Consultor en SAP MM Nivel Avanzado
- Carrera Consultor en SAP MM Nivel Inicial