Está en la página 1de 9

CURSO SAP PROGRAMACIÓN

Sentencias SQL
1. Declaración de datos
REPORT  zhr_utilitarios.

TABLES: zhrtt_empleados.

*Declarando Tablas Internas
DATA: gti_empleados TYPE TABLE OF zhrtt_empleados.
DATA: gti_edades TYPE TABLE OF zhrtt_empleados.

*Declarando un work area
DATA: gwa_empleados LIKE LINE OF gti_empleados.
DATA: gwa_edades LIKE LINE OF gti_edades.

*Solo para el caso de INNER JOIN
*Declaramos una estructura
DATA: BEGIN OF ges_ordenes,
        trkorr  TYPE e070-trkorr,
        as4date TYPE e070-as4date,
        as4time TYPE e070-as4time,
        object  TYPE e071-object,
        NOMBRE  TYPE e071-obj_NAME,
      END OF ges_ordenes.

*Declarando Tablas Internas
DATA: gti_ordenes LIKE TABLE OF ges_ordenes.

*Creamos una estructura
DATA: ges_ordenes2 LIKE ges_ordenes.

2. SELECT parte 1

START-OF-SELECTION.

SELECT *
  FROM zhrtt_empleados.
  WRITE:/ zhrtt_empleados-id_empleado, zhrtt_empleados-
nombre_empleado.
ENDSELECT.

SKIP.
ULINE.

SELECT apellid_empleado
  FROM zhrtt_empleados
  INTO zhrtt_empleados-apellid_empleado.
  WRITE:/ zhrtt_empleados-apellid_empleado.
ENDSELECT.

SKIP.
ULINE.
SELECT SINGLE apellid_empleado
  FROM zhrtt_empleados
  INTO zhrtt_empleados-apellid_empleado.
  WRITE:/ zhrtt_empleados-apellid_empleado.

SKIP.
ULINE.

*Obtengo la edad máxima de los registros de una tabla
SELECT MAX( edad_empleado )
  FROM zhrtt_empleados
  INTO zhrtt_empleados-edad_empleado.
  WRITE:/ zhrtt_empleados-edad_empleado.

SKIP.
ULINE.

*Obtengo la edad mínima de los registros de una tabla
SELECT MIN( edad_empleado )
  FROM zhrtt_empleados
  INTO zhrtt_empleados-edad_empleado.
  WRITE:/ zhrtt_empleados-edad_empleado.

SKIP.
ULINE.

3. SELECT parte 2

*Los campos seleccionados deben ser iguales
*a los campos de la tabla interna
SELECT *
  FROM zhrtt_empleados
  INTO TABLE gti_empleados.

*La tabla interna no debe tener necesariamente los mismos
*campos identicos a los que seran seleccionados
SELECT *
  FROM zhrtt_empleados
  INTO CORRESPONDING FIELDS OF TABLE gti_empleados.

*Los campos seleccionados se agregarán a los registros
*ya existentes en la tabla interna
SELECT *
  FROM zhrtt_empleados
  APPENDING TABLE gti_empleados.

*Los campos seleccionados se se guardarán en
*la tabla interna teniendo en cuenta condiciónes
SELECT *
  FROM zhrtt_empleados
  INTO TABLE gti_empleados
  WHERE edad_empleado >= 20
  AND   apellid_empleado = 'ZELADA SILVA'.
4. SELECT parte 3 (FOR ALL ENTRIES IN, WHERE, GROUP BY, HAVING, ORDER BY)

*Cargamos datos a la tabla interna gti_edades
gwa_edades-edad_empleado = 57.
APPEND gwa_edades TO gti_edades.
gwa_edades-edad_empleado = 25.
APPEND gwa_edades TO gti_edades.

*Los campos seleccionados que se agregarán en
*la tabla interna deben estar en la otra tabla interna
*las tablas internaqs involucradas las relacionaremos
*mediante algunos campos usando la sentencia Where
SELECT *
  FROM zhrtt_empleados
  INTO TABLE gti_empleados
  FOR ALL ENTRIES IN gti_edades
  WHERE edad_empleado EQ gti_edades-edad_empleado.

*Los campos seleccionados se se guardarán en
*la tabla interna teniendo en cuenta la condición de agrupación
*group by y la condición Having
SELECT sexo_empleado
  FROM zhrtt_empleados
  INTO CORRESPONDING FIELDS OF TABLE gti_empleados
  GROUP BY sexo_empleado
  HAVING sexo_empleado EQ 'M'.

*Los campos seleccionados se se guardarán en
*la tabla interna teniendo en cuenta un orden
*utilizando el order by
SELECT nombre_empleado apellid_empleado edad_empleado sexo_empleado
  FROM zhrtt_empleados
  INTO CORRESPONDING FIELDS OF TABLE gti_empleados
  ORDER BY edad_empleado ASCENDING.

*Mostrando datos
LOOP AT gti_empleados INTO gwa_empleados.
  WRITE:/ gwa_empleados-nombre_empleado,
          gwa_empleados-apellid_empleado,
          gwa_empleados-edad_empleado,
          gwa_empleados-sexo_empleado.
ENDLOOP.

SKIP.
ULINE.

5. INSERT
*Insertar datos en una tabla Z
gwa_empleados-id_empleado       = '0010'.
gwa_empleados-nombre_empleado   = 'JONAS'.
gwa_empleados-apellid_empleado  = 'IPARRAGIRRE LÓPEZ'.
gwa_empleados-edad_empleado     = 55.
gwa_empleados-sexo_empleado     = 'M'.
gwa_empleados-sueldo_empleado   = 10000.
*Permite insertar datos a una tabla Z
*a partir de una estructura
INSERT INTO zhrtt_empleados VALUES gwa_empleados.
*Permite insertar datos a una tabla Z
*a partir de una estructura
INSERT zhrtt_empleados FROM gwa_empleados.
*Permite insertar datos de una estructura a una
*tabla interna al igual que APPEND gwa_empleados TO
*gti_empleados
INSERT gwa_empleados INTO TABLE gti_empleados.
*Permite insertar datos a una tabla Z
*a partir de una tabla interna
INSERT zhrtt_empleados FROM TABLE gti_empleados.

IF sy-subrc IS INITIAL.
  WRITE:/ 'Se registró con éxito'.
ELSE.
  WRITE:/ 'No se registró con éxito'.
ENDIF.

6. UPDATE
*Modificar datos en una tabla Z
gwa_empleados-id_empleado       = '0009'.
gwa_empleados-nombre_empleado   = 'LUISA'.
gwa_empleados-apellid_empleado  = 'NEIRA ROCAS'.
gwa_empleados-edad_empleado     = 35.
gwa_empleados-sexo_empleado     = 'F'.
gwa_empleados-sueldo_empleado   = 10000.

*Actualizar registros teniendo en cuenta condiciones
UPDATE zhrtt_empleados SET nombre_empleado = 'LUISA2' WHERE id_empl
eado = '0009'.

*Actualizar registros a partir de una estructura
UPDATE zhrtt_empleados FROM gwa_empleados.

*Insertar registro en tabla interna
APPEND gwa_empleados TO gti_empleados.

*Actualizar registros a partir de una tabla interna
UPDATE zhrtt_empleados FROM TABLE gti_empleados.

IF sy-subrc IS INITIAL.
  WRITE:/ 'Se modificó con éxito'.
ELSE.
  WRITE:/ 'No se modificó con éxito'.
ENDIF.

7. DELETE

*Eliminar datos en una tabla Z
gwa_empleados-id_empleado       = '0009'.
gwa_empleados-nombre_empleado   = 'LUISA'.
gwa_empleados-apellid_empleado  = 'NEIRA ROCAS'.
gwa_empleados-edad_empleado     = 35.
gwa_empleados-sexo_empleado     = 'F'.
gwa_empleados-sueldo_empleado   = 10000.

*Eliminar registros de una tabla z teniendo en cuenta condiciones
DELETE FROM zhrtt_empleados WHERE id_empleado = '0009'.
*Eliminar registros de una tabla z desde una estructura
DELETE zhrtt_empleados FROM gwa_empleados.
*Insertar registro en tabla interna
APPEND gwa_empleados TO gti_empleados.
*Eliminar registro de una tabla z desde una tabla interna
DELETE zhrtt_empleados FROM TABLE gti_empleados.

IF sy-subrc IS INITIAL.
  WRITE:/ 'Se eliminó con éxito'.
ELSE.
  WRITE:/ 'No se eliminó con éxito'.
ENDIF.

8. SQL ROLLBACK WORK

*Eliminar datos en una tabla Z
gwa_empleados-id_empleado       = '0009'.
gwa_empleados-nombre_empleado   = 'LUISA'.
gwa_empleados-apellid_empleado  = 'NEIRA ROCAS'.
gwa_empleados-edad_empleado     = 35.
gwa_empleados-sexo_empleado     = 'F'.
gwa_empleados-sueldo_empleado   = 10000.

*Eliminar registros de una tabla z desde una estructura
DELETE zhrtt_empleados FROM gwa_empleados.

*Permite volver el regitro eliminado anteriormente
*a su estado inicial
ROLLBACK WORK.

9. SQL COMMIT WORK

*Eliminar datos en una tabla Z
gwa_empleados-id_empleado       = '0009'.
gwa_empleados-nombre_empleado   = 'LUISA'.
gwa_empleados-apellid_empleado  = 'NEIRA ROCAS'.
gwa_empleados-edad_empleado     = 35.
gwa_empleados-sexo_empleado     = 'F'.
gwa_empleados-sueldo_empleado   = 10000.

*Eliminar registros de una tabla z desde una estructura
DELETE zhrtt_empleados FROM gwa_empleados.

*Permite asegurar la ejecución anteriormente realizada
*Esta sentencia siempre esta por defecto al ejecutar
*una instrucción, por lo cual no es necesario ponerla
COMMIT WORK.
IF sy-subrc IS INITIAL.
  WRITE:/ 'Se eliminó con éxito'.
ELSE.
  WRITE:/ 'No se eliminó con éxito'.
ENDIF.

10. SQL INNER JOIN


WRITE:/ 'INNER JOIN DE 2 TABLAS'.

SKIP.

SELECT a~trkorr a~as4date a~as4time b~object b~obj_name
  FROM e070 AS a
  INNER JOIN e071 AS b ON a~trkorr = b~trkorr
  INTO TABLE gti_ordenes
  UP TO 10 ROWS
  WHERE a~trkorr LIKE 'SAPKD%'
  AND   b~object EQ   'PROG'.

LOOP AT gti_ordenes INTO ges_ordenes.
  MOVE ges_ordenes TO ges_ordenes2.
  WRITE:/ ges_ordenes2-trkorr, '|',ges_ordenes2-as4date, '|',
          ges_ordenes2-as4time, '|',ges_ordenes2-object,'|',
          ges_ordenes2-nombre.
ENDLOOP.

11. SQL UP TO ROWS´


SELECT a~trkorr a~as4date a~as4time b~object b~obj_name
  FROM e070 AS a
  INNER JOIN e071 AS b ON a~trkorr = b~trkorr
  INTO TABLE gti_ordenes
  UP TO 10 ROWS  "Determina la cantidad de regitros que se mostrar
án al realizar la consulta
  WHERE a~trkorr LIKE 'SAPKD%'
  AND   b~object EQ   'PROG'.

LOOP AT gti_ordenes INTO ges_ordenes.
  MOVE ges_ordenes TO ges_ordenes2.
  WRITE:/ ges_ordenes2-trkorr, '|',ges_ordenes2-as4date, '|',
          ges_ordenes2-as4time, '|',ges_ordenes2-object,'|',
          ges_ordenes2-nombre.
ENDLOOP.

12. SQL IN

- Definición de Datos

REPORT  zhr_utilitarios.

TABLES: zhrtt_empleados, e070.

*Declarando Tablas Internas
DATA: gti_empleados TYPE TABLE OF zhrtt_empleados.

*Declaramos una estructura
DATA: ges_empleados LIKE LINE OF gti_empleados.

- Pantalla de selección

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
  SELECT-OPTIONS s_id_emp FOR zhrtt_empleados-id_empleado.
SELECTION-SCREEN END OF BLOCK b1.

- Código de ejemplo

START-OF-SELECTION.

"Permite restringir los registros en la consulta
*A partir de una tabla interna o select-option
SELECT *
  FROM zhrtt_empleados
  INTO TABLE gti_empleados
  WHERE id_empleado IN s_id_emp.

*Recorremos la tabla de empleados consultada
LOOP AT gti_empleados INTO ges_empleados.
  WRITE:/ ges_empleados-id_empleado, '|',ges_empleados-
nombre_empleado, '|',
          ges_empleados-edad_empleado, '|',ges_empleados-
sexo_empleado,'|',
          ges_empleados-moneda_empleado.
ENDLOOP.

*Declaramos una estructura de la tabla interna del select-
option
DATA: les_id_emp LIKE LINE OF s_id_emp.
*Recorremos la tabla interna del select-option
LOOP AT s_id_emp INTO les_id_emp.
  WRITE:/ les_id_emp-sign, les_id_emp-option, les_id_emp-low, le
s_id_emp-high.
ENDLOOP.

"Permite restringir los registros en la consulta
*Indicando los valores que se quiere restringir o aceptar
SELECT *
  FROM zhrtt_empleados
  INTO TABLE gti_empleados
  WHERE id_empleado IN ('0001','0008').

*Recorremos la tabla de empleados consultada
LOOP AT gti_empleados INTO ges_empleados.
  WRITE:/ ges_empleados-id_empleado, '|',ges_empleados-
nombre_empleado, '|',
          ges_empleados-edad_empleado, '|',ges_empleados-
sexo_empleado,'|',
          ges_empleados-moneda_empleado.
ENDLOOP.

13. SQL DISTINCT

START-OF-SELECTION.

"Permite obtener registros distintos, dependiendo
*del campo señalado en la consulta
SELECT DISTINCT apellid_empleado
  FROM zhrtt_empleados
  INTO CORRESPONDING FIELDS OF TABLE gti_empleados.

*Recorremos la tabla de empleados consultada
LOOP AT gti_empleados INTO ges_empleados.
  WRITE:/ ges_empleados-apellid_empleado.
ENDLOOP.

14. SQL COUNT, MAX, MIN, AVG, SUM

- La definición de variables

REPORT  zhr_utilitarios.

TABLES: zhrtt_empleados.

*Declarando Tablas Internas
DATA: gti_empleados TYPE TABLE OF zhrtt_empleados.

*Declaramos una estructura
DATA: ges_empleados LIKE LINE OF gti_empleados.

*Declarando variales
DATA: gv_cant_registros TYPE i.
DATA: gv_max_sueldo LIKE ges_empleados-sueldo_empleado.
DATA: gv_min_sueldo LIKE ges_empleados-sueldo_empleado.
DATA: gv_avg_sueldo LIKE ges_empleados-sueldo_empleado.
DATA: gv_sum_sueldo LIKE ges_empleados-sueldo_empleado.

- Ejemplo del código.

START-OF-SELECTION.

*Limpiamos las variables creadas
CLEAR: gv_cant_registros, gv_max_sueldo, gv_min_sueldo, gv_avg_s
ueldo, gv_sum_sueldo.

*Obtenemos la cantidad de registros, Máximo, Mínimo, Porcentaje 
y Sumatoria
SELECT  COUNT(*) MAX( sueldo_empleado ) MIN( sueldo_empleado )
        AVG( sueldo_empleado ) SUM( sueldo_empleado )
  FROM  zhrtt_empleados
  INTO  (gv_cant_registros,
         gv_max_sueldo,
         gv_min_sueldo,
         gv_avg_sueldo,
         gv_sum_sueldo).

*Mostramos resultados
WRITE:/ 'La tabla tiene: ', gv_cant_registros, 'Registros'.
WRITE:/ 'El máximo es: ', gv_max_sueldo.
WRITE:/ 'El mínimo es: ', gv_min_sueldo.
WRITE:/ 'El promedio es: ', gv_avg_sueldo.
WRITE:/ 'La sumatoria es: ', gv_sum_sueldo.

También podría gustarte