Dicas do OsmarJr

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:

Dicas MS-Access para Usuários Iniciantes
Fornecido por Allen Browne, [email protected], November 1999.
Traduzido por Osmar José Correia Júnior, Setembro, 2003.

Nulos: Preciso deles?

Por que 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.

Um Nulo é uma "não entrada" em um campo. A alternativa é exigir algum dado em todos os campos de todos os registros! Você chega a um hospital muito ferido para fornecer sua data de nascimento e não o deixam ser internado pois o sistema de registro de entradas não permite que um campo fique nulo? Como alguns campos devem ser opcionais, você deve aprender a trabalhar com Nulos.

Nulos não são um problema criado pelo Microsoft Access. Eles são parte muito importante da teoria e prática de bases de dados relacionais, parte de qualquer base de dados razoável. No final você passará a ver os Nulos como seus amigos.
Pense em Nulos como significando Desconhecido.

Nulo não é o mesmo que zero
Abra a Janela Depurar (Tecle Ctrl+G) e digite:

? 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.

Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23
Hosted by www.Geocities.ws

1