Exercício de tratamento de nulos com GeneXus 9 Web e .NET e Oracle 10g XE

Com o passar dos anos acabamos trabalhando com um padrão determinado e muitas vezes não paramos para pensar se existe outra forma de fazer as coisas até que algum dia é questionado por alguém.
Realmente é algo complicado de explicar assim de cabeça então achei melhor deixar documentado o funcionamento de GeneXus no meu parecer respeito aos nulos, e algumas considerações ao trabalhar com Oracle particularmente.

Existe uma propriedade em GeneXus chamada

Generate null for nullvalue

Por default ela traz o valor “no”

O que é que isso faz?

Isso faz que o ORACLE não grave NULL nos registros das tabelas.

Para caracteres grava ‘ ’

Para numéricos grava 0

Para datas grava 01/01/0001

Tudo bem, agora, se você quiser gravar NULOS como tem que fazer?

1) Trocar Generate null for nullvalue para “Yes”
2) Mudar a estrutura de sua transação para permitir que os atributos permitam nulo, veja a imagem.

Ok, então agora já está agora não vão aparecer meus registros em nulo.
Sinto informar que não.
Ainda tem um passo mais.

3) Se você atualiza códigos com procedimentos como por exemplo

New //envio
EnvioCodigo = 3
EnvioEstado = nullvalue(EnvioEstado)
EnvioValor = nullvalue(EnvioValor)
// EnvioData = nullvalue(EnvioData)
EndNew

Veja bem o atributo comentado e pode fazer o exercício com todos os atributos secundários.

Se você não tiver a função associada nullvalue(), GeneXus vai a carregar no registro o valor padrão de GeneXus, neste exemplo ‘01/01/0001’
Ahh ok, tudo bem então agora descomentando isso, sim está tudo certo?

Não. O mesmo acontece nas telas das transações. Se você não coloca o atributo na transação GeneXus vai a carregar no registro o valor padrão dele para os nulos.

Uma solução neste caso e colocar os campos nas telas e adicionar a propriedade “visible” com valor 0.

Exemplo:

Bem, mas ainda existe outra alternativa ainda melhor passada por Enrique Almeida que é a propriedade “Initialized not referenced atributes” que ela por default traz o valor = “yes” e se trocamos ela para “no” evitamos colocar nas telas e nos procs a regra nullvalue.

Quero aclarar que inicialmente não tinha mudado esta última propriedade, porque como comentei no início eu não tenho a costume de trabalhar com os nulos de ORACLE, mas agora com a enorme colaboração de Enrique acho que fica publicado um bom exemplo que pode tirar as dúvidas de muitos.

Retiro a sugestão para ARTech, já que está resolvido e muito bem.

Continuarei testando com combinações de constraints de banco e demais.

Muito obrigado Enrique.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus –
ERP – Sistemas de Missão Crítica – Bancos de Dados.

Veja meus blogs em:
www.fabriciodelossantos.com

Esta entrada tiene 2 comentarios

  1. Enrique Almeida

    Fabricio:
    Revisa la propiedad
    “Initilize not referenced attributes”.
    Con eso si haces un new que no tiene todos los atributos, los que faltan los pone con Null

  2. Fabricio De los Santos

    Gracias Enrique, la verdad fue un aporte grandisimo el tuyo como siempre.
    Yo generalmente no tengo costumbre de usar los nulos de Oracle porque no es el default de GeneXus y realmente en mis pruebas no mudé esta propiedad porque la ayuda decia
    “Yes: The generators automatically initialize all attributes that have not been referenced.”
    y como tengo la propiedad Generate null for nullvalue asumí erroneamente que me deberia dejar en nulo.
    Lo importante es que ahora si está claro para mi el funcionamiento y bueno de paso un aporte para quienes por fortuna caigan aqui buscando esta información!
    Gracias Enrique, un abrazo!
    Fabricio

Deja un comentario