Trabalhar com valores vazios

Um valor vazio indica que um membro, tupla ou célula específica está vazio. Um valor de célula vazia indica ou que os dados da célula especificada não podem ser encontrados na tabela de factos subjacente, ou que a tupla da célula especificada representa uma combinação de elementos que não é aplicável ao cubo.

Note

Embora um valor vazio seja diferente de um valor zero, um valor vazio é normalmente tratado como zero na maioria das vezes.

A consulta seguinte ilustra o comportamento de valores vazios e zero:

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])  

A seguinte informação aplica-se a valores vazios:

  • A função IsEmpty devolve TRUE se e só se a célula identificada pela tupla especificada na função estiver vazia. Caso contrário, a função devolve FALSE.

    Note

    A função IsEmpty não pode determinar se uma expressão membro devolve um valor nulo. Para determinar se um membro nulo é devolvido de uma expressão, use o operador IS .

  • Quando o valor da célula vazia é um operando para qualquer um dos operadores numéricos (+, -, *, /), o valor da célula vazia é tratado como zero se o outro operando for um valor não vazio. Se ambos os operandos estiverem vazios, o operador numérico devolve o valor da célula vazia.

  • Quando o valor da célula vazia é um operando para o operador de concatenação de cadeias (+), o valor da célula vazia é tratado como uma cadeia vazia se o outro operando for um valor não vazio. Se ambos os operandos estiverem vazios, o operador de concatenação de cadeias devolve o valor da célula vazia.

  • Quando o valor da célula vazia é um operando para qualquer um dos operadores de comparação (=. <>, >=, <=, >, ), <o valor da célula vazia é tratado como zero ou uma cadeia vazia, dependendo se o tipo de dado do outro operando é numérico ou cadeia de caracteres, respetivamente. Se ambos os operandos estiverem vazios, ambos os operandos são tratados como zero.

  • Ao compilar valores numéricos, o valor da célula vazia coloca-se no mesmo local que zero. Entre o valor da célula vazia e zero, vazio colina-se antes de zero.

  • Ao compilar valores de cadeia, o valor da célula vazia coloca-se no mesmo local que a cadeia vazia. Entre o valor da célula vazia e a cadeia vazia, vazia cola-se antes de uma cadeia vazia.

Lidar com valores vazios em instruções e cubos MDX

Nas instruções de Expressões Multidimensionais (MDX), pode procurar valores vazios e depois realizar certos cálculos em células com dados válidos (ou seja, não vazios). Eliminar valores vazios ao realizar cálculos pode ser importante porque certos cálculos, como uma média, podem ser imprecisos se forem incluídos valores de células vazias.

Se os valores vazios estiverem armazenados nos dados da tabela de factos subjacentes, por defeito serão convertidos em zeros quando o cubo for processado. Pode usar a opção Processamento Nulo numa medida para controlar se factos nulos são convertidos em 0, convertidos em valor vazio, ou até geram um erro durante o processamento. Se não quiser que valores de células vazios apareçam nos resultados da sua consulta, deve criar consultas, membros calculados ou instruções MDX Script que eliminem os valores vazios ou os substituam por outro valor.

Para remover linhas ou colunas vazias de uma consulta, pode usar a instrução NON EMPTY antes da definição do conjunto de eixos. Por exemplo, a consulta seguinte apenas devolve a Categoria de Produto Bicicletas porque essa é a única Categoria vendida no Ano Civil de 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])  

Mais geralmente, para remover tuplas vazias de um conjunto pode usar a função NonVoid. A consulta seguinte mostra duas medidas calculadas, uma das quais conta o número de Categorias de Produtos e a segunda mostra o número de Categorias de Produtos que têm valores para a medida [Valor do Imposto da Internet] e para o Ano Civil de 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 mais informações, consulte NonEmpty (MDX).

Valores vazios e operadores de comparação

Quando valores vazios estão presentes nos dados, operadores lógicos e de comparação podem potencialmente devolver um terceiro resultado de VAZIO em vez de apenas TRUE ou FALSE. Essa necessidade de lógica de três valores é uma fonte de muitos erros de aplicativo. Estas tabelas descrevem o efeito de introduzir comparações de valores vazios.

Esta tabela mostra os resultados da aplicação de um operador AND a dois operandos booleanos.

AND TRUE EMPTY FALSE
TRUE TRUE FALSE FALSE
VAZIO FALSE EMPTY FALSE
FALSE FALSE FALSE FALSE

Esta tabela mostra os resultados da aplicação de um operador OR a dois operandos booleanos.

OR TRUE FALSE
TRUE TRUE TRUE
VAZIO TRUE TRUE
FALSE TRUE FALSE

Esta tabela mostra como o operador NOT nega, ou reverte, o resultado de um operador booleano.

Expressão booleana à qual o operador NOT é aplicado Avalia para
TRUE FALSE
EMPTY EMPTY
FALSE TRUE