En ABAP Cloud (ABAP RESTful Application Programming Model), muchos campos del sistema clásicos (SY-*) no están disponibles o están restringidos. Este artículo muestra las alternativas modernas.
Por qué los campos SY-* están restringidos
ABAP Cloud sigue el principio Clean Core:
- Los campos del sistema dependen del contexto de ejecución
- Muchos campos SY-* revelan detalles de implementación
- Las aplicaciones cloud deben ser independientes del contexto
Alternativas
1. Fecha y hora actuales
" Clásico (NO disponible en ABAP Cloud)DATA(lv_datum) = sy-datum.DATA(lv_uzeit) = sy-uzeit.
" ABAP Cloud - con CL_ABAP_CONTEXT_INFODATA(lv_date) = cl_abap_context_info=>get_system_date( ).DATA(lv_time) = cl_abap_context_info=>get_system_time( ).
" TimestampDATA(lv_timestamp) = utclong_current( ).2. Usuario actual
" ClásicoDATA(lv_uname) = sy-uname.
" ABAP CloudDATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).
" Nombre para mostrar (nombre de usuario legible)DATA(lv_user_formatted) = cl_abap_context_info=>get_user_formatted_name( ).3. Idioma
" ClásicoDATA(lv_langu) = sy-langu.
" ABAP CloudDATA(lv_language) = cl_abap_context_info=>get_user_language_abap_format( ).4. Zona horaria
" ABAP CloudDATA(lv_timezone) = cl_abap_context_info=>get_user_time_zone( ).5. SUBRC - Estado de retorno
" SUBRC sigue estando disponible tras operaciones!READ TABLE lt_data INTO DATA(ls_data) WITH KEY id = 1.IF sy-subrc = 0. " EncontradoENDIF.
" TABIX también sigue disponibleDATA(lv_index) = sy-tabix.6. Índice del LOOP
" SY-INDEX disponible en LOOPsLOOP AT lt_data INTO DATA(ls_data). DATA(lv_index) = sy-tabix. " Índice de la línea actualENDLOOP.
DO 10 TIMES. DATA(lv_counter) = sy-index. " Contador DO/WHILEENDDO.Clase CL_ABAP_CONTEXT_INFO
Esta clase proporciona todos los métodos relevantes para información de contexto:
| Método | Descripción |
|---|---|
get_system_date( ) | Fecha del sistema (reemplaza sy-datum) |
get_system_time( ) | Hora del sistema (reemplaza sy-uzeit) |
get_user_technical_name( ) | Nombre de usuario técnico (reemplaza sy-uname) |
get_user_formatted_name( ) | Nombre de usuario formateado |
get_user_language_abap_format( ) | Idioma en formato ABAP |
get_user_time_zone( ) | Zona horaria del usuario |
get_user_business_partner( ) | Business Partner del usuario |
Campos del sistema aún disponibles
Estos campos SY-* siguen disponibles en ABAP Cloud:
| Campo | Uso |
|---|---|
sy-subrc | Código de retorno tras operaciones |
sy-tabix | Índice en operaciones de tabla |
sy-index | Índice en DO/WHILE |
sy-dbcnt | Número de registros de base de datos afectados |
Ejemplo completo
CLASS zcl_context_example DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. METHODS get_context_info RETURNING VALUE(rs_info) TYPE string.ENDCLASS.
CLASS zcl_context_example IMPLEMENTATION. METHOD get_context_info. DATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ). DATA(lv_date) = cl_abap_context_info=>get_system_date( ). DATA(lv_time) = cl_abap_context_info=>get_system_time( ). DATA(lv_language) = cl_abap_context_info=>get_user_language_abap_format( ). DATA(lv_timezone) = cl_abap_context_info=>get_user_time_zone( ).
rs_info = |Usuario: { lv_user }, Fecha: { lv_date }, Hora: { lv_time }, | && |Idioma: { lv_language }, Zona horaria: { lv_timezone }|. ENDMETHOD.ENDCLASS.En CDS Views
En CDS Views usa funciones de sesión:
define view entity ZI_ContextDemo as select from ztable { key field1,
// Información de sesión $session.user as CurrentUser, $session.client as CurrentClient, $session.system_language as SystemLanguage, $session.system_date as SystemDate}Notas importantes / Mejores prácticas
- Usa siempre CL_ABAP_CONTEXT_INFO en lugar de campos SY-* directamente.
- sy-subrc y sy-tabix siguen disponibles normalmente.
- En CDS Views usa $session para información de contexto.
- Piensa en zonas horarias - usa UTC para almacenamiento.
- Los timestamps deben crearse con
utclong_current( ).