Cambiar atributo a usar valores enumerados


En versiones anteriores de Genexus, no se podían tener dominios con valores enumerados. 
Esto es un atributo que solo pueda tener los valores que se ponen en una lista y nada mas que esos. 
Esta muy bueno también para poner constantes en los programas, sin tener que poner numero o strings con significados mágicos. 

Por ejemplo, antes poniamos:

PedidoEstado<> !'I'  and PedidoEstado <> !'F'   

y con un dominio enumerado se pone

PedidoEstado<> Estado.Inicial and PedidoEstado <> Estado.Final

* La nomenclatura no es la mejor, pero es para que quede fácil de entender

Las ventajas es que el código queda mucho mas claro, y queda referencias donde se utilizan los diferentes valores. 
La relación entre el valor que se guarda en la base de datos y lo que tienen los programas esta concentrada en la lista de valores enumerados del dominio o del atributo y no por todos los programas. Cuando cambio la lista, cambia automáticamente en toda la aplicación. 
También tiene ventajas si necesito traducir la aplicación a otros idiomas. 

Ahora, que debo hacer si quiero cambiar un atributo que no tiene valores enumerados a que use valores enumerados? 

Una forma es recorrer todos los programas que hagan referencia al atributo y revisarlos uno a uno. 

Otra forma que a mi me resulta mas facil, aunque poco intuitiva, es hacer un cambio de tipo de datos en forma temporal, para detectar donde debo hacer los cambios. 

IMPORTANTE: Hacer esto en una KB de copia de trabajo y que no reorganice la base de datos. 

Por ejemplo, si tengo 

PedidoEstado  Character(1)   //Puede tener los valores I, R, F

lo cambio a (puede ser a cualquier tipo que la conversión no sea automática y de error)

PedidoEstado Numeric(1)     //Le pongo un valor enumerado con 1,2,3

y hago un build all. 

Esto hará que la mayoría de los programas que usan el atributo PedidoEstado fallen porque realizan operaciones de Character en vez de Numericos, pero Genexus me dice exactamente en que linea se realiza esta operacion y me da una lista de todos los objetos que tengo que corregir. En KB grandes, esto ayuda muchísimo 
Hago el cambio solo en los programas, cambiando las constantes, en los lugares que correspondan sustituyendolas por los valores del dominio enumerado. 

Paso a Paso.

1) Hacer un backup de la KB o un export o crear una versión para tener donde volver si hay errores. 

2) Cambiar la propiedad del generador para no reorganizar




3) Cambiar el dominio del atributo a un tipo de datos incompatible y poner valores enumerados que se quieran mantener 




El campo VALUE hay que cambiarlo para que tengan el tipo que corresponda en ese momento. 

5) Revisar la reorg que se genera y verificar que cambian todos los atributos necesarios y solo esos. 

6) Hacer un build all y van a aparecer errores de asignación de tipos de datos incorrectos y de comparación de tipos de datos.  Si son muchos, se puede generar una Categoria con todos los objetos que hay que revisar/corregir. 

7) Corregir todos los errores del tipo en selecciones

where PedidoEstado = !'I'

por 

where PedidoEstado = PedidodEstado.Inicial

8) Corregir todos los errores del tipo en asignaciones

PedidoEstado = !'F'

por

PedidoEstado = PedidoEstado.Final

9) Van a existir algunos errores que no conviene corregir por ejemplo si tengo concatenación de string para mostrar mensajes o cosas asi. 

10) Volver a hacer un build all (seguirán habiendo errores). 

11) Volver el dominio al tipo de datos correcto


12) Hacer un Build All y ya no deberían haber errores. 

13) Volver el valor de la propiedad del generador para que vuelva a reorganizar la base de datos. 

14) Testear y volver los cambios al server. 

Comentarios

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.