Entradas

Eliminar Styles de KB en GeneXus X.

Imagen
En versiones anteriores de GeneXus, existian los objetos Styles que servían para uniformizar workpanels, webpanes y transacciones. Se definia la estetica en un solo objeto y la misma se replicaba en los objetos que los usaban. Eran útiles pero a partir de la version X los mismos no existen mas. Si realizamos una migración de GeneXus 9.0 (o anteriores) a la X, los objetos convertidos mantienen una referencia a los Styles, pero como no existen como objetos, dicha referencia queda apuntando a objetos que  se almacenan en la "carpeta" TO BE DEFINED. En general, joroban bastante poco, pero cuando se quieren subir objetos con dichas referencias al GXServer, dan problemas, pues el GeneXus Server no maneja los objetos Styles. Si se quiere eliminar dicha referencia, se debe hacer: 1) Distribuir todos los objetos que usen Styles en la GeneXus X. 2) Descomprimir el xpz generado en 1) y salvar el xml. 3) En dicho XML, eliminar el texto: <Property><Name>ObjSt...

Crónica de un poblema "divertido"

Imagen
Tenemos funcionando varios wikis ( www.gxwiki.com ) todos con configuraciones/versiones parecidas. C#/SQL server y C#/Oracle. En la DNA , tenemos un Wiki Interno y otro Wiki Externo . Cuando se da por aprobado un procedimiento en el wiki interno, el mismo se publica en el wiki externo a traves de web services. Los mismos venian funcionando sin problemas, desde hace varios meses,  pero los usuarios nos plantearon que se habia empezado a "quedar congelado" en varias oportunidades. Hicimos un TRACE para ver donde se estaba poniendo lento y en el mismo vimos, al querer visualizar una pagina 16:50:54,187 [12] DEBUG GxConnectionCache - SetAvailableCommand stmt:   SELECT PageUsageDay, PageUsageCount, PageId FROM wikiproc.PageUsage   WHERE PageId = :PageId AND PageUsageDay = :PageUsageDay ,c.opened:0=0 16:50:54,187 [12] DEBUG GxConnection - DecOpenHandles, OpenHandles after '1' 16:50:54,187 [12] DEBUG GxConnectionManager - GxConnectionManager.DecOpen...

Funcionalidades que me gustaría agregar al KBDoctor (continuación)

Imagen
Search&Replace Poder poner un texto a buscar y otro a sustituir y cambiarlo en todos los objetos. El cambio puede ser en el código, en las pantallas, en las propiedades. Seria opcional buscar con el Indice que GeneXus ya posee, o que recorra todos los objetos, los distribuya y si el texto esta en dicho objeto, lo modifique y vuelva a consolidarlo. Seria muy util, para muchas situaciones, por ejemplo para eliminar el &Planilla.UseAutomation, que no se porque motivo el Search de Genexus no lo encuentra.

Funcionalidades que me gustaría agregarle al KBDoctor.

Imagen
Hay un conjunto de funcionalidades que me gustaría agregarle al KBdoctor y dado el ritmo de trabajo que preveo para este año no voy a poder encarar. TRNCleaner. Toma una transacción que no esta siendo usada (solo se usa para crear la tabla) y le saca todas las reglas, pantalla, documentación. Opcionalmente puede eliminar también formulas no redundantes o atributos que no pertenezcan a las tablas básicas de la transacción. También debería marcarla como no generable, para que no jorobe mas por un tiempo. ThemeCleaner. Dado un tema, borrar todas las clases no referenciadas por ningún objeto de la KB, tomando en cuenta la jerarquía lógica. ThemeFixer. Recorrer todos los objetos WEB y corregir todos aquellos controles que tengan clases que no existan en el tema asignado, poniéndole la clase por defecto para dicho control. SDTFixer. Dado un SDT, generar un proc que define una variable basado en dicho SDT, y lo genera forzado para todos los ambientes del modelo. Luego borra ...

PiensoPienso: Cómo implementar semáforos en GeneXus?

Imagen
Se tiene una aplicación que se ejecuta en muchas computadoras diferentes sobre la misma base de datos y comparten el file system. Hay un determinado proceso que por su consumo no puedo permitir mas que tres ejecuciones simultaneas del mismo pues la performance de  toda la aplicación se degrada hasta niveles no aceptables.  Dicho proceso, puede tener cortes o caídas que hagan que no termine en forma correcta.  Cuales son las posibles implementaciones con GeneXus para lograr un máximo de tres ejecuciones simultaneas? Se valorarán las que maximicen la concurrencia y no provoquen bloqueos. Para los que quieran les dejo el link de wikipedia sobre el tema y otro sobre mutex .

PiensoPienso: Como mejorar la permformance de este programa?

Tengo una tabla con millones de registros que son de la forma *Clave Descripcion Fecha y un webpanel  con una grilla que muestra los registros que cumplen la condicion: Clave = &Clave when not &Clave.isEmpty(); Descripcion like &Descripcion when not &Clave.IsEmpty(); &FechaInicial <= Fecha and Fecha <= &FechaFinal ; En la pantalla se muestran la cantidad de registros que tiene le grilla y en los eventos tengo: &TotPag = Grid.PageCount if Grid.Rows > 0 if Grid.PageCount <= 1 Paginado.Visible = 0 //Muestro botones de  paginado else if &nroPag = 1 anterior.Enabled = 0 primero.Enabled = 0 endif if &nroPag = Grid.PageCount siguiente.Enabled = 0 endif endif else Paginado.Visible = 0 endif Como mejorarían la performance de este programa? 

Ventajas de programación basada en modelos : Cambios al migrar a GeneXus X ev2.

Estaba revisando un tema de performance en la base de datos, de una aplicación generada con GeneXus 9.0. La misma no tenia problemas de performance grande, pero los administradores de la base de datos pedían que se utilizara BINDING para mejorar el ratio del cache de sentencias en la base de datos. Para hacer pruebas cree una KB en 9.0 con dos tablas (Clientes y Facturas) y un webpanel con una grilla de 10 renglones, que traia algunos datos de las tablas con un join, con condiciones con un when y ordenados   La misma generaba la sentencia: SELECT T1.[FactImporte], T1.[FactId], T1.[FacFecha], T2.[CliNom], T1.[CliId] FROM ([FACTURA] T1 WITH (FASTFIRSTROW NOLOCK) INNER JOIN [CLIENTE] T2 WITH (NOLOCK) ON T2.[CliId] = T1.[CliId]) WHERE (T1.[FactImporte] > 100) ORDER BY T1.[FactImporte] DESC   Para hacer pruebas, también la migre a la GeneXus X Evolution 2 y generó la sentencia.   SELECT * FROM ( SELECT T1.[FactImporte], T1.[FactId], T1.[FacFecha], T2.[...