Clases, ejercicios y proyecto final del máster de SAP ABAP Cloud, desarrollados en SAP BTP (ABAP Environment) con Eclipse ADT y sincronizados con GitHub mediante abapGit.
Segunda parte: ABAP Cloud · de avanzado a experto
| Bloque | Temario | Qué hay en el repositorio |
|---|---|---|
| Primeros pasos | Clases de introducción sobre el modelo de vuelos /DMO/ de SAP |
Clases locales, atributos, métodos funcionales y excepciones |
| 01 | Herramientas y conceptos básicos | Estructura de clases y laboratorio de variables |
| 02 | Operaciones, textos y cadenas de caracteres | Aritmética (y sus formas obsoletas), redondeo y truncamiento, fechas del sistema, OVERLAY, SUBSTRING, FIND, REPLACE, SPLIT… Laboratorio de gestión de facturas |
| 03 | Bifurcaciones, estructuras y tipos locales | Operadores lógicos y su prioridad, IF, CASE, SWITCH, COND, bucles DO, WHILE y LOOP, CHECK, TRY-CATCH. Laboratorio de estructuras de control |
| 04 | Tablas internas | Tablas STANDARD, SORTED y HASHED, VALUE #, APPEND, INSERT, MODIFY, DELETE, COLLECT, SORT, CORRESPONDING con BASE y MAPPING |
| 05 | Expresiones de constructor y punteros | Estructura de clases del bloque |
| 06 | Depuración, programación dinámica y rendimiento | Estructura de clases del bloque |
| 07-08 | Diccionario: tipos, tablas, bloqueos y relaciones | Dominios, elementos de datos, estructura, tipo tabla y objeto de bloqueo |
| 09-10 | Programación ABAP SQL | Estructura de clases (consultas, joins, subconsultas, commit/rollback) |
| 11 | ABAP SQL push-down | Estructura de clases del bloque |
| 12 | ATC y abapGit | Objeto de autorización con su campo |
| Proyecto final | Gestión de órdenes de trabajo | Modelo de datos completo, CRUD, validaciones, historial, autorizaciones y pruebas (ver abajo) |
En los bloques 05, 06, 09-10 y 11 el repositorio solo conserva la estructura de las clases.
Sistema para registrar órdenes de trabajo de clientes, asignarlas a técnicos y llevar un historial de cambios.
erDiagram
ZDT_CUSTOMER_AGG ||--o{ ZDT_WO_AGG : "solicita"
ZDT_TECH_AGG ||--o{ ZDT_WO_AGG : "atiende"
ZDT_WO_AGG ||--o{ ZDT_WO_HIST_AGG : "registra cambios"
ZDT_CUSTOMER_AGG {
NUMC customer_id PK
CHAR name
CHAR address
CHAR phone
}
ZDT_TECH_AGG {
CHAR technician_id PK
CHAR name
CHAR specialty
}
ZDT_WO_AGG {
NUMC work_order_id PK
NUMC customer_id FK
CHAR technician_id FK
DATS creation_date
CHAR status "PE pendiente · CO completada"
CHAR priority "A alta · B baja"
CHAR description
}
ZDT_WO_HIST_AGG {
NUMC history_id PK
NUMC work_order_id FK
DATS modification_date
CHAR change_description
}
- Diccionario de datos propio: 7 dominios (estado, prioridad y actividad con valores fijos), 16 elementos de datos y 4 tablas con claves foráneas.
ZCL_WO_CRUD_HANDLER_AGG: crear, leer, actualizar (solo los campos que cambian) y eliminar órdenes. Cada cambio queda en el historial.ZCL_WORK_ORDER_VALIDATOR_AGG: reglas de negocio.- El cliente y el técnico tienen que existir.
- La prioridad y el estado deben tener valores permitidos.
- Solo se pueden modificar o borrar las órdenes pendientes.
- Autorizaciones: objeto
ZAC_WO_AGGcon los camposZ_ACTVT(crear, cambiar, ver, borrar) yZ_STATUS, comprobado conAUTHORITY-CHECK. En el entorno de pruebas la comprobación está desactivada (comentada en el código). ZCL_WORK_ORDER_CRUD_TEST_AGG: prepara datos de prueba y ejecuta las cuatro operaciones desde la consola de Eclipse.
" Actualización parcial: solo se aplican los campos que llegan informados
IF lo_validator->validate_update_order( iv_work_order_id = iv_work_order_id
iv_status = ls_current-status ) = abap_false.
RETURN. " Solo las órdenes pendientes ('PE') se pueden modificar
ENDIF.
IF is_changes-priority IS NOT INITIAL.
ls_current-priority = is_changes-priority.
ENDIF.
...
UPDATE zdt_wo_agg FROM @ls_current.
IF sy-subrc = 0.
log_history( iv_work_order_id = iv_work_order_id
iv_description = 'Orden actualizada' ).
ENDIF." Expresiones condicionales (bloque 03)
DATA(lv_descuento) = COND #( WHEN lv_monto >= 1000 THEN '10% de descuento'
WHEN lv_monto >= 500 THEN '5% de descuento'
ELSE 'Sin descuento' ).
" Copiar entre tablas internas con campos de distinto nombre (bloque 04)
gt_flights_renamed = CORRESPONDING #( gt_flights MAPPING carrier = carrier_id
connection = connection_id
date = flight_date ).Todo el código se analiza automáticamente con abaplint en cada cambio. Se compara con la API pública de SAP BTP para detectar:
- errores de sintaxis,
- tipos desconocidos,
- incoherencias del diccionario,
- SQL no válido en ABAP Cloud,
- sentencias obsoletas.
La configuración está en abaplint.json.
El código ABAP se ejecuta dentro de un sistema SAP, así que no hay una demo web. Para importarlo:
- Abre un sistema SAP BTP ABAP Environment. Sirve la cuenta de prueba gratuita (trial).
- En Eclipse con ABAP Development Tools, instala el plugin de abapGit.
- Crea un paquete, enlaza este repositorio y haz Pull.
- Ejecuta cualquier clase con F9: todas implementan
IF_OO_ADT_CLASSRUNy escriben el resultado en la consola.