Trabajar con valores vacíos

Un valor vacío indica que un miembro, tupla o celda específica está vacío. Un valor de celda vacío indica o bien que los datos de la celda especificada no pueden encontrarse en la tabla de hechos subyacente, o que la tupla de la celda especificada representa una combinación de miembros que no es aplicable para el cubo.

Note

Aunque un valor vacío es diferente de un valor de cero, un valor vacío suele tratarse como cero la mayoría de las veces.

La siguiente consulta ilustra el comportamiento de los valores vacíos y cero:

WITH  
//A calculated Product Category that always returns 0  
MEMBER [Product].[Category].[All Products].ReturnZero AS 0  
//Will return true for any null value  
MEMBER MEASURES.ISEMPTYDemo AS ISEMPTY([Measures].[Internet Tax Amount])  
//Will true for any null or zero value  
//To be clear: the expression 0=null always returns true in MDX  
MEMBER MEASURES.IsZero AS [Measures].[Internet Tax Amount]=0  
SELECT  
{[Measures].[Internet Tax Amount],MEASURES.ISEMPTYDemo,MEASURES.IsZero}  
ON COLUMNS,  
[Product].[Category].[Category].ALLMEMBERS  
ON ROWS  
FROM [Adventure Works]  
WHERE([Date].[Calendar].[Calendar Year].&[2001])  

La siguiente información se aplica a los valores vacíos:

  • La función IsEmpty devuelve TRUE si y solo si la celda identificada por la tupla especificada en la función está vacía. De lo contrario, la función devuelve FALSE.

    Note

    La función IsEmpty no puede determinar si una expresión miembro devuelve un valor nulo. Para determinar si un miembro nulo es devuelto desde una expresión, se utiliza el operador IS .

  • Cuando el valor de la celda vacía es un operando para cualquiera de los operadores numéricos (+, -, *, /), el valor de la celda vacía se trata como cero si el otro operando es un valor no vacío. Si ambos operandos están vacíos, el operador numérico devuelve el valor de la celda vacía.

  • Cuando el valor de la celda vacía es un operando para el operador de concatenación de cadenas (+), el valor de la celda vacía se trata como una cadena vacía si el otro operando es un valor no vacío. Si ambos operandos están vacíos, el operador de concatenación de cadenas devuelve el valor de la celda vacía.

  • Cuando el valor de la celda vacía es un operando para cualquiera de los operadores de comparación (=. <>, >=, <=, >, <, ), el valor de la celda vacía se trata como cero o cadena vacía, dependiendo de si el tipo de dato del otro operando es numérico o de cadena, respectivamente. Si ambos operandos están vacíos, ambos operandos se tratan como cero.

  • Al compilar valores numéricos, el valor de la celda vacía se coloca en el mismo lugar que cero. Entre el valor de la celda vacía y cero, vacío se agrupa antes de cero.

  • Al compilar valores de cadena, el valor de la celda vacía se coloca en el mismo lugar que la cadena vacía. Entre el valor de la celda vacía y la cadena vacía, empty se coloca antes de una cadena vacía.

Manejo de valores vacíos en sentencias y cubos MDX

En las sentencias de Expresiones Multidimensionales (MDX), puedes buscar valores vacíos y luego realizar ciertos cálculos en celdas con datos válidos (es decir, no vacíos). Eliminar los valores vacíos al realizar cálculos puede ser importante porque ciertos cálculos, como un promedio, pueden ser inexactos si se incluyen los valores de celdas vacías.

Si los valores vacíos se almacenan en los datos subyacentes de la tabla de hechos, por defecto se convertirán en ceros cuando el cubo sea procesado. Puedes usar la opción de Procesamiento Nulo en una medida para controlar si los hechos nulos se convierten en 0, se convierten en un valor vacío o incluso generan un error durante el procesamiento. Si no quieres que los valores vacíos aparezcan en los resultados de tu consulta, deberías crear consultas, miembros calculados o sentencias MDX Script que eliminen los valores vacíos o los sustituyan por otro valor.

Para eliminar filas o columnas vacías de una consulta, puedes usar la sentencia NON EMPTY antes de la definición del conjunto de ejes. Por ejemplo, la siguiente consulta solo devuelve la categoría de Producto Bicicletas porque es la única categoría que se vendió en el año natural 2001:

SELECT  
{[Measures].[Internet Tax Amount]}  
ON COLUMNS,  
//Comment out the following line to display all the empty rows for other Categories  
NON EMPTY  
[Product].[Category].[Category].MEMBERS  
ON ROWS  
FROM [Adventure Works]  
WHERE([Date].[Calendar].[Calendar Year].&[2001])  

De forma más general, para eliminar tuplas vacías de un conjunto puedes usar la función NonVoid. La siguiente consulta muestra dos medidas calculadas, una de las cuales cuenta el número de Categorías de Producto y la segunda muestra el número de Categorías de Producto que tienen valores para la medida [Importe del Impuesto de Internet] y el Año Calendario 2001:

WITH  
MEMBER MEASURES.CategoryCount AS  
COUNT([Product].[Category].[Category].MEMBERS)  
MEMBER MEASURES.NonEmptyCategoryCountFor2001 AS  
COUNT(  
NONEMPTY(  
[Product].[Category].[Category].MEMBERS  
,([Date].[Calendar].[Calendar Year].&[2001], [Measures].[Internet Tax Amount])  
))  
SELECT  
{MEASURES.CategoryCount,MEASURES.NonEmptyCategoryCountFor2001 }  
ON COLUMNS  
FROM [Adventure Works]  

Para más información, véase NonEmpty (MDX).

Valores vacíos y operadores de comparación

Cuando hay valores vacíos presentes en los datos, los operadores lógicos y de comparación pueden devolver potencialmente un tercer resultado de VACÍO en lugar de solo VERDADERO o FALSO. Esta necesidad de una lógica de tres valores es el origen de muchos errores de la aplicación. Estas tablas describen el efecto de introducir comparaciones de valores vacíos.

Esta tabla muestra los resultados de aplicar un operador AND a dos operandos booleanos.

AND VERDADERO EMPTY FALSO
VERDADERO VERDADERO FALSO FALSO
VACÍO FALSO EMPTY FALSO
FALSO FALSO FALSO FALSO

Esta tabla muestra los resultados de aplicar un operador OR a dos operandos booleanos.

OR VERDADERO FALSO
VERDADERO VERDADERO VERDADERO
VACÍO VERDADERO VERDADERO
FALSO VERDADERO FALSO

Esta tabla muestra cómo el operador NOT niega, o revierte, el resultado de un operador booleano.

Expresión booleana a la que se aplica el operador NOT Se evalúa como
VERDADERO FALSO
EMPTY EMPTY
FALSO VERDADERO