Campos del sistema en ABAP Cloud: Alternativas a SY-*

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

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_INFO
DATA(lv_date) = cl_abap_context_info=>get_system_date( ).
DATA(lv_time) = cl_abap_context_info=>get_system_time( ).
" Timestamp
DATA(lv_timestamp) = utclong_current( ).

2. Usuario actual

" Clásico
DATA(lv_uname) = sy-uname.
" ABAP Cloud
DATA(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ásico
DATA(lv_langu) = sy-langu.
" ABAP Cloud
DATA(lv_language) = cl_abap_context_info=>get_user_language_abap_format( ).

4. Zona horaria

" ABAP Cloud
DATA(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.
" Encontrado
ENDIF.
" TABIX también sigue disponible
DATA(lv_index) = sy-tabix.

6. Índice del LOOP

" SY-INDEX disponible en LOOPs
LOOP AT lt_data INTO DATA(ls_data).
DATA(lv_index) = sy-tabix. " Índice de la línea actual
ENDLOOP.
DO 10 TIMES.
DATA(lv_counter) = sy-index. " Contador DO/WHILE
ENDDO.

Clase CL_ABAP_CONTEXT_INFO

Esta clase proporciona todos los métodos relevantes para información de contexto:

MétodoDescripció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:

CampoUso
sy-subrcCódigo de retorno tras operaciones
sy-tabixÍndice en operaciones de tabla
sy-indexÍndice en DO/WHILE
sy-dbcntNú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( ).