A continuación se detallan los errores más comunes después de traducir una base de datos con código personalizado a la versión 5.0.
TABLA DE CONTENIDOS
- El instalador de la 5.0 no funciona
- Error relativo al control TextoAlinDerecha
- Error conversión EFormatoCampo / ETipoDato en string
- Error de conversión AhoraCore.IControl a AhoraCore.Valor
- Error de definición de "carga" para object
- Error WScript.Shell
- Asignación incorrecta de IControlEnlazable como IEnlaceObjetos
- Formato de campo "####" no soportado
- Error conversión string[] en Valor[]
- Error al convertir en IXArrayDB
- Conversión de IControl a Valor
- Llamada a propiedades pasándole parámetros que no existen
El instalador de la 5.0 no funciona
Tenemos a su disposición un artículo en el que se detallan posibles errores y sus soluciones.
Actualmente Ahora Install tiene una incidencia reconocida en la que el instalador detecta como "instalados" módulos cuando está a la espera de realizar determinados procesos a nivel de sistema operativo.
La solución pasa por, simplemente, reiniciar el equipo.
Error relativo al control TextoAlinDerecha
El control TextoUsuario, en la versión 5.0, ha asimilado el anteriormente control TextoAlinDerecha por lo que las referencias antiguas a dicho control devolverán error.
Si se producen errores que indiquen alguna referencia a TextoAlinDerecha ejecutar el siguiente script:
UPDATE Ahora_Controles_Personalizados SET Tipo = 'TextoUsuario' WHERE Tipo = 'TextoAlinDerecha'
Tengan en cuenta que esto modifica la referencia al control de la misma tabla que usa la versión 4.0 por lo que dicho control personalizado sufrirá cambios también en la versión anterior.
Error conversión EFormatoCampo / ETipoDato en string
Mensaje error ->
No se puede convertir implícitamente el tipo 'string' en 'AhoraOCX.EFormatoCampo'
No se puede convertir implícitamente el tipo 'AhoraCore.Valor' en 'AhoraOCX.ETipoDato'
Código ejemplo:
((IControlEnlazable) lCampo).Formato = "Numeric"; lControl.TipoDato = aTipoDato;
El formato y el tipo, anteriormente establecidos mediante cadenas de texto descriptivas, funcionan ahora mediante enumeraciones, EFormatoCampo y ETipoDato.
El traductor detecta automáticamente aquellas equivalencias correctas pero aquellas anteriormente definidas de forma incorrecta (en el ejemplo anterior, "Formato" no admite "Numeric", el sistema omite el error y lo pone como "String") las inserta como cadenas y se provoca el error.
Para solucionarlo hay que usar las enumeraciones internas correctas en el propio campo:
((IControlEnlazable)lOportunidad).Formato = EFormatoCampo.SinDecimales; lControl.TipoDato = ETipoDato.Numeric;
Error de conversión AhoraCore.IControl a AhoraCore.Valor
Mensaje de ejemplo: Argumento 1: no se puede convertir de 'AhoraCore.IControl' a 'AhoraCore.Valor'
Ejemplo código traducido:
lFrmGen.Tag = CStr(gForm.Controls["IdRegistro"]);
El traductor intenta convertir en Valor (anterior Variant) un control. En 5.0 ya no se puede acceder a la propiedad por defecto de un determinado control (gForm.Controls("IdClientePadre") en VB6 hace referencia a la propiedad "Text" a nivel interno).
Para solucionarlo asignaremos el tipo de control que es y la propiedad que queremos recuperar. Para ello necesitaremos conocer el tipo de control del que queremos recuperar la propiedad.
Ejemplo código traducido (donde "IdRegistro" es un ComboUsuario):
lfrmGen.Tag = (gForm.Controls["IdRegistro"] as IComboUsuario).Text;
Error de definición de "carga" para object
Mensaje de ejemplo: "object" no contiene una definición para "carga" ni un método de extensión accesible "carga" que acepte un primer argumento del tipo "object" (¿falta alguna directiva using o una referencia de ensamblado?)
"Carga" es un método común a todos los IForm de la aplicación y por tanto debe ser declarado explícitamente. Que tenga "carga" con la "c" en minúscula significa que el traductor no ha podido deducir el formulario a cargar y por tanto lo ha creado de tipo "object" y por eso da el error.
Para solucionar este tipo de errores es importante tener claro el formulario que queremos abrir para llamar al método "Carga" de su interfaz.
Un ejemplo válido:
IfrmAsignarGrupos lFrm = (IfrmAsignarGrupos) pCn.AhoraProceso("AsignaGruposSeg", out _); lFrm.Carga("Ahora_Grid", pCn.DameValorCampo("SELECT IdDoc FROM Ahora_Grids WHERE IdGrid=" + pGrid.DameIdGrid()), true, this);
Error WScript.Shell
El método CreateObject para realizar un "SendKeys" y poder maximizar un formulario es muy común y no tiene traducción directa.
La solución es eliminar las líneas de código anteriores y sustituirlas por el nuevo sistema, tal como se puede ver en este documento.
Asignación incorrecta de IControlEnlazable como IEnlaceObjetos
Al establecer el título del formulario (Control "EnlaceObjetos", propiedad "Text", anteriormente "Caption") en ocasiones el traductor interpreta de forma errónea el control "IEnlaceObjetos" como un IControlEnlazable (esta interfaz sirve para agrupar aquellos controles que podemos enlazar mediante Ctrl + F10).
Ejemplo código traducido:
((IControlEnlazable) gForm.Controls["Titulo"]).Text = "Articulo Nuevo";
Para solucionarlo simplemente hay que castear el control a su tipo correcto, IEnlaceObjetos:
((IEnlaceObjetos) gForm.Controls["Titulo"]).Text = "Articulo Nuevo";
Formato de campo "####" no soportado
Si les salta este error de forma no bloqueante (es decir, pueden trabajar luego con la pantalla sin mayores problemas) es porque tienen definido un tipo de formato que anteriormente con VBScript era admitido pero ahora no lo es. Aplicable únicamente a la personalización de las columnas de un grid.
El equipo de desarrollo de la 5.0 ha implementado aquellos formatos de uso común y está abierto a implementar aquellos que se consideren necesarios. Si creen que su formato es correcto y debería estar soportado pónganse en contacto mediante un ticket y se estudiará su inclusión.
Error estableciendo ReglaColor
La fórmula básica de ReglaColor de VBScript es incompatible con la 5.0. En el siguiente artículo encontrarán más información al respecto.
Tendrán que eliminar y volver a crear la fórmula adaptándola a C#.
Error conversión string[] en Valor[]
Mensaje error -> No se puede convertir implícitamente el tipo 'string[]' en 'AhoraCore.Valor[]'
Código ejemplo:
Valor[] arraylineas = {}; arraylineas = Split(variableASplitear, "}");
El traductor, para mantener la máxima compatibilidad con VBScript y el uso de su tipo de campo "Variant" (más información aquí) usa el tipo "Valor" para aquellas variables no declaradas. Como en VBScript no pueden declararse explícitamente los tipos todos son de tipo "Variant" por lo que la traducción intenta usar la clase "Valor" en aquellos campos que no puede inferir su tipo.
Cuando el error lo tenemos porque intenta realizar, por ejemplo, un split y el sistema no sabe realizar la conversión, para solucionarlo simplemente usaremos la clase "string" para la declaración de la variable que recibirá dicho valor:
string[] arraylineas = {}; arraylineas = Split(variableASplitear, "}");
Error al convertir en IXArrayDB
Mensaje error -> No se puede convertir implícitamente el tipo 'AhoraCore.IXArrayDB' en 'AhoraCore.Valor[*,*]'
Código ejemplo:
Valor[,] lArr = {}; lArr = ((ICntGridUsuario) gForm.Controls["gridCabecera"]).ArrayDb;
El único tipo de campo que puede admitir la propiedad ArrayDb de un grid es IXArrayDB. Para solucionarlo declarar lArr al tipo correspondiente:
IXArrayDB lArr; lArr = ((ICntGridUsuario) gForm.Controls["gridCabecera"]).ArrayDb;
Conversión de IControl a Valor
Mensaje Error -> Argumento 1: no se puede convertir de 'AhoraCore.IControl' a 'AhoraCore.Valor'
Código ejemplo:
if (Len(CStr(gForm.Controls["lMeses"])) == 0) ...
Este mensaje de error lo veremos cuando se intenta llamar directamente a un control, y no a su propiedad. En VBScript los controles tienen una propiedad por defecto a la que se hace referencia implícitamente en el control (p.e. "MsgBox lMeses" hace referencia a "lMeses.Text") y, aunque el traductor infiere la propiedad a usar, en determinadas ocasiones puede no mostrarla correctamente.
Para solucionarlo convertiremos el control al tipo que corresponda y leeremos su propiedad:
if (Len(CStr((gForm.Controls["nMeses"] as ITextoUsuario).Text)) == 0) ...
Llamada a propiedades pasándole parámetros que no existen
Este error puede provocar muchos otros mensajes de error de distinta índole y se produce cuando se usa un operando y el traductor no tiene forma de entender cómo debe operar con él.
Código ejemplo:
(gForm.Controls["CampoAModificar"] as ITextoUsuario).ResizeV = (gForm.Controls["Campo"] as ITextoUsuario).ResizeV(-5);
La sintaxis misma es incorrecta y esto se produce porque en el código original existe algo parecido a esto:
CampoAModificar.ResizeV = Campo.ResizeV -5
El traductor en estos casos no tiene herramientas suficientes para diferenciar "valor - 5" de "pasa un parámetro por VBScript que es -5" por lo que establece que en realidad queremos llamar a un método pasándole el parámetro "-5".
No hay forma de prevenir esto salvo corregir el código original a algo así:
CampoAModificar.ResizeV = Campo.ResizeV - 5
Nótese el espacio entre el operador (-) y el número (5).
Y, por supuesto, aplicando la corrección al código de C#:
(gForm.Controls["CampoAModificar"] as ITextoUsuario).ResizeV = (gForm.Controls["Campo"] as ITextoUsuario).ResizeV - 5;