Entradas

Environments dentro de la KB GeneXus

Imagen
Un escenario común en aplicaciones Genexus en clientes grandes (y chicos) es el siguiente: Desde la KB, programo y genero los instalables (pueden ser imágenes docker, war/jar, zip, etc) con los ejecutables y todos lo necesario para ejecutar. Esto tambien tiene los archivos de configuración necesarios para ejecutar con los valores que tengo en la KB o algunos que saco de las propiedades de la KB (web.config, client.cfg, appconfig.json y varios mas). Luego que hago una instalación en un ambiente de TEST, cuando el responsable lo aprueba (luego de correr test automático, test manuales, o que se cumplan los criterios de aprobación definidos, se pasa al ambiente de pre-produccion, que es mas parecido al ambiente de producción (en algunas instalaciones no existe el ambiente de PRE-Produccion y pasan directo a PRODUCCION).  En este pasaje, los instalables que se instalan SON EXACTAMENTE LOS MISMOS, pero se cambian los archivos de configuración y las variables de ambiente del sistema operativo

Pasarisa y Pampin

Hoy me entere que hace unos meses falleció Edgardo Pampin que junto con Gerardo Pasarisa fueron uno de nuestros primeros clientes. Teñían un estudio de fotografía y publicidad . Recién des-exiliados desde Holanda, se instalaron en Uruguay y tenian mucho trabajo porque trajeron maquinas y metodologías que no eran tan conocidas en el mercado.  Le instalamos una aplicacion en Clipper y estaba pensada para algo medio temporal, pero la usaron por muchisimos años. Aprendi mucho de ellos dos, sobre todo la dedicación y cariño que le ponía a cada una de sus producciones.  Si les gustan las buenas fotos, pueden ver algunas de las que publicaba en Instagram.  View this post on Instagram A post shared by Edgardo Pampin (@edgardopam)

Migrar a GeneXus 18 (+20.000 objetos después)

Hemos realizado unas cuantas migraciones a GeneXus 18, de muy diversos tipos. La idea es contar algunas de las diferencias encontradas para que a otros le sea más fácil.  Como siempre, y como no esta recomendado, hemos realizado algunos cambios para aprovechar nuevas funcionalidades.  Migración de .NET Framework a .NET Core. (.NET Core) El generador .NET Framework va a ser discontinuado, por lo que conviene empezar a realizar la transición de uno a otro. El mayor problema que tuvimos aquí, es con el código C# externo que tenemos en la aplicación.  La mayoría de los cambios fueron por temas de namespaces cambiados y otros por el uso de WCF (Windows Communication Foundation).  También tuvimos que re-programar funcionalidad para manejo de PDF (concatenar, firmar, reemplazar dentro de PDF) porque usábamos un componente que no tiene soporte en .NET Core.  No carga la grilla - Smooth y Automatic Refresh = NO (.NET Framework) En varios paneles, que estaban como Smooth y tenían Automatic Refre

Incluir Bases de Datos de Grafos y Vectoriales en aplicaciones

Imagen
En la actualidad, las empresas enfrentan la necesidad de gestionar grandes volúmenes de datos y extraer información valiosa de ellos de manera rápida y eficiente. Tradicionalmente, las bases de datos relacionales (SQL) han sido la columna vertebral de la infraestructura de datos en muchas organizaciones. Sin embargo, con el crecimiento de la complejidad de los datos y las relaciones entre ellos, y el surgimiento de nuevas tecnologías, las bases de datos de grafos y vectoriales han emergido como soluciones poderosas. Este artículo explora la importancia y las oportunidades de integrar bases de datos de grafos y vectoriales en aplicaciones que utilizan bases de datos relacionales, destacando la oportunidad para las empresas que logren unificar o centralizar el acceso a los datos utilizando SQL, GQL, RAG y Full Text Search de manera coordinada y eficiente. La Importancia de las Bases de Datos de Grafos Las bases de datos de grafos están diseñadas para manejar relaciones complejas entre da

Haciendo la transición de Servicios Web SOAP a Servicios Web REST con GeneXus

Imagen
En el desarrollo de software moderno, la adopción de servicios web RESTful ha ganado mucha popularidad debido a su simplicidad y eficiencia. Sin embargo, muchos sistemas legados aún utilizan servicios web SOAP. En este post, explicaremos cómo hacer la transición de un servicio web SOAP a un servicio web REST en GeneXus, permitiendo que ambos servicios coexistan durante un periodo de transición. Paso 1: Analizar el Servicio SOAP Existente y separar interfaz de la lógica.  Antes de iniciar la transición, es crucial entender el servicio SOAP existente. Esto incluye: Identificar las operaciones del servicio SOAP. Revisar los contratos de servicio (WSDL). Entender las estructuras de datos (tipos de mensajes, esquemas XML). Una vez realizado esto, conviene separar la interfaz de la lógica de la siguiente manera, suponiendo que el objeto se llama ServicioWEB y tiene la variable &ParmIN como parámetro de entrada y &ParmOUT como parámetro de salida.  ServicioWEB es un objeto procedure q

Encontrar string no traducibles a los que les falta ! en fuentes Genexus.

Imagen
GeneXus tiene la posibilidad de generar aplicaciones multi-idioma de una forma bastante fácil.  Como es GeneXus el que genera el código, va a traducir todas los labels de las pantallas, los strings dentro de los programas, mensajes, etc.  Realmente es una solución sencilla a un problema realmente complejo.  Pero, hay strings o constantes que no deben traducirse, porque si se traducen la aplicación puede funcionar mal.  Por ejemplo, si leo un XML y busco dentro una etiqueta especifica, con el nombre que viene en el archivo y no con el nombre traducido.  La forma de decirle a GeneXus que no traduzca, es ponerle un signo de exclamación delante del string, por ejemplo el string !'ETIQUETA'  no sera traducido.  Esto trae un lindo problema cuando tenemos código GeneXus que fue desarrollado para ser utilizado en un único idioma y se incorpora a una KB que es multi-idioma. Hay que buscar y cambiar los strings que no deben traducirse.  Como encontrar strings que no debo traducir en el c

Modularizacion de servicios web sin afectar su funcionamiento

Problema: Tengo un servicio web (REST o SOAP) desarrollado con versiones anteriores de GeneXus y quiero modularizar mi KB.  Por ejemplo, tengo un servicio que se llama  Get_Clientes(&Tipo)  que devuelve una Collection de clientes de un determinado tipo.  Como el servicio viene de una versión anterior de GeneXus, donde no existían los módulos, queda en el módulo Root.  En el proceso de modernización de la KB, se crea el módulo Clientes.  Qué hacer con el objeto Get_Clientes()? Si lo muevo al módulo Clientes, voy a afectar a los usuarios de dicho servicio, pues le va a cambiar la  URL desde donde lo consumen, pues el nombre del servicio pasará a ser CLIENTES.Get_Clientes() Si lo dejo en el módulo Root, no afecto a los usuarios del sistema, pero la KB me queda mal modularizada, por ejemplo no puedo pasar la tabla de Clientes a privada del modulo.  Solución: Hay varias formas de solucionarlo, pero una forma sencilla, es dividir el servicio, en dos objetos.  Uno que tiene la interfaz (G

Migraciones y Timezones

Imagen
Había una vez dos aplicaciones, una de Contabilidad y otra de Costos, que convivían en una misma máquina y lo hicieron durante muchos años en armonía. Ambas aplicaciones nacieron mucho antes de que GeneXus tuviera soporte para TimeZone. Un día, los dioses de los microservicios decidieron que era una buena idea instalar las aplicaciones en diferentes equipos. Para ello, se creó una KB intermedia con servicios simples que permitieran transferir datos de una aplicación a la otra. Esta KB, llamada Servicios SOAP, leía datos de la base de datos de Contabilidad y los devolvía en una colección de SDT para que el sistema de Costos pudiera procesarlos. La KB de Servicios SOAP y la de Costos estaban programadas en GeneXus, generando en .NET Framework, y convivieron muchos años transfiriendo asientos sin inconvenientes. La KB de Servicios SOAP no grababa nada en la base de datos; solo leía y devolvía algunos servicios, por lo que no la considerábamos crítica. Todos los campos eran de tipo DATE y

Prototipo de KB Assistant en GeneXus

Imagen
 Es de esperar que aparezcan una cantidad interesantes de asistentes para ayudar en el desarrollo de aplicaciones GeneXus, ayudados con los modelos de inteligencia artificial y su capacidad de interpretar el lenguaje natural.  Mi primer intento para hacer una prueba de esto, es un modelo RAG  Retrieval-Augmented Generation en el que le paso una colección de documentos y los procesa dividiendo el contenido en pedazos y codificando el contenido como vectores de muchas dimensiones y almacenando el resultado en una base de datos vectorial.  Luego se puede recuperar dichos datos de forma de encontrar textos que están semánticamente cerca de lo que estoy preguntando.  En mi caso, lo que hice fue hacer un programa que lee una KB GeneXus y genera un txt por cada objeto.  Si bien el contenido es diferente para los diferentes tipos de objetos, el contenido del mismo tiene la forma Atributo : ClienteId Descripcion: Identificador de Cliente ClienteId es del tipo de datos Character y tiene largo 6.

Libros interesantes

Imagen
 Me toco participar en dos temas que no domino y por lo tanto tuve que leer algo sobre los temas.  Observability En un proyecto que estoy trabajando, empezamos a sustituir los logs por metrics/ traces / logs de OpenTelemetry.   El libro Learning OpenTelemetry , es una buena introducción al tema y permite ver que es un tema que se esta trabajando mucho pues muchas funcionalidades se están agregando en estos momentos.  Para administrar sitios con varios nodos, para procesos distribuidos y para manejo de microservicios, OpenTelemetry ofrece numerosas ventajas.  También tiene la posibilidad de medir cosas en producción, sin afectar (mucho) la performance de la aplicación.  Docker / Kubernetes / Helm Una aplicación que desarrollamos necesita instalarse a través de imágenes docker en kubernetes.  Helm es uno de los productos que se utilizan para facilitar la instalación es un gestor de paquetes para kubernetes que facilita la tarea, definiendo que es lo que se quiere hacer, y el producto def