|
Trabalhando com nulos |
Aprender a trabalhar com Nulos pode ser frustrante. Ocasionalmente ouço iniciantes perguntar: "Como posso evitá-los?" Nulos são parte importante de nossas bases de dados, e é essencial que se aprenda a trabalhar com eles.Autores: Allen Browne e OsmarJr |
|
Juntei duas dicas do Allen Browne sobre tratamento e uso de Nulos: ? Null = 0
e o VBA responde Nulo. Em bom português, você perguntou ao VBA: Um Desconhecido é igual a Zero?, e o VBA respondeu com Eu não sei. Nulo não é o mesmo que zero. Se uma expressão contém um Nulo, o resultado normalmente é Nulo. Tente: ? 4 + Null
e o VBA responde com Nulo, ou seja, O resultado é desconhecido. O nome técnico para este efeito dominó é Propagação de Nulo. Os nulos são tratados de forma diferente dos zeros quando se conta ou se faz a média de um campo. Imagine uma tabela com um campo Total e estes valores em seus três registros: 4, 5, Nulo
Na Janela Depurar entre com: ? DCount("Total", "MinhaTabela")
e o VBA responde com 2. Ainda que existam três registros, existem apenas dois valores conhecidos para serem contados. Similarmente, se você perguntar: ? DAvg("Total", "MinhaTabela")
o VBA responde comh 4.5, e não 3. Nulos são excluídos de operações como soma, contar e média. Dica: Para contar todos os registros, use Contar("*") em vez de Contar("[AlgumCampo]"). desta forma o Access pode responder com a contagem de registros sem perder tempo verificando se existem nulos a serem excluídos. Nulo não é a mesma coisa que string de comprimento zero O VBA usa aspas duplas que abrem e fecham imediatamente ("") para representar uma string vazia. Se você não tem um nome do meio, isso pode ser representado por uma string de comprimento zero. Isto não é o mesmo que dizer que seu nome do meio é desconhecido (Nulo). Para demonstrar a diferença, digite, na Janela depurar: ? Len(""), Len(Null)
e o VBA responde que o comprimento da primeira string é zero, mas o comprimento de desconhecido é desconhecido (nulo). Campos texto em uma tabela Access podem conter strings de comprimento zero para distinguir Desconhecido de Não existente. Por padrão a propriedade Permitir comprimento zero é Não, já que a diferença entre uma string Nula e uma de comprimento zero não é muito aparente para o usuário e a interface pode ficar um tanto confusa. Para dados armazenados em uma tabela Access, esta propriedade raramente deve ser alterada para Sim. Nulo não é o mesmo que Nada ou Ausente Estes são termos que soam similares mas não significam o mesmo que Nulo, o valor desconhecido. O VBA usa Nothing (Nada) para se referir a um objeto não referenciado, como um recordset que foi declarado mas não referenciado. O VBA usa Missing (Ausente) para se referir a um parâmetro opcional d um procedimento. Eis alguns erros comuns que os novatos cometem com Null. Erro 1: Nulos em Critérios Se você entrar com critérios sob um campo em uma consulta, ela devolve apenas os registros que satisfazem a condição. Os Nulos são excluídos quando são usados critérios. Por exemplo, digamos que você tem uma tabela com nomes e endereços de empresas. Você deseja duas consultas: uma que lhe devolve as empresas locais e outra que devolve todas as outras. Na linha Critérios no campo Cidade da primeira consulta seria digitado: "Curitiba"
e, na segunda consulta: Not "Curitiba"
Errado! Nenhuma das consultas inclui os registros onde a Cidade está Nulo. Solução Especifique É Nulo. Para sua segunda consulta atender seu objetivo de trazer "todas as outras", o critério deve ser: É Nulo Ou Não "Curitiba"
Erro 2: Nulos em expressões Cálculos matemáticos que envolvem um Nulo normalmente resultam em Nulo. Por exemplo, novatos algumas vezes introduzem uma expressão como esta a propriedade Origem do Controle de uma caixa de texto, para mostrar o valor devido: =[TotalDaDívida] - [ValorPago]
O problema é que, se nada foi pago, ValorPago é Nulo e a caixa de texto não mostra nenhum resultado. Solução Use a função Nz() para especificar um valor para o Nulo: = Nz([TotalDaDívida], 0) - Nz([ValorPago], 0)
Erro 3: Nulos em Chaves Estrangeiras O Access bloqueia automaticamente a introdução de chaves primárias Nulas, mas permite que existam em chaves estrangeiras. Na maioria dos casos deve-se bloquear explicitamente esta possibilidade para evitar a presença de registros órfãos. Para uma tabela de Pedidos típica, os ítens do pedido são armazenados em uma tabela DetalhesDoPedido, ligada à tabela Pedidos por IDPedido. Cria-se um relacionamento entre Pedido.IDPedido e DetalhesDoPedido.IDPedido, com integridade referencial imposta! Isso não é suficiente! A menos que a propriedade Requerido no campo IDPedido seja Sim na tabela detalhesDoPedido, o Access permite Nulos. Normalmente isto acontece quando o usuário começa a incluir linhas no subformulário sem criar o pedido no formulário principal. Como estes registros não estão ligados a nenhum registro do formulário principal, estes órfãos nunca mais serão mostrados. O usuário vai ter certeza que o seu programa os perdeu, ainda que ainda estejam na tabela. Solução Sempre deixe a Propriedade requerido de campos que são chaves estrangeiras com Sim, a menos que você deseje expressamente a presença de Nulos no campo. Erro 4: Nulos e não-Variantes No Visual Basic o único tipo de dados que pode conter Nulo é o Variant. Sempre que você passa o valor de um campo para um não-Variante, deve tomar em consideração se o campo pode ser nulo.Veja se você consegue ver onde o código vai dar errado neste módulo de formulário: Dim strName as String
Dim lngID As Long strName = Me.MiddleName lngID = Me.ClientID Quando o campo MiddleName contiver Nulo, a tentativa de passar um Nulo para uma string vai dar erro. Similarmente a passagem do valor de ClientID para uma variável numérica pode causar um erro. Mesmo ClientID sendo a chave primária o código não está a salvo: a chave primária contém Nulo em um novo registro. Soluções (a) Use um tipo de dados Variant se quiser trabalhar com nulos. (B) Use a função Nz() para especificar o valor a ser usado quando Nulo. Por exemplo: strName = Nz(Me.MiddleName, "")
lngID = Nz(Me.ClientID, 0) Erro 5: Comparar alguma coisa com Nulo A expressão: If [Sobrenome] = Null Then
é uma situação que nunca será Verdadeira (True). Mesmo que o Sobrenome seja Nulo, o VBA pensa que você perguntou: O Desconhecido é igual a Desconhecido?
e sempre responde " Como vou saber se seus desconhecidos são iguais?" Isto é uma Propagação de Nulos, de novo: o resultado não é Verdadeiro ou Falso, mas Nulo. Solução Use a função IsNull(): If IsNull([Sobrenome]) Then
Erro 6: Esquecer que Nulo não é nem Verdadeiro nem Falso As duas construções abaixo executam o mesmo serviço? (a) If [Sobrenome] = "Smith" Then
MsgBox "É um Smith" Else MsgBox "Não é um Smith" End If (b) If [Sobrenome] <> "Smith" Then MsgBox "Não é um Smith" Else MsgBox "É um Smith" End If Quando o Sobrenome é Nulo, estes dois pedaços de código se contradizem. O If falha e o Else é executado, resultando em mensagens contraditórias. Soluções (a) Trabalhe as três possibilidades da comparação: Verdadeiro, Falso e Nulo: If [Sobrenome] = "Smith" Then
MsgBox "É um Smith" ElseIf [Sobrenome] <> "Smith" Then MsgBox "Não é um Smith" Else MsgBox "Não sei se é um Smith" End If (B) Em alguns casos a função Nz() permite que dois casos sejam tratados de uma vez. Por exemplo, para tratar da mesma forma uma string de comprimento zero ou nula: If Len(Nz([Surname],"")) = 0 Then
---------------------------------------------- A Consulta Perdeu Meus Registros!!! Nulos em Critérios Você deseja enviar duas mensagens diferentes - uma para seus amigos do PR e outra para os de outros estados. Você cria duas consultas: uma onde a linha de Critério na coluna Estado contém PR, e uma segunda consulta onde a linha Critério contém Not "PR". Parece que isso resolve todas as situações. Só parece!!! O problena é a forma com que o Access e outras bases de dados relacionais tratam os Nulos. Se o campo Estado for deixado totalmente em branco, o registro não será mostrado em nenhuma das consultas acima. Deve-se solicitar especificamente ao Access a verificação da existência de Nulos, usando-se um critério como Is Null Or Not "PR". Ao entrar com critérios em uma consulta, pense SEMPRE na possibilidade da existência de Nulos. Em alguns casos você pode desejar a não ocorrência de nulos. No Access 2 e superiores, abra a tabela no Modo Estrutura, selecione o campo e, nas propriedades, na parte de baixo da tela, deixe Requerido como "Sim" (não esqueça de criar um teste no form de entrada para não receber a mensagem padrão do Access ao salvar o registro...). Nulos em Joins A mesma coisa ocorre quando você tem duas tabelas ligadas por um campo que pode conter Nulos. Por exemplo, uma tabela Clientes pode estar ligada a uma tabela Fatura através de um campo IDCliente. Para atender "Vendas a Dinheiro", você permite que sejam emitidas faturas sem IDCliente. Agora você cria uma consulta usanto as tabelas Clientes e Faturas como base de um relatório que mostre todas as vendas. Se você observar com cuidado, verá que suas "Vendas a Dinheiro" não aparecem e o relatório está com totais incorretos! A solução é bem simples. Na tela de construção da consulta, dê um duplo clique na linha que liga as duas tabelas e o Access abre uma caixa de diálogo perguntando qual tipo de ligação você deseja. Selecione o OUTER JOIN apropriado e todas as "Vendas a Dinheiro" vão aparecer na consulta e no relatório. |