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'
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.
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.
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
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
Publicar un comentario
1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.