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