Ir al contenido
Programación ABAP

Diccionario de dumps

Los errores de tiempo de ejecución más habituales de la ST22: qué significan, por qué ocurren y cómo se solucionan, con la excepción que permite capturarlos y ejemplos de código.

CONVT_NO_NUMBER

Conversiones y cálculosCATCH CX_SY_CONVERSION_NO_NUMBER

Se ha intentado convertir a número un texto que no es un número.

Causas habituales

  • Asignar a un campo de tipo I, P o N un texto con letras, espacios intermedios o símbolos.
  • Leer un fichero con importes en formato «1.250,50» y moverlos directamente a un campo numérico.
  • Un campo de la pantalla de selección o de un IDoc trae un valor inesperado.

Cómo se soluciona

  • Valida el texto antes de convertirlo, por ejemplo con CO '0123456789' o una expresión regular.
  • Para importes con formato de usuario, quita los separadores de miles y cambia la coma decimal por punto antes de convertir.
  • Rodea la conversión con TRY … CATCH cx_sy_conversion_no_number y muestra un mensaje claro.
Provoca el dump
DATA lv_importe TYPE p LENGTH 15 DECIMALS 2.
lv_importe = lv_texto.   " '12,5 EUR' → dump
Corregido
TRY.
    DATA(lv_importe) = CONV decfloat34( replace( val = lv_texto sub = ',' with = '.' ) ).
  CATCH cx_sy_conversion_no_number INTO DATA(lx_error).
    MESSAGE |Importe no válido: { lv_texto }| TYPE 'E'.
ENDTRY.

Enlace a este dump

CONVT_OVERFLOW

Conversiones y cálculosCATCH CX_SY_CONVERSION_OVERFLOW

El valor no cabe en el campo de destino al convertirlo.

Causas habituales

  • Mover un número grande a un campo de tipo I (máximo 2.147.483.647) o a un P con pocas posiciones.
  • Convertir un texto largo de dígitos a un campo numérico corto.

Cómo se soluciona

  • Usa un tipo con más capacidad: int8, p LENGTH 16 o decfloat34.
  • Comprueba el rango antes de asignar o captura cx_sy_conversion_overflow.

Enlace a este dump

BCD_ZERODIVIDE

Conversiones y cálculosCATCH CX_SY_ZERODIVIDE

División por cero con números de tipo P (empaquetados).

Causas habituales

  • Calcular un porcentaje o un precio unitario cuando el divisor (cantidad, total) es cero.

Cómo se soluciona

  • Comprueba el divisor antes de dividir.
  • Captura cx_sy_zerodivide si el cero es un caso posible.
Provoca el dump
lv_unitario = lv_importe / lv_cantidad.
Corregido
lv_unitario = COND #( WHEN lv_cantidad <> 0 THEN lv_importe / lv_cantidad ELSE 0 ).

Enlace a este dump

COMPUTE_INT_ZERODIVIDE

Conversiones y cálculosCATCH CX_SY_ZERODIVIDE

División por cero con números enteros (tipo I).

Causas habituales

  • Dividir entre un contador o un número de líneas que vale cero, por ejemplo lines( itab ) de una tabla vacía.

Cómo se soluciona

  • Comprueba que el divisor no es cero, o que la tabla no está vacía, antes de dividir.

Enlace a este dump

BCD_OVERFLOW

Conversiones y cálculosCATCH CX_SY_ARITHMETIC_OVERFLOW

El resultado de un cálculo con números de tipo P no cabe en el campo.

Causas habituales

  • Sumar importes en un campo con pocas posiciones.
  • Multiplicar cantidades por precios con muchos decimales.

Cómo se soluciona

  • Declara el campo del resultado con más longitud (p LENGTH 16) o usa decfloat34.
  • Captura cx_sy_arithmetic_overflow si el valor puede ser muy grande.

Enlace a este dump

STRING_OFFSET_TOO_LARGE

Conversiones y cálculosCATCH CX_SY_RANGE_OUT_OF_BOUNDS

Se accede a una parte de un texto (offset y longitud) que está fuera de su longitud.

Causas habituales

  • Usar lv_texto+10(5) sobre un texto más corto.
  • Calcular el offset a partir de datos de un fichero sin comprobar la longitud de la línea.

Cómo se soluciona

  • Comprueba strlen( ) antes de cortar.
  • Usa funciones de texto como substring( ) o segment( ) dentro de un TRY.

Enlace a este dump

ITAB_LINE_NOT_FOUND

Tablas internasCATCH CX_SY_ITAB_LINE_NOT_FOUND

Una expresión de tabla itab[ … ] no ha encontrado la línea.

Causas habituales

  • Leer con lt_tabla[ clave = valor ] una línea que no existe. A diferencia de READ TABLE, la expresión no pone sy-subrc: lanza una excepción.

Cómo se soluciona

  • Añade OPTIONAL o DEFAULT dentro de un VALUE #( ).
  • Comprueba antes con line_exists( ).
  • O captura cx_sy_itab_line_not_found.
Provoca el dump
DATA(lv_nombre) = lt_clientes[ kunnr = lv_kunnr ]-name1.
Corregido
DATA(lv_nombre) = VALUE #( lt_clientes[ kunnr = lv_kunnr ]-name1 OPTIONAL ).

Enlace a este dump

ITAB_DUPLICATE_KEY

Tablas internasCATCH CX_SY_ITAB_DUPLICATE_KEY

Se ha insertado en una tabla interna con clave única una línea con una clave que ya existe.

Causas habituales

  • INSERT o VALUE #( ) sobre una tabla SORTED o HASHED con UNIQUE KEY y datos repetidos.
  • Llenar una tabla HASHED desde un SELECT que devuelve duplicados.

Cómo se soluciona

  • Elimina los duplicados antes (SELECT DISTINCT, SORT + DELETE ADJACENT DUPLICATES).
  • Si los duplicados son posibles, usa NON-UNIQUE KEY o INSERT con comprobación de sy-subrc (la sentencia INSERT … INTO TABLE no da dump: devuelve 4).

Enlace a este dump

TABLE_INVALID_INDEX

Tablas internasNo se puede capturar

Se ha usado un índice de tabla interna que no es válido (cero, negativo o mayor que el número de líneas más uno).

Causas habituales

  • INSERT … INDEX o MODIFY … INDEX con un índice calculado mal.
  • Usar sy-tabix después de haber cambiado de tabla o fuera del bucle.

Cómo se soluciona

  • Comprueba el índice contra lines( itab ) antes de usarlo.
  • Guarda el índice en una variable propia en lugar de confiar en sy-tabix.

Enlace a este dump

GETWA_NOT_ASSIGNED

Referencias y field-symbolsNo se puede capturar

Se ha usado un field-symbol que no apunta a nada.

Causas habituales

  • Un READ TABLE … ASSIGNING que no encontró la línea y el código siguió usando el field-symbol.
  • ASSIGN COMPONENT con un nombre de campo que no existe.

Cómo se soluciona

  • Comprueba sy-subrc o IS ASSIGNED antes de usarlo.
  • Con expresiones de tabla, usa ASSIGN lt_tabla[ … ] TO FIELD-SYMBOL(<fs>) y comprueba sy-subrc: el ASSIGN no lanza excepción.
Provoca el dump
READ TABLE lt_pedidos ASSIGNING <ls_pedido>
  WITH KEY vbeln = lv_vbeln.
<ls_pedido>-netwr = 0.   " dump si no existe
Corregido
ASSIGN lt_pedidos[ vbeln = lv_vbeln ] TO FIELD-SYMBOL(<ls_pedido>).
IF sy-subrc = 0.
  <ls_pedido>-netwr = 0.
ENDIF.

Enlace a este dump

OBJECTS_OBJREF_NOT_ASSIGNED

Referencias y field-symbolsCATCH CX_SY_REF_IS_INITIAL

Se ha llamado a un método o atributo de una referencia a objeto vacía.

Causas habituales

  • Usar un objeto que no se ha creado con NEW o CREATE OBJECT.
  • Un método que devuelve una referencia y no ha encontrado nada (por ejemplo, un ALV no creado por un error anterior).

Cómo se soluciona

  • Comprueba IS BOUND antes de usar la referencia.
  • Revisa el código que crea el objeto: suele haber una excepción anterior que se ha ignorado.

Enlace a este dump

MOVE_CAST_ERROR

Referencias y field-symbolsCATCH CX_SY_MOVE_CAST_ERROR

Un cast (CAST o ?=) a una clase o interfaz que el objeto no implementa.

Causas habituales

  • Convertir una referencia genérica (por ejemplo, de RTTS o de una excepción) a un tipo concreto equivocado.

Cómo se soluciona

  • Comprueba el tipo antes con IS INSTANCE OF o usa CASE TYPE OF.
  • Captura cx_sy_move_cast_error.

Enlace a este dump

SAPSQL_ARRAY_INSERT_DUPREC

Base de datosCATCH CX_SY_OPEN_SQL_DB

Un INSERT … FROM TABLE ha intentado grabar en la base de datos una clave que ya existe.

Causas habituales

  • La tabla interna tiene registros con la misma clave que otros ya grabados, o repetidos entre sí.
  • Se ejecuta dos veces la misma carga.

Cómo se soluciona

  • Añade ACCEPTING DUPLICATE KEYS si los duplicados se pueden ignorar (sy-subrc vale 4).
  • Usa MODIFY en lugar de INSERT si quieres crear o actualizar.
  • Elimina los duplicados de la tabla interna antes de grabar.
Provoca el dump
INSERT zventas FROM TABLE lt_ventas.
Corregido
INSERT zventas FROM TABLE @lt_ventas ACCEPTING DUPLICATE KEYS.
IF sy-subrc = 4.
  " algunos registros ya existían
ENDIF.

Enlace a este dump

DBSQL_DUPLICATE_KEY_ERROR

Base de datosCATCH CX_SY_OPEN_SQL_DB

La base de datos ha rechazado una grabación por clave duplicada (o por un índice único).

Causas habituales

  • Grabar en una tabla con un índice único un valor que ya existe.
  • Rangos de números que se solapan entre procesos en paralelo.

Cómo se soluciona

  • Comprueba si el registro existe antes de insertarlo, o usa MODIFY.
  • Revisa los índices únicos de la tabla en la SE11 y el rango de números (SNRO).

Enlace a este dump

DBSQL_SQL_ERROR

Base de datosCATCH CX_SY_OPEN_SQL_DB

La base de datos ha devuelto un error al ejecutar una sentencia SQL.

Causas habituales

  • Una consulta con demasiadas condiciones (un rango o un FOR ALL ENTRIES enorme).
  • Una tabla o un campo que no existe en la base de datos (tabla no activada o mal ajustada en la SE14).
  • Problemas de espacio o bloqueos en la propia base de datos.

Cómo se soluciona

  • Lee el texto del error de base de datos en el dump: indica la causa exacta.
  • Divide los rangos muy grandes en paquetes.
  • Si la tabla no está ajustada, actívala y ajústala con la SE14.

Enlace a este dump

DBIF_RSQL_INVALID_RSQL

Base de datosCATCH CX_SY_OPEN_SQL_DB

La interfaz de base de datos no ha podido generar la sentencia SQL.

Causas habituales

  • Un SELECT-OPTIONS o un rango con miles de valores en el WHERE … IN.
  • Un FOR ALL ENTRIES con una tabla de entrada enorme o mal formada.

Cómo se soluciona

  • Divide el rango en paquetes o carga los valores en una tabla y únela con un JOIN.
  • Reduce la tabla de entrada del FOR ALL ENTRIES con SORT y DELETE ADJACENT DUPLICATES.

Enlace a este dump

SAPSQL_INVALID_FIELDNAME

Base de datosCATCH CX_SY_DYNAMIC_OSQL_SEMANTICS

En una consulta con partes dinámicas aparece un nombre de campo que no existe.

Causas habituales

  • Montar la lista de campos o el WHERE en una variable con un nombre mal escrito o de otra tabla.

Cómo se soluciona

  • Valida los nombres con cl_abap_dyn_prg=>check_column_name( ).
  • Captura cx_sy_dynamic_osql_semantics y muestra qué campo falla.

Enlace a este dump

TSV_TNEW_PAGE_ALLOC_FAILED

Memoria y tiempoNo se puede capturar

El programa se ha quedado sin memoria: una tabla interna ha crecido demasiado.

Causas habituales

  • Un SELECT sin filtro sobre una tabla grande (BSEG, MSEG, VBFA…) que carga millones de filas.
  • Un bucle que añade líneas sin control o tablas internas que no se liberan.
  • Un FOR ALL ENTRIES con la tabla de entrada vacía, que lee la tabla entera.

Cómo se soluciona

  • Filtra en la base de datos y pide solo los campos necesarios.
  • Procesa por paquetes con SELECT … PACKAGE SIZE o con un cursor.
  • Libera las tablas que ya no uses con FREE.
  • Comprueba que la tabla de un FOR ALL ENTRIES no está vacía.
Provoca el dump
SELECT * FROM mseg INTO TABLE lt_mseg.
Corregido
SELECT mblnr, mjahr, zeile, matnr, menge
  FROM mseg
  WHERE werks = @p_werks
    AND budat_mkpf IN @s_budat
  INTO TABLE @DATA(lt_mseg)
  PACKAGE SIZE 50000.
  " procesar el paquete
ENDSELECT.

Enlace a este dump

TSV_TNEW_BLOCKS_NO_ROLL_MEMORY

Memoria y tiempoNo se puede capturar

No hay memoria suficiente para seguir ampliando una tabla interna.

Causas habituales

  • Las mismas que TSV_TNEW_PAGE_ALLOC_FAILED: demasiados datos en memoria a la vez.

Cómo se soluciona

  • Reduce los datos que se cargan (filtros, campos, paquetes).
  • Si el volumen es legítimo, el equipo de Basis puede revisar los parámetros de memoria del sistema.

Enlace a este dump

SYSTEM_NO_ROLL

Memoria y tiempoNo se puede capturar

El proceso de trabajo no tiene memoria de roll disponible.

Causas habituales

  • Programas que consumen mucha memoria en diálogo, o muchos usuarios a la vez ejecutando procesos pesados.

Cómo se soluciona

  • Reduce el consumo de memoria del programa.
  • Ejecuta los procesos pesados en fondo.
  • Si ocurre a menudo, consúltalo con Basis.

Enlace a este dump

TIME_OUT

Memoria y tiempoNo se puede capturar

El programa ha superado el tiempo máximo de ejecución en diálogo (normalmente unos minutos, parámetro rdisp/max_wprun_time).

Causas habituales

  • Consultas lentas sin índice, SELECT dentro de bucles, o procesos muy grandes lanzados en diálogo.

Cómo se soluciona

  • Mide con la ST05 y la SAT dónde se va el tiempo.
  • Saca los SELECT de los bucles (JOIN o FOR ALL ENTRIES).
  • Lanza los procesos largos en fondo (SM36): en un job no se aplica este límite.

Enlace a este dump

CALL_FUNCTION_NOT_FOUND

Llamadas a funciones y programasCATCH CX_SY_DYN_CALL_ILLEGAL_FUNC

Se ha llamado a un módulo de función que no existe en el sistema.

Causas habituales

  • Nombre mal escrito en una llamada dinámica (con el nombre en una variable).
  • La función existe en desarrollo pero no se ha transportado, o está en un componente no instalado (por ejemplo, de IS-H o HR).

Cómo se soluciona

  • Comprueba el nombre en la SE37 del sistema donde falla.
  • Revisa que la orden de transporte que la contiene se ha importado.

Enlace a este dump

CALL_FUNCTION_PARM_MISSING

Llamadas a funciones y programasCATCH CX_SY_DYN_CALL_PARAM_MISSING

Falta un parámetro obligatorio en la llamada a un módulo de función.

Causas habituales

  • La función tiene un parámetro obligatorio que la llamada no pasa (frecuente en llamadas dinámicas o después de cambiar la función).

Cómo se soluciona

  • Compara la llamada con la firma de la función en la SE37.
  • Usa el patrón de llamada del editor (Modelo / Pattern) para no olvidar parámetros.

Enlace a este dump

CALL_FUNCTION_CONFLICT_TYPE

Llamadas a funciones y programasCATCH CX_SY_DYN_CALL_ILLEGAL_TYPE

Un parámetro de la llamada no tiene el tipo que espera la función.

Causas habituales

  • Pasar una variable de tipo distinto al del parámetro (por ejemplo, un texto donde se espera una estructura), sobre todo en parámetros tipados de forma estricta.

Cómo se soluciona

  • Declara la variable con el mismo tipo que el parámetro: DATA lv_x TYPE <tipo del parámetro>.
  • Para RFC, revisa que los tipos coinciden en los dos sistemas.

Enlace a este dump

CALL_FUNCTION_PARM_UNKNOWN

Llamadas a funciones y programasCATCH CX_SY_DYN_CALL_PARAM_NOT_FOUND

La llamada pasa un parámetro que la función no tiene.

Causas habituales

  • Un nombre de parámetro mal escrito, o una función que ha cambiado su firma.

Cómo se soluciona

  • Revisa los nombres de los parámetros en la SE37.

Enlace a este dump

CALL_FUNCTION_REMOTE_ERROR

Llamadas a funciones y programasNo se puede capturar

Ha fallado una llamada remota (RFC) en el sistema de destino.

Causas habituales

  • La función remota ha dado un error o un dump en el otro sistema.
  • Problemas de autorización o de usuario en el destino RFC.

Cómo se soluciona

  • Añade siempre system_failure y communication_failure (con MESSAGE) a las llamadas RFC para tratar el error.
  • Revisa la ST22 del sistema de destino y prueba el destino en la SM59.
Provoca el dump
CALL FUNCTION 'Z_LEER_DATOS' DESTINATION lv_destino
  EXPORTING iv_clave = lv_clave.
Corregido
DATA lv_mensaje TYPE c LENGTH 200.
CALL FUNCTION 'Z_LEER_DATOS' DESTINATION lv_destino
  EXPORTING iv_clave = lv_clave
  EXCEPTIONS
    system_failure        = 1 MESSAGE lv_mensaje
    communication_failure = 2 MESSAGE lv_mensaje
    OTHERS                = 3.
IF sy-subrc <> 0.
  MESSAGE |Error RFC: { lv_mensaje }| TYPE 'E'.
ENDIF.

Enlace a este dump

PERFORM_NOT_FOUND

Llamadas a funciones y programasCATCH CX_SY_DYN_CALL_ILLEGAL_FORM

Se ha llamado a una subrutina (FORM) que no existe en el programa indicado.

Causas habituales

  • Un PERFORM … IN PROGRAM o un PERFORM (variable) con un nombre equivocado.
  • Rutinas de formularios o de mensajes (NACE) que apuntan a un FORM que no existe.

Cómo se soluciona

  • Revisa el nombre del FORM y del programa.
  • Con PERFORM … IF FOUND la llamada no da error si la rutina no existe.

Enlace a este dump

LOAD_PROGRAM_NOT_FOUND

Llamadas a funciones y programasCATCH CX_SY_PROGRAM_NOT_FOUND

No existe el programa que se intenta cargar (con SUBMIT, PERFORM IN PROGRAM o una transacción).

Causas habituales

  • Un programa no transportado, borrado o con el nombre mal escrito.
  • Una transacción (SE93) que apunta a un programa que no existe.

Cómo se soluciona

  • Comprueba el programa en la SE38 y la transacción en la SE93 del sistema donde falla.

Enlace a este dump

SYNTAX_ERROR

Llamadas a funciones y programasNo se puede capturar

El programa (o un include o clase que usa) tiene errores de sintaxis.

Causas habituales

  • Se ha transportado un objeto sin otro del que depende (una estructura, un include, una clase).
  • Un cambio en un objeto del diccionario rompe programas que lo usan.

Cómo se soluciona

  • El dump indica el include y la línea: ábrelo y verifica con Ctrl+F2.
  • Transporta los objetos que faltan y revisa con el «Where-used» quién usa el objeto cambiado.

Enlace a este dump

OPEN_DATASET_NO_AUTHORITY

FicherosCATCH CX_SY_FILE_AUTHORITY

El usuario no tiene autorización para abrir el fichero del servidor.

Causas habituales

  • Falta el objeto S_DATASET para esa ruta o ese programa.
  • La ruta no está permitida en la tabla SPTH.

Cómo se soluciona

  • Pide la autorización a seguridad (la SU53 muestra qué falta).
  • Captura cx_sy_file_authority para dar un mensaje claro.

Enlace a este dump

DATASET_NOT_OPEN

FicherosCATCH CX_SY_FILE_OPEN_MODE

Se ha leído o escrito en un fichero del servidor que no está abierto.

Causas habituales

  • El OPEN DATASET falló (ruta incorrecta, permisos del sistema operativo) y el programa siguió sin comprobar sy-subrc.

Cómo se soluciona

  • Comprueba siempre sy-subrc después de OPEN DATASET y usa MESSAGE para ver el error del sistema operativo.
Provoca el dump
OPEN DATASET lv_fichero FOR INPUT IN TEXT MODE ENCODING DEFAULT.
READ DATASET lv_fichero INTO lv_linea.
Corregido
DATA lv_msg TYPE string.
OPEN DATASET lv_fichero FOR INPUT IN TEXT MODE ENCODING UTF-8
  MESSAGE lv_msg.
IF sy-subrc <> 0.
  MESSAGE |No se puede abrir { lv_fichero }: { lv_msg }| TYPE 'E'.
ENDIF.
READ DATASET lv_fichero INTO lv_linea.

Enlace a este dump

CONVT_CODEPAGE

FicherosCATCH CX_SY_CONVERSION_CODEPAGE

Un carácter del fichero no se puede convertir a la página de códigos del sistema.

Causas habituales

  • Leer con ENCODING DEFAULT (UTF-8) un fichero que viene en ANSI o Latin-1, o al revés.

Cómo se soluciona

  • Indica la codificación real del fichero: ENCODING NON-UNICODE o CODE PAGE '1100'.
  • Añade IGNORING CONVERSION ERRORS si los caracteres raros se pueden ignorar.

Enlace a este dump

DYNPRO_SEND_IN_BACKGROUND

Pantallas y fondoNo se puede capturar

Un programa ejecutado en fondo ha intentado mostrar una pantalla.

Causas habituales

  • Un job que llama a una ventana emergente (POPUP_TO_CONFIRM…), a un CALL SCREEN o a una transacción con pantallas.
  • Un batch input en modo que muestra pantallas, lanzado en fondo.

Cómo se soluciona

  • Comprueba sy-batch y evita las pantallas cuando sea abap_true.
  • En CALL TRANSACTION … USING, usa el modo 'N'.

Enlace a este dump

DYNPRO_FIELD_CONVERSION

Pantallas y fondoNo se puede capturar

Un campo de pantalla no se puede convertir al tipo del campo del programa (o al revés).

Causas habituales

  • El campo del dynpro y la variable del programa tienen tipos distintos (por ejemplo, después de cambiar el tipo en el programa sin actualizar la pantalla).

Cómo se soluciona

  • Revisa en la SE51 que el campo de pantalla tiene el mismo tipo y longitud que la variable, o que hace referencia al diccionario.

Enlace a este dump

MESSAGE_TYPE_X

Excepciones y mensajesNo se puede capturar

Un programa ha emitido un mensaje de tipo X: una cancelación deliberada porque se ha detectado una situación imposible.

Causas habituales

  • En programas estándar suele indicar datos incoherentes o un uso no previsto de una función.
  • En código propio, un MESSAGE … TYPE 'X' usado como control de errores.

Cómo se soluciona

  • Lee en el dump la clase y el número del mensaje y búscalos en las notas de SAP: muchas veces hay una corrección.
  • En código propio, sustitúyelo por una excepción o un mensaje de error tratable.

Enlace a este dump

RAISE_EXCEPTION

Excepciones y mensajesNo se puede capturar

Un módulo de función ha lanzado una excepción clásica que la llamada no trata.

Causas habituales

  • La llamada no tiene bloque EXCEPTIONS (o le falta esa excepción y OTHERS).

Cómo se soluciona

  • Añade siempre EXCEPTIONS … OTHERS = n y comprueba sy-subrc después de la llamada.
Provoca el dump
CALL FUNCTION 'DATE_GET_WEEK'
  EXPORTING date = lv_fecha
  IMPORTING week = lv_semana.
Corregido
CALL FUNCTION 'DATE_GET_WEEK'
  EXPORTING
    date         = lv_fecha
  IMPORTING
    week         = lv_semana
  EXCEPTIONS
    date_invalid = 1
    OTHERS       = 2.
IF sy-subrc <> 0.
  MESSAGE 'Fecha no válida' TYPE 'E'.
ENDIF.

Enlace a este dump

UNCAUGHT_EXCEPTION

Excepciones y mensajesNo se puede capturar

Se ha lanzado una excepción de clase y nadie la ha capturado.

Causas habituales

  • Falta un TRY … CATCH alrededor de la llamada que la lanza.
  • El dump indica qué clase de excepción era (por ejemplo, CX_SY_ITAB_LINE_NOT_FOUND).

Cómo se soluciona

  • Captura la excepción concreta o su superclase (CX_STATIC_CHECK, CX_DYNAMIC_CHECK, CX_ROOT).
  • Muestra el texto con lx_error->get_text( ).

Enlace a este dump

ASSERTION_FAILED

Excepciones y mensajesNo se puede capturar

Ha fallado una sentencia ASSERT: una condición que el programador consideraba siempre cierta no lo es.

Causas habituales

  • Datos inesperados que rompen una suposición del código (estándar o propio).

Cómo se soluciona

  • Revisa la condición del ASSERT en la línea del dump y por qué los datos no la cumplen.
  • En código propio, si la situación es posible, trátala con una excepción en lugar de ASSERT.

Enlace a este dump

POSTING_ILLEGAL_STATEMENT

Excepciones y mensajesNo se puede capturar

Se ha ejecutado una sentencia no permitida dentro de una tarea de actualización (update task).

Causas habituales

  • Un COMMIT WORK, ROLLBACK WORK, SUBMIT o una pantalla dentro de una función llamada IN UPDATE TASK o de un BAdI que se ejecuta en la actualización.

Cómo se soluciona

  • Quita el COMMIT WORK: en la tarea de actualización lo gestiona SAP.
  • Mueve la lógica que necesita esas sentencias fuera de la actualización.

Enlace a este dump

MOVE_TO_LIT_NOTALLOWED_NODATA

Referencias y field-symbolsNo se puede capturar

Se ha intentado modificar una constante, un literal o un parámetro de solo lectura.

Causas habituales

  • Pasar un literal ('X', 10) a un parámetro CHANGING o TABLES que la función modifica.
  • Un field-symbol que apunta a una constante y se usa para escribir.

Cómo se soluciona

  • Pasa una variable en lugar del literal en los parámetros que se modifican.
  • No modifiques parámetros IMPORTING dentro de un método.

Enlace a este dump