Verificación de objetos

Este conjunto de extensiones permite verificar y, en algunos casos, arreglar errores lógicos de objetos. La verificación se puede configurar para que se haga automáticamente al guardar un objeto, o se puede lanzar seleccionando una opción del menú de las extensiones manualmente. En ambos casos, la ejecución de la verificación se hace en segundo plano, y no bloquea la interface de usuario de GeneXus. En caso de encontrar problemas en el objeto, estos se describen en la ventana de Output. Un ejemplo de la salida sería este:

========== LSI.Extensiones started ==========
error: Objeto PPrueba: Hay variables referenciandas que no existen:
flgref
mnucod
mnusel
warning: Objeto PPrueba: Hay variables sólo usadas en la regla parm:
achilipu
warning: Objeto PPrueba: Hay variables no usadas:
arriquitaun
sdocid
var1
var2
var3
warning: Objeto PPrueba: Hay variables sólo leidas:
mnucod
mnusel
warning: Objeto PPrueba: Hay variables sólo escritas:
flgref
Tiempo de ejecución: 340 ms.
TIEMPO TOTAL: Tiempo de ejecución: 341 ms.
LSI.Extensiones Failed

Los tests a hacer sobre los objetos se pueden configurar en la ventana configuración. Los tests se hacen sobre un único objeto a la vez, y permite revisar los siguientes problemas:

Revisión de variables / atributos

Variables declaradas y no usadas

Se revisa el objeto en busca de variables declaradas y no usadas en ninguna parte del objeto.

Variables sólo usadas en la UI/Conditions

Se revisa el objeto en busca de variables que se muestran en la interface de usuario (en Win Forms / Web Forms / Printblocks de listados), y no usadas en ninguna otra parte del objeto. Esto significa que la variable siempre se mostraría con su valor por defecto, y suele ser un error.

También revisa variable sólo referenciadas en la parte de Conditions, y que por tanto, a las cuales nunca se habría asignado un valor.

Variables sólo usadas en la regla parm

Se revisan variables que son pasadas como parámetro al objeto, y que no són usadas en ninguna otra parte del objeto: Ni en otras parte de las Rules ni en otras partes del objeto.

Variables autodefinidas

Genexus, con el objetivo de agilizar el trabajo, tiene la inteligencia para declarar automáticamente variables en función de su nombre: Si una variable está declarada con el mismo nombre que un atributo, la autodefinirá del tipo del atributo. Sin embargo, en algunos casos, esto puede ser fuente de sutiles errores de programación. Si se copia un bloque de código de un objeto a otro, se te puede olvidar asignar una variable que está siendo usada en dicho bloque. La extensión avisa de qué variables hay autodefinidas. Si son correctas, basta con, manualmente, cortarlas de la categoría de autodefinidas y pegarlas en la categoría principal de variables.

Variables no declaradas y usadas

Este error, evidentemente, lo da el especificador de GeneXus, pero se podía avisar sin coste de rendimiento por parte de la extensión, así que se muestra. Da un mensaje de error en el caso que se encuentre una referencia a una variable no declarada.

Variables declaradas como N(4)

En Genexus, cuando se declara una variable y ésta no tiene el mismo nombre que un atributo, por defecto le pone un tipo Numeric(4). Si la variable no ha de tener este tipo, se edita la declaración de la variable, y se le pone la deseada.

Este test tiene como por objectivo evitar el olvidarse este cambio, que nos ha provocado algunos errores en aplicaciones en producción. Si una variable está definida como N(4), no está basada en un atributo o domínio, y no tiene como nombre una sóla letra (p.ej &i, &j, que se suelen usar como indices para recorrer vectores o listas ) la extensión da un aviso.

Si una variable ha de tener realmente una declaración de tipo N(4), el test también ignora variables que en su descripción contengan un texto "n4". El añadir este texto automáticamente puede hacerse con la opción de arreglo de errores automático.

Atributos huérfanos (fuera de FOR EACHs / NEWs)

El test revisa referencias a atributos fuera de sentencias X/FOR EACH y X/NEW. Por ejemplo, en un procedimento, las referencias a los atributos Atributo2 y Atributo3 suelen ser errores:

FOR EACH
    &Variable1 = Atributo1
    DO 'Subrutina'
ENDFOR
&Variable2 = Atributo2
    
SUB 'Subrutina'
    &Variable3 = Atributo3
ENDSUB

Las transacciones no se revisan. En el caso de Win/WebForms, sólo se revisan si el form no contiene referencias a atributos en alguna de las siguientes formas:

Variables siempre nulas con initial value

Se da un aviso si se tienen variables con un prefijo en el nombre que indica que son siempre nulas, y tienen asignada la propiedad "Initial value". En LSI, las variables que empiezan por "z" (p.ej. &zCliCod), se asume que son siempre nulas. Si resulta que tiene valor, es un error. Estos prefijos se pueden indicar en la configuración.

Revisiones avanzadas (más lentas)

Estas son un conjunto de revisiones que requieren ver cuales son los objetos llamados por el objeto a revisar y que son mucho más lentas que el resto:

Variables sólo leidas/escritas

Revisa variables que sólo son leidas o escritas en el objeto.

En el caso que una variable vaya a tener siempre un valor nulo, en LSI tenemos como estandar de codificación ponerle un prefijo "z". Por ejemplo una variable basada en un atributo llamado CliCod que siempre vaya a ser nula tiene un nombre "&zCliCod". Las variables cuyo nombre empieza con este prefijo no dan aviso de que son sólo leidas. Estos prefijos se pueden indicar en la configuración.

Si una variable tiene la propiedad "Initial value" asignada, puede considerarse siempre escrita o no, dependiendo de lo indicado en el campo "Report read only variables with 'Initial value'" de la configuración. Si este campo está marcado y una variable sólo leida tiene un 'Initial value', será reportada.

Check out: parameters not assigned / in: parameters assigned

Revisa variables declaradas como out: en la regla parm y que no se escriben en ninguna parte del objeto.

También revisa variables parametro declaradas como in: y que se asigna directamente, o se pasan en llamadas a objetos en parámetros declarados como out:. Si se pasa a un parámetro declarado como inout: no se da ningún aviso (puede que sólo se lea).

Llamadas a objetos con un número de parámetros incorrecto

Revisa que las llamadas a objetos tengan el número de parametros esperado. Si el número es distinto, da un aviso.

Otras revisiones

Objeto sin carpeta / módulo asignado

Revisa que el objeto tenga la propiedad "Module/Folder" asignada, es decir, que no valga "Root module"

Printblocks no usados

En procedimientos, da un aviso si hay printblocks que no se imprimen nunca. No se avisa sobre el prinblock que se crea por defecto cuando se crea el procedure, si este está vacio.

Uso de objetos obsoletos

Se da un aviso si en el objeto se están usando objetos marcados como obsoletos. Para marcar los objetos como obsoletos hay que incluir el texto "[DEPRECATED]" en su descripción. Este texto se puede cambiar por otro en la configuración.
Se pueden marcar como obsoleto cualquier objeto llamable y atributo. También se pueden marcar tablas como obsoletas, pero la extensión no avisará hasta que se haya especificado el objeto, con lo que no tiene mucha utilidad.

Revisión de Winforms

Revisar tamaño en Win Forms

Cuando se crea un Win Form en GeneXus se tiene que tener en mente el tamaño máximo que estos pueden tener en el monitor del cliente: Si la resolución mínima de un monitor requerida para ejecutar una aplicación es de 1024 x 768 (por ejemplo), los winforms (transacciones y worpanels) creados para dicha aplicación han de cumplir con dicha restricción: De otro caso, se mostrarán barras de scroll que pueden molestar al usuario.

Por ello, esta extensión permite definir un tamaño máximo para los winforms (Win Transactions, Workpanels) y dar un aviso si el tamaño del formulario supera dichas dimensiones. En la configuración se establece cual es el tamaño máximo que puede tener un WinForm y si hay que dar un aviso o no si dicho tamaño supera el máximo.

Regla hidden declarada

Desde GeneXus X, la regla hidden está obsoleta. Esta extensión avisa si hay dicha regla en los objetos WinForm. La opción de arreglar errores automaticamente permite mover los elementos de dicha regla al grid del objeto en WinForms como ocultos. Sólo se aplica a Win Forms (no a Web Panels). Este test puede deshabilitarse en la configuración.

Campos invisibles en grids de Win Forms y no usados en otra parte del objeto

Revisa campos (variables/atributos) que aparecen en grids de WorkPanels, que serán siempre invisibles (columnas marcadas como Visible = false en el editor del grid, y cuya propiedad .Visible no sea referenciada en otra parte del objeto), y que no sean utilizados en ninguna otra parte del objeto.

Marcar una variable para que no se den avisos sobre ella

Es posible marcar una variable para que no se de ningún aviso sobre ella, añadiendo en su descripción un texto "[NOCHECK]".

Configuración de las verificaciones

La configuración de las verificaciones se indica en el menú Lsi.Extensions > Lsi.Extensions configuration…, en la pestaña Check objects. Allí se puede indicar si hay que ejecutar los tests automáticamente o no cada vez que se guarda un objeto, y qué tests ejecutar.

Lanzar manualmente la verificación del objeto actual

La extensión se puede lanzar para el objeto actual desde el menú Lsi.Extensiones > Verificaciones > Verificar el objeto actual (atajo de menú Ctrl+F8). El objeto debe estar guardado y sin cambios antes de lanzar la verificación.

Arreglo automático de errores

La extensión permite arreglar automáticamente los siguientes errores de los descritos anterioremente:

Para lanzar el arreglo hay que selecciónar el menú Lsi.Extensiones > Verificaciones > Arreglar problemas del objeto (atajo de menú Ctrl+F9). Aparecerá la siguiente ventana:

Imagen arreglos

Delete following ununsed variables Muestra la lista de variables declaradas. Si se marca esta opción, las variable se borrarán.
Agregar "N4" a la descripción de las siguientes variables Esta opción sólo aparece si en la configuración se indicó "Revisar variables N(4)". Indica la lista de variables en las que en su descripción se va a añadir un texto "n4". P.ej. si una variable tenia una descripción "Código de cliente", finalmente su descripción quedará "Código de cliente n4".
Borrar regla hidden Si se marca esta opción, todas las variables/atributos que aparezcan en la regla hidden del objeto se moverán al grid del objeto, marcadas como ocultas. Sólo se aplica a Workpanels, no a Webpanels.
Replace operators old syntax Esto es útil en objetos antiguos en los que aun se usa la sintaxis con puntos para operadores booleanos (".AND.", ".OR.", ".NOT."), para hacer un poco más claro el código. Si se marca, se revisa el código del objeto y se quitan los puntos de dichos operadores.

Limitaciones