Estimado señor Gavilan:


Estoy inmerso en la migración de una kb de cierto porte (3500 objetos) de GX 8.0 a 9.0 y entre los diferentes puntos de diferenciación entre ambas versiones está el manejo de los nulos. He leído bastante documentación sobre esto en el wiki de GX e incluso algún comentario de algún proceso parecido en otros blogs.


La consulta viene dado por lo siguientes:

Se tiene la factura resuelta en dos trn, una para los datos del cabezal y otra para las líneas. La trn de las líneas tiene FK a otras tablas del sistema.

Ahora con el pasaje a la 9.0, se agregan automáticamente controles de integridad referenciales sobre las FK del cabezal (lo cual implícitamente es un cambio con respecto a cómo funcionaba en la 8.0, e implica sin más, que si ejecutamos dicha trn sin hacer ningún cambio, nos saltarán controles de integridad referencial sobre dichos atributos que puede ser no queridos).

Una resolución a esta situación particular y para “imitar” el comportamiento que antes se tenía sería agregar en dichos atributos la rule allownulls y pronto, todo quedará como antes.

Sin embargo, ¿es esta la solución más adecuada? ¿O lo mejor sería analizar todos los atributos de la kb y ver cuales deben de pasar a tener como valor NO el si permiten ser nulos? Y un poco más allá aún, ¿algún atributo debería poder llegar a ser nulo en una kb?

La pregunta viene dada ya que sin dudas, cuando una kb es pequeña, la resolución a tomar puede ser poco costosa, pero siendo una kb con más de 3500 objetos y buscando hacer una conversión lo mas prolija posible y aprovechando todas las virtudes de la 9.0 (y pensando una posterior migración a la Ev 1) sería bueno elegir el camino más indicado (aunque no fuera este el más sencillo o que implicara menos esfuerzo) pero hacerlo una sola vez y no hacer muchos cambios que a la larga, impliquen otra serie de cambios más

Espero haberme explicado correctamente. El generador es VFP C/S y el DMBS SQL Server. Cualquier aporte que puedas hacer desde tu experiencia sería de mucha ayuda

Desde ya muchas gracias


---------------------------------------------------------------------------------------------
Estimado Lector:

El manejo de Nulos en GeneXus (y en las bases relacionales en general) es un tema controversial. El mismo Date (quien hizo gran parte de la teoria de los DBMS relacionales) se queja frecuentemente de que el agregado de los nulos en las bases de datos fue una mal decision.

Con GeneXus, la cosa es aun mas complicada pues ademas del nulo de la base de datos, se tiene los valores que GeneXus considera nulos, que pueden ser los mismos que el de la base o simplemente blancos y ceros.

No es obligatorio en 9.0 utilizar integridad referencial y tambien se puede mantener el funcionamiento tal cual se tenia con 8.0.
Para migraciones de KB de 3500 objetos, te recomiendo fuertemente que mantengas las propiedades del modelo en el valor compatible y con eso logres el mismo comportamiento.
Si la KB se convierte desde 8.0 (abriendola con 9.0) te va a quedar de esa forma y van a seguir funcionando las reglas nockeck, allownulls, tal cual lo hacen en 8.0.

Una vez que la KB esta convertida y funcionado en 9.0, puedes empezar a utilizar el nuevo manejo de nulos de forma de poder dejar la KB mas prolija y con mejor funcionalidad.
Es importante diferenciar entre una

Migracion: Se pasan los objetos a la nueva version, sin cambios en las funcionalidades, obteniendose una aplicacion equivalente a la anterior, solo que en una version mas nueva.
Conversion: Se cambian funcionalidades de la aplicacion para mejorarla.

Si sigues mis recomendaciones, lo importante es que queden las propiedades de diseño de:
Empty as Null como 8.0 o prior
Nulls Behavior como 8.0 o prior.

Y que todos los valores de los atributos tengan Compatible en la propiedad NULLS.

Despues que ya tienes la aplicacion funcionando correctamente puedes hacer los ajustes necesarios para que funcione de forma mejorada con el manejo de los nulos ampliado que vienen con 9.0.


Hay varias propiedades de las KB 9.0 que influyen en el funcionamiento de los nulos.

A nivel de diseño:

Empty as Null.
Nulls Behavior.

A nivel de atributos en transacciones


A nivel de reglas de transacciones

  • AllowNulls
  • Nocheck

Y las funciones

  • Null()
  • Nullvalue()
  • IsNull()

Los Metodos
.IsNull()
.SetNull()
.IsEmpty()
.SetEmpty()

Otras Propiedades

  • Initialize not referenced atributes (en el Modelo y Objeto)
  • Generate Null for NullValue (a nivel del modelo y a nivel de objeto).

Lectura Adicional:


Es un tema escabroso y divertido.