Entradas

Mostrando las entradas de 2019

Build y deploy de aplicaciones GeneXus complejas

Imagen
Me gustaría poder organizar una "reunión virtual" con aquellos que hacen deploy de aplicaciones complejas, para intercambiar con  que  problemas se chocaron y cuales fueron las soluciones encontradas. 

Estoy tratando de elevar el nivel de abstracción de las tareas "Build", "Pack" y "Deploy" y me gustaría contar con más casos para no hacer apreciaciones sesgadas con el tipo de aplicaciones que desarrollamos nosotros. 

A quienes les interese, respondan este post o me mandan un mail y los agrego a un hangout que estoy organizando para el Viernes 18 a las 14:00 de Uruguay.

Me gustaría poder organizar una "reunión virtual" con aquellos que hacen deploy de aplicaciones complejas, para intercambiar con  que  problemas se chocaron y cuales fueron las soluciones encontradas. 

Estoy tratando de elevar el nivel de abstracción de las tareas "Build", "Pack" y "Deploy" y me gustaria contar con más casos para no hacer apreci…

Temporal Databases: Es posible tener tablas temporales en nuestras aplicaciones?

Imagen
Casi todas las aplicaciones necesitan algún tipo de manejo temporal de sus operaciones.

Supongamos que tenemos la tabla de clientes y la modelamos de la siguiente forma:

*ClienteId
ClienteDireccion


ClienteIDClienteDireccionMBI18 de Julio 3234
Que pasa cuando los datos de una entidad cambia?.
Lo que se hace habitualmente es cambiar directamente el valor de la tabla, cambiando de ahí hacia adelante todos las referencias a la misma.
Si el cliente MBI, cambia su dirección, el registro que lo representa quedará así:

ClienteIDClienteDireccionMBIMillán 2515

Supongamos ahora, que el cliente realiza compras antes del cambio de domicilio y las consultamos después del registro del cambio de domicilio.

Lo que pasaría es que los nuevos reportes van a figurar con la dirección nueva, pudiendo ocasionar problemas de entrega.

Cual seria una posible solución?
Una solución sencilla, seria manejar vigencias en los datos del cliente, donde podamos especificar un intervalo en los cuales la información del clie…

Charlas en el encuentro GeneXus GX29

Imagen
Hace unas semanas escuché un podcast de @rorro, sobre como calcular el valor de una empresa. 

Siendo propietario de una parte de una empresa, me interesa poder calcular el valor de la misma. El valor de una empresa que crea o usa software esta más basado en las expectativas de futuro que en presente.

Cada vez que me pregunto cuanto puede valer Concepto, me cuesta muchísimo responder, pues hay varios factores que influyen y hay un componente subjetivo grande.  Sin embargo, me resulta mucho mas fácil de responder la pregunta. ¿Que puedo hacer para agregar valor a mi empresa de software?

En ésto es algo en lo que si he trabajado en los últimos años, y pensé que podía ser útil compartirlo en algunas charlas, aunque no soy experto (ni cerca) en el tema.

¿Que puedo mejorar? Mejorar el proceso de desarrollo. Como empresa de software, la mejor inversión es poder hacer que el proceso de desarrollo sea lo mas ágil/adaptable/repetible que pueda lograr. Tratando de estar por encima de modas y sig…

Poder extraer conocimiento de una KB GeneXus

Imagen
Mientras desarrollo con GeneXus, me resulta muy común enfrentarme a situaciones donde necesito resolver un problema relacionado con un subconjunto de objetos de la KB y resulta muy difícil encontrar ese subconjunto a pesar de tener todo el conocimiento en la KB.

Algunos ejemplos de los últimos días:

Problema 1)
En GX 16 tenemos un comportamiento diferente de la forma en que se valida que una grilla tenga un renglón seleccionado.
En Evo3 si el usuario no habia seleccionado nada, traía las variables / atributos del renglón vacios y ahora queda con el ultimo cargado.

Para poder probar esto necesito recuperar todos los webpanels que tengan un grilla que acepte seleccionar registros.

Problema 2)
Apareció un error de datos en la base de datos y sospechamos que un programa esta grabando mal un atributo.
Necesito todos los objetos (van a ser procedures o business component) que inserten o actualicen datos en esa tabla (pero solo para un atributo especifico).

Problema 3)
Quiero cambiar un domi…

Como responder un HTTP 500 - "Internal Server Error" en un servicio web GeneXus C#.

Imagen
En determinados programas expuestos como servicios web SOAP, es conveniente devolver un error 500 - Internal Server Error, para dejar bien evidente que hubo un problema serio.

En GeneXus no hay una forma nativa de devolver estos errores, por ahora al menos.

Necesitábamos devolver errores 500 cuando nos llegaba un request con formato invalido.

Lo que hicimos fue, agregar en la primera línea del procedure (*):

&SoapErrMsg =GetSOAPErrMsg()

If&SoapErrMsg <> ''
csharp throw new System.Web.Services.Protocols.SoapException([!&SoapErrMsg!], System.Web.Services.Protocols.SoapException.ClientFaultCode);
endif

* Esto fue probado en el Upgrade 5 de GeneXus 16. 



Diferencias en servicios SOAP de GeneXus Evo3 y GeneXus 16.

Imagen
Realizando una conversión de una KB que está en GeneXus Evo3 a GeneXus 16, tenemos varios servicios web con protocolo SOAP.  Despues de tener algunos inconvenientes con las pruebas de los mismos,  tuve que hacer la comparación mas exhaustiva de la salida de los servicios SOAP  y comparar los resultados.

En las pruebas me lleve varias sorpresas.

Hice un web service soap (procedure/main/call protocol=SOAP/Use SOAP native=NO) que recibe un SDT con un numero con signo de -N(8.2) y asi como lo recibe lo devuelve.

&SDTEntrada                     Collection=True
    &Numero                     -N(8.2)

con la regla

parm(in:&SDTEntrada,out:&SDTSalida);

y el código

//Asigno lo mismo que recibo. 
&SDTSalida = &SDTEntrada

Los Request que se envían a ambos sistemas en Evo3 y GX16 son parecidos a


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:kbn="KBNamespace"><soapenv:Header/><soapenv:Body><kbn:Pr…

Recuperar la version de GeneXus que estoy ejecutando.

Imagen
En nuestro proceso de integración continua queríamos lograr que cuando se instalara una nueva versión de GeneXus en la maquina de build, se hiciera un REBUILD en vez de un Build all normal.

Para esto, era necesario poder saber en que versión de GeneXus estoy ejecutando.

GeneXus /version
GeneXus viene con un comando command line para recuperar esta información, pero no es trivial recuperarla desde línea de comando, pues necesita ejecutar como administrador. Si no estoy como administrador, abre otra ventana y no es fácil recuperar la información.

La opción que encontramos, es recuperar la versión directamente del archivo GeneXus.exe con powershell

(Get-Command "genexus.exe").FileVersionInfo.ProductVersion

y devuelve  algo parecido a esto:

16.0.5.135057

Es el Upgrade 5 de la versión 16, con el Build = 135057

Teniendo esto podemos guardar la versión en un archivo, cuando termina el build en forma exitosa y si actualizamos GeneXus, solo tenemos que comparar el contenido del archivo…

Herramientas útiles para migraciones

Imagen
Desde hace un buen tiempo, estoy participando en un proyecto de migración de una KB grande desde GeneXus Evo3 a GeneXus 16 Upgrade4.

En el proceso, hemos tenido que asegurarnos que la ejecución del sistema nuevo, es compatible con el sistema anterior.

Como es un sistema bastante grande, hemos tratado de automatizar lo que podemos para hacer el chequeo mas eficiente y encontrar mas rapido las diferencias.

Algunas de las cosas que comparamos son:
* WSDL de los servicios SOAP del sistema
* Respuesta de los servicios SOAP (cuando lo llamamos con parámetros)
* Respuesta de los servicios REST
* Salida de los procesos batch
* Ejecución de pantallas WEB

Para lograrlo, hemos estado utilizando algunas herramientas que pienso que pueden ser de utilidad a otros en proyectos parecidos.

Estas herramientas son las que usamos para

SoapUI.  Permite probar en forma fácil servicios SOAP (y también REST) pero en principio lo usamos mas para el SOAP.
Como lo usamos?.
Dado el WSDL del servicio que queremos…

Testeo Unitario a un proyecto GeneXus - Gxwiki6

Imagen
Con el fin de practicar y encontrar la forma de como incorporar pruebas unitarias a un proyecto GeneXus, decidí hacer un proyecto colaborativo (conmigo mismo) en un proyecto público como GXwiki. 
http://open.genexusserver.com/v16/knowledgebase.aspx?GXwiki6,GXWiki6

Elegi este proyecto porque es publico/abierto y tiene pocas tablas y a la vez es suficientemente sofisticado como para encontrar varios de los problemas que vamos a encontrar en casas proyectos reales.

Lamentablemente no puedo crear versiones en el server, pues me gustaría poder dejarlo (en el server) asi:


Por ahora, lo voy a dejar desconectado del server, y tal vez mas adelante lo suba a algun server para que otros puedan usarlo.

Las tareas que voy realizando son:
Aprontes y limpieza de la KBCrear KB from Server
Build All Creo una versión congelada (para tener un lugar donde volver si meto la pata). 
Corregir estos errores:  Processing enumerated domains...
Database Creation Analysis Success
Generating Resources...
English\Theme…