• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
Twitter Linkedin Instagram
S4PCADEMY_Logo
Twitter Linkedin Instagram
SAP ABAP

Expresión SQL ABAP especial NULL

By s4pcademy 


Un valor nulo es un valor especial devuelto por una base de datos para indicar un valor o resultado indefinido. No hay valores nulos especiales en ABAP, y no es fácil agregar una función de este tipo al lenguaje en estos días. El rango de valores de un tipo de datos ocupa todo el espacio de memoria de su objeto de datos. Imagine, por ejemplo, el tipo entero simple de un byte INT1 del Diccionario ABAP, correspondiente a b en ABAP: el rango de valores es de 0 a 255, que es exactamente el rango que puede expresar con bits de 1 byte (hexadecimal 00 a FF). No queda espacio para un valor nulo y no queda ningún valor para representar un valor nulo.

Cuando se lee un valor nulo con ABAP SQL de la base de datos, simplemente se convierte al valor inicial específico del tipo del campo de destino ABAP, que es 0 para tipos numéricos y en blanco para tipos de caracteres. Por lo tanto, no hay forma de saber si se leyó un valor nulo mediante una simple comparación. Durante mucho tiempo, la única forma de manejar valores nulos era la expresión relacional IS NULL y, más recientemente, indicadores nulos.

De hecho, en los primeros días de ABAP, esto nunca se vio como un problema porque en el mundo ABAP, los valores nulos solo aparecían en la base de datos en casos excepcionales:

  • En ABAP SQL, los accesos de escritura a las tablas de la base de datos normalmente no producen valores nulos.
  • Los valores nulos se pueden generar en las tablas de la base de datos de DDIC cuando se agregan nuevas columnas a las tablas llenas. Sin embargo, esto se puede anular con una bandera para los valores iniciales.

En términos de accesos de lectura, fue solo con la introducción de combinaciones externas en ABAP Release 4.0 que los valores nulos comenzaron a aparecer en los conjuntos de resultados. A partir de ese momento, a medida que se añadían más y más expresiones y funciones SQL, aparecían valores nulos como resultado de estas expresiones y funciones. Un ejemplo destacado son las distinciones de casos: si omite el ELSE declaración, la expresión producirá automáticamente el valor nulo como resultado. Otros ejemplos son funciones que devuelven valores nulos cuando ocurre una excepción. Por estas razones, los valores nulos se están volviendo más comunes en ABAP SQL y existe la necesidad de mejorar el manejo de los valores nulos.

Además de la expresión relacional IS NULL y los indicadores nulos mencionados anteriormente, existe una nueva forma de expresar explícitamente un valor nulo en ABAP SQL, a saber, la expresión NULL.

Mientras que ABAP CDS introdujo ELSE NULL con ABAP Release 7.89, SAP BTP ABAP Environment 2208 (ver matriz de funciones de todas las funciones de CDS DDL), que le permite especificar un valor nulo después de ELSE de un CASE expresión, ABAP SQL va un paso más allá al introducir una nueva expresión SQL NULL que se puede utilizar en muchas más posiciones de operandos de ABAP SQL. La expresión SQL especial NULL está disponible desde ABAP Release 7.83, SAP BTP ABAP Environment 2102.

Este blog ofrece una breve introducción a la expresión nula, y dado que NULL se puede utilizar casi en cualquier parte del entorno ABAP SQL, hemos probado todas las posiciones y resumido nuestros hallazgos y posibles dificultades.

Introducción

el operando NULL representa el valor nulo y se puede utilizar en muchas posiciones de operandos de expresiones SQL. Un ejemplo famoso es el distinción de casos introducido arriba.

Tenga en cuenta que ABAP no tiene valores nulos. Más bien, los valores nulos que se asignan a un objeto de datos ABAP en ABAP SQL, Native SQL o AMDP se convierten en valores iniciales dependientes del tipo. Leer más aquí.

Así, la expresión NULL es una opción para manejar valores nulos en ABAP SQL. Otras opciones son la expresión relacional IS NULL e indicadores nulos. La diferencia entre NULL y IS NULL se explica a continuación. Un aspecto importante del uso NULL es que debe ser posible derivar un tipo (ver Trampas).

Introduciendo NULLel objetivo era permitir NULL como un valor de columna constante en la lista de campos. Al final, NULL generalmente se permitía en ABAP SQL. Esto hace posible establecer una expresión completa en nulo usando específicamente NULL para uno de sus operandos dependiendo de la condición. Los posibles casos de uso se explican a continuación.

caso de uso

Dos posibles casos de uso de la expresión nula son ELSE NULL y THEN NULL, los cuales son parte de las distinciones de casos. Otro ejemplo de distinciones de casos se da en el Alcance sección para demostrar las posiciones de operandos en las que NULL puede ser usado. El siguiente código de muestra muestra un ejemplo de todos los vuelos en marzo de 2023 con el código de la aerolínea LH. Se incluye una distinción de casos para identificar vuelos con asientos de primera clase disponibles.

METHOD main.
    SELECT FROM sflight
           FIELDS carrid,
                  connid,
                  fldate,
                  price,
                  currency,
                  planetype,
                  CASE
                     WHEN seatsocc_f < seatsmax_f THEN 'yes'
                     WHEN seatsocc_f = seatsmax_f THEN CAST( NULL AS CHAR( 1 ) )
                  END AS book_a_seat
           WHERE fldate BETWEEN datn`20230301` AND datn`20230331`
              AND carrid = 'LH'
           INTO TABLE @FINAL(result) INDICATORS NULL STRUCTURE null_ind.

    cl_demo_output=>display( result ).
ENDMETHOD.

(Por cierto, ¿reconoce los literales escritos en el ejemplo? Mire esto entrada en el blog.)

La consulta devuelve lo siguiente (excluyendo NULL_IND):

CARRIDO CONNIDO FLDATE PRECIO DIVISA TIPO DE PLANE RESERVAR UN ASIENTO
LH 0401 2023-03-14 668.2 EUR 767-200
LH 0402 2023-03-10 668.2 EUR A380-800 Sí
LH 2402 2023-03-15 244.2 EUR A380-800 Sí
LH 2407 2023-03-15 244.2 EUR A320-200
LH 0400 2023-03-15 808.52 EUR A340-600

El caso de uso de NULL aquí es que usted está principalmente interesado en los asientos disponibles, pero aún le gustaría saber acerca de otros vuelos, tal vez para planificar un vuelo en los próximos meses. Todo acerca de NULL y el indicador nulo se explica a continuación.

Alcance

El siguiente ejemplo muestra dónde NULL se puede utilizar en una distinción de caso simple. Puedes encontrar un ejemplo como este en el Documentación de palabras clave ABAP.

METHOD main.
    SELECT FROM scarr
             LEFT OUTER JOIN spfli
               ON scarr~carrid = spfli~carrid
           FIELDS scarr~carrid,
                  distid,
                  CASE distid
                     WHEN 'MI' THEN 'Miles'
                     WHEN 'KM' THEN 'Kilometers'
                     ELSE NULL
                  END AS distance,
                  CASE distid
                     WHEN 'MI' THEN NULL
                     WHEN NULL THEN 'Kilometers'
                     ELSE NULL
                  END AS null
           INTO TABLE @FINAL(result)
           UP TO 5 ROWS.

    cl_demo_output=>display( result ).
ENDMETHOD.

En este ejemplo, se especifican dos distinciones de casos simples que contienen NULL. NULL se puede usar explícitamente en la posición del operando después ELSEpero también después WHEN y THEN. El result la tabla se ve así:

CARRIDO DISTID DISTANCIA NULO
Automóvil club británico MI Millas
Automóvil club británico MI Millas
C.A.
FA
Arizona MI Millas

Al mirar el result tabla, no puede ver si los valores nulos están presentes o no. Esto se debe a que los valores nulos se convierten en valores iniciales y se representan con espacios en blanco, por ejemplo. Los indicadores nulos se pueden utilizar para identificar valores nulos:

INTO TABLE @FINAL(result) INDICATORS NULL STRUCTURE null_ind

Usando indicadores nulos, se pueden determinar las columnas del conjunto de resultados que contienen el valor nulo. En este ejemplo, se utiliza un indicador estructurado y cada componente de la estructura es del tipo x con longitud 1. Un valor componente de hexadecimal 1 denota un valor nulo en la columna respectiva del conjunto de resultados. El result La tabla ahora se ve así:
Result%20table%20with%20a%20null%20indicator

Tabla de resultados con un indicador nulo

El result tabla enfatiza que las columnas DISTID, DISTANCEy NULL devuelve el valor nulo para todas las comparaciones que no son verdaderas. Además, la columna NULL devuelve un resultado desconocido para las comparaciones con el valor nulo. Mientras NULL se pasa a la tabla de resultados, los valores nulos se convierten en valores iniciales.

Recomendaciones

Básicamente, NULL se puede utilizar en cualquier posición de operando de una expresión SQL. La siguiente tabla marca excepciones. La columna Verdadero Falso indica si NULL puede ser usado (Verdadero) o si NULL No puede ser usado (FALSO) en una posición de operando específica.

Categoría Sintaxis Argumento Verdadero Falso
Función numérica ROUND( sql_exp, pos ) pos Verdadero
Función de cadena LIKE_REGEXPR( pcre = pcre, value = sql_exp[, case_sensitive = case] ) pcre
case
Verdadero
LOCATE( sql_exp, sub[ ... ] ) sub Verdadero
LOCATE_REGEXPR( pcre = pcre, value = sql_exp[, case_sensitive = case][ ... ] ) pcre
case
Verdadero
LOCATE_REGEXPR_AFTER( pcre = pcre, value = sql_exp[, case_sensitive = case][ ... ] ) pcre
case
Verdadero
OCCURRENCES_REGEXPR( pcre = pcre, value = sql_exp[, case_sensitive = case] ) pcre
case
Verdadero
REPLACE_REGEXPR( pcre = pcre, value = sql_exp1, with = sql_exp2[, case_sensitive = case][ ... ] ) pcre
case
Verdadero
SUBSTRING_REGEXPR_AFTER( pcre = pcre, value = sql_exp[ ... ][, case_sensitive = case][ ... ] ) pcre
case
Verdadero
Conversión de unidades UNIT_CONVERSION( quantity = a1, source_unit = a2, target_unit = a3[, client = a4 ][ ... ] ) a2
a3
a4
FALSO
Conversión de Moneda CURRENCY_CONVERSION( amount = a1, source_currency = a2, target_currency = a3[, exchange_rate_date = a4 ][, exchange_rate_type = a5 ][, client = a6 ][ ... ] ) a2
a3
a4
a6
FALSO
Función de ventana FIRST_VALUE( col|sql_null ) sql_null Verdadero
LAST_VALUE( col|sql_null ) sql_null Verdadero
expresión relacional BETWEEN operand1 AND operand2 operand1
operand2
Verdadero

La mayoría de las excepciones positivas ocurren para funciones de cadena como tipo de argumento válido para pcre, suby case. Las funciones de ventana se mencionan aquí porque antes solo se permitían columnas como argumento NULL Fue presentado.

Trampas

Como se mencionó anteriormente, las dos conclusiones más importantes para usar NULL deben recordar que debe ser posible derivar un tipo y que la expresión nula se puede especificar en casi todas las posiciones de expresión SQL con algunas excepciones. Si NULL se usa en una expresión relacional, el resultado nunca es verdadero sino desconocido. Unknown es similar a false pero el comportamiento es diferente para AND, ORy NOT. Además, otro posible escollo sale a la luz al probar el manejo de errores con, por ejemplo, el UNIT_CONVERSION() función.

Código tipo de error Mensaje de error
unit_conversion(
  quantity = dec3,
  source_unit = cast( null as unit ),
  target_unit = unit`KM`,
  on_error = @sql_unit_conversion=>c_on_error-set_to_null )
Estático No es posible derivar un tipo para el valor NULL de su contexto.
unit_conversion(
  quantity = dec3,
  source_unit = unit`MI`,
  target_unit = null,
  on_error = @sql_unit_conversion=>c_on_error-set_to_null )
Dinámica Se genera una excepción capturable de la clase CX_SY_OPEN_SQL_DB.

Según el primer ejemplo, puede suponer que necesita especificar una longitud para los tipos que no tienen una longitud fija. Por ejemplo, escribir CAST( NULL AS CHAR( 10 ) ). Esto es cierto y debe especificar la longitud para todos los tipos con una longitud variable para moldes con NULL. El segundo ejemplo muestra el manejo dinámico de errores de NULL. Además, como se introdujo anteriormente, la expresión NULL se parece a la expresión relacional IS NULL. Es importante señalar que mientras NULL es una expresion, IS NULL es una expresión relacional con sintaxis de predicado.

Más información

La expresión SQL NULL maneja valores nulos y se puede especificar en la mayoría de las posiciones de operandos en una expresión SQL. NULL depende del tipo y necesita una longitud específica para tipos con longitudes variables en una expresión de conversión. No confunda la expresión relacional con la sintaxis del predicado IS NULL con la expresión NULL. Teniendo todo en cuenta, puede comenzar a usar NULL. Algunas referencias adicionales se enumeran a continuación:

Ahora debería saber cómo usar la expresión SQL NULL en tus proyectos. Usar NULL para el manejo de nulos en ABAP SQL. Los ejemplos proporcionados en este blog están destinados únicamente a fines de demostración. ¿Estás emocionado de usar la expresión nula especial? Escribe tus pensamientos en la sección de comentarios. No te pierdas los nuevos elementos lingüísticos y sigue mi perfil (lena padeken) para publicaciones de blog similares.




SAP Build Process Automation: cómo desencadenar procesos desde una automatización
Previo
SAP Build 如何支持 SAP S/4HANA 之旅?案例介绍和资源分享
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.

x