Diferencia entre INITIAL y NULL

En ABAP, NULL e INITIAL no significan lo mismo. Y aunque muchas veces parezca que sí, entender la diferencia es importante cuando trabajas con Open SQL, CDS Views, HANA, APIs o integraciones externas.

Porque en ABAP clásico normalmente trabajamos con valores INITIAL, pero en base de datos existen los valores NULL. Y ahí es donde aparecen muchos comportamientos inesperados.

¿Qué significa INITIAL en ABAP?

En ABAP, una variable INITIAL es simplemente una variable que tiene su valor por defecto según de su tipo de dato.

Algunos ejemplos:

  • Números (I, P, F, etc.): su valor inicial es 0.
  • Caracteres (C, STRING): su valor inicial es una cadena vacía ('') o, para campos de tipo CHAR con longitud fija, el valor es SPACE.
  • Tablas internas: su valor inicial es una tabla sin líneas (ITAB[] IS INITIAL es verdadero cuando no tiene registros).
  • Referencias a objetos: su valor inicial es una referencia nula que no apunta a ningún objeto (REF IS INITIAL).
DATA lv_number TYPE i.

IF lv_number IS INITIAL.
WRITE 'La variable vale 0'.
ENDIF.

Aquí la variable existe y tiene un valor válido. Simplemente contiene el valor inicial del tipo.

En resumen: toda variable o campo en ABAP siempre tiene un valor inicial definido según su tipo, y será INITIAL cuando la variable existe, tiene un valor válido y ese valor es el valor inicial del tipo de dato.

¿Qué significa NULL en base de datos?

El concepto NULL pertenece al mundo de las bases de datos, no al de ABAP. Una columna tiene valor NULL cuando su contenido es desconocido o no existe.

NULL no es 0, no es '', no es SPACE. Es la representación de «no hay ningún valor» en la base de datos. Es literalmente ausencia de valor.

¿Pueden coexistir INITIAL y NULL en una misma tabla?

La respuesta es sí, absolutamente. Y aquí es donde muchos programas fallan.

Una columna puede tener valores reales, valores iniciales y registros con NULL al mismo tiempo.

Por ejemplo, si añades una columna nueva a una tabla que ya contiene millones de registros, los valores de los registros existentes para esa nueva columna serán NULL, a menos que se haya marcado la opción de valores iniciales en el diccionario de datos.

Si haces un SELECT solo con la condición WHERE campo = '', estarás dejando fuera todos los registros que tienen NULL, porque NULL no es igual a ''.

Tabla comparativa NULL vs INITIAL

CaracterísticaNULL (Base de Datos)INITIAL (ABAP)
Dónde viveEn la base de datos (columna de una tabla)En el programa ABAP (variables, estructuras)
ConceptoValor desconocido o ausenteValor por defecto de un tipo de dato
En númerosNo es cero0
En textosNo es una cadena vacía'' o SPACE
¿Se puede asignar desde ABAP?No directamente (se asigna al insertar/modificar registros sin especificar la columna)Sí, con CLEAR o INITIAL
¿Se puede comprobar en ABAP?Sí, con IS [NOT] NULL en ABAP SQLSí, con IS INITIAL

Esta tabla muestra que NULL habita en la base de datos y INITIAL en el programa ABAP, y aunque en la práctica pueden confundirse, conceptualmente representan situaciones distintas.

El comportamiento en ABAP al leer datos

Cuando el programa ABAP ejecuta un SELECT y la base de datos devuelve un NULL, el motor de ABAP SQL convierte automáticamente ese NULL en el valor inicial según el tipo de dato de la variable o estructura de destino.

Es decir, si la base de datos devuelve un NULL para una columna numérica, en tu programa verás un 0. Si es una columna de texto, verás una cadena vacía ('').

Esto es importante porque en tiempo de depuración no podrás distinguir si el valor provenía de un NULL real o de un 0 / '' original. En ambos casos verás el mismo valor inicial.

Por eso, no puedes usar IS INITIAL para detectar NULL. La única forma segura de detectar NULL es dentro de la propia sentencia SQL, usando IS NULL o IS NOT NULL

Una de las confusiones más comunes en ABAP es pensar que NULL e INITIAL son lo mismo.

No lo son.

  • INITIAL = valor por defecto ABAP
  • NULL = ausencia de valor en base de datos

Y aunque ABAP muchas veces convierta automáticamente NULL a INITIAL, entender esta diferencia es clave cuando trabajas con Open SQL, CDS, HANA o integraciones externas.