Migrando de GeneXus 9.0 a GeneXus X.
La idea de este post es comentar algunos de los problemas que he encontrado migrando desde Genexus 9.0 a GeneXus X. Tiene también algunos tips que pueden hacer mas fácil la vida (al menos la mia).
Los pasos que hice fueron:
1) Copiar el directorio de la KB para guardar en caso que pase algo.
Borrar de la KB el directorio de los modelos (los DATA00x). Esto es para asegurarme que no me queda ningun fuente viejo, ni ninguna dll, jar, etc de la versión anterior.
2) Entrar con GeneXus 9.0 a la KB y borrar todos los modelos que no se utilicen. Esto se hace con
File/Delete Model estando en diseño.
Conviene borrar el modelo de Backup (si existe) pues acelera la conversión.
3) Renombrar el domino Boolean si existiera y ponerle Boolean90.
En GeneXus X Boolean es un tipo de datos nativos y si existe un domino Boolean (como el que usa el Pattern WorkWith, se arma lio).
4) Borrar todos los objetos que no se utilicen y los que sean WIN.
Este paso no es indispensable, pero es muy saludable. Puede ahorrar muchos dolores de cabeza.
5) Salir de GeneXus 9.0 y compactar la KB y correr un rebuild. Tampoco es indispensable, pero sirve para ver si no hay algo mal en la KB original.
6) Abrir la KB con GeneXus X y realizar la conversión.
Si por algún motivo cancela, hay que reportarlo a Artech. En las ultimas que he hecho ha funcionado sin problemas.
7) Revisar el conversion.txt siguiendo el link "Open conversion log" en la pantalla que indica que termina la conversión.
Aunque diga Succes, hay veces que hay varios errores en la misma que conviene mirar:
* Error al convertir webservices (no se porque no los muestra como errores) en mi caso
Importing WebService from C:\Models\100\MTX1\kbdata\
>>>ERROR: Failed
>>>ERROR: Object reference not set to an instance of an object.
Successful
Importing WebService from C:\Models\100\MTX1\kbdata\
>>>ERROR: Failed
>>>ERROR: Object reference not set to an instance of an object.
pero muestra todo como Succesful. Se puede arreglar mas adelante, pero conviene conocerlo.
* HTML mal formado
Tambien hay que mirar a las correcciones que haga a programas que tengan html mal formado, para revisar y ver como quedaron las pantallas.
Converting WebPanel HDHorTaP...
>>>WARNING: Webform modified to be XHTML well-formed
* Deprecated functions.
Hay que ver si se tienen algunas funciones que eran validas en 9.0 y que ahora no se pueden usar mas.
En mi caso tenia UDF (que las sustitui con UDP)
Allownulls (hay que cambiar declarando en los atributos que puedan ser nulos)
Hidden (Si es de una Grilla Freestyle , hay que cambiar el codigo y poner columna.visible=0 y si es una grilla normal, hay que poner la columna como oculta)
>>>WARNING: 'allownulls' is a deprecated function. (Rules, Line: 12, Char: 1)
>>>WARNING: 'nocheck' is a deprecated function. (Rules, Line: 14, Char: 1)
8) Borrar los lenguajes que no se usan. Es bueno desmarcar el Chino, Japones, etc si no se van a usar.
9) Revisar las propiedades de MasterPage y Default Theme y ponerle las correctas (no se bien porque no se migran correctamente)
10) Instalar el KBDoctor y correr las consultas:
a) Objetos no alcanzables. Revisar los objetos que estan en la Categoria KBDoctor.Unreachables y borrar todos los objetos que no se utilicen, incluyendo atributos. NO BORRAR TRANSACCIONES hasta no estar seguro. Puede ser que el objeto transaccion no se use, pero si se use la tabla que esta genera.
Si hay transacciones que no se ejecutan, pero si se necesitan para la creacion de tablas, marcar la propiedad de dichos objetos, para que no las genere.
Antes del KBDoctor
Despues del KBDoctor
En una KB chica que use para la migracion , pase de 730 objetos a 634, por lo que baje mas de un 15% la cantidad de objetos a especificar y un poquito mas los que tengo que generar. Esto seguramente va a hacer mas rapido el ciclo de desarrollo.
b) Atributos sin tabla base. Revisar donde estan siendo referenciados estos atributos y quitar dichas referencias, si es necesario, crear nuevos dominos y despues borrar dichos atributos.
c) Objetos con variables no usadas. Borrar todas las variables que no se utilcen en los programas.
10) Hacer un build all y arreglar todos los errores que aparezcan (esta es la parte divertida, pero no hay receta que valga para arreglarlos. La mayoría de los problemas que tuve fueron con SDT que pasan a ser dominios en la conversión.
11) Revisar todos los warnings que aparezcan.
En GeneXus X se hacen unas cuantas validaciones nuevas (generalmente necesarias) y por lo tanto se pueden tener mas warnings que en la versión anterior. Conviene mirarlos en detalle.
Puede ser conveniente deshabilitar los warning spc0038 (no existe índice por esos atributos) y el de "Commit on Exit" por un rato hasta tener solucionados todos los problemas. Esto se hace en la propiedad del generador, que se llama Disabled Warnings.
12) Compilar todo, hasta que quede todo pipi-cucu.
Se puede tener problemas con programas externos, dll del usuario, flag del compilador, y un conjunto de etceteras grandes.
13) Empezar a programar en GeneXus X.
Usen muchos DataSelectors, Data Providers, user controls y demas que estan muy buenos....
14) Correr otras consultas del KBdoctor para poder arreglar otros errores.
15) Disfrutar la vida.
UPDATE: Conviene mirar la pagina del Wiki que explica el proceso de conversion que tiene información mas completa y detallada de la migración.
8 comentario(s):
Personalmente también exporto toda la KB antes de convertirla, de ese modo por lo menos obligo a que se lean todos los objetos. Me ha ayudado a detectar problemas originales en la KB que no son de la conversión en si.
Hace 10 minutos me pasó de nuevo con una KB de +6.000 objetos, algún lio de los IDXs porque con un rbld lo resolví (con el "-y" por las dudas).
BTW: En la X no existen más los IDXs :)
También he encontrado información sobre otros casos que me encontré en el wiki: http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?5710
Guscarr: Agrege un link en el post, para que la gente que quiera vea la pagina del wiki que esta muy completa.
Despues de publicar esto, intente migrar 2 kb mas (un poco mas grandes) y me cancelaron en forma estrepitosa por otros motivos :(
Hay que seguir probando.
Hola Enrique, disculpa, te hago una consulta que no tiene nada que ver con el titulo.
Soy novato en genexus, me podrias decir donde conseguir un ejemplo como imprimir en una impresora fiscal usando genexus?. Uso GX 9 .NET.
Gracias.
José
Jose:
No tengo experiencia en impresoras fiscales...
Podes mirar en http://www.gxtechnical.com/gxsearch/hgenexussearch_f.aspx?impresora+fiscal,
Gracias Enrique, apenas pueda hacer funcionar esto te envio código.
José
una pregunta
no es mejor distribuir el modelo de gx9 y consolidarlo en gx10?
Anonimo:
El distribuir en 9.0y consolidar en la X es una opcion, pero no siempre es la mejor.
Algunos de los problemas que puede haber:
Si un objeto no consolida, es dificil arreglarlo.
Demora mucho mas que convertir.
El modelo de datos, puede quedar diferente y por lo tanto la base de datos tiene diferencias.
En KB chicas, puede usarse (lo he usado), en KB mas grandes prefiero la otra solucion.
Saludos.
Hola Enrique he leido tu post y seguido todos tus cosasejos, y efectivamente sucedio cada una de las cosas que mensionas y las pude resolver, sin embargo estoy atorado en uno y ya perdi varios días dandole vuelta al asunto y no mas no queda.
Migre una aplicación hecha en genexus 9.0 a GX X, pero tengo problema en los webpanels donde uso GRIDS y en estos grids introduzco BC, cuando estos BC son de un nivel no hay ningun problema, pero cuando son multinivel me marca un error en ejecución...
identifique que el error tiene que ver con una propiedad de las columnas del grid "FieldSpecifier"
Familiar.item(0).PWBenPaternoFam
cuando lo tengo en cero me manda el siguiente error:
javax.servlet.ServletException: java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Unknown Source)
at com.genexus.GXObjectCollectionBase.elementAt(Unknown Source)
at hpwsolben_impl.strup1B0(hpwsolben_impl.java:1093)
la linea del código (hpwsolben_impl.java:1093) es:
AV46GXV1 = nGXsfl_97_fel_idx ;
Currentitem0 = (((SdtTPWBeneficiario_FamiliarItem)AV27benef.getgxTv_SdtTPWBeneficiario_Familiar().elementAt(-1+AV46GXV1)));
if ( ( ( localUtil.ctol( httpContext.cgiGet( avCtlpwbennumfam_Internalname), ".", ",") < -9 ) ) || ( ( localUtil.ctol( httpContext.cgiGet( avCtlpwbennumfam_Internalname), ".", ",") > 99 ) ) )
{
httpContext.GX_msglist.addItem(localUtil.getMessages().getMessage("GXM_badnum"), 1, "_GXV12Q");
GX_FocusControl = avCtlpwbennumfam_Internalname ;
httpContext.ajax_rsp_assign_attri("", false, "GX_FocusControl", GX_FocusControl);
wbErr = true ;
((SdtTPWBeneficiario_FamiliarItem)AV27benef.getgxTv_SdtTPWBeneficiario_Familiar().elementAt(-1+AV46GXV1)).setgxTv_SdtTPWBeneficiario_FamiliarItem_Pwbennumfam( (byte)(0) );
}
else
Suponiendo el problema era esta propiedad decidi cambiarla por:
"FieldSpecifier"
Familiar.item(1).PWBenPaternoFam
y desaparecio el error, pero ahora ya nop puedo ver la información desplegada en el grid... me aparece vacio....
Ojala tengas tiempo de darle un vistazo e iluminarme con tu sabiduria...
Gracias Enrique
Juan Esteban
Publicar un comentario en la entrada