<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5980598</id><updated>2026-05-04T20:26:12.208-03:00</updated><category term="Genexus"/><category term="Usabilizando Genexus"/><category term="OffTopic"/><category term="Uruguay"/><category term="Web"/><category term="Humor"/><category term="PiensoPienso"/><category term="KBDoctor"/><category term="Metodologia de Desarrollo"/><category term="Rocha"/><category term="Blog"/><category term="database"/><category term="Empresas"/><category term="Costa Rica"/><category term="Encuentro"/><category term="Microsoft"/><category term="Comunidad"/><category term="software"/><category term="Modulos"/><category term="Tica"/><category term="Libros"/><category term="Migracion"/><category term="extensions"/><category term="Bio"/><category term="Concepto"/><category term="GIA"/><category term="Computadoras"/><category term="HowTo"/><category term="Sql Server"/><category term="Testing"/><category term="CicloFeatures"/><category term="kbtools"/><category term="GxUnit"/><category term="Utilitarios"/><category term="Celulares"/><category term="Build &amp; Deploy"/><category term="GUG"/><category term="GeneXus Extensiones"/><category term="Juegos"/><category term=".NET"/><category term="GeneXus Server"/><category term="diseño"/><category term="open source"/><category term="reorg"/><category term="wiki"/><category term="IIS"/><category term="Palmira"/><category term="Patterns"/><category term="java"/><category term="Calidad"/><category term="Futbol"/><category term="Internet"/><category term="proyectos"/><category term="seguridad"/><category term="Consultorio"/><category term="Control de Versiones"/><category term="Ecuador"/><category term="GeneXus TILO"/><category term="GeneXusNext"/><category term="ISO 9000"/><category term="OLPC"/><category term="Relojes"/><category term="Aviones"/><category term="CSS"/><category term="ExtensionesQueUso"/><category term="LUCIA"/><category term="Mashup"/><category term="Musica"/><category term="Rss"/><category term="Trabajo"/><category term="#GeneXus"/><category term="Hardware"/><category term="Modularizacion"/><category term="Soporte"/><category term="TDD"/><category term="javascript"/><category term="Cache"/><category term="DevOps"/><category term="GxChart"/><category term="GxFit"/><category term="KBCodeReview"/><category term="Metadatos"/><category term="Oracle"/><category term="Panama"/><category term="Robots"/><category term="Ruby"/><category term="#GEAI"/><category term="COLEBus"/><category term="Colombia"/><category term="Datys"/><category term="Docker"/><category term="GX27"/><category term="GXChallenge"/><category term="GXServer"/><category term="Inteligencia Artificial"/><category term="KBSaveReorganization"/><category term="MSBUILD"/><title type='text'>Desarrollando desde la trinchera.</title><subtitle type='html'>El blog de Enrique Almeida. Desarrollo de aplicaciones, GeneXus y otros divagues.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default?start-index=26&amp;max-results=25'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/13964187630117314432</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://enrique.almeida.googlepages.com/EnriqueAlmeida.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1271</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5980598.post-4084669026574006642</id><published>2026-04-06T08:59:00.003-03:00</published><updated>2026-04-07T13:17:05.718-03:00</updated><title type='text'>Usando IA para detectar problemas de performance en aplicaciones GeneXus</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhJKlVh7bX0hSwFygdTtiikTNV9vspCgnK6-2qFjKek7FlK_LY7oOWO_0LiJW1AuOjXTMGcXK2BsETmHcPVxWn9f2XxIOX-qy1Ktv3x4vXOSQDiH7Ly22UuIIoqkJrDSbVpd078TuUMropcc2dDy8ppxq0lNxzYBNBSSenTW_hRtbIBbasA3asmvA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhJKlVh7bX0hSwFygdTtiikTNV9vspCgnK6-2qFjKek7FlK_LY7oOWO_0LiJW1AuOjXTMGcXK2BsETmHcPVxWn9f2XxIOX-qy1Ktv3x4vXOSQDiH7Ly22UuIIoqkJrDSbVpd078TuUMropcc2dDy8ppxq0lNxzYBNBSSenTW_hRtbIBbasA3asmvA&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;En aplicaciones grandes desarrolladas con GeneXus, detectar problemas de performance puede ser una tarea compleja. Los logs generados con log4net contienen muchísima información valiosa, pero leerlos manualmente no escala.&lt;p&gt;&lt;/p&gt;&lt;p&gt;En este post te comparto una metodología práctica para analizar estos logs utilizando &lt;strong&gt;&lt;a href=&quot;https://notebooklm.google.com/&quot;&gt;NotebookLM&lt;/a&gt;&lt;/strong&gt;, aprovechando su capacidad de entender documentos y responder preguntas sobre ellos.&lt;/p&gt;&lt;hr /&gt;&lt;h2&gt;Idea general&lt;/h2&gt;&lt;p&gt;La propuesta es simple pero poderosa:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Convertir los logs de ejecución en documentos (PDF)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Subirlos como fuentes a NotebookLM&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hacer preguntas inteligentes sobre el contenido&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Obtener insights de performance automáticamente&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Esto transforma un análisis manual tedioso en un proceso asistido por IA.&lt;/p&gt;&lt;hr /&gt;&lt;h2&gt;Paso 1: Generar los logs correctamente&lt;/h2&gt;&lt;p&gt;Asegurate de que tu aplicación GeneXus esté generando logs con suficiente detalle (al menos DEBUG).&lt;br /&gt;Yo lo uso asi:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEicHcoBliePUzorjmyo6KbHWwEddBIgrcGQjfUx1Y3Jn5UXvZ6odsMXNwWBTpkfk9or8IGEdXUj1QsZahcRlEXV2n3-pdENplhW4Ytb4ny2YMtDoRdedKmXv1H656tNQ5UXxwTKChAmijwPxw8BbQUWVX7Rs1IAPMKdAMXS3VEOI1Pd3BvZm5GSFQ&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;307&quot; data-original-width=&quot;906&quot; height=&quot;108&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEicHcoBliePUzorjmyo6KbHWwEddBIgrcGQjfUx1Y3Jn5UXvZ6odsMXNwWBTpkfk9or8IGEdXUj1QsZahcRlEXV2n3-pdENplhW4Ytb4ny2YMtDoRdedKmXv1H656tNQ5UXxwTKChAmijwPxw8BbQUWVX7Rs1IAPMKdAMXS3VEOI1Pd3BvZm5GSFQ&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Un formato típico de log4net (es el default que trae GX) que funciona muy bien es:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;%d{yyyy-MM-dd&#39;T&#39;HH:mm:ss.fffzzz} [%t] %-5p %c - %m%n
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Esto te da:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Timestamp con precisión de milisegundos&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Nivel de log (INFO, DEBUG, WARN, etc.)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mensaje (incluyendo SQL, nombre de programa, parametros, etc.)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Paso 2: Convertir logs a PDF&lt;/h2&gt;&lt;p&gt;NotebookLM trabaja mejor con documentos estructurados. Por eso:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Convertí tus archivos &lt;code inline=&quot;&quot;&gt;.log&lt;/code&gt; a &lt;code inline=&quot;&quot;&gt;.pdf .&amp;nbsp;&lt;/code&gt;Yo uso un driver de impresion a PDF.&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Si el archivo es muy grande, dividilo por partes (ej: por día o por thread)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Paso 3: Subir los logs a NotebookLM&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Crear un nuevo notebook en &lt;strong&gt;NotebookLM&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Subir los PDFs como “Sources”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Esperar a que indexe el contenido&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Una vez hecho esto, NotebookLM ya puede “leer” y entender tus logs.&lt;/p&gt;&lt;hr /&gt;&lt;h2&gt;Paso 4: Hacer consultas inteligentes&lt;/h2&gt;&lt;p&gt;Acá está la clave del valor.&lt;/p&gt;&lt;p&gt;Ejemplos de preguntas útiles:&lt;/p&gt;&lt;h3&gt;🔹 Detección de cuellos de botella&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;“¿Cuáles son las operaciones más lentas?”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“¿Qué consultas SQL tienen mayor tiempo de ejecución?”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;🔹 Análisis de patrones&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;“¿Hay procesos que se repiten muchas veces?”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“¿Qué sentencias sql aparecen más frecuentemente en los logs?”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;🔹 Problemas potenciales&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;“¿Detectas esperas largas entre eventos?”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“¿Hay indicios de problemas de concurrencia o bloqueos?”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;🔹 Recomendaciones&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;“Dame 3 recomendaciones para mejorar la performance basadas en estos logs”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;NotebookLM no solo responde, sino que además &lt;b&gt;cita partes específicas &lt;/b&gt;del log como evidencia.&lt;/p&gt;&lt;hr /&gt;&lt;h2&gt;Paso 5: Iterar como si fuera un analista experto&lt;/h2&gt;&lt;p&gt;Una gran ventaja es que podés iterar:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Refinar preguntas&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Focalizar en un proceso específico&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pedir explicaciones más técnicas&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Esto simula tener un analista senior revisando logs contigo.&lt;/p&gt;&lt;hr /&gt;&lt;h2&gt;&amp;nbsp;Casos de uso concretos en GeneXus&lt;/h2&gt;&lt;p&gt;Esta metodología es especialmente útil para:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&amp;nbsp;Identificar procedimientos batch lentos&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Detectar SQL mal optimizado&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Analizar conexiones lentas&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Entender comportamiento en producción&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Validar mejoras luego de optimizaciones&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Bonus: combinándolo con herramientas propias&lt;/h2&gt;&lt;p&gt;Si ya tenés herramientas como &lt;a href=&quot;https://github.com/enriquealmeida/KBLogAnalyzer&quot;&gt;analizadores de logs &lt;/a&gt;(por ejemplo scripts o utilidades internas), podés combinarlas:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Preprocesar los logs (ej: detectar demoras grandes)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Luego usar NotebookLM para el análisis cualitativo&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Lo mejor de ambos mundos: automatización + interpretación inteligente&lt;/p&gt;&lt;hr /&gt;&lt;h2&gt;Consideraciones importantes&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Los logs pueden contener datos sensibles → anonimizar si es necesario&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;NotebookLM tiene límites de tamaño → dividir archivos grandes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No reemplaza el conocimiento técnico → lo potencia&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Conclusión&lt;/h2&gt;&lt;p&gt;El análisis de performance ya no tiene que ser un proceso manual, lento y propenso a errores.&lt;/p&gt;&lt;p&gt;Usando &lt;strong&gt;NotebookLM&lt;/strong&gt;, podés transformar tus logs de GeneXus en una fuente de conocimiento accionable, acelerando el diagnóstico y mejorando la calidad de tus sistemas. No es el uso mas tradicional de NotebookLM pero es efectivo y ahorra mucho en en analisis de logs.&amp;nbsp;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Si estás trabajando con aplicaciones grandes o sistemas críticos, esta metodología puede marcar una diferencia enorme en productividad.&lt;/p&gt;&lt;p&gt;* Esta metodologia es mejor cuando analiza proceso batch. Para esto, es recomendable utilizar procedures command line como wrapper que llame al procedure que se quiere optimizar y generar el log solo de ese objeto.&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;La Yapa&lt;/h3&gt;Comparto alguno de los prompts que uso para analizar los logs.&lt;br /&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Prompt para iniciar el NotebookLM&lt;/h4&gt;&lt;br /&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Actúa como un experto en performance de aplicaciones GeneXus.&lt;br /&gt;&lt;br /&gt;Analiza estos logs generados con log4net. &lt;br /&gt;Los logs contienen timestamps, niveles de log y mensajes de ejecución.&lt;br /&gt;&lt;br /&gt;Tu objetivo es:&lt;br /&gt;1) Detectar cuellos de botella&lt;br /&gt;2) Identificar operaciones lentas&lt;br /&gt;3) Encontrar patrones repetitivos ineficientes&lt;br /&gt;4) Detectar esperas entre eventos&lt;br /&gt;5) Proponer mejoras concretas&lt;br /&gt;&lt;br /&gt;Cuando respondas:&lt;br /&gt;- Usa evidencia concreta del log&lt;br /&gt;- Cita ejemplos&lt;br /&gt;- Sé específico (no general)&lt;br /&gt;- Prioriza impacto alto en performance&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Pregunta Generica&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;Analiza estos logs de GeneXus como experto en performance.&lt;br /&gt;&lt;br /&gt;1) Detecta las operaciones más lentas&lt;br /&gt;2) Encuentra gaps de tiempo &amp;gt; 500 ms&lt;br /&gt;3) Identifica patrones repetitivos&lt;br /&gt;4) Analiza SQL problemático&lt;br /&gt;&lt;br /&gt;Devuelve:&lt;br /&gt;- Top 5 problemas&lt;br /&gt;- Evidencia concreta&lt;br /&gt;- Recomendaciones accionables&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Sentencias SQL&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;&lt;br /&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Extrae todas las sentencias SQL detectadas en los logs.&lt;br /&gt;&lt;br /&gt;Para cada una:&lt;br /&gt;- Identifica frecuencia&lt;br /&gt;- Evalúa posibles problemas (filtros, índices, joins, funciones)&lt;br /&gt;- Detecta patrones de mala performance&lt;br /&gt;&lt;br /&gt;Devuelve:&lt;br /&gt;- Top queries más problemáticas&lt;br /&gt;- Recomendaciones específicas&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/4084669026574006642/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2026/04/usando-ia-para-detectar-problemas-de.html#comment-form' title='6 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/4084669026574006642'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/4084669026574006642'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2026/04/usando-ia-para-detectar-problemas-de.html' title='Usando IA para detectar problemas de performance en aplicaciones GeneXus'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhJKlVh7bX0hSwFygdTtiikTNV9vspCgnK6-2qFjKek7FlK_LY7oOWO_0LiJW1AuOjXTMGcXK2BsETmHcPVxWn9f2XxIOX-qy1Ktv3x4vXOSQDiH7Ly22UuIIoqkJrDSbVpd078TuUMropcc2dDy8ppxq0lNxzYBNBSSenTW_hRtbIBbasA3asmvA=s72-c" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-2245685318495025056</id><published>2026-03-17T13:21:13.860-03:00</published><updated>2026-03-17T13:21:13.861-03:00</updated><title type='text'>Prueba de CODA_CLI   </title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEieuV7474iB9UrhhuaRL4zQ2b_Nbm3p5q9UlphsDI9DXV0SvhFXGO1nm-5r_4xj5Ya9MCl3fnLA5npi1x3wiE24Fm88pEFMDng3m2CM9Bu5xootSdDRa1eSj6G_Ou6CTVgWwzsqHKbmCrG1H2CjKrS4YRuP-hojJDBSVbz9s-jYdkFcqvaCehNoEg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;874&quot; data-original-width=&quot;1213&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEieuV7474iB9UrhhuaRL4zQ2b_Nbm3p5q9UlphsDI9DXV0SvhFXGO1nm-5r_4xj5Ya9MCl3fnLA5npi1x3wiE24Fm88pEFMDng3m2CM9Bu5xootSdDRa1eSj6G_Ou6CTVgWwzsqHKbmCrG1H2CjKrS4YRuP-hojJDBSVbz9s-jYdkFcqvaCehNoEg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Para hacer la primer prueba de CODA CLI, decidi ir por algo sencillo y conocido.&amp;nbsp;&lt;br /&gt;Queria un utilitario command line, que permita analizar un log de la ejecucion de una aplicacion GeneXus y me ayudara a detectar problemas (fundamentalmente para mejorar performance).&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Lo que hice fue partir de cero, dandole ejemplos del archivo que queria procesar y luego ir agregando una a una las diferentes funcionalidades que queria.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;✅&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; font-weight: 600;&quot;&gt;Detección de demoras&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;- Identifica operaciones lentas&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;✅&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; font-weight: 600;&quot;&gt;Análisis de errores&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;- Separa y agrupa errores y warnings&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;✅&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; font-weight: 600;&quot;&gt;Totalización por programa&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;- Cuenta ejecuciones de cada programa&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;✅&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; font-weight: 600;&quot;&gt;Totalización por SQL&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;- Identifica queries más frecuentes&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;✅&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; font-weight: 600;&quot;&gt;Análisis de conexiones&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;- Detecta conexiones lentas o no cerradas&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;✅&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; font-weight: 600;&quot;&gt;Duración de logs&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;- Calcula el periodo cubierto por cada log&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;Hasta ahi, todo fue muy bien.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Cuando le pedi algo un poco mas sofisticado, como armar un arbol de llamadas, partiendo de log, cuando abria y cerraba conexiones a la base de datos, no logro resultados satisfactorios.&amp;nbsp; Y demoro muchisimo. Lo deje igual en el proyecto, pero claramente es algo que se puede hacer, pero aun no tiene todo como para lograrlo o no supe explicarselo suficientemente bien.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px;&quot;&gt;✅&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; font-weight: 600;&quot;&gt;Árbol de llamadas&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Noto Sans, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;&quot;&gt;&amp;nbsp;- Visualiza jerarquía de ejecución de programas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Noto Sans, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;&quot;&gt;De cualquier forma, con esto ya tengo como para empezar a trabajar.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #1f2328; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Noto Sans, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;&quot;&gt;El repositorio es publico y quedo en&amp;nbsp; https://github.com/enriquealmeida/KBLogAnalyzer&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;y&amp;nbsp; me llevo una mañana y unos 50 USD de tokens.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjQkesXiD54pmMuwsmrO6v1wgCZWLbqq9v4RdifzCppUOH9Q0-8lUSu002QjytaG2b5YFzbMwa0Q0gkTvYh2sHi-v7FUE-cQoZjLjI-FBl9Cr63dIUwkPGASpzULtw6z2-ndKjOarrOrufgDTXkfeSVfPEAIWE_URQwCDx5JDMq94uXPOLakVIb9Q&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;995&quot; data-original-width=&quot;2313&quot; height=&quot;259&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjQkesXiD54pmMuwsmrO6v1wgCZWLbqq9v4RdifzCppUOH9Q0-8lUSu002QjytaG2b5YFzbMwa0Q0gkTvYh2sHi-v7FUE-cQoZjLjI-FBl9Cr63dIUwkPGASpzULtw6z2-ndKjOarrOrufgDTXkfeSVfPEAIWE_URQwCDx5JDMq94uXPOLakVIb9Q=w600-h259&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Tengo varias mejoras en la lista de cosas a hacer&amp;nbsp; https://github.com/enriquealmeida/KBLogAnalyzer/blob/main/doc/TECHNICAL_GUIDE.md&lt;br /&gt;&lt;br /&gt;Estoy usando claude 4.5 y quiero pasarme al 4.6 que dicen que es mucho mejor.&amp;nbsp;&lt;br /&gt;Tambien voy a hacer otros experimientos con Gemini CLI y Codex.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Como justo tengo que optimizar un proceso batch pesado, va a ser un buen momento para probarlo en ejecucion.&amp;nbsp;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/2245685318495025056/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2026/03/prueba-de-codacli.html#comment-form' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/2245685318495025056'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/2245685318495025056'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2026/03/prueba-de-codacli.html' title='Prueba de CODA_CLI   '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEieuV7474iB9UrhhuaRL4zQ2b_Nbm3p5q9UlphsDI9DXV0SvhFXGO1nm-5r_4xj5Ya9MCl3fnLA5npi1x3wiE24Fm88pEFMDng3m2CM9Bu5xootSdDRa1eSj6G_Ou6CTVgWwzsqHKbmCrG1H2CjKrS4YRuP-hojJDBSVbz9s-jYdkFcqvaCehNoEg=s72-c" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-7197057535781833856</id><published>2026-03-12T09:38:00.003-03:00</published><updated>2026-03-12T10:03:01.759-03:00</updated><title type='text'>Personalizacion de Genexus Next. </title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi05tVymg7Zi3JC6EjLwcbFUxh8Y8W9QpMSTasm6R7zqMAzNqwPAT3xARThJ7vIRvIaqhwmp9DC5Dghi9GpWFhwHVzV40RKUP0BL1ipbrNZbxCpycs7VnzXivakjQPrhlJcC9YQ06crgna1OHjqwga4yHySUfMsYojgCnaQYf5lXToAfcv2hPxsLQ/s1024/GeneXus%20Next%20Brandmark.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1024&quot; height=&quot;72&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi05tVymg7Zi3JC6EjLwcbFUxh8Y8W9QpMSTasm6R7zqMAzNqwPAT3xARThJ7vIRvIaqhwmp9DC5Dghi9GpWFhwHVzV40RKUP0BL1ipbrNZbxCpycs7VnzXivakjQPrhlJcC9YQ06crgna1OHjqwga4yHySUfMsYojgCnaQYf5lXToAfcv2hPxsLQ/w72-h72/GeneXus%20Next%20Brandmark.png&quot; width=&quot;72&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Estoy haciendo algunas pruebas con &lt;a href=&quot;https://www.genexus.com/en/products/genexus/get-genexus-next&quot;&gt;Genexus Next, &lt;/a&gt;para aclimatarme y utilizar agentes de IA en codigo GeneXus.&amp;nbsp;&lt;br /&gt;Aun siento que le faltan algunos minutos de coccion como para que este pronto para ser usado en proyectos de verdad, pero esta bueno ver un poco como se avanza en el tema.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Una de las cosas que tenia que hacer es lograr conectarme a la base de datos generada, con SQL Server Management Studio y poder ver los datos y hacer algunos ajustes.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Como estoy usando Docker en windows para esta prueba, la base de datos queda dentro del contenedor que distribuyen con Genexus Next. El usuario y la password del administrador, tambien quedan no visibles.&amp;nbsp; Ya no tenemos mas el icono del ojo para ver el valor de la contraseña en el IDE.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Haciendo algo de ingenieria reversa en los docker-compose que levantan el IDE de GXNext, pude ver que dentro del archivo &lt;b&gt;app.asar &lt;/b&gt;(es un formato de archivos indexados de atom que se puede abrir con VS Code y algunos otros ) se encuentra el &lt;b&gt;config.json,&lt;/b&gt; donde estan las contraseñas y otros datos de configuracion de GeneXus Next.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No domino nada de docker, pero no entiendo como puedo levantar mi sql server local y escucha en el puerto 1433 y que GXNext levante el SQLServer en el mismo puerto, pero esa es la realidad. Entiendo que es otra red, pero no me doy cuenta como logran compartir el mismo puerto.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Para poder acceder a la base de datos, tuve que bajar mi SQLServer local (el que uso para GX18) y ahi si pude entrar con localhost,1433 al servidor sql server que usa GXNext.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Entonces los pasos fueron&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Ubicar el app.asar en el dir de instalacion de GXNext y abrir el config.json para conocer la password&lt;/li&gt;&lt;li&gt;Bajar mi SQL Server local&lt;/li&gt;&lt;li&gt;Conectarme con MSSQL Management Studio a localhost,1433 usando el usuario y password del paso 1)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Lo documento aca, por si a alguien mas le sirve, porque no lo vi en ningun lado.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/7197057535781833856/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2026/03/personalizacion-de-genexus-next.html#comment-form' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/7197057535781833856'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/7197057535781833856'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2026/03/personalizacion-de-genexus-next.html' title='Personalizacion de Genexus Next. '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi05tVymg7Zi3JC6EjLwcbFUxh8Y8W9QpMSTasm6R7zqMAzNqwPAT3xARThJ7vIRvIaqhwmp9DC5Dghi9GpWFhwHVzV40RKUP0BL1ipbrNZbxCpycs7VnzXivakjQPrhlJcC9YQ06crgna1OHjqwga4yHySUfMsYojgCnaQYf5lXToAfcv2hPxsLQ/s72-w72-h72-c/GeneXus%20Next%20Brandmark.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-8696706525017052385</id><published>2026-03-03T23:11:00.003-03:00</published><updated>2026-03-04T09:13:47.977-03:00</updated><title type='text'>Modelo Ejecutable con Markdown: Specification by Example aplicada al dominio</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjqz1SGGa7O4yojzpkpQ2tyEFfoIs6omXVw_qlL7U2DKC_bapBKR6f82iNk2G1qupcNmnHMmLenPANmkSYIX0wmKdG4Dt2EDzo9cOQQXsuuuKkpc0clVATkaf7-MqgzlkYS7043-Irod-zsUesCknys5z0l6SzktVvEYrup56iLBWBI31E1t-8T3A&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1462&quot; data-original-width=&quot;1212&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjqz1SGGa7O4yojzpkpQ2tyEFfoIs6omXVw_qlL7U2DKC_bapBKR6f82iNk2G1qupcNmnHMmLenPANmkSYIX0wmKdG4Dt2EDzo9cOQQXsuuuKkpc0clVATkaf7-MqgzlkYS7043-Irod-zsUesCknys5z0l6SzktVvEYrup56iLBWBI31E1t-8T3A&quot; width=&quot;199&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Una de las ideas más potentes de &lt;a href=&quot;https://www.amazon.com/Specification-Example-Successful-Deliver-Software/dp/1617290084&quot;&gt;Specification by Example&lt;/a&gt; es simple: las reglas del negocio no deben quedar en documentos ambiguos, sino en ejemplos concretos que puedan ejecutarse. Si bien este libro se escribio antes que&amp;nbsp; la &lt;a data-preview=&quot;&quot; href=&quot;https://www.google.com/search?ved=1t:260882&amp;amp;q=IA+generativa+impact+and+applications&amp;amp;bbid=5980598&amp;amp;bpid=8696706525017052385&quot; target=&quot;_blank&quot;&gt;IA generativa&lt;/a&gt; tuviera la visibilidad que tiene hoy, sigue teniendo mucha vigencia.&amp;nbsp;&lt;p&gt;
Si combinamos esto con un &lt;a data-preview=&quot;&quot; href=&quot;https://www.google.com/search?ved=1t:260882&amp;amp;q=define+model-driven+approach+software+development&amp;amp;bbid=5980598&amp;amp;bpid=8696706525017052385&quot; target=&quot;_blank&quot;&gt;enfoque model-driven&lt;/a&gt;, podemos ir un paso más allá:
definir el &lt;b&gt;modelo de datos, las reglas y los escenarios de aceptación en un único &lt;a data-preview=&quot;&quot; href=&quot;https://www.google.com/search?ved=1t:260882&amp;amp;q=Specification+by+Example+executable+Markdown&amp;amp;bbid=5980598&amp;amp;bpid=8696706525017052385&quot; target=&quot;_blank&quot;&gt;Markdown ejecutable&lt;/a&gt;&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
Ese archivo puede ser:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Legible por negocio&lt;/li&gt;
  &lt;li&gt;Procesable por una herramienta&lt;/li&gt;
  &lt;li&gt;Generador de código&lt;/li&gt;
  &lt;li&gt;Generador de tests automáticos&lt;/li&gt;
  &lt;li&gt;Documentación viva&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3&gt;Ejemplo: Sistema de Gestión de Pedidos&lt;/h3&gt;

&lt;h4&gt;1️⃣ Modelo de Datos&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;model:
  entities:

    - name: Cliente
      attributes:
        - { name: ClienteId, type: int, key: true }
        - { name: Nombre, type: string, required: true }
        - { name: Email, type: string }

    - name: &lt;/code&gt;Pedido&lt;code&gt;
      attributes:
        - { name: PedidoId, type: int, key: true }
        - { name: Fecha, type: date }
        - { name: &lt;a data-preview=&quot;&quot; href=&quot;https://www.google.com/search?ved=1t:260882&amp;amp;q=Pedido+states+Borrador+Confirmado+Cancelado&amp;amp;bbid=5980598&amp;amp;bpid=8696706525017052385&quot; target=&quot;_blank&quot;&gt;Estado&lt;/a&gt;, type: enum[Borrador,Confirmado,Cancelado], default: Borrador }
        - { name: ClienteId, type: int, foreignKey: Cliente }
        - { name: Total, type: decimal, derived: true }

    - name: ItemPedido
      attributes:
        - { name: ItemId, type: int, key: true }
        - { name: PedidoId, type: int, foreignKey: Pedido }
        - { name: ProductoId, type: int }
        - { name: Cantidad, type: decimal, required: true }
        - { name: PrecioUnitario, type: decimal, required: true }
        - { name: Subtotal, type: decimal, derived: true }
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;h4&gt;2️⃣ Reglas de Negocio&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;rules:

  - name: SubtotalCalculation
    entity: ItemPedido
    expression: Subtotal = Cantidad * PrecioUnitario

  - name: PedidoTotalCalculation
    entity: Pedido
    expression: Total = sum(ItemPedido.Subtotal where PedidoId = Pedido.PedidoId)

  - name: PedidoDebeTenerItems
    entity: Pedido
    validation: count(ItemPedido where PedidoId = Pedido.PedidoId) &amp;gt; 0
    error: &quot;El pedido debe tener al menos un ítem&quot;

  - name: PedidoNoPuedeConfirmarseConTotalCero
    entity: Pedido
    when: Estado changes to Confirmado
    validation: Total &amp;gt; 0
    error: &quot;El pedido no puede confirmarse con total cero&quot;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;h4&gt;3️⃣ Escenarios Ejecutables&lt;/h4&gt;

&lt;p&gt;
Estos ejemplos funcionan como &lt;a data-preview=&quot;&quot; href=&quot;https://www.google.com/search?ved=1t:260882&amp;amp;q=Specification+by+Example+acceptance+tests&amp;amp;bbid=5980598&amp;amp;bpid=8696706525017052385&quot; target=&quot;_blank&quot;&gt;tests de aceptación&lt;/a&gt;.
Si cambian las reglas y estos escenarios fallan,
sabemos que rompimos el contrato del sistema.
&lt;/p&gt;

&lt;h5&gt;Escenario: Pedido sin ítems&lt;/h5&gt;

&lt;pre&gt;&lt;code&gt;
scenario: PedidoSinItems
given:
  Pedido:
    PedidoId: 1
    Estado: Borrador

when:
  action: validar

then:
  error: &quot;El pedido debe tener al menos un ítem&quot;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;Escenario: Cálculo correcto del total&lt;/h5&gt;

&lt;pre&gt;&lt;code&gt;
scenario: CalculoTotalCorrecto
given:
  Pedido:
    PedidoId: 10
    Estado: Borrador

  ItemPedido:
    - { PedidoId: 10, Cantidad: 2, PrecioUnitario: 50 }
    - { PedidoId: 10, Cantidad: 1, PrecioUnitario: 100 }

when:
  action: calcular_total

then:
  Pedido.Total: 200&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;Escenario: Confirmación inválida&lt;/h5&gt;&lt;pre&gt;&lt;code&gt;scenario: ConfirmacionTotalCero
given:
  Pedido:
    PedidoId: 20
    Estado: Borrador

  ItemPedido:
    - { PedidoId: 20, Cantidad: 1, PrecioUnitario: 0 }

when:
  action: cambiar_estado
  Estado: Confirmado

then:
  error: &quot;El pedido no puede confirmarse con total cero&quot;
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;h3&gt;¿Por qué esto es poderoso?&lt;/h3&gt;

&lt;p&gt;Usando archivos con Markdown:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Definimos el modelo conceptual&lt;/li&gt;
  &lt;li&gt;Expresamos reglas formales&lt;/li&gt;
  &lt;li&gt;Documentamos comportamiento esperado&lt;/li&gt;
  &lt;li&gt;Generamos pruebas automáticas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
El modelo deja de ser solo diseño y pasa a ser el centro ejecutable del sistema.
&lt;/p&gt;

&lt;p&gt;
En un futuro cercano, herramientas de IA podrán, en forma consistente y correcta&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Generar/mantener la estructura de la base de datos&amp;nbsp;&lt;/li&gt;
  &lt;li&gt;Crear APIs automáticamente&amp;nbsp;&lt;/li&gt;
  &lt;li&gt;Construir UI inicial&lt;/li&gt;
  &lt;li&gt;Generar tests unitarios y de aceptacion&lt;/li&gt;
  &lt;li&gt;Validar inconsistencias&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
El código será una consecuencia del modelo que podra expresarse de varias maneras.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Al ser archivos de Markdown tambien se facilita el versionado de los mismos y se deberan contar con algun mecanismo de centralizacion (tipo &lt;a data-preview=&quot;&quot; href=&quot;https://www.google.com/search?ved=1t:260882&amp;amp;q=GIT+version+control+for+Markdown&amp;amp;bbid=5980598&amp;amp;bpid=8696706525017052385&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;)&amp;nbsp; y solucion de colisiones cuando dos personas (o dos IA) modifiquen el mismo archivo o intenten ingresar requerimientos contradicctorios.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Cada vez es mas importante conocer el problema que queremos resolver con el sistema que estamos desarrollando, para poder expresarlo y definirlo correctamente.&amp;nbsp;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3&gt;Conclusión&lt;/h3&gt;

&lt;p&gt;
Specification by Example no es solo una técnica de testing.
Es una forma de pensar el desarrollo donde los ejemplos son el contrato.
&lt;/p&gt;

&lt;p&gt;
Si esos ejemplos viven junto al modelo en Markdown ejecutable,
tenemos una base sólida para sistemas generados,
adaptables y verificables.
&lt;/p&gt;

&lt;hr /&gt;

&lt;h4&gt;&lt;br /&gt;&lt;/h4&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/8696706525017052385/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2026/03/modelo-ejecutable-con-markdown.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8696706525017052385'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8696706525017052385'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2026/03/modelo-ejecutable-con-markdown.html' title='Modelo Ejecutable con Markdown: Specification by Example aplicada al dominio'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjqz1SGGa7O4yojzpkpQ2tyEFfoIs6omXVw_qlL7U2DKC_bapBKR6f82iNk2G1qupcNmnHMmLenPANmkSYIX0wmKdG4Dt2EDzo9cOQQXsuuuKkpc0clVATkaf7-MqgzlkYS7043-Irod-zsUesCknys5z0l6SzktVvEYrup56iLBWBI31E1t-8T3A=s72-c" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-8681085204913624702</id><published>2026-02-26T08:57:00.002-03:00</published><updated>2026-02-26T16:21:16.680-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#GEAI"/><category scheme="http://www.blogger.com/atom/ns#" term="#GeneXus"/><title type='text'>Visita a Japon </title><content type='html'>&lt;p&gt;Fuimos unos de los ganadores del concurso LetsPlAI (para programar soluciones que incoroporte inteligencia artificial).&amp;nbsp;&lt;br /&gt;La aplicacion que programe es un clasificador arancelario, que ayuda a encontrar el codigo arancelario para el MERCOSUR dada una descripcion de producto.&amp;nbsp;&lt;br /&gt;Tambien funciona con una imagen de una factura de importacion, o con una imagen del producto.&amp;nbsp;&lt;br /&gt;Tiene como ventaja que personas con no tanto conocimiento tecnico de la clasificacion arancelaria pueden ser guiadas a una clasificacion correcta (o al menos mejor informada).&amp;nbsp;&lt;br /&gt;&lt;br /&gt;El premio del viaje era un viaje a Japon, y exponer la solucion ante la comunidad GeneXus de Japon.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Ya conocia algo de Japon, pero es una sociedad y una cultura que admiro muchisimo y siempre se aprenden cosas nuevas de ellos.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Cosas a destacar, y que dependen mucho de su cultura, es la limpieza, el orden, el respeto por el grupo, su comida y la seguridad. Todas cosas que dependen de la cultura y la educacion, y me provocan una sana envidia.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Dejo algunas fotos de lo que pude ver en Tokio.&amp;nbsp; Me encantaria volver en algun momento.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguUCSDwXJZ6sTWh6uOj7DYbo97idZLMBKkVROgNpS4L0ix4cqiQeE5rqW79C-0M_vdyXldV-_FPUb_XEtihRfy4xBGKbzBtdZO9YY3gPDZyfsyFjaSoqEhCvsT0FkdtMHSQ_0Wi4R1g008hf6Co4sEub5qM2SNENyMs4Ex2NhKF2Z0e0si2MU7mw/s4000/20260216_180755.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguUCSDwXJZ6sTWh6uOj7DYbo97idZLMBKkVROgNpS4L0ix4cqiQeE5rqW79C-0M_vdyXldV-_FPUb_XEtihRfy4xBGKbzBtdZO9YY3gPDZyfsyFjaSoqEhCvsT0FkdtMHSQ_0Wi4R1g008hf6Co4sEub5qM2SNENyMs4Ex2NhKF2Z0e0si2MU7mw/s320/20260216_180755.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2xkcqhAIaecCUHojRb1uwo3Q9UhxaxRIfeNyjKzTnRYuUdQG0rI1QNtaOHf3noTAHZYMlF4Mq82RsXX1QaXM6rEtpFwbTHWN7xhiHBaySu6jzR_xZapGuLTt0HcBNo6pXjPVx-YaxOghjGGshoqnuyedbvOagc2Gl4eXGiwiEW6mj8v78PnHvRg/s4000/20260215_111439.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2xkcqhAIaecCUHojRb1uwo3Q9UhxaxRIfeNyjKzTnRYuUdQG0rI1QNtaOHf3noTAHZYMlF4Mq82RsXX1QaXM6rEtpFwbTHWN7xhiHBaySu6jzR_xZapGuLTt0HcBNo6pXjPVx-YaxOghjGGshoqnuyedbvOagc2Gl4eXGiwiEW6mj8v78PnHvRg/s320/20260215_111439.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJtBDtyPwQHlOA0TXVFXewTDDHPsg3x0U907VCLjrZO1OFGhWaUBmoxrgo3w1XwD0sPQg3VtqIjAaYJlJMdyptCQlYmM2ew3vBL_pLn-tDwZxlikX89i1s-cQFsXZOwfkOIYBVTL51TvfReH7iuVPNUPR75EDqRUQwpZk5DzCSgJCf6kscKSfbiw/s4000/20260215_111452.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJtBDtyPwQHlOA0TXVFXewTDDHPsg3x0U907VCLjrZO1OFGhWaUBmoxrgo3w1XwD0sPQg3VtqIjAaYJlJMdyptCQlYmM2ew3vBL_pLn-tDwZxlikX89i1s-cQFsXZOwfkOIYBVTL51TvfReH7iuVPNUPR75EDqRUQwpZk5DzCSgJCf6kscKSfbiw/s320/20260215_111452.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyZUqEfvoxfpC47sa4dzFKYdGVtLkNQK0xK2pErsSW4avh57As4Pi_-eDaQhqlbeBfmcPbMAClJ6OaILo00DmkB2DiOq35-GW5dJoTOBQsOl8rYRAKHg9cva6axlHMscoxI8xSgL2pTTq5i-c8_4SHNaDXbeUjNUJw8nWR66X4P9Rkn6FW6Dtidw/s4000/20260215_115935.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyZUqEfvoxfpC47sa4dzFKYdGVtLkNQK0xK2pErsSW4avh57As4Pi_-eDaQhqlbeBfmcPbMAClJ6OaILo00DmkB2DiOq35-GW5dJoTOBQsOl8rYRAKHg9cva6axlHMscoxI8xSgL2pTTq5i-c8_4SHNaDXbeUjNUJw8nWR66X4P9Rkn6FW6Dtidw/s320/20260215_115935.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6Vh0Ky1kpM_4P5cltpLSv9JXyrmg_0r14yGzm5-BZRgD57yN6zkoHnc3_EktHanWtznEVwgUHn_Tuz_XKs_ve6dEHWKNEfFqPggAQWuqakm4VPXmVYjYkpcO-zwt_1Anp7i7OPSeQWYoSZPvQXNe2ptpFwwBCUsqhdSSyLjBeS92T83Fl4zq8Bg/s4000/20260215_231150.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6Vh0Ky1kpM_4P5cltpLSv9JXyrmg_0r14yGzm5-BZRgD57yN6zkoHnc3_EktHanWtznEVwgUHn_Tuz_XKs_ve6dEHWKNEfFqPggAQWuqakm4VPXmVYjYkpcO-zwt_1Anp7i7OPSeQWYoSZPvQXNe2ptpFwwBCUsqhdSSyLjBeS92T83Fl4zq8Bg/s320/20260215_231150.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjDhhbRBS4w-qqGdha5l1JGIqUUQvEphQ0C2aacbNJRyOoeoZUNQyCaZmvAp5yDLavoS-76Gta_Ftzy5Z6EI80aL1bLIWXqm66kBNrBo6k16DGPZzXhcF3YLzJIn8JN3R-xm_Ybfo67rQ1Jdv9NefwFjo7tMBEBtGSC-j4hkaLOyfNo-JY1IEnCg/s1468/IMG-20260215-WA0008(3).jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;903&quot; data-original-width=&quot;1468&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjDhhbRBS4w-qqGdha5l1JGIqUUQvEphQ0C2aacbNJRyOoeoZUNQyCaZmvAp5yDLavoS-76Gta_Ftzy5Z6EI80aL1bLIWXqm66kBNrBo6k16DGPZzXhcF3YLzJIn8JN3R-xm_Ybfo67rQ1Jdv9NefwFjo7tMBEBtGSC-j4hkaLOyfNo-JY1IEnCg/s320/IMG-20260215-WA0008(3).jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih4Lop-Is0dAWNEingyHcZSA1ORaS0FJ7HQJ3dg9KfHrRP-_VWxrc5pUrUaTJ4f-87yGpttYCu9TqpqVPLJo4pUpE5KsMO8DPAX6YLR_3jPjhOoC7ppgqwtx5hc7GqRvFDzvB4-FZ7dk8t8WCciRdQK5nmAZ7ZRjalYjG7RP9ohIq_rjPvfUaABw/s4000/20260216_102120.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih4Lop-Is0dAWNEingyHcZSA1ORaS0FJ7HQJ3dg9KfHrRP-_VWxrc5pUrUaTJ4f-87yGpttYCu9TqpqVPLJo4pUpE5KsMO8DPAX6YLR_3jPjhOoC7ppgqwtx5hc7GqRvFDzvB4-FZ7dk8t8WCciRdQK5nmAZ7ZRjalYjG7RP9ohIq_rjPvfUaABw/s320/20260216_102120.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXlUqogx7noSnTTHRzJD6B9ODSfVOX4vzd8uf6GVP8Pw7g-BjzHxuRtTWH8T6OnkS8foU29FZiSt_w_Iytio4LMxCcY5ODVk5Wg8WLkZ5XEg3fQBXgisA1g5maWfHGit-D5OBip0dSXEFCXce3sBFlo3IHzWmah4acPDrOuPQnIrHiwzppbZo9w/s4000/20260216_101217.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXlUqogx7noSnTTHRzJD6B9ODSfVOX4vzd8uf6GVP8Pw7g-BjzHxuRtTWH8T6OnkS8foU29FZiSt_w_Iytio4LMxCcY5ODVk5Wg8WLkZ5XEg3fQBXgisA1g5maWfHGit-D5OBip0dSXEFCXce3sBFlo3IHzWmah4acPDrOuPQnIrHiwzppbZo9w/s320/20260216_101217.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPkRyDyrUQt_Pl_hSw6_DxXf0yOibIZluyg4IfGFh8TuSzbDgHUX9MzYrvhS44iDK7l7xWKO-Hugf0ukzqxAISScL5HRrcVHS8Mc0KpSOoAc-DaxWSsgpBuUW9s6ld_v8i5VR_Z7XtU613zITzt317g3cdJjF3fDuWcWUc4E_2FzGhhMaAVsTxRg/s4000/20260216_172027.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPkRyDyrUQt_Pl_hSw6_DxXf0yOibIZluyg4IfGFh8TuSzbDgHUX9MzYrvhS44iDK7l7xWKO-Hugf0ukzqxAISScL5HRrcVHS8Mc0KpSOoAc-DaxWSsgpBuUW9s6ld_v8i5VR_Z7XtU613zITzt317g3cdJjF3fDuWcWUc4E_2FzGhhMaAVsTxRg/s320/20260216_172027.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAOmUj0oCXMkdgrzVpptz6FO6XBE082F6eBeMPLukelpe9Nm6eBqgJb1PR2d9eIEKkPC-ySm87vbIbBDfiQrxc279iBioc9BkoddSQZroujgEozA1Ml2IRps9YnLmFQZDae2Pd6jlbk4ImEbU-2v3PAqMyBcYxYUCeHW19k8WHy_mwb8jpT1l9oQ/s4000/20260216_174005.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAOmUj0oCXMkdgrzVpptz6FO6XBE082F6eBeMPLukelpe9Nm6eBqgJb1PR2d9eIEKkPC-ySm87vbIbBDfiQrxc279iBioc9BkoddSQZroujgEozA1Ml2IRps9YnLmFQZDae2Pd6jlbk4ImEbU-2v3PAqMyBcYxYUCeHW19k8WHy_mwb8jpT1l9oQ/s4000/20260216_174005.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguUCSDwXJZ6sTWh6uOj7DYbo97idZLMBKkVROgNpS4L0ix4cqiQeE5rqW79C-0M_vdyXldV-_FPUb_XEtihRfy4xBGKbzBtdZO9YY3gPDZyfsyFjaSoqEhCvsT0FkdtMHSQ_0Wi4R1g008hf6Co4sEub5qM2SNENyMs4Ex2NhKF2Z0e0si2MU7mw/s4000/20260216_180755.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAOmUj0oCXMkdgrzVpptz6FO6XBE082F6eBeMPLukelpe9Nm6eBqgJb1PR2d9eIEKkPC-ySm87vbIbBDfiQrxc279iBioc9BkoddSQZroujgEozA1Ml2IRps9YnLmFQZDae2Pd6jlbk4ImEbU-2v3PAqMyBcYxYUCeHW19k8WHy_mwb8jpT1l9oQ/s320/20260216_174005.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQsgSA_ebf0r5JzSIkUQvBQpVLVASscyVNKD395T-i6uYvfrSJds0YxlNekROO3-dzgjgC1OEsRRG6WOosAm06lyvYCsgYYYfVhoQEPpgQyzZAbMTP5A_Q-J3_AcMUDiPG3V8-NgujFZlZ3YH2TrV4aeTdmok0mWjyBxZD8Ew0tZlmNKNmCdS-IA/s4000/20260216_175406.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4000&quot; data-original-width=&quot;1848&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQsgSA_ebf0r5JzSIkUQvBQpVLVASscyVNKD395T-i6uYvfrSJds0YxlNekROO3-dzgjgC1OEsRRG6WOosAm06lyvYCsgYYYfVhoQEPpgQyzZAbMTP5A_Q-J3_AcMUDiPG3V8-NgujFZlZ3YH2TrV4aeTdmok0mWjyBxZD8Ew0tZlmNKNmCdS-IA/s320/20260216_175406.jpg&quot; width=&quot;148&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFuk7qYYZHztIXDfn47pFKMwdmiI3aCUlh6YfgFB2-CAwYe6mph6JSu4YSsBJtizpJKupOk2gLpwoNafAEaB92_GpMFdb1JzRR_SWx3PA28X26c-oc7hJTxTp8oyETDZrZ_9_QQ3Naifk-7sZ4SgzWUeffaCeGfmDVmKnb8ty3Lus7TwgCj4hB1w/s4000/20260217_103203.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFuk7qYYZHztIXDfn47pFKMwdmiI3aCUlh6YfgFB2-CAwYe6mph6JSu4YSsBJtizpJKupOk2gLpwoNafAEaB92_GpMFdb1JzRR_SWx3PA28X26c-oc7hJTxTp8oyETDZrZ_9_QQ3Naifk-7sZ4SgzWUeffaCeGfmDVmKnb8ty3Lus7TwgCj4hB1w/s320/20260217_103203.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL7ZhRzWhPAqKXZGofza86pZy2M9LRVt6nKcWSS93X2FN8zy6fCWW3XsfvICtHPdevFxPfQzT2MvHShrV_7MPgbEzu7dV6sgIe9vkEu88hFePY6H7RRUEwyw8noRSFRTzrlUBB6EMl-IFbG3xUni_m9mzpp8ddSMZMw2OZZEWSMLIj2dxf9TJNuQ/s4000/20260217_101549.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL7ZhRzWhPAqKXZGofza86pZy2M9LRVt6nKcWSS93X2FN8zy6fCWW3XsfvICtHPdevFxPfQzT2MvHShrV_7MPgbEzu7dV6sgIe9vkEu88hFePY6H7RRUEwyw8noRSFRTzrlUBB6EMl-IFbG3xUni_m9mzpp8ddSMZMw2OZZEWSMLIj2dxf9TJNuQ/s320/20260217_101549.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ogyonS8FhudMFhXztKSm50xIX5hyphenhyphen6fFIeMFne7Nqhdsv8SEUB26aBj622ghtkejtEJcHNOvVPq2eZHoXRhEzJRCTCGDN9zGY2sxy8_-t0EL1d-hj1iINHcbvWLfEiAQ7GqqO_0Pqk-aOtgb6kKZ1FiMr9nUhm0hvil9fV_yCvkoYO0f7WTLhQw/s4000/20260217_152451.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ogyonS8FhudMFhXztKSm50xIX5hyphenhyphen6fFIeMFne7Nqhdsv8SEUB26aBj622ghtkejtEJcHNOvVPq2eZHoXRhEzJRCTCGDN9zGY2sxy8_-t0EL1d-hj1iINHcbvWLfEiAQ7GqqO_0Pqk-aOtgb6kKZ1FiMr9nUhm0hvil9fV_yCvkoYO0f7WTLhQw/s320/20260217_152451.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS90C6OuBJCwhhTjUrqpPnLhjrJwGbUPqa6ScZtLNSlUOCvJbMU2NnSzzBHAu-d17xz4FuMYAH1ASI09Y-f5aTeLNwLccosRUm1z83l-XFXdMR3x0SlTR7kR586HmHvqawpudoiUQaFrMDy20FEn8kUMJL8IeR_cioQQpGBvu6f3iKcUqbjAQ-rA/s2048/IMG-20260217-WA0012.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1276&quot; data-original-width=&quot;2048&quot; height=&quot;199&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS90C6OuBJCwhhTjUrqpPnLhjrJwGbUPqa6ScZtLNSlUOCvJbMU2NnSzzBHAu-d17xz4FuMYAH1ASI09Y-f5aTeLNwLccosRUm1z83l-XFXdMR3x0SlTR7kR586HmHvqawpudoiUQaFrMDy20FEn8kUMJL8IeR_cioQQpGBvu6f3iKcUqbjAQ-rA/s320/IMG-20260217-WA0012.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhetmY-RhyzHh5Zq0ZSQ8xg1qBLvW6EsnUQFql3S_P8Vts2XguB5WQa9qcy0AviwPMEiP0WCdt_EjUKoEzul8Bw4eUKRnh2bzbeFiDNFPZ8PTPHnC5u80qHC1yCAgtvTOTamJuWSbUktSguF9HDSAlEIJVy1oKKdc05ePuRyxAxZ5K156K_hF43lA/s4000/20260218_133358.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhetmY-RhyzHh5Zq0ZSQ8xg1qBLvW6EsnUQFql3S_P8Vts2XguB5WQa9qcy0AviwPMEiP0WCdt_EjUKoEzul8Bw4eUKRnh2bzbeFiDNFPZ8PTPHnC5u80qHC1yCAgtvTOTamJuWSbUktSguF9HDSAlEIJVy1oKKdc05ePuRyxAxZ5K156K_hF43lA/s320/20260218_133358.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOXTs2dL54P-G0VE2XBhimUomqUQP-i2_fNd9uPGArJDn7XA73-C6NLTUfK_OrvdyJzlQ_QXg5-cVu3nU8H5kjmMgcJ0yonSNpa79oQftbkxA93zBIBZPGj48ewKCEmCMyok9vaJd5AM_0ZfJHHUbEjYocoNwvW2UNCRB6JeDXVhjHTlkWWY34eQ/s4000/20260218_123203.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOXTs2dL54P-G0VE2XBhimUomqUQP-i2_fNd9uPGArJDn7XA73-C6NLTUfK_OrvdyJzlQ_QXg5-cVu3nU8H5kjmMgcJ0yonSNpa79oQftbkxA93zBIBZPGj48ewKCEmCMyok9vaJd5AM_0ZfJHHUbEjYocoNwvW2UNCRB6JeDXVhjHTlkWWY34eQ/s320/20260218_123203.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGOD8iJJoT90s7u9Iek9bnYkEOd3b8LVAYI0hWhtfrH0rItWZxHuygReJTdJHHwWVPerdo7OjM3QeSlzWHcxcSPJRd8geQzUGjDxgqiXJQLx32EH4R9vMGJ0A2zcO-rTlcF1I03ty9zDxAOwPuWmLUi7yFGoju0Kys0pIJ7zqvBzZ5wJ3aC_U4Vw/s4000/20260218_154027.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGOD8iJJoT90s7u9Iek9bnYkEOd3b8LVAYI0hWhtfrH0rItWZxHuygReJTdJHHwWVPerdo7OjM3QeSlzWHcxcSPJRd8geQzUGjDxgqiXJQLx32EH4R9vMGJ0A2zcO-rTlcF1I03ty9zDxAOwPuWmLUi7yFGoju0Kys0pIJ7zqvBzZ5wJ3aC_U4Vw/s320/20260218_154027.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvQIpZgONnz1oPeB_Ah-tH06SLDIhWYhEArFfpmSsl2OkV1E-4CMtwuADB_kdc97wxE1IUYImFTuhWy9f0-xM9mWafIkeDJ_izZ7NmV4QZks16NEknPXKUhQeAjVOkLzsmT5SYQs80AUa-vTgxGfAT9ol7yXqhjZz1BObFB4W8ZK4Dkk5dRxazVQ/s4000/20260218_154117.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvQIpZgONnz1oPeB_Ah-tH06SLDIhWYhEArFfpmSsl2OkV1E-4CMtwuADB_kdc97wxE1IUYImFTuhWy9f0-xM9mWafIkeDJ_izZ7NmV4QZks16NEknPXKUhQeAjVOkLzsmT5SYQs80AUa-vTgxGfAT9ol7yXqhjZz1BObFB4W8ZK4Dkk5dRxazVQ/s320/20260218_154117.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0CxFcitDa10-kT7x3JGqT4dvv3wmr9_3gxk0fmxkQ4tFUgmHyIbgL_fqR2o0WwvoS-l1XBjPBN-PSh_Ypc7s_Y1m_chdEz8FOLfoKpjLo8pCJLRVwrwx9yFnSEpSpBG1zcCes4DJ67w9zb4IQqCBz2A4xp0_6-BZBxkJqun7dIZZyib065IG07Q/s4000/20260218_154043.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0CxFcitDa10-kT7x3JGqT4dvv3wmr9_3gxk0fmxkQ4tFUgmHyIbgL_fqR2o0WwvoS-l1XBjPBN-PSh_Ypc7s_Y1m_chdEz8FOLfoKpjLo8pCJLRVwrwx9yFnSEpSpBG1zcCes4DJ67w9zb4IQqCBz2A4xp0_6-BZBxkJqun7dIZZyib065IG07Q/s320/20260218_154043.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnw3ZKgyiNXgbiqtwsfT1-axPyag8_Z-mZ3HSfWyezLdAOqW_f_Zx-q6TCwrGRzi2W4MoSwX9tIL-6zUEo0C9uf9WI3V1dGJn-W20BGhU8CzpaDPMFjojPQhcK_ZAoyLfI-ddxz3iJ5o5Avm8VkOzs2pVw35lrj4tMTbpUmy5heTbFn3TU-Amfg/s4000/20260218_195219.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnw3ZKgyiNXgbiqtwsfT1-axPyag8_Z-mZ3HSfWyezLdAOqW_f_Zx-q6TCwrGRzi2W4MoSwX9tIL-6zUEo0C9uf9WI3V1dGJn-W20BGhU8CzpaDPMFjojPQhcK_ZAoyLfI-ddxz3iJ5o5Avm8VkOzs2pVw35lrj4tMTbpUmy5heTbFn3TU-Amfg/s320/20260218_195219.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZQqoarvK1BOHY4BRfnWqkBO6QmT3H8IJPpp8IWgBUrIrU-EpKh_nbSAZ0x5YOLfp4H_acxL1M0szrXloMuDUoTHAG2xqqtsJGGm4VLS3ceo9p2dCA__iaOJc9UNbN5hjwrCdrEuf3DPDfiguHvj78YxTWddIupDn4hKy5-lI_HlmOgYquRQm8LQ/s1600/IMG-20260219-WA0021.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZQqoarvK1BOHY4BRfnWqkBO6QmT3H8IJPpp8IWgBUrIrU-EpKh_nbSAZ0x5YOLfp4H_acxL1M0szrXloMuDUoTHAG2xqqtsJGGm4VLS3ceo9p2dCA__iaOJc9UNbN5hjwrCdrEuf3DPDfiguHvj78YxTWddIupDn4hKy5-lI_HlmOgYquRQm8LQ/s320/IMG-20260219-WA0021.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZkRBp2x00UntNUSSiH9_fPOL3O7dSTXkowEPsYEaWhYKvWgjom-ffm7VrEsn5_hDHKi8mfZj497wFVsy6kFADZTb_DUU_mA9L_iV1PBVVECoa0FgDdJL6Vbkr3VTAwlksoSskibY4QgVRAVKpQ0QQOwofrDMwIJk_8K_EgfxQciQMIoXcOFJ87Q/s1600/IMG-20260219-WA0020.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZkRBp2x00UntNUSSiH9_fPOL3O7dSTXkowEPsYEaWhYKvWgjom-ffm7VrEsn5_hDHKi8mfZj497wFVsy6kFADZTb_DUU_mA9L_iV1PBVVECoa0FgDdJL6Vbkr3VTAwlksoSskibY4QgVRAVKpQ0QQOwofrDMwIJk_8K_EgfxQciQMIoXcOFJ87Q/s320/IMG-20260219-WA0020.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXVFZysIrGvzSFuZ9WkiEbjj_8Ghdxh9d90YUa1BKKfoIWux9V7DV2LOGR3hafu1DKy6gaAhwEUWIRYClprGIZbX7wCxgfRMUnDcvNZ2smuu75izE29ZfxgrTyvc2clK3H96jl7BDTmMT7VEYaMAkxlIOXfpzDmOEWQ0CQwOXkJN1k5k0c1Gpspw/s2048/IMG-20260219-WA0035(1).jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;1536&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXVFZysIrGvzSFuZ9WkiEbjj_8Ghdxh9d90YUa1BKKfoIWux9V7DV2LOGR3hafu1DKy6gaAhwEUWIRYClprGIZbX7wCxgfRMUnDcvNZ2smuu75izE29ZfxgrTyvc2clK3H96jl7BDTmMT7VEYaMAkxlIOXfpzDmOEWQ0CQwOXkJN1k5k0c1Gpspw/s320/IMG-20260219-WA0035(1).jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglY3Uo45Qnds0Nhnh1QtAUEPqZschyphenhyphenW0Ez3VTcj4QdM29BtDq83SWfB-5x-5kTlRY0Nw6DkfU__DIl-CQC8kYN_BBROb9XGwKBvRfQ891PE61F6_4PiuXmrYfI_i_40boQbpTeKT86qIhUl3e8SVtJI2uPh39PGVpOINHb0v2L9MHzdItcur9ukQ/s1600/IMG-20260221-WA0002.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglY3Uo45Qnds0Nhnh1QtAUEPqZschyphenhyphenW0Ez3VTcj4QdM29BtDq83SWfB-5x-5kTlRY0Nw6DkfU__DIl-CQC8kYN_BBROb9XGwKBvRfQ891PE61F6_4PiuXmrYfI_i_40boQbpTeKT86qIhUl3e8SVtJI2uPh39PGVpOINHb0v2L9MHzdItcur9ukQ/s320/IMG-20260221-WA0002.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYKRCGkilb4_HSbtHcnJuog_Zm00snFpE7TQk2BvTnXcqrOEnC9PDJHUM_6WJuTS7rWkLPqXGCeaMjEOEsGt6GzJRSMs02ccIaJUiOpQ2yFVsTzmn02gWJ7xruXFNsKSSFb5oB2qUfLETJzLRJhz_h0T6FQ4iIqYk91TIM4MIHOEF6XXsJDzJIgA/s4000/20260219_210652.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYKRCGkilb4_HSbtHcnJuog_Zm00snFpE7TQk2BvTnXcqrOEnC9PDJHUM_6WJuTS7rWkLPqXGCeaMjEOEsGt6GzJRSMs02ccIaJUiOpQ2yFVsTzmn02gWJ7xruXFNsKSSFb5oB2qUfLETJzLRJhz_h0T6FQ4iIqYk91TIM4MIHOEF6XXsJDzJIgA/s320/20260219_210652.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1sZl_dR_zGayuzWjdjupV1NyMRQIx-5ZW0ckJ7EKKKZoB8w-XTexfPJ4UtPcImk8gApPO0Oct-6N_TyCoQkUgjjrl9mCYvgUynhmoqPN3uPEDsda4I2H5GSH52GiH0QtZuU6vN08QR7DjPfkuO2qAEQ3_ypQR1myLaJ0i6CC04CZZVKcIhPz55g/s4000/20260218_154025.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1sZl_dR_zGayuzWjdjupV1NyMRQIx-5ZW0ckJ7EKKKZoB8w-XTexfPJ4UtPcImk8gApPO0Oct-6N_TyCoQkUgjjrl9mCYvgUynhmoqPN3uPEDsda4I2H5GSH52GiH0QtZuU6vN08QR7DjPfkuO2qAEQ3_ypQR1myLaJ0i6CC04CZZVKcIhPz55g/s320/20260218_154025.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC2SXG6yMlcwmCYYUKDJZS9oaUWzBVEIU9rt0wIjL0HjKMSKEBTeiqflaGVfAVyXwMKk1ILkktnnScv9dcEP4XJb_g96rspxtTRgiY7_GTe_7YeH2GutF504kTvIb1BZUc-h41i7GMAIIFh1K4Mki0kIVDiYTGWuw3zGx8Q-sooLFnyLVPVHzF3Q/s4000/20260218_133441.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC2SXG6yMlcwmCYYUKDJZS9oaUWzBVEIU9rt0wIjL0HjKMSKEBTeiqflaGVfAVyXwMKk1ILkktnnScv9dcEP4XJb_g96rspxtTRgiY7_GTe_7YeH2GutF504kTvIb1BZUc-h41i7GMAIIFh1K4Mki0kIVDiYTGWuw3zGx8Q-sooLFnyLVPVHzF3Q/s320/20260218_133441.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLcgWF7tn7e3opPwKP62Xy047L3y-GaBOuCaMyoEakZUGeIAGhvAj_irxMKgpcjzRAQh_1Rswu9xmFoeGwvxFJJQTW3rtB8xh_S97f4AUQZQLyelRFexAm8-YMViwdKmTsFmGOrbNPegyxjU6bPV_ViQkl-kVlk2PVPknqYgoi0TLkR3x48gStw/s4000/20260218_133033.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4000&quot; data-original-width=&quot;1848&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLcgWF7tn7e3opPwKP62Xy047L3y-GaBOuCaMyoEakZUGeIAGhvAj_irxMKgpcjzRAQh_1Rswu9xmFoeGwvxFJJQTW3rtB8xh_S97f4AUQZQLyelRFexAm8-YMViwdKmTsFmGOrbNPegyxjU6bPV_ViQkl-kVlk2PVPknqYgoi0TLkR3x48gStw/s320/20260218_133033.jpg&quot; width=&quot;148&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx1MF30omNOObNIUsEnAbZvQQ9QeWpt39AEFxVoSvahag97ld37c7yDXH56NjCSUOObU575MY576iD1qaJdNlXZ8CCFXMytXseoXIbrlfp_8oUGay4y6gLDaVIx_YC_bJmLV0Htnbsf1mQHxWFDGYWJvoupJE4VOhW_RmJhbyg9Cr4tdy6nhAVAw/s4000/20260218_113858.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4000&quot; data-original-width=&quot;1848&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx1MF30omNOObNIUsEnAbZvQQ9QeWpt39AEFxVoSvahag97ld37c7yDXH56NjCSUOObU575MY576iD1qaJdNlXZ8CCFXMytXseoXIbrlfp_8oUGay4y6gLDaVIx_YC_bJmLV0Htnbsf1mQHxWFDGYWJvoupJE4VOhW_RmJhbyg9Cr4tdy6nhAVAw/s320/20260218_113858.jpg&quot; width=&quot;148&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidahfxTAvshz9neJnWkUnbTKLMQMCNckLLSSpKC9r5Vf9PBmtVsk3BMPm8Six6LHcLsEmYB01sh_iZoEcYV5pn5rG8fvg7162Wskxh_uMCbAaXF0XQMmm3E3qhas8-GwJbDlASXZNr5ux4foKPmdt8f6uIcFC9nm3UXaMF5WCcIHazWfQGJS8S6w/s4000/20260217_112046.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4000&quot; data-original-width=&quot;1848&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidahfxTAvshz9neJnWkUnbTKLMQMCNckLLSSpKC9r5Vf9PBmtVsk3BMPm8Six6LHcLsEmYB01sh_iZoEcYV5pn5rG8fvg7162Wskxh_uMCbAaXF0XQMmm3E3qhas8-GwJbDlASXZNr5ux4foKPmdt8f6uIcFC9nm3UXaMF5WCcIHazWfQGJS8S6w/s320/20260217_112046.jpg&quot; width=&quot;148&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiepRoy_-vP1JudJhNw31c7rmH_p6otZgcq6HNQFN61JbyGgv0j07AyS7B4WwlYNP5vTkcUGQDn8Z9sUD_ii_EU2AeL3DXtvLCB0XXneWEwYWCNq7N9-lz250ttSK_-EV9q0A_JnIzLMvEWYe9JQ8LgAjbfZZ04wlE_ft2LhXVCc1iznTSl5D73Eg/s4000/20260217_105134.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiepRoy_-vP1JudJhNw31c7rmH_p6otZgcq6HNQFN61JbyGgv0j07AyS7B4WwlYNP5vTkcUGQDn8Z9sUD_ii_EU2AeL3DXtvLCB0XXneWEwYWCNq7N9-lz250ttSK_-EV9q0A_JnIzLMvEWYe9JQ8LgAjbfZZ04wlE_ft2LhXVCc1iznTSl5D73Eg/s320/20260217_105134.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimkahQKZIMUBZOb5r2VXeCSnNWeIULGqwTODzxRFc7RU3G4tzpqjlGFceCZ8aMeHULs_ei3jXkyAC4K_-Yp4OsKWdIZqbM9v-msijOG_oKM6Pm0HmNJISRsjirn9iiHNaZ1ngy-kzAemhl_oHiO_PMkorZhijsmEeVav5NkqPvGc_VytEAwYcOqg/s4000/20260217_101440.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimkahQKZIMUBZOb5r2VXeCSnNWeIULGqwTODzxRFc7RU3G4tzpqjlGFceCZ8aMeHULs_ei3jXkyAC4K_-Yp4OsKWdIZqbM9v-msijOG_oKM6Pm0HmNJISRsjirn9iiHNaZ1ngy-kzAemhl_oHiO_PMkorZhijsmEeVav5NkqPvGc_VytEAwYcOqg/s320/20260217_101440.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqDs-P2JzRBoxWRs6m-h09d1OKOC0gqlhbp6LNMIOFUkzP135m8DQdWNhDQgweOWIBvcVxdKMBsxbNNIsVmzO_7NLjC3PlMQk6S9uTjd0wXn9iK7wbJ2Qb3p-kTbLJ12p81xRL9cTkC9OZ6oISfcfPeB6CSCcNnfGEewu0A2oEAkNbfhsIOMaUvg/s4000/20260216_100944.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4000&quot; data-original-width=&quot;1848&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqDs-P2JzRBoxWRs6m-h09d1OKOC0gqlhbp6LNMIOFUkzP135m8DQdWNhDQgweOWIBvcVxdKMBsxbNNIsVmzO_7NLjC3PlMQk6S9uTjd0wXn9iK7wbJ2Qb3p-kTbLJ12p81xRL9cTkC9OZ6oISfcfPeB6CSCcNnfGEewu0A2oEAkNbfhsIOMaUvg/s320/20260216_100944.jpg&quot; width=&quot;148&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd2W0wu_aw1F7HL6oFjv2ToS8XximS-tDLzgb7qRXhpoWc9NT0gQ7JxhAOe3jRaKQPO8_ukittuYb0RUYKoYwX-nJymBzhe1FbFQoV5-DDBCKEgOb60wlgP0H48CPMmjlH5f5gOU4ZQ-igI3HA4o6OEVInRPqv0w7oj5PyW1RvnFuceJRLOa04zA/s4000/20260216_192024.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1848&quot; data-original-width=&quot;4000&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd2W0wu_aw1F7HL6oFjv2ToS8XximS-tDLzgb7qRXhpoWc9NT0gQ7JxhAOe3jRaKQPO8_ukittuYb0RUYKoYwX-nJymBzhe1FbFQoV5-DDBCKEgOb60wlgP0H48CPMmjlH5f5gOU4ZQ-igI3HA4o6OEVInRPqv0w7oj5PyW1RvnFuceJRLOa04zA/s320/20260216_192024.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTMSvLmYCsRRY6i5BmhksHWctXmJEfrVt4rbyzdOYFxxkdi5CEWuE9FhPPVylB_cMfmB9nPz_SmJ9xlj7E1yMTmCJtnxssZ1fJGj_WWx4SaEBnv_HtksvEqRNyjmjvMrHRlIAQd_8EuLHbp8Pq0MrmkjNuS8Q3dhGSW5eckML-RHGLk_wKMCp5oA/s5264/IMG-20260224-WA0000.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2784&quot; data-original-width=&quot;5264&quot; height=&quot;169&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTMSvLmYCsRRY6i5BmhksHWctXmJEfrVt4rbyzdOYFxxkdi5CEWuE9FhPPVylB_cMfmB9nPz_SmJ9xlj7E1yMTmCJtnxssZ1fJGj_WWx4SaEBnv_HtksvEqRNyjmjvMrHRlIAQd_8EuLHbp8Pq0MrmkjNuS8Q3dhGSW5eckML-RHGLk_wKMCp5oA/s320/IMG-20260224-WA0000.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/8681085204913624702/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2026/02/visita-japon.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8681085204913624702'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8681085204913624702'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2026/02/visita-japon.html' title='Visita a Japon '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguUCSDwXJZ6sTWh6uOj7DYbo97idZLMBKkVROgNpS4L0ix4cqiQeE5rqW79C-0M_vdyXldV-_FPUb_XEtihRfy4xBGKbzBtdZO9YY3gPDZyfsyFjaSoqEhCvsT0FkdtMHSQ_0Wi4R1g008hf6Co4sEub5qM2SNENyMs4Ex2NhKF2Z0e0si2MU7mw/s72-c/20260216_180755.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-5754128312596053771</id><published>2026-01-02T08:22:00.001-03:00</published><updated>2026-01-02T08:22:32.459-03:00</updated><title type='text'>Webinar: Clasificacion Arancelaria asistida con Inteligencia Artificial</title><content type='html'>&lt;p&gt;&amp;nbsp;Me invitaron a contar la experiencia de desarrollar CLARA v2.0, que es un clasificador arancelario, usando agentes de inteligencia artificial, usando Globant Enterprise IA.&amp;nbsp;&lt;br /&gt;Fue uno de los ganadores del concurso LETSPLAI y por eso nos ganamos un viaje a Japón.&amp;nbsp;&lt;br /&gt;El video de la charla se puede ver en youtube.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/6a42GwiNz28&quot; width=&quot;320&quot; youtube-src-id=&quot;6a42GwiNz28&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/5754128312596053771/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2026/01/webinar-clasificacion-arancelaria.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5754128312596053771'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5754128312596053771'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2026/01/webinar-clasificacion-arancelaria.html' title='Webinar: Clasificacion Arancelaria asistida con Inteligencia Artificial'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/6a42GwiNz28/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-8843738906245640570</id><published>2025-11-05T15:39:00.004-03:00</published><updated>2025-11-05T16:40:27.511-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Genexus"/><category scheme="http://www.blogger.com/atom/ns#" term="Migracion"/><title type='text'>Cambiar el valor default de una propiedad en una KB GeneXus</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhZ42dRtgZobf44XgoL7e6vHqMZW0Spbil-b9zu6GmhTsu56zXffeF96mCP8t38x3PDWygx-TlT1ZSKr__0QevQlQ7PyqTfg4wSGv-KbrUiSp3uI17BMSN-rFSmU_4dm3POPf0mXIwlrsgzZdFTcG6w2fl8dIEvaRRo0fyi9-5GkqS4ChtXa5BkYw&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;909&quot; data-original-width=&quot;1403&quot; height=&quot;207&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhZ42dRtgZobf44XgoL7e6vHqMZW0Spbil-b9zu6GmhTsu56zXffeF96mCP8t38x3PDWygx-TlT1ZSKr__0QevQlQ7PyqTfg4wSGv-KbrUiSp3uI17BMSN-rFSmU_4dm3POPf0mXIwlrsgzZdFTcG6w2fl8dIEvaRRo0fyi9-5GkqS4ChtXa5BkYw&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;En GeneXus, las propiedades de los objetos tienen un comportamiento jerárquico: pueden definirse a distintos niveles (KB, Version, Environment, Generator, Folder, Object, etc.), y los valores definidos en niveles superiores se heredan como &lt;em data-end=&quot;427&quot; data-start=&quot;418&quot;&gt;default&lt;/em&gt; por los niveles inferiores.&lt;p&gt;&lt;/p&gt;
&lt;p data-end=&quot;724&quot; data-start=&quot;457&quot;&gt;Este modelo facilita la consistencia general del desarrollo, pero plantea un desafío cuando queremos &lt;strong data-end=&quot;590&quot; data-start=&quot;558&quot;&gt;cambiar el valor por defecto&lt;/strong&gt; de una propiedad en toda la Knowledge Base (KB).&lt;br data-end=&quot;642&quot; data-start=&quot;639&quot; /&gt;
Ese cambio puede tener un impacto masivo, afectando a miles de objetos en cascada.&lt;/p&gt;
&lt;hr data-end=&quot;729&quot; data-start=&quot;726&quot; /&gt;
&lt;h3 data-end=&quot;772&quot; data-start=&quot;731&quot;&gt;Un ejemplo concreto: &lt;em data-end=&quot;772&quot; data-start=&quot;756&quot;&gt;Commit on Exit&lt;/em&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1036&quot; data-start=&quot;774&quot;&gt;Supongamos que tenemos la propiedad &lt;strong data-end=&quot;828&quot; data-start=&quot;810&quot;&gt;Commit on Exit&lt;/strong&gt; configurada en &lt;code data-end=&quot;849&quot; data-start=&quot;844&quot;&gt;YES&lt;/code&gt; a nivel del &lt;em data-end=&quot;875&quot; data-start=&quot;862&quot;&gt;Environment&lt;/em&gt;.&lt;br data-end=&quot;879&quot; data-start=&quot;876&quot; /&gt;
Esto significa que todos los objetos que no tengan un valor explícito heredan ese comportamiento y realizan un &lt;em data-end=&quot;998&quot; data-start=&quot;990&quot;&gt;commit&lt;/em&gt; automático al finalizar la ejecución.&lt;/p&gt;
&lt;p data-end=&quot;1245&quot; data-start=&quot;1038&quot;&gt;Ahora imaginemos que queremos modificar esta configuración para que &lt;strong data-end=&quot;1183&quot; data-start=&quot;1106&quot;&gt;cada desarrollador maneje manualmente las UTL (Unit of Transaction Logic)&lt;/strong&gt;, y por tanto necesitamos cambiar el valor por defecto a &lt;code data-end=&quot;1244&quot; data-start=&quot;1240&quot;&gt;NO&lt;/code&gt;.&lt;/p&gt;
&lt;ul data-end=&quot;1463&quot; data-start=&quot;1247&quot;&gt;
&lt;li data-end=&quot;1463&quot; data-start=&quot;1247&quot;&gt;
&lt;p data-end=&quot;1463&quot; data-start=&quot;1249&quot;&gt;Si hacemos el cambio directamente a nivel de &lt;em data-end=&quot;1307&quot; data-start=&quot;1294&quot;&gt;Environment&lt;/em&gt;, &lt;strong data-end=&quot;1398&quot; data-start=&quot;1309&quot;&gt;todos los objetos que usan el valor por defecto pasarán a tener &lt;code data-end=&quot;1396&quot; data-start=&quot;1375&quot;&gt;Commit on Exit = NO&lt;/code&gt;&lt;/strong&gt;.&lt;br data-end=&quot;1402&quot; data-start=&quot;1399&quot; /&gt;
En este caso, el cambio es global, instantáneo y coherente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1468&quot; data-start=&quot;1465&quot; /&gt;
&lt;h3 data-end=&quot;1509&quot; data-start=&quot;1470&quot;&gt;Cuando el cambio debe ser paulatino&lt;/h3&gt;
&lt;p data-end=&quot;1609&quot; data-start=&quot;1511&quot;&gt;El problema aparece cuando el cambio &lt;strong data-end=&quot;1595&quot; data-start=&quot;1548&quot;&gt;no puede hacerse de forma total e inmediata&lt;/strong&gt;, por ejemplo:&lt;/p&gt;
&lt;ul data-end=&quot;1787&quot; data-start=&quot;1610&quot;&gt;
&lt;li data-end=&quot;1676&quot; data-start=&quot;1610&quot;&gt;
&lt;p data-end=&quot;1676&quot; data-start=&quot;1612&quot;&gt;Queremos que los objetos nuevos adopten el nuevo valor (&lt;code data-end=&quot;1672&quot; data-start=&quot;1668&quot;&gt;NO&lt;/code&gt;),&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1787&quot; data-start=&quot;1677&quot;&gt;
&lt;p data-end=&quot;1787&quot; data-start=&quot;1679&quot;&gt;pero mantener los objetos existentes con el valor anterior (&lt;code data-end=&quot;1744&quot; data-start=&quot;1739&quot;&gt;YES&lt;/code&gt;) hasta que puedan ser revisados uno a uno.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2050&quot; data-start=&quot;1789&quot;&gt;En este escenario, la herencia jerárquica deja de ser suficiente.&lt;br data-end=&quot;1857&quot; data-start=&quot;1854&quot; /&gt;
Necesitamos &lt;strong data-end=&quot;1891&quot; data-start=&quot;1869&quot;&gt;romper la herencia&lt;/strong&gt; en los objetos existentes (es decir, establecer explícitamente &lt;code data-end=&quot;1977&quot; data-start=&quot;1955&quot;&gt;Commit on Exit = YES&lt;/code&gt; en cada uno) antes de cambiar el valor por defecto en el nivel superior.&lt;/p&gt;
&lt;p data-end=&quot;2067&quot; data-start=&quot;2052&quot;&gt;De esta manera:&lt;/p&gt;
&lt;ol data-end=&quot;2238&quot; data-start=&quot;2068&quot;&gt;
&lt;li data-end=&quot;2145&quot; data-start=&quot;2068&quot;&gt;
&lt;p data-end=&quot;2145&quot; data-start=&quot;2071&quot;&gt;Los objetos existentes quedan con su comportamiento actual (valor fijo).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2238&quot; data-start=&quot;2146&quot;&gt;
&lt;p data-end=&quot;2238&quot; data-start=&quot;2149&quot;&gt;Los nuevos objetos, al heredar el nuevo &lt;em data-end=&quot;2198&quot; data-start=&quot;2189&quot;&gt;default&lt;/em&gt;, comenzarán con el valor actualizado.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2243&quot; data-start=&quot;2240&quot; /&gt;
&lt;h3 data-end=&quot;2271&quot; data-start=&quot;2245&quot;&gt;Estrategia recomendada&lt;/h3&gt;
&lt;ol data-end=&quot;2710&quot; data-start=&quot;2273&quot;&gt;
&lt;li data-end=&quot;2477&quot; data-start=&quot;2273&quot;&gt;
&lt;p data-end=&quot;2477&quot; data-start=&quot;2276&quot;&gt;&lt;strong data-end=&quot;2313&quot; data-start=&quot;2276&quot;&gt;Identificar los objetos afectados&lt;/strong&gt;: aquellos que tienen la propiedad en valor por defecto.&lt;br data-end=&quot;2372&quot; data-start=&quot;2369&quot; /&gt;
Puede hacerse con herramientas como &lt;strong data-end=&quot;2423&quot; data-start=&quot;2411&quot;&gt;KBDoctor&lt;/strong&gt; o mediante un script de exportación de propiedades.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2549&quot; data-start=&quot;2478&quot;&gt;
&lt;p data-end=&quot;2549&quot; data-start=&quot;2481&quot;&gt;&lt;strong data-end=&quot;2523&quot; data-start=&quot;2481&quot;&gt;Asignar explícitamente el valor actual&lt;/strong&gt; (&lt;code data-end=&quot;2530&quot; data-start=&quot;2525&quot;&gt;YES&lt;/code&gt;) a esos objetos.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2550&quot;&gt;
&lt;p data-end=&quot;2628&quot; data-start=&quot;2553&quot;&gt;&lt;strong data-end=&quot;2581&quot; data-start=&quot;2553&quot;&gt;Cambiar el valor default&lt;/strong&gt; a nivel de &lt;em data-end=&quot;2606&quot; data-start=&quot;2593&quot;&gt;Environment&lt;/em&gt; o &lt;em data-end=&quot;2618&quot; data-start=&quot;2609&quot;&gt;Version&lt;/em&gt; (&lt;code data-end=&quot;2624&quot; data-start=&quot;2620&quot;&gt;NO&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2710&quot; data-start=&quot;2629&quot;&gt;
&lt;p data-end=&quot;2710&quot; data-start=&quot;2632&quot;&gt;&lt;strong data-end=&quot;2657&quot; data-start=&quot;2632&quot;&gt;Migrar paulatinamente&lt;/strong&gt; los objetos, revisando el manejo de transacciones.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2715&quot; data-start=&quot;2712&quot; /&gt;
&lt;h3 data-end=&quot;2731&quot; data-start=&quot;2717&quot;&gt;Conclusión&lt;/h3&gt;
&lt;p data-end=&quot;3080&quot; data-start=&quot;2733&quot;&gt;Cambiar el valor &lt;em data-end=&quot;2759&quot; data-start=&quot;2750&quot;&gt;default&lt;/em&gt; de una propiedad en GeneXus parece simple, pero implica entender la &lt;strong data-end=&quot;2870&quot; data-start=&quot;2828&quot;&gt;herencia jerárquica de configuraciones&lt;/strong&gt;.&lt;br data-end=&quot;2874&quot; data-start=&quot;2871&quot; /&gt;
Si el cambio es global, basta con modificarlo en el nivel superior.&lt;br data-end=&quot;2944&quot; data-start=&quot;2941&quot; /&gt;
Si es gradual, se requiere una estrategia intermedia que preserve la estabilidad del sistema mientras se avanza hacia el nuevo estándar.&lt;/p&gt;&lt;p data-end=&quot;3080&quot; data-start=&quot;2733&quot;&gt;Creo que es una buena oportunidad para &lt;b&gt;automatizar y definir una buena práctica&lt;/b&gt; para lograr cambiar propiedades. Ayudaría mucho, poder tener una herramienta que fije el valor actual en los objetos que tienen el valor default, de forma de poder cambiar sin miedo a los valores más modernos.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Otros ejemplos de propiedades definidas a varios niveles (hay mas)&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Default Style (Version / Objeto)&lt;/li&gt;&lt;li&gt;Default Master Page (Version / Objeto)&lt;/li&gt;&lt;li&gt;Web Form Defaults (Version / Objeto)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Default Web Form Editor (Version / Objeto)&lt;/li&gt;&lt;li&gt;Web User Experience (Version / Objeto)&lt;/li&gt;&lt;li&gt;Default Form Layout (Version / Instancia / Objeto)&lt;/li&gt;&lt;li&gt;Exposed Namespace&amp;nbsp; (Version / SDT / BC)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Disabled Warning (Generador / Objeto)&lt;/li&gt;&lt;li&gt;Object Visibility (Modulo / Objeto)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/8843738906245640570/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/11/cambiar-el-valor-default-de-una.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8843738906245640570'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8843738906245640570'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/11/cambiar-el-valor-default-de-una.html' title='Cambiar el valor default de una propiedad en una KB GeneXus'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhZ42dRtgZobf44XgoL7e6vHqMZW0Spbil-b9zu6GmhTsu56zXffeF96mCP8t38x3PDWygx-TlT1ZSKr__0QevQlQ7PyqTfg4wSGv-KbrUiSp3uI17BMSN-rFSmU_4dm3POPf0mXIwlrsgzZdFTcG6w2fl8dIEvaRRo0fyi9-5GkqS4ChtXa5BkYw=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-5827160693287700761</id><published>2025-10-30T11:45:00.002-03:00</published><updated>2025-10-30T11:45:37.312-03:00</updated><title type='text'>Convertir de Theme a Design System</title><content type='html'>&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh6a47MsAmjEjw585gGUQ3JJnItPO8LFKef4HRE7m6lGYiDjUxEU1WD0UfIcwLNihttXrwTmX8GqkNLte64mcT-YNhg_6fD91G5Dpl0xYxse-2zZgc82ox2kNbyEVfzE4NktNm9Aas-J5Auh-lIr49R5XIj-zAsx7uzrQfXHnkesPCM6FjpAVeN3A&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;594&quot; data-original-width=&quot;1328&quot; height=&quot;143&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh6a47MsAmjEjw585gGUQ3JJnItPO8LFKef4HRE7m6lGYiDjUxEU1WD0UfIcwLNihttXrwTmX8GqkNLte64mcT-YNhg_6fD91G5Dpl0xYxse-2zZgc82ox2kNbyEVfzE4NktNm9Aas-J5Auh-lIr49R5XIj-zAsx7uzrQfXHnkesPCM6FjpAVeN3A&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Durante años, los &lt;strong&gt;Themes&lt;/strong&gt; fueron la forma clásica de definir la estética de una aplicación GeneXus. Colores, fuentes y estilos centralizados, pero rígidos. Hoy, con &lt;strong&gt;Design System Objects (DSO)&lt;/strong&gt;, GeneXus da un paso enorme hacia la consistencia y la evolución visual controlada.&lt;p&gt;&lt;/p&gt;&lt;p&gt;Migrar de Theme a Design System no es solo un cambio técnico: es adoptar una &lt;strong&gt;mentalidad de diseño unificado&lt;/strong&gt;. El Design System permite definir tokens reutilizables (colores, tipografías, espaciados) y componentes que se adaptan automáticamente a la plataforma —web, mobile o ambas—, mejorando la experiencia de usuario y facilitando el mantenimiento.&lt;/p&gt;&lt;p&gt;En este proceso, lo que vamos a cambiar incluye:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;Reemplazo de &lt;strong&gt;Theme&lt;/strong&gt; por &lt;strong&gt;Design System&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Creación de una &lt;strong&gt;nueva MasterPage&lt;/strong&gt; moderna.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Adopción del &lt;strong&gt;Editor Abstracto&lt;/strong&gt; para una edición más limpia y visual.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Implementación de un &lt;strong&gt;diseño responsive&lt;/strong&gt; para adaptarse a todos los dispositivos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limpieza&lt;/strong&gt; de recursos no utilizados (Themes y MasterPages viejas, etc.).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pasaje a valores por defecto&lt;/strong&gt; de la mayoría de las clases.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pasaje a valores por defecto&lt;/strong&gt; de propiedades en los objetos GeneXus.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;El proceso de conversión tiene que ser gradual y debe garantizar que la aplicación continúe funcionando en todo momento. Dado que la KB tiene más de 3.300 objetos con pantallas web, no se busca un cambio radical, sino una transición paulatina y controlada.&lt;/p&gt;&lt;p&gt;El proceso de conversión suele implicar las siguientes etapas:&lt;/p&gt;&lt;ol data-spread=&quot;false&quot; start=&quot;1&quot; style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;p&gt;Comenzar por los &lt;strong&gt;WebForms de transacciones&lt;/strong&gt; que usan patterns, asegurando que los nuevos formularios sean compatibles con el Design System.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Continuar con los &lt;strong&gt;objetos generados automáticamente&lt;/strong&gt; por los patterns, verificando su adaptación al nuevo esquema visual.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Luego avanzar con el resto de las &lt;strong&gt;transacciones no basadas en patterns&lt;/strong&gt;, migrando gradualmente sus layouts al nuevo DSO.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Finalmente, actualizar los &lt;strong&gt;WebPanels personalizados&lt;/strong&gt;, revisando estilos, clases y propiedades para alinearlos con el Design System.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Defincion de indicadores&lt;/h3&gt;&lt;br /&gt;Para poder medir el avance del proyecto, defini un indicador simple para usar era contar la cantidad de objetos que tienen formiulario web que usan el nuevo DSO. &lt;br /&gt;&lt;br /&gt;Para colaborar con la conversion, tenemos programas que detectan clases referenciadas en los objetos, que no existen en el DSO.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Estudio del alcance del proyecto.&amp;nbsp; Que cambiar y cuando&lt;/h3&gt;&lt;br /&gt;Tambien hice programas con ayuda de IA, que identifican objetos por módulos y obtienen las siguientes caracteristicas.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;FullyQualifiedName&lt;/li&gt;&lt;li&gt;Type&lt;/li&gt;&lt;li&gt;MasterPage&lt;/li&gt;&lt;li&gt;ParentType (si el objeto esta en un FOLDER / MODULO O ES GENERADO POR WORKWITH)&lt;/li&gt;&lt;li&gt;Theme (SI ESTA EN BLANCO, TOMA EL DEFAULT)&lt;/li&gt;&lt;li&gt;WebUX (SI ES SMOOTH O NO)&lt;/li&gt;&lt;li&gt;WebFormDefaults (SI ES RESPONSIVE O NO)&lt;/li&gt;&lt;li&gt;FormLayout (UNANIMOTEMPLATE O CARMINE TAMPLATE)&lt;/li&gt;&lt;li&gt;FormEditor (HTML O ABSTRACT) Si el form es DEFAULT, no tiene nada&lt;/li&gt;&lt;li&gt;RulesDefault (si es workwith, dice si las rules no perdieron dinamismo)&lt;/li&gt;&lt;li&gt;EventsDefault (si es workwith, dice si los eventos no perdieron dinamismo)&lt;/li&gt;&lt;li&gt;ConditionDefault (si es workwhith, dice si las condition no perdieron dinamismo)&lt;/li&gt;&lt;li&gt;FormDefault (si es workwith, dice si el form, no perdio el dinamismo)&lt;/li&gt;&lt;li&gt;Description (descripcion del objeto)&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;br /&gt;Con todo esto, pudimos analizar que tanto teniamos para cambiar, cuantos objetos podiamos cambiar por sprint y que tanto ibamos a tener que trabajar para lograr el objetivo.&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Propiedades involucradas en el cambio. .&amp;nbsp;&lt;/h3&gt;&lt;p&gt;Las propiedades que afectan este cambio, son varias, y tienen diferentes niveles de jerarquía.&amp;nbsp;&lt;br /&gt;Tuve que hacer un diagrama para poder entenderlo .&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiYL0t48ya3R1f1_CMak0pyle8K5tGrhbD0SNTJuAGtSO4V3R3CDG-zYJfcCHSk6Xup2hf_S1C_NR73d8hRvaLQTfUkZ3agK1j3NZPgfNkzDL3FckjGz8THpNGDstreToK4rScubDS6W225vrw_uHcLd7U-LaH8f5ma_rfUALeM4j2GIplwVr3KWA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;960&quot; data-original-width=&quot;1280&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiYL0t48ya3R1f1_CMak0pyle8K5tGrhbD0SNTJuAGtSO4V3R3CDG-zYJfcCHSk6Xup2hf_S1C_NR73d8hRvaLQTfUkZ3agK1j3NZPgfNkzDL3FckjGz8THpNGDstreToK4rScubDS6W225vrw_uHcLd7U-LaH8f5ma_rfUALeM4j2GIplwVr3KWA=w640-h480&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Conclusiones&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Lo que al principio me pareció que era un cambio no tan grande, luego de realizar la evaluacion, termino siendo mucho mas grande y complejo de lo que me parecía.&amp;nbsp;&lt;br /&gt;Nos va a exigir automatizar varias de las etapas de y vamos a dedicar recursos para la prueba de todas las pantallas.&amp;nbsp;&lt;br /&gt;Si bien el proyecto no esta terminado, el resultado obtenido hasta el momento, es bueno. Y si bien la parte de UI no es mi fuerte, si entiendo que nos deja con un sistema mucho mas fácil de mantener.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Algunos links interesantes&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.genexus.com/en/wiki?4375,Theme&quot;&gt;GeneXus Theme &lt;/a&gt;y &lt;a href=&quot;https://docs.genexus.com/en/wiki?47375,Category%3ADesign+System+Object&quot;&gt;GeneXus DSO&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.figma.com/blog/design-systems-101-what-is-a-design-system/&quot;&gt;Que es un DS?&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.designsystems.com/six-myths-holding-you-back-from-embracing-design-systems/&quot;&gt;Mitos de DS&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p data-end=&quot;749&quot; data-start=&quot;394&quot;&gt;&lt;span id=&quot;docs-internal-guid-035ba2a7-7fff-545b-c996-8286df0bbbf1&quot;&gt;&lt;span style=&quot;font-family: Rubik, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/5827160693287700761/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/10/convertir-de-theme-design-system.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5827160693287700761'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5827160693287700761'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/10/convertir-de-theme-design-system.html' title='Convertir de Theme a Design System'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEh6a47MsAmjEjw585gGUQ3JJnItPO8LFKef4HRE7m6lGYiDjUxEU1WD0UfIcwLNihttXrwTmX8GqkNLte64mcT-YNhg_6fD91G5Dpl0xYxse-2zZgc82ox2kNbyEVfzE4NktNm9Aas-J5Auh-lIr49R5XIj-zAsx7uzrQfXHnkesPCM6FjpAVeN3A=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-3746034100458514354</id><published>2025-10-07T10:24:00.003-03:00</published><updated>2025-10-07T10:24:24.550-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#GeneXus"/><category scheme="http://www.blogger.com/atom/ns#" term="Inteligencia Artificial"/><title type='text'>Cómo integrar GeneXus 18 con Globant Enterprise AI </title><content type='html'>
  &lt;style&gt;
    /* --- Estilos mínimos amigables para Blogspot --- */
    :root { --fg:#0f172a; --muted:#475569; --accent:#2563eb; --bg:#ffffff; --chip:#eef2ff; }
    body { font-family: system-ui, -apple-system, Segoe UI, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, &quot;Liberation Sans&quot;, sans-serif;
           color: var(--fg); background: var(--bg); line-height: 1.65; }
    h1,h2,h3 { line-height: 1.2; }
    h1 { font-size: 1.9rem; margin: 1.2rem 0; }
    h2 { font-size: 1.4rem; margin: 1.1rem 0 .6rem; }
    h3 { font-size: 1.15rem; margin: 1rem 0 .4rem; }
    p, li { color: var(--fg); }
    .lead { color: var(--muted); font-size: 1.05rem; }
    .toc { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: .9rem; }
    .toc a { text-decoration: none; color: var(--accent); }
    .badge { display: inline-block; padding: .1rem .5rem; font-size: .8rem; border-radius: 999px; background: var(--chip); color: var(--accent); }
    pre, code { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &quot;Liberation Mono&quot;, monospace; }
    pre { background: #0b1020; color: #e2e8f0; padding: .9rem; border-radius: 10px; overflow:auto; }
    code {  padding: .1rem .3rem; border-radius: 4px; }
    .note { border-left: 4px solid var(--accent); background: #eff6ff; padding: .75rem; border-radius: 6px; }
    .grid { display: grid; gap: .8rem; }
    .grid-2 { grid-template-columns: repeat(auto-fit,minmax(260px,1fr)); }
    table { width: 100%; border-collapse: collapse; overflow-x:auto; display:block; }
    th, td { text-align: left; padding: .6rem; border-bottom: 1px solid #e2e8f0; }
    th { background: #f8fafc; }
    .kbd { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; background:#111827; color:#e5e7eb; padding:.15rem .4rem; border-radius:4px; }
    .footer { margin-top: 2rem; font-size: .9rem; color: var(--muted); }
  &lt;/style&gt;



&lt;p class=&quot;lead&quot;&gt;
&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEicnLI5r9jiQZO3qj1z6UlfUNxWB2gk-a8LAYTTGLwV8Exit4Fa5Vgh9QaaSd474ct-N1brtm1Ik6PgDSqjzHT-4eP5R-iqyTxlaIE-NVWFZ1LB-m6tpzJabkvZrMgltF-ZIshIBNSE3hCs9xUF8HyoXSzTJRYuQLLhbqW4sOWESguDQ-mYEWZXFg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEicnLI5r9jiQZO3qj1z6UlfUNxWB2gk-a8LAYTTGLwV8Exit4Fa5Vgh9QaaSd474ct-N1brtm1Ik6PgDSqjzHT-4eP5R-iqyTxlaIE-NVWFZ1LB-m6tpzJabkvZrMgltF-ZIshIBNSE3hCs9xUF8HyoXSzTJRYuQLLhbqW4sOWESguDQ-mYEWZXFg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgzdDkL-Pb7OQ24zl8jZyASPBeKiVWwA9G-YrnXhtRjx0M8sXIUDrwAN27IeR3kvlfteqv_jHQQCp6PG7ktyUTLoD9N2lmRLeDgs7_bbXgab7J2_0ugz7UwsLrU5USz7LZGZ_656SifrXpkZvOSz3CWkzDBUY0FA5fJeGf14tWdEvP4OwGUiGme2g&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;341&quot; data-original-width=&quot;1461&quot; height=&quot;75&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgzdDkL-Pb7OQ24zl8jZyASPBeKiVWwA9G-YrnXhtRjx0M8sXIUDrwAN27IeR3kvlfteqv_jHQQCp6PG7ktyUTLoD9N2lmRLeDgs7_bbXgab7J2_0ugz7UwsLrU5USz7LZGZ_656SifrXpkZvOSz3CWkzDBUY0FA5fJeGf14tWdEvP4OwGUiGme2g&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Si trabajás con &lt;strong&gt;GeneXus 18&lt;/strong&gt;, podés potenciar tus apps con &lt;strong&gt;Globant Enterprise AI (GEAI)&lt;/strong&gt; para sumar inteligencia conversacional, recuperación de conocimiento (RAG) y automatización mediante agentes. En esta guía vas a ver:
conceptos clave, arquitectura, &lt;em&gt;paso a paso&lt;/em&gt; del lado de GEAI y del lado de GeneXus, y ejemplos de código listos para adaptar.&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;toc&quot;&gt;&lt;ol&gt;
  &lt;/ol&gt;
&lt;/div&gt;

&lt;h2 id=&quot;que-es-geai&quot;&gt;¿Qué es Globant Enterprise AI?&lt;/h2&gt;
&lt;p&gt;
&lt;strong&gt;GEAI&lt;/strong&gt; es una plataforma empresarial para crear y gobernar &lt;em&gt;asistentes y agentes&lt;/em&gt; que combinan modelos generativos, herramientas externas y pipelines de recuperación (&lt;em&gt;RAG&lt;/em&gt;) dentro de un entorno controlado.
Actúa como &lt;em&gt;capa de orquestación&lt;/em&gt;: desacopla tu aplicación del modelo, gestiona credenciales, costos, métricas, versiones y cumplimiento.
&lt;/p&gt;

&lt;div class=&quot;grid grid-2&quot;&gt;
  &lt;div&gt;
    &lt;h3&gt;Componentes típicos&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;The Lab&lt;/strong&gt;: diseño, test y despliegue de agentes/asistentes.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;RAG&lt;/strong&gt;: conexión a fuentes/documentos para respuestas con evidencia.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Tools&lt;/strong&gt;: integraciones a APIs internas/externas.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Gobernanza&lt;/strong&gt;: métricas, logs, versiones y seguridad.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;h3&gt;¿Por qué usarlo?&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;Modelo-agnóstico (cambiás de modelo sin reescribir tu app).&lt;/li&gt;
      &lt;li&gt;Observabilidad y control de costos/tokens.&lt;/li&gt;
      &lt;li&gt;Escenarios multi-paso/autónomos con agentes.&lt;/li&gt;
      &lt;li&gt;Mejor &lt;em&gt;time-to-value&lt;/em&gt; en equipos low-code.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&quot;definiciones&quot;&gt;Definiciones: Asistente, Agente y Asistente RAG&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Tipo&lt;/th&gt;
      &lt;th&gt;Qué hace&lt;/th&gt;
      &lt;th&gt;Autonomía&lt;/th&gt;
      &lt;th&gt;&lt;br /&gt;&lt;/th&gt;
      &lt;th&gt;Cuándo usar&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Asistente&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Responde a un prompt (chat clásico).&lt;/td&gt;
      &lt;td&gt;Baja&lt;/td&gt;
      &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
      &lt;td&gt;Q&amp;amp;A, redacción, transformaciones.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Asistente RAG&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Busca evidencia antes de responder.&lt;/td&gt;
      &lt;td&gt;Media&lt;/td&gt;
      &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
      &lt;td&gt;Soporte, políticas, catálogos, procedimientos.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Agente&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Orquesta pasos y &lt;em&gt;tools&lt;/em&gt;, toma decisiones.&lt;/td&gt;
      &lt;td&gt;Alta&lt;/td&gt;
      &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
      &lt;td&gt;Flujos multi-paso, automatización, acciones.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;arquitectura&quot;&gt;Arquitectura de la integración&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Usuario → App GeneXus (UI / evento)
       → Llamada REST a GEAI (endpoint de Asistente/Agente)
       → Ejecución en GEAI (opcional: RAG + Tools)
       → Respuesta estructurada
       → GeneXus (renderiza / ejecuta acciones de negocio)&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&quot;note&quot;&gt;
  &lt;strong&gt;Idea clave:&lt;/strong&gt; GeneXus envía el &lt;em&gt;prompt + contexto&lt;/em&gt; y recibe una respuesta (texto/JSON) y metadatos. Si es un agente, puede devolver también &lt;em&gt;intenciones/acciones&lt;/em&gt; para que tu app las ejecute.
&lt;/div&gt;

&lt;h2 id=&quot;geai-setup&quot;&gt;Paso a paso en GEAI (The Lab)&lt;/h2&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
  &lt;li&gt;&lt;strong&gt;Permisos y proyecto&lt;/strong&gt;: accedé a &lt;em&gt;The Lab&lt;/em&gt; y creá un &lt;em&gt;Assistant&lt;/em&gt; o &lt;em&gt;Agent&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Definir propósito&lt;/strong&gt;: qué resuelve, inputs esperados y formato de salida (texto/JSON).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Probar&lt;/strong&gt;: ajustar prompts, roles y límites (tokens, temperatura, timeouts).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tener claros estos datos para poder invocar&lt;/strong&gt;:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;BaseURL&lt;/b&gt; =&amp;nbsp;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;https://api.saia.ai/chat &lt;/b&gt;&lt;/span&gt;o algo parecido.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Nombre del agente/asistente&lt;/b&gt;&amp;nbsp;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Para asistente :&amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&quot;saia:assistant:%1&quot;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Para agente: &lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;&quot;saia:agent:%1&quot;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Para RAG:&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;&quot;saia:search:%1&quot;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Obtener el Token de autenticación : BaererToken=&lt;span style=&quot;color: #cc0000;&quot;&gt;&quot;&lt;b&gt;adadsfadsf.....&quot;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;/ol&gt;&lt;div&gt;Los que yo programe, recibian un texto de entrada y tenian un texto estructurado de salida&amp;nbsp;&lt;br /&gt;Es importante ponerle a los asistentes/agentes que la salida sea de un formato especifico (puede ser json, xml, CSV, HTML pero que se pueda procesar correctamente desde GeneXus.&amp;nbsp;&lt;br /&gt;Tambien es importante explicitarle en el prompt&amp;nbsp; que no agregue nada mas a la salida y conviene ponerle ejemplo de lo que quiero como salida.&amp;nbsp;&lt;/div&gt;

&lt;h2 id=&quot;gx-setup&quot;&gt;Paso a paso en GeneXus 18&lt;/h2&gt;

&lt;h3&gt;1) Variables y propiedades&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;bearer_token&gt;Con las valores anteriores, ya podemos consumir los asistentes / agentes desarrollados. 
En mi caso, use procedimiento que haga el llamdo REST, pero tambien agregue el manejo de un CACHE 
DE INVOCACIONES, para ahorrar cuando se realizan invocaciones con el mismo texto. 
El texto puede incluir caracteres que hagan invalido el request, por lo que hay que hacer la sustitucion para que siempre sea valido, es lo que hago con el procedure TextoEscapado()&lt;/bearer_token&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;2) Llamada HTTP (REST) desde un Procedure o Event&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;HttpClient.Timeout = 140

if not &lt;b&gt;ExisteCacheAsistente(&amp;amp;Asistente,&amp;amp;TextoIN,&amp;amp;TextoOUT)  &lt;/b&gt;

	&amp;amp;HttpClient.AddHeader(!&quot;Authorization&quot;, format(!&quot;Bearer %1&quot;, &lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;BearerToken()&lt;/b&gt;)&lt;/span&gt;)
	&amp;amp;HttpClient.AddHeader(!&quot;Content-Type&quot;, !&quot;application/json&quot;)

	&amp;amp;HttpClient.AddString(format(!&#39;{&quot;model&quot;:&quot;%1&quot;,
            &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;,&quot;content&quot;: &quot;%2&quot;}],&quot;stream&quot;: false}&#39;,
             &lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;&amp;amp;Asistente&lt;/b&gt;&lt;/span&gt;,TextoEscapado(&amp;amp;TextoIN)))&lt;br&gt;
     	     &amp;amp;HttpClient.Execute(!&quot;POST&quot;, &lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;BaseURL()&lt;/span&gt;&lt;/b&gt;)

	if &amp;amp;HttpClient.ErrCode&amp;lt;&amp;gt; 0
		&amp;amp;Msg = format(&quot;Error: %1 - %2 - %3&quot;, &amp;amp;Pgmname,&amp;amp;HttpClient.ErrCode, &amp;amp;HttpClient.ErrDescription)
		Log.Error(&amp;amp;Msg)
		Msg(&amp;amp;Msg,status)
	else
		&amp;amp;TextoOUT = &amp;amp;HttpClient.ToString()
		&amp;amp;AsistenteResponse.FromJson(&amp;amp;HttpClient.ToString())
		&amp;amp;TextoOUT = &amp;amp;AsistenteResponse.choices.Item(1).message.content
		&lt;b&gt;GraboCacheAsistente(&amp;amp;Asistente,&amp;amp;TextoIN,&amp;amp;TextoOUT)&lt;/b&gt;
	endif

Endif
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;Simplifique un poco el codigo, para que quedara mas lindo, pero le falta chequeo de errores y 
ver si tiene mas de una respuesta. &lt;/pre&gt;

&lt;h3&gt;3) Parseo de respuesta&lt;br /&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Si la salida es json, lo que hice es desde GX generar un SDT con el JSON (Tools / Application Integration / JSON Import)
y eso genera un SDT. 

En el código, se puede hacer

&amp;amp;SDT.FromJson(&amp;amp;SalidaDelAgente)
if NoHayErrores()
   Proceso(&amp;amp;SDT)
endif


Si la salida es un HTML se puede mostrar en pantalla, luego de hacer alguna validación que no contenga nada peligroso. &lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;buenas-practicas&quot;&gt;Buenas prácticas y checklist&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Prompts estructurados&lt;/strong&gt;: preferí entradas con campos (“objetivo”, “restricciones”, “formato de salida”).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Manejo de errores&lt;/strong&gt;: validá &lt;code&gt;StatusCode&lt;/code&gt; y contemplá timeouts/reintentos.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Versionado&lt;/strong&gt;: mantené IDs/versions de agentes y &lt;em&gt;feature flags&lt;/em&gt; para canary.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Observabilidad&lt;/strong&gt;: log de prompts/latencias/tokens (sin datos sensibles).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Seguridad&lt;/strong&gt;: protegé el token de GEAI; sanitizá entradas (no confiar en el modelo).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Contratos claros&lt;/strong&gt;: definí bien el JSON de ida/vuelta; documentá ejemplos.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Costos&lt;/strong&gt;: cacheá resultados repetibles; limitá longitud de prompts.&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id=&quot;cierre&quot;&gt;Conclusiones.&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
La combinación &lt;strong&gt;GeneXus 18 + Globant Enterprise AI&lt;/strong&gt; te permite construir soluciones con &lt;em&gt;bajo tiempo de desarrollo&lt;/em&gt; y &lt;em&gt;alto impacto&lt;/em&gt;. Empezá con un Asistente, incorporá RAG para responder con evidencia y evolucioná a Agentes que orquestan procesos y herramientas.
&lt;br /&gt;&lt;br /&gt;GeneXus NEXT hace todo este proceso mucho mas facil y queda todo mucho mas integrado, pero quienes ya tenemos aplicaciones en Genexus vamos a necesitar un tiempo de transicion para incorporar agentes de IA a los sistemas que ya tenemos, por lo que este me parece un camino valido.&amp;nbsp;&lt;/p&gt;

&lt;br /&gt;


&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/3746034100458514354/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/10/como-integrar-genexus-18-con-globant.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3746034100458514354'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3746034100458514354'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/10/como-integrar-genexus-18-con-globant.html' title='Cómo integrar GeneXus 18 con Globant Enterprise AI '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgzdDkL-Pb7OQ24zl8jZyASPBeKiVWwA9G-YrnXhtRjx0M8sXIUDrwAN27IeR3kvlfteqv_jHQQCp6PG7ktyUTLoD9N2lmRLeDgs7_bbXgab7J2_0ugz7UwsLrU5USz7LZGZ_656SifrXpkZvOSz3CWkzDBUY0FA5fJeGf14tWdEvP4OwGUiGme2g=s72-c" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-8255807066361541709</id><published>2025-09-06T12:21:00.002-03:00</published><updated>2025-09-06T12:21:35.629-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Docker"/><category scheme="http://www.blogger.com/atom/ns#" term="Genexus"/><category scheme="http://www.blogger.com/atom/ns#" term="GeneXusNext"/><title type='text'>Cómo achicar el disco de Docker Desktop cuando se usa GeneXus Next (WSL2 en Windows)</title><content type='html'>&lt;p&gt;&lt;strong&gt;Contexto:&lt;/strong&gt;&amp;nbsp;GeneXus Next usa Docker Desktop sobre WSL2. Con el tiempo, el archivo de disco virtual de Docker (“ext4.vhdx” o “docker_data.vhdx”) crece y&amp;nbsp;&lt;em&gt;no&lt;/em&gt;&amp;nbsp;se achica solo aunque borres imágenes.&lt;br /&gt;Al cambiar de versión (en la fase beta se hace muy a menudo) se crean imágenes y contenedores que luego se dejan de usar, pero a veces no libera el espacio.&lt;br /&gt;En mi caso, pude recuperar 28 Gb con la limpieza.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;¿Por qué pasa?&lt;/h2&gt;
&lt;p&gt;Docker Desktop guarda sus datos en una distro WSL2 (&lt;code&gt;docker-desktop-data&lt;/code&gt;) dentro de un disco virtual dinámico &lt;code&gt;.vhdx&lt;/code&gt; que crece cuando necesitás más espacio, pero no reduce tamaño automáticamente al liberar datos.&lt;/p&gt;

&lt;h3&gt;Rutas típicas del VHDX&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;%LOCALAPPDATA%\Docker\wsl\data\ext4.vhdx&lt;/code&gt; (clásico)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;%LOCALAPPDATA%\Docker\wsl\disk\docker_data.vhdx&lt;/code&gt; (nombres nuevos)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Tip:&lt;/em&gt; En Docker Desktop podés ver o cambiar &lt;strong&gt;Settings → Resources → Advanced → Disk image location&lt;/strong&gt; y el tamaño máximo.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Paso a paso&lt;/h2&gt;

&lt;div style=&quot;background: rgb(255, 249, 237); border-left: 4px solid rgb(255, 177, 0); margin: 16px 0px; padding: 10px 14px;&quot;&gt;
  &lt;strong&gt;Recomendación:&lt;/strong&gt; hacé una copia del &lt;code&gt;.vhdx&lt;/code&gt; antes de compactar.
&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Liberá espacio dentro de Docker&lt;/strong&gt;&lt;/p&gt;
    &lt;pre style=&quot;background: rgb(246, 248, 250); overflow: auto; padding: 12px;&quot;&gt;&lt;code&gt;docker system df
docker system prune -a --volumes&lt;/code&gt;&lt;/pre&gt;
    &lt;p&gt;&lt;em&gt;Esto borra imágenes huérfanas, contenedores detenidos, redes y volúmenes no usados.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Cerrá Docker Desktop&lt;/strong&gt; (tray icon → &lt;em&gt;Quit Docker Desktop&lt;/em&gt;).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Apagá WSL&lt;/strong&gt; (PowerShell como Administrador):&lt;/p&gt;
    &lt;pre style=&quot;background: rgb(246, 248, 250); overflow: auto; padding: 12px;&quot;&gt;&lt;code&gt;wsl --shutdown&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Compactá el VHDX&lt;/strong&gt; (elegí una):&lt;/p&gt;
    &lt;p&gt;&lt;u&gt;Opción A – Optimize-VHD&lt;/u&gt; (Windows Pro/Enterprise con herramientas Hyper-V):&lt;/p&gt;
    &lt;pre style=&quot;background: rgb(246, 248, 250); overflow: auto; padding: 12px;&quot;&gt;&lt;code&gt;PowerShell (Administrador)

$Vhdx = &quot;$env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx&quot;   # Ajustá si usás \disk\docker_data.vhdx
Optimize-VHD -Path $Vhdx -Mode Full&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;u&gt;Opción B – DiskPart&lt;/u&gt; (sirve en cualquier edición de Windows):&lt;/p&gt;
    &lt;pre style=&quot;background: rgb(246, 248, 250); overflow: auto; padding: 12px;&quot;&gt;&lt;code&gt;PowerShell (Administrador)

$Vhdx = &quot;$env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx&quot;

$dp = @&quot;
select vdisk file=&quot;$Vhdx&quot;
attach vdisk readonly
compact vdisk
detach vdisk
exit
&quot;@

$tmp = New-TemporaryFile
Set-Content -LiteralPath $tmp -Value $dp -Encoding ASCII
diskpart /s $tmp
Remove-Item $tmp -Force&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Reiniciá Docker Desktop&lt;/strong&gt; y verificá:&lt;/p&gt;
    &lt;pre style=&quot;background: rgb(246, 248, 250); overflow: auto; padding: 12px;&quot;&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Comprobá el ahorro&lt;/strong&gt; mirando el tamaño del archivo antes/después (Propiedades del archivo).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/8255807066361541709/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/09/como-achicar-el-disco-de-docker-desktop.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8255807066361541709'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8255807066361541709'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/09/como-achicar-el-disco-de-docker-desktop.html' title='Cómo achicar el disco de Docker Desktop cuando se usa GeneXus Next (WSL2 en Windows)'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-6477551386185524792</id><published>2025-09-03T12:56:00.002-03:00</published><updated>2025-09-03T12:56:52.392-03:00</updated><title type='text'>Usando Globant Enterprise AI para desarrollo de aplicaciones</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjN3D-reJX_okFRUSFJoUaJSPlHh1ztlbg9r-oGSeGDTKzQtZhmw99AeNrLX40fcC_b5r9fc01C8dwof_psPJMps6InCIFwlZZ2wpB_xAQTfFHHiEYckCu4su1Q_YLJ_Apucq8ixqiTHwu_l0wUZCmMjzluY4NnJc5Yb4fdIjjqF5wd_xiskVV3Rw&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;225&quot; data-original-width=&quot;225&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjN3D-reJX_okFRUSFJoUaJSPlHh1ztlbg9r-oGSeGDTKzQtZhmw99AeNrLX40fcC_b5r9fc01C8dwof_psPJMps6InCIFwlZZ2wpB_xAQTfFHHiEYckCu4su1Q_YLJ_Apucq8ixqiTHwu_l0wUZCmMjzluY4NnJc5Yb4fdIjjqF5wd_xiskVV3Rw&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Preparándonos para lo que viene con &lt;a href=&quot;https://www.genexus.com/en/products/genexus&quot; target=&quot;_blank&quot;&gt;GeneXus Next&lt;/a&gt;, estuve probando &lt;a href=&quot;https://www.globant.com/enterprise-ai&quot; target=&quot;_blank&quot;&gt;Globant Enterprise AI (GEAI)&lt;/a&gt; para incorporar Agentes y Asistentes a aplicaciones ya existentes construidas con &lt;a href=&quot;https://docs.genexus.com/en/wiki?51066%2CTable+of+contents%3AGeneXus+18=&quot; target=&quot;_blank&quot;&gt;GeneXus 18&lt;/a&gt;.&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumen rápido:&lt;/strong&gt; suma un nivel de potencia que puede elevar mucho la productividad en varios frentes. Por otro lado, se notan asperezas de una implementación que todavía evoluciona, lo que hace que la experiencia no sea tan fluida como podría ser.&lt;/p&gt;

&lt;h2&gt;Inconvenientes&lt;/h2&gt;

&lt;h3&gt;Problemas de conexión / reconexión / desconexión&lt;/h3&gt;
&lt;p&gt;Dentro de GEAI hay varios componentes con Single Sign-On (SSO). En teoría, al iniciar sesión en uno quedo autenticado en todos; en la práctica, al alternar entre módulos a distintas horas aparecen errores &lt;code&gt;403 – Forbidden&lt;/code&gt; y hay que hacer “magia” para seguir trabajando. Además, no encontré forma de extender la duración de la sesión y cada ~20 minutos debo volver a loguearme. Huele a bugs propios de un producto todavía en transición.&lt;/p&gt;

&lt;h3&gt;Asistentes vs. Agentes&lt;/h3&gt;
&lt;p&gt;La terminología y el modelo mental no son del todo claros. En principio, un &lt;strong&gt;Asistente&lt;/strong&gt; ejecuta una tarea específica apoyada en IA, mientras que un &lt;strong&gt;Agente&lt;/strong&gt; puede orquestar varias herramientas (entre ellas, asistentes), mantener contexto y devolver resultados compuestos. Los Asistentes se gestionan en una sección y los Agentes en otra. Puedo crear un agente “estilo asistente”, pero —por ahora— no pude hacer agentes que ejecuten búsquedas &lt;a href=&quot;https://aws.amazon.com/what-is/retrieval-augmented-generation/&quot; target=&quot;_blank&quot;&gt;RAG&lt;/a&gt; de forma nativa.&lt;/p&gt;

&lt;h3&gt;Flujos y “Procesos Agénticos”&lt;/h3&gt;
&lt;p&gt;Además existen Flujos y Procesos Agénticos. Da la sensación de que el diseño original está migrando hacia un nuevo modelo y estamos en plena adaptación. Falta una vista unificada que reduzca la confusión.&lt;/p&gt;

&lt;h3&gt;Salidas estructuradas de Asistentes&lt;/h3&gt;
&lt;p&gt;No hay ejemplos realmente claros de cómo lograr salidas estrictamente estructuradas (JSON, esquemas, etc.) en Asistentes. Curiosamente, esto es más sencillo cuando se trabaja desde Agentes.&lt;/p&gt;

&lt;h3&gt;Asistentes RAG vs. “otros” Asistentes&lt;/h3&gt;
&lt;p&gt;Los Asistentes aparecen en listas separadas y no termina de quedar claro el porqué. Intuyo que algunos requieren carga de documentos y otros no; aun así, preferiría ver todo en una única lista con filtros.&lt;/p&gt;

&lt;h3&gt;Documentación no integrada&lt;/h3&gt;
&lt;p&gt;La documentación de uso de asistentes es buena y &lt;a href=&quot;https://docs.globant.ai/en/chat&quot;&gt;el bot asociado&lt;/a&gt; responde con eficacia. Me gustaría que la guía para &lt;em&gt;crear&lt;/em&gt; e &lt;em&gt;invocar&lt;/em&gt; un asistente o agente estuviera integrada en el producto (aunque sea como ítem en el menú lateral).&amp;nbsp;https://docs.globant.ai/en/chat&lt;/p&gt;

&lt;h3&gt;Información para desarrolladores&lt;/h3&gt;
&lt;p&gt;GEAI apunta a un público diverso, pero muchos usuarios seremos desarrolladores. Se agradecería una ruta clara para invocar agente/asistente/flow/proceso desde una aplicación (GX o no GX). Un patrón ideal sería: probar en la UI y obtener automáticamente el &lt;code&gt;curl&lt;/code&gt; equivalente para la misma invocación (copiar/pegar y listo), evitando bucear en docs para cada detalle.&lt;/p&gt;

&lt;h3&gt;Errores encontrados&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;RAGAssistant:&lt;/strong&gt; intenté crear un asistente para procesar una tabla simple y arrojó:&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;code&gt;Error processing file: can only concatenate str (not &#39;int&#39;) to str&lt;/code&gt;.&amp;nbsp;&lt;div&gt;&lt;br /&gt;No encontré forma de salir de ese estado.&lt;br /&gt;&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;DataAnalyst Assistant:&lt;/strong&gt; al indexar un CSV llegó al 50% y falló sin indicar motivo. No vi logs ni requests con error para diagnosticar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ventajas&lt;/h2&gt;

&lt;h3&gt;Potencia&lt;/h3&gt;
&lt;p&gt;No es mérito exclusivo de GEAI sino de los LLMs. Tenía que hacer un programa que leyera un documento, lo escaneara, hiciera OCR, extrajera datos estructurados, tradujera al español, procesara el texto y devolviera resultados estructurados a una app. Hace años resolvimos algo así integrando varios componentes distintos; hoy se cubre con un solo asistente. En casos así, el ahorro en meses de desarrollo e instalación (escaneo, OCR, traducción, etc.) es muy significativo.&lt;/p&gt;

&lt;h3&gt;Facilidad de integración&lt;/h3&gt;
&lt;p&gt;Es relativamente sencillo integrar con aplicaciones GeneXus y no GeneXus. Todo se puede invocar por API y queda centralizado y auditado.&lt;/p&gt;

&lt;h3&gt;Mayor nivel de abstracción&lt;/h3&gt;
&lt;p&gt;Podemos empezar a pensar soluciones a un nivel más alto, sin preocuparnos tanto por varios detalles de implementación (al menos, no de entrada). El enfoque de &lt;em&gt;agentes&lt;/em&gt; y &lt;em&gt;asistentes&lt;/em&gt; encaja bien con el espíritu de &lt;a href=&quot;https://www.genexus.com/en/products/genexus&quot; target=&quot;_blank&quot;&gt;GeneXus Next&lt;/a&gt;, que promueve diseñar y automatizar más tareas con IA.&lt;/p&gt;

&lt;h3&gt;Independencia del LLM&lt;/h3&gt;
&lt;p&gt;Quizás la ventaja más importante: aún estamos en fase temprana y no está claro quiénes serán los ganadores. Es clave poder reutilizar conocimiento, moverlo de proveedor y no quedar atado a un único modelo. La sensación es similar a la burbuja &lt;em&gt;.com&lt;/em&gt;: prevalecerán quienes agreguen valor real; por eso, abstraerse del LLM específico es estratégico.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Conclusión&lt;/h2&gt;Aún es pronto para dictar sentencia sobre el papel que jugarán GeneXus y GEAI en los próximos años; falta ver cómo se materializan en soluciones reales. Lo que sí está claro es que GeneXus parte con una ventaja estructural: un modelado sólido y una “fábrica” de backoffice madura.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;El desafío ahora es completar el rompecabezas: front-end moderno y para usuarios finales; analítica a gran escala; documentación viva; testing automatizado; gestión de requerimientos y operaciones; buen soporte para bases no relacionales; y nuevos patrones de UI (con audio, video, imagenes, etc). &lt;br /&gt;&lt;br /&gt;Si GEAI consigue integrarse bien en estas capas —con agentes, RAG y abstracciones reutilizables— podremos construir aplicaciones más completas, mantenibles y portables entre modelos, con un salto real de productividad. Hasta entonces, prudencia y experimentación: medir dónde aporta valor, documentar aprendizajes , para poder reutilizarlo.&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/6477551386185524792/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/09/usando-globant-enterprise-ai-para.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6477551386185524792'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6477551386185524792'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/09/usando-globant-enterprise-ai-para.html' title='Usando Globant Enterprise AI para desarrollo de aplicaciones'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjN3D-reJX_okFRUSFJoUaJSPlHh1ztlbg9r-oGSeGDTKzQtZhmw99AeNrLX40fcC_b5r9fc01C8dwof_psPJMps6InCIFwlZZ2wpB_xAQTfFHHiEYckCu4su1Q_YLJ_Apucq8ixqiTHwu_l0wUZCmMjzluY4NnJc5Yb4fdIjjqF5wd_xiskVV3Rw=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-5301403735199238476</id><published>2025-09-02T10:46:00.002-03:00</published><updated>2025-09-02T10:49:09.412-03:00</updated><title type='text'>iText + GeneXus : riesgo legal de su uso sin licencia. </title><content type='html'>&lt;p&gt;Si generás PDFs con GeneXus, seguro te cruzaste con &lt;strong data-end=&quot;147&quot; data-start=&quot;138&quot;&gt;iText&lt;/strong&gt; (Java) o &lt;strong data-end=&quot;171&quot; data-start=&quot;157&quot;&gt;iTextSharp&lt;/strong&gt; (.NET). Lo clave: &lt;strong data-end=&quot;266&quot; data-start=&quot;190&quot;&gt;las versiones modernas de iText ya no son gratuitas para uso empresarial&lt;/strong&gt; salvo que cumplas &lt;strong data-end=&quot;293&quot; data-start=&quot;285&quot;&gt;AGPL&lt;/strong&gt;; de lo contrario, &lt;strong data-end=&quot;344&quot; data-start=&quot;312&quot;&gt;requieren licencia comercial&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 data-end=&quot;408&quot; data-start=&quot;347&quot;&gt;1) Línea de tiempo (qué fue gratis y desde cuándo se paga)&lt;/h2&gt;
&lt;ul data-end=&quot;851&quot; data-start=&quot;409&quot;&gt;
&lt;li data-end=&quot;665&quot; data-start=&quot;409&quot;&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;411&quot;&gt;&lt;strong data-end=&quot;447&quot; data-start=&quot;411&quot;&gt;Gratis (para proyectos cerrados)&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-end=&quot;665&quot; data-start=&quot;452&quot;&gt;
&lt;li data-end=&quot;554&quot; data-start=&quot;452&quot;&gt;
&lt;p data-end=&quot;554&quot; data-start=&quot;454&quot;&gt;&lt;strong data-end=&quot;476&quot; data-start=&quot;454&quot;&gt;iText 2.1.7 (Java)&lt;/strong&gt;: bajo &lt;strong data-end=&quot;495&quot; data-start=&quot;483&quot;&gt;MPL/LGPL&lt;/strong&gt;. Última “antigua”. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://itextpdf.com/sites/default/files/2018-12/Flyer_Licensing%20.pdf?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://itextpdf.com/sites/default/files/2018-12/Flyer_Licensing%20.pdf?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;iTextpdf&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;665&quot; data-start=&quot;557&quot;&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;559&quot;&gt;&lt;strong data-end=&quot;596&quot; data-start=&quot;559&quot;&gt;iTextSharp 4.1.6 (.NET Framework)&lt;/strong&gt;: &lt;strong data-end=&quot;608&quot; data-start=&quot;598&quot;&gt;última&lt;/strong&gt; bajo &lt;strong data-end=&quot;626&quot; data-start=&quot;614&quot;&gt;MPL/LGPL&lt;/strong&gt;. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://github.com/schourode/iTextSharp-LGPL?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://github.com/schourode/iTextSharp-LGPL?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://www.nuget.org/packages/iTextSharp-LGPL/?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://www.nuget.org/packages/iTextSharp-LGPL/?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;NuGet&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;851&quot; data-start=&quot;666&quot;&gt;
&lt;p data-end=&quot;851&quot; data-start=&quot;668&quot;&gt;&lt;strong data-end=&quot;698&quot; data-start=&quot;668&quot;&gt;Desde iText 5 (7-Dic-2009)&lt;/strong&gt;: &lt;strong data-end=&quot;725&quot; data-start=&quot;700&quot;&gt;dual AGPL + comercial&lt;/strong&gt;. Si no podés/querés cumplir AGPL, &lt;strong data-end=&quot;783&quot; data-start=&quot;760&quot;&gt;tenés que licenciar&lt;/strong&gt; (aplica también a iText 7/8). &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;kb.itextpdf.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;1048&quot; data-start=&quot;853&quot;&gt;
&lt;p data-end=&quot;1048&quot; data-start=&quot;855&quot;&gt;AGPL implica obligaciones de compartir código si hay interacción por red con el programa que incorpora iText; para evitarlo, se usa &lt;strong data-end=&quot;1009&quot; data-start=&quot;987&quot;&gt;licencia comercial&lt;/strong&gt;. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;kb.itextpdf.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1053&quot; data-start=&quot;1050&quot; /&gt;
&lt;h2 data-end=&quot;1103&quot; data-start=&quot;1055&quot;&gt;2) GeneXus hoy: por generador&lt;/h2&gt;
&lt;h3 data-end=&quot;1113&quot; data-start=&quot;1105&quot;&gt;Java&lt;/h3&gt;
&lt;ul data-end=&quot;1370&quot; data-start=&quot;1114&quot;&gt;
&lt;li data-end=&quot;1204&quot; data-start=&quot;1114&quot;&gt;
&lt;p data-end=&quot;1204&quot; data-start=&quot;1116&quot;&gt;&lt;strong data-end=&quot;1127&quot; data-start=&quot;1116&quot;&gt;Default&lt;/strong&gt;: &lt;strong data-end=&quot;1139&quot; data-start=&quot;1129&quot;&gt;PDFBox&lt;/strong&gt; (Apache 2.0, sin costo). &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1370&quot; data-start=&quot;1205&quot;&gt;
&lt;p data-end=&quot;1370&quot; data-start=&quot;1207&quot;&gt;&lt;strong data-end=&quot;1219&quot; data-start=&quot;1207&quot;&gt;Opciones&lt;/strong&gt;: &lt;strong data-end=&quot;1239&quot; data-start=&quot;1221&quot;&gt;iText (Legacy)&lt;/strong&gt; = iText 2.x; &lt;strong data-end=&quot;1264&quot; data-start=&quot;1253&quot;&gt;iText 8&lt;/strong&gt; (AGPL/comercial). La posibilidad de elegir apareció en &lt;strong data-end=&quot;1331&quot; data-start=&quot;1320&quot;&gt;GX18 U4&lt;/strong&gt;. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://dev-docs.genexus.com/en/wiki?55459%2CPDF+Reports+Library+property+%28GeneXus+18+Upgrade+4%29=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://dev-docs.genexus.com/en/wiki?55459%2CPDF+Reports+Library+property+%28GeneXus+18+Upgrade+4%29=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;dev-docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://docs.genexus.com/en/wiki?54238%2CGeneXus+18+Upgrade+4=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://docs.genexus.com/en/wiki?54238%2CGeneXus+18+Upgrade+4=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1427&quot; data-start=&quot;1372&quot;&gt;.NET (moderno, ex &lt;strong data-end=&quot;1407&quot; data-start=&quot;1394&quot;&gt;.NET Core&lt;/strong&gt; / “.NET Generator”)&lt;/h3&gt;
&lt;ul data-end=&quot;1679&quot; data-start=&quot;1428&quot;&gt;
&lt;li data-end=&quot;1546&quot; data-start=&quot;1428&quot;&gt;
&lt;p data-end=&quot;1546&quot; data-start=&quot;1430&quot;&gt;&lt;strong data-end=&quot;1441&quot; data-start=&quot;1430&quot;&gt;Default&lt;/strong&gt;: &lt;strong data-end=&quot;1461&quot; data-start=&quot;1443&quot;&gt;iText (Legacy)&lt;/strong&gt; (equivale a iText 4.x/iTextSharp histórico). &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://dev-docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://dev-docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;dev-docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1679&quot; data-start=&quot;1547&quot;&gt;
&lt;p data-end=&quot;1679&quot; data-start=&quot;1549&quot;&gt;&lt;strong data-end=&quot;1561&quot; data-start=&quot;1549&quot;&gt;Opciones&lt;/strong&gt;: &lt;strong data-end=&quot;1574&quot; data-start=&quot;1563&quot;&gt;iText 8&lt;/strong&gt; (AGPL/comercial) y &lt;strong data-end=&quot;1604&quot; data-start=&quot;1594&quot;&gt;PDFPig&lt;/strong&gt; como alternativa OSS agregada luego. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://sac.genexus.com/frontend.scmain.aspx?E%3B178%3B94%3B1264%3B1%3B1%3BO%3B%2C54060=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://sac.genexus.com/frontend.scmain.aspx?E%3B178%3B94%3B1264%3B1%3B1%3BO%3B%2C54060=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;sac.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1711&quot; data-start=&quot;1681&quot;&gt;&lt;strong data-end=&quot;1703&quot; data-start=&quot;1685&quot;&gt;.NET Framework&lt;/strong&gt; (viejo)&lt;/h3&gt;
&lt;ul data-end=&quot;1904&quot; data-start=&quot;1712&quot;&gt;
&lt;li data-end=&quot;1904&quot; data-start=&quot;1712&quot;&gt;
&lt;p data-end=&quot;1904&quot; data-start=&quot;1714&quot;&gt;&lt;strong data-end=&quot;1723&quot; data-start=&quot;1714&quot;&gt;Sigue&lt;/strong&gt; con &lt;strong data-end=&quot;1746&quot; data-start=&quot;1728&quot;&gt;iText (Legacy)&lt;/strong&gt; por defecto (la rama histórica 4.x/iTextSharp). Si cambiás a &lt;strong data-end=&quot;1821&quot; data-start=&quot;1808&quot;&gt;iText 7/8&lt;/strong&gt;, aplica el mismo esquema &lt;strong data-end=&quot;1865&quot; data-start=&quot;1847&quot;&gt;AGPL/comercial&lt;/strong&gt;. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://dev-docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://dev-docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;dev-docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;2060&quot; data-start=&quot;1906&quot;&gt;
&lt;p data-end=&quot;2060&quot; data-start=&quot;1908&quot;&gt;Pista práctica: revisá la propiedad &lt;strong data-end=&quot;1969&quot; data-start=&quot;1944&quot;&gt;“PDF Reports Library”&lt;/strong&gt; en tu KB (por generador) antes de compilar/deployar. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2065&quot; data-start=&quot;2062&quot; /&gt;
&lt;h2 data-end=&quot;2104&quot; data-start=&quot;2067&quot;&gt;3) Qué conviene usar (en 2 líneas)&lt;/h2&gt;
&lt;ul data-end=&quot;2437&quot; data-start=&quot;2105&quot;&gt;
&lt;li data-end=&quot;2265&quot; data-start=&quot;2105&quot;&gt;
&lt;p data-end=&quot;2142&quot; data-start=&quot;2107&quot;&gt;&lt;strong data-end=&quot;2139&quot; data-start=&quot;2107&quot;&gt;Si no querés licenciar iText&lt;/strong&gt;:&lt;/p&gt;
&lt;ul data-end=&quot;2265&quot; data-start=&quot;2145&quot;&gt;
&lt;li data-end=&quot;2265&quot; data-start=&quot;2145&quot;&gt;
&lt;p data-end=&quot;2265&quot; data-start=&quot;2147&quot;&gt;&lt;strong data-end=&quot;2155&quot; data-start=&quot;2147&quot;&gt;Java&lt;/strong&gt; → &lt;strong data-end=&quot;2168&quot; data-start=&quot;2158&quot;&gt;PDFBox&lt;/strong&gt;.&lt;strong data-end=&quot;2178&quot; data-start=&quot;2170&quot;&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li data-end=&quot;2265&quot; data-start=&quot;2145&quot;&gt;&lt;p data-end=&quot;2265&quot; data-start=&quot;2147&quot;&gt;&lt;strong data-end=&quot;2178&quot; data-start=&quot;2170&quot;&gt;.NET&lt;/strong&gt; → evaluá &lt;strong data-end=&quot;2198&quot; data-start=&quot;2188&quot;&gt;PDFPig&lt;/strong&gt; (según tus necesidades). &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://sac.genexus.com/frontend.scmain.aspx?E%3B178%3B94%3B1264%3B1%3B1%3BO%3B%2C54060=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://sac.genexus.com/frontend.scmain.aspx?E%3B178%3B94%3B1264%3B1%3B1%3BO%3B%2C54060=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;sac.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2437&quot; data-start=&quot;2266&quot;&gt;
&lt;p data-end=&quot;2437&quot; data-start=&quot;2268&quot;&gt;&lt;strong data-end=&quot;2332&quot; data-start=&quot;2268&quot;&gt;Si necesitás features de iText 7/8 (pdfHTML, PDF/A/UA, etc.)&lt;/strong&gt; → &lt;strong data-end=&quot;2364&quot; data-start=&quot;2335&quot;&gt;comprá licencia comercial&lt;/strong&gt; o asegurá &lt;strong data-end=&quot;2396&quot; data-start=&quot;2375&quot;&gt;cumplimiento AGPL&lt;/strong&gt;. &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;kb.itextpdf.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2442&quot; data-start=&quot;2439&quot; /&gt;
&lt;h2 data-end=&quot;2498&quot; data-start=&quot;2444&quot;&gt;4) Caso real&amp;nbsp;&lt;/h2&gt;
&lt;h3&gt;&lt;b&gt;Caso Real: Demanda por el uso de iText sin Licencia&lt;/b&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;El riesgo de no pagar la licencia no es teórico. Ha habido varios casos de empresas demandadas por la empresa detrás de iText. Un caso que conozco involucró a una empresa en el extranjero que fue contactada por un representante de iText Group, la compañía desarrolladora. Después de un análisis del software de la empresa, los auditores de iText descubrieron que utilizaban la versión 5.x de la biblioteca en un producto comercial, sin haber adquirido la licencia comercial correspondiente.&lt;/p&gt;&lt;p&gt;La empresa recibió una carta de demanda exigiendo el pago de &lt;b&gt;royalties retroactivos&lt;/b&gt; por el uso no autorizado y una tarifa por la licencia futura, lo que resultó en un costo significativamente mayor que el precio original de la licencia. Estos casos demuestran que las empresas que desarrollan software &lt;b&gt;iText Group&lt;/b&gt; tienen equipos dedicados a la auditoría de licencias y no dudan en tomar acciones legales para proteger su propiedad intelectual.&lt;/p&gt;&lt;p&gt;La moraleja de la historia es clara: los costos y problemas legales de no cumplir con las licencias superan con creces el costo de adquirir una. Es fundamental auditar el software que se utiliza, especialmente las librerías de terceros, para evitar problemas que puedan poner en riesgo a tu empresa.&lt;/p&gt;

&lt;h3 data-end=&quot;3541&quot; data-start=&quot;3530&quot;&gt;Fuentes&lt;/h3&gt;
&lt;ul data-end=&quot;3846&quot; data-start=&quot;3542&quot;&gt;
&lt;li data-end=&quot;3631&quot; data-start=&quot;3542&quot;&gt;
&lt;p data-end=&quot;3631&quot; data-start=&quot;3544&quot;&gt;Cambio de licencia y línea histórica (iText): &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://kb.itextpdf.com/it5kb/can-itext-2-1-7-itextsharp-4-1-6-or-earlier-be-use?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;kb.itextpdf.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://itextpdf.com/sites/default/files/2018-12/Flyer_Licensing%20.pdf?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://itextpdf.com/sites/default/files/2018-12/Flyer_Licensing%20.pdf?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;iTextpdf&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3727&quot; data-start=&quot;3632&quot;&gt;
&lt;p data-end=&quot;3727&quot; data-start=&quot;3634&quot;&gt;Última versión LGPL/MPL en .NET (iTextSharp 4.1.6): &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://github.com/schourode/iTextSharp-LGPL?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://github.com/schourode/iTextSharp-LGPL?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://www.nuget.org/packages/iTextSharp-LGPL/?utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://www.nuget.org/packages/iTextSharp-LGPL/?utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;NuGet&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3846&quot; data-start=&quot;3728&quot;&gt;
&lt;p data-end=&quot;3846&quot; data-start=&quot;3730&quot;&gt;GeneXus “PDF Reports Library” (defaults y opciones por generador) + GX18 U4: &lt;span data-state=&quot;closed&quot;&gt;&lt;span class=&quot;ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]&quot; data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;a alt=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; class=&quot;flex h-4.5 overflow-hidden rounded-xl px-2 text-[9px] font-medium text-token-text-secondary! bg-[#F4F4F4]! dark:bg-[#303030]! transition-colors duration-150 ease-in-out&quot; href=&quot;https://docs.genexus.com/en/wiki?54844%2CPDF+Reports+Library+property=&amp;amp;utm_source=chatgpt.com&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;relative start-0 bottom-0 flex h-full w-full items-center&quot;&gt;docs.genexus.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/5301403735199238476/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/09/itext-genexus-riesgo-legal-de-su-uso.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5301403735199238476'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5301403735199238476'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/09/itext-genexus-riesgo-legal-de-su-uso.html' title='iText + GeneXus : riesgo legal de su uso sin licencia. '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-5235104490354865481</id><published>2025-08-18T10:09:00.004-03:00</published><updated>2025-08-18T10:09:51.100-03:00</updated><title type='text'>La próxima generación de plataformas de desarrollo empresarial basadas en IA</title><content type='html'>&lt;p&gt;
&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh27B6z0GYWaL-K-k6BMYljQgPpY4bsi8pDjND1MIDf2SZM450dBNzZYnyxJN_Il2uvQ9sDwu0BuehGAX7ZwDEN9FwT_x4SdDaE-8rCibML8-_zYxvx47ApfDn0Hdw5LtfIIbue2ePMGvU3yOC2n4QzAJyKbe1Yo70hNkSz8Qek9o5Kfezf-qTPjA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh27B6z0GYWaL-K-k6BMYljQgPpY4bsi8pDjND1MIDf2SZM450dBNzZYnyxJN_Il2uvQ9sDwu0BuehGAX7ZwDEN9FwT_x4SdDaE-8rCibML8-_zYxvx47ApfDn0Hdw5LtfIIbue2ePMGvU3yOC2n4QzAJyKbe1Yo70hNkSz8Qek9o5Kfezf-qTPjA&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Las plataformas actuales de desarrollo requieren que aprendamos su lenguaje: 
&lt;strong&gt;sintaxis, configuraciones, patrones específicos&lt;/strong&gt;.  
Pero… ¿qué pasaría si fuera la plataforma la que aprendiera a hablar el 
&lt;strong&gt;idioma empresarial&lt;/strong&gt;?
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
La próxima generación de plataformas de IA para desarrollo no solo generará código; 
también &lt;strong&gt;comprenderá, interpretará y traducirá el conocimiento de negocio 
en aplicaciones completas y funcionales&lt;/strong&gt;.
&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Problema actual&lt;/h2&gt;&lt;div&gt;Cuando nos llega un nuevo requerimiento que dice:&lt;/div&gt;

&lt;blockquote&gt;
“ La cuarta medida determina un régimen simplificado de importación en el que se beneficiará una exoneración total de tributos a la importación para determinados productos. 
Se crea un régimen especial de importación en el que los comercios minoristas, de ramos generales, ubicados a menos de 60 km de la frontera, podrán importar, libres de todo tributo, productos que componen la canasta básica ” (*)
&lt;/blockquote&gt;

&lt;p&gt;Esto se traduce en semanas de trabajo que incluyen:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Análisis legal y regulatorio&lt;/li&gt;
  &lt;li&gt;Interpretación compleja de marcos normativos&lt;/li&gt;
  &lt;li&gt;Modelado de datos geográficos y comerciales&lt;/li&gt;
  &lt;li&gt;Clasificación de importadores&lt;/li&gt;
  &lt;li&gt;Desarrollo de múltiples componentes de validación e ingreso de datos&lt;/li&gt;
  &lt;li&gt;Nuevos flujos de trabajo&lt;/li&gt;
  &lt;li&gt;Modificaciones e integración con sistemas aduaneros y tributarios&lt;/li&gt;
  &lt;li&gt;Pruebas exhaustivas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Está claro que las condiciones están dadas para que podamos ser 
&lt;strong&gt;más productivos&lt;/strong&gt; al traducir este tipo de requerimientos de alto nivel 
en aplicaciones ejecutables.
&lt;/p&gt;

&lt;p&gt;
Solo necesitamos una &lt;strong&gt;nueva generación de herramientas&lt;/strong&gt; que gestionen 
el ciclo de vida de las aplicaciones empresariales basadas en datos.
&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;¿Qué características deberán tener estas herramientas?&lt;/h2&gt;

&lt;p&gt;
Mi sueño es poder &lt;strong&gt;gestionar todo el ciclo de vida de una aplicación&lt;/strong&gt;, 
con un conjunto de herramientas que trabajen en conjunto e interactúen entre ellas 
para &lt;strong&gt;minimizar el trabajo humano y los errores&lt;/strong&gt;.
&lt;/p&gt;

&lt;h3&gt;1. Basado en modelos&lt;/h3&gt;

&lt;p&gt;
Todo el conocimiento de la aplicación debe almacenarse en un 
&lt;strong&gt;repositorio centralizado&lt;/strong&gt;, que funcione como modelo único.
&lt;/p&gt;

&lt;p&gt;Este repositorio debería incluir, como mínimo, información sobre:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Arquitectura&lt;/li&gt;
  &lt;li&gt;Plataforma y empaquetado&lt;/li&gt;
  &lt;li&gt;Requerimientos&lt;/li&gt;
  &lt;li&gt;Operaciones y manejo de incidentes&lt;/li&gt;
  &lt;li&gt;Seguridad&lt;/li&gt;
  &lt;li&gt;Analítica&lt;/li&gt;
  &lt;li&gt;Instalación&lt;/li&gt;
  &lt;li&gt;Observabilidad y monitoreo&lt;/li&gt;&lt;li&gt;Criterios de calidad verificables (pruebas, validaciones, reglas )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El repositorio debe:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Manejar &lt;strong&gt;versionado&lt;/strong&gt; y mantener un estado consistente.&lt;/li&gt;
  &lt;li&gt;Traducir los requerimientos en &lt;em&gt;lenguaje de negocio&lt;/em&gt; antes de integrarlos.&lt;/li&gt;
  &lt;li&gt;Resolver conflictos antes de aceptarlos.&lt;/li&gt;
  &lt;li&gt;Ser la &lt;strong&gt;fuente de la verdad&lt;/strong&gt; para todos los involucrados en el desarrollo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;2. Diferentes niveles de abstracción&lt;/h3&gt;

&lt;p&gt;
Las herramientas deberán permitir trabajar en distintos niveles:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Aplicación completa&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Módulo&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Programa/Pantalla&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Ejemplo:  
&lt;br /&gt;✔ Para ciertos componentes bastará con definir: 
&lt;em&gt;“Altas, bajas y modificaciones de ciudades”,&amp;nbsp; y&lt;/em&gt; de ahi se puden deducir los atributos de la entidad Ciudades, que va a tener un API REST para interacturar con las ciudades deduciendo esto de reglas mas generales.&amp;nbsp;&lt;br /&gt;✔ Pero en productos de importación se necesitará más detalle: indicar si están en la canasta básica, si cuentan con exoneraciones, e incluso definir el diseño de las pantallas.
&lt;/p&gt;

&lt;h3&gt;3. Lenguajes específicos&lt;/h3&gt;

&lt;p&gt;
El &lt;strong&gt;lenguaje natural&lt;/strong&gt; es impreciso y ambiguo.  
Por eso, se necesitarán &lt;strong&gt;traductores&lt;/strong&gt; hacia lenguajes estructurados, 
que puedan ser interpretados de forma determinística.
&lt;/p&gt;

&lt;p&gt;Se requerirán lenguajes para:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Arquitectura de la aplicación&lt;/li&gt;
  &lt;li&gt;Almacenamiento de datos&lt;/li&gt;
  &lt;li&gt;Empaquetado e instalación&lt;/li&gt;
  &lt;li&gt;Analítica de datos (qué medir, qué mostrar, cómo visualizarlo)&lt;/li&gt;
  &lt;li&gt;ML/AI (qué partes del sistema deben aprender y adaptarse)&lt;/li&gt;
  &lt;li&gt;Referencias y relaciones entre entidades/módulos/requerimientos (grafos con tipos y pesos)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
En estos lenguajes, por ejemplo, se podrá describir 
&lt;strong&gt;qué mostrar y qué acciones realizar en una pantalla&lt;/strong&gt;, 
sin preocuparse por la estética.
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;3. Diferentes contenidos.&amp;nbsp;&lt;/h3&gt;&lt;div&gt;Los requerimientos podrán venir de diferentes formas y formatos. Podrán ser transcripciones de&amp;nbsp; reuniones o entrevistas, videos, audios, pruebas, reportes de errores, imagenes, dibujos, diagramas. Historias de usuario, etc. Todo deberá ser traducido a requerimientos y en lo posible incorporado al repositorio. Estos artefactos deberán ser almacenados como la fuente de requerimientos y deberá poder rastrearse un requerimiento como y porque fue introducido al sistema.&amp;nbsp;&lt;/div&gt;&lt;h2&gt;¿Cómo sería el desarrollo con estas herramientas?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;El usuario ingresa un nuevo requerimiento.&lt;/li&gt;
  &lt;li&gt;El sistema lo &lt;strong&gt;traduce y elimina ambigüedades&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Se clasifican los requerimientos concretos y se presentan al usuario.&lt;/li&gt;
  &lt;li&gt;Si falta información, el sistema propone o solicita aclaraciones.&lt;/li&gt;
  &lt;li&gt;Se mide el impacto en el &lt;strong&gt;repositorio central&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;El usuario aprueba o rechaza la integración.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Además, existiría un &lt;strong&gt;repositorio de componentes prearmados&lt;/strong&gt;, reutilizables en diferentes secciones de la aplicación.
&lt;/p&gt;

&lt;p&gt;Entre los componentes se incluirían:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Patrones de diseño&lt;/strong&gt; (Work With, MVC, etc.)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Design System&lt;/strong&gt; (estilo y diseño centralizados)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Herramientas de terceros&lt;/strong&gt; (vía APIs)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Controles de usuario&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Otros proyectos ya desarrollados con IA&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2&gt;Conclusión&lt;/h2&gt;

&lt;p&gt;
Aún falta camino por recorrer, pero la industria ya está invirtiendo 
&lt;strong&gt;grandes recursos&lt;/strong&gt; en transformar la forma en que desarrollamos software.
&lt;/p&gt;

&lt;p&gt;
Estamos en el mejor momento para imaginar cómo queremos que sea la 
&lt;strong&gt;próxima generación de herramientas de desarrollo&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Quienes lo logren tendrán un futuro brillante.  
Y en un futuro más lejano, quizás tengamos 
&lt;strong&gt;intérpretes directos del modelo de la aplicación&lt;/strong&gt;, 
haciendo innecesaria la etapa de generación de código.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;(*) Cualquier parecido con la realidad es mera coincidencia.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/5235104490354865481/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/08/la-proxima-generacion-de-plataformas-de.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5235104490354865481'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5235104490354865481'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/08/la-proxima-generacion-de-plataformas-de.html' title='La próxima generación de plataformas de desarrollo empresarial basadas en IA'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEh27B6z0GYWaL-K-k6BMYljQgPpY4bsi8pDjND1MIDf2SZM450dBNzZYnyxJN_Il2uvQ9sDwu0BuehGAX7ZwDEN9FwT_x4SdDaE-8rCibML8-_zYxvx47ApfDn0Hdw5LtfIIbue2ePMGvU3yOC2n4QzAJyKbe1Yo70hNkSz8Qek9o5Kfezf-qTPjA=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-3332158221054381669</id><published>2025-08-09T22:54:00.004-03:00</published><updated>2025-08-09T22:54:52.623-03:00</updated><title type='text'>Cómo manejar Slow Changing Dimensions (SCD) en GeneXus — Ejemplo práctico con Ventas y Clientes</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: Roboto;&quot;&gt;Este es un problema básico en el modelado de sistemas y bases de datos, pero es el causante de algunos inconvenientes en el momento de hacer reportes.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Roboto;&quot;&gt;En muchos casos, se decide modelar el modelo operacional de la forma fácil (SCD Tipo 1) y en la plataforma de BI se mantiene la historia con SCD Tipo 2. **&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;section id=&quot;problema&quot; style=&quot;color: #222222; font-family: system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;&quot;&gt;&lt;h2 style=&quot;line-height: 1.25; margin-top: 2rem;&quot;&gt;El problema&lt;/h2&gt;&lt;p&gt;Tenemos tres entidades:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Clientes&lt;/strong&gt;:&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;ClienteId&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;ClienteNombre&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;TipoClienteId&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ventas&lt;/strong&gt;:&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;VentaId&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;ClienteId&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;Fecha&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;Monto&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;TipoCliente&lt;/strong&gt;:&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;TipoClienteId&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;TipoClienteNombre&lt;/code&gt;&amp;nbsp;(Grande, Mediano, Chico).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;El sistema debe brindar el reporte de Ventas por Tipo de Cliente, para un rango de fechas&lt;br /&gt;&lt;br /&gt;TipoCliente, Total Vendido&lt;br /&gt;Grande&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1000&lt;br /&gt;Mediano&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;700&lt;br /&gt;Chico&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1200&lt;br /&gt;&lt;br /&gt;Un dia, un cliente pasa de&amp;nbsp;&lt;strong&gt;Mediano&lt;/strong&gt;&amp;nbsp;a&amp;nbsp;&lt;strong&gt;Grande&lt;/strong&gt;. Si el reporte “Ventas por Tipo de Cliente” junta las ventas con el tipo actual del cliente, entonces todas sus ventas históricas podrían aparecer como “Grande”, incluso las realizadas cuando era “Mediano”. Resultado:&amp;nbsp;&lt;strong&gt;histórico inconsistente&lt;/strong&gt;.&lt;/div&gt;&lt;div class=&quot;callout&quot; style=&quot;background: rgb(245, 247, 251); border-left: 4px solid rgb(136, 146, 191); margin: 1rem 0px; padding: 0.75rem 1rem;&quot;&gt;&lt;strong&gt;Señal de alerta:&lt;/strong&gt;&amp;nbsp;si tus sumatorias por categoría “se mueven” en el tiempo sin que cambien las ventas, probablemente estés usando&amp;nbsp;&lt;em&gt;solo&lt;/em&gt;&amp;nbsp;el estado actual de la dimensión.&lt;/div&gt;&lt;/section&gt;&lt;section id=&quot;scd1&quot; style=&quot;color: #222222; font-family: system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;&quot;&gt;&lt;h2 style=&quot;line-height: 1.25; margin-top: 2rem;&quot;&gt;SCD Tipo 1 — Sobrescritura (sin histórico)&lt;/h2&gt;&lt;p&gt;Se actualiza el registro de&amp;nbsp;&lt;em&gt;Cliente&lt;/em&gt;&amp;nbsp;con el nuevo&amp;nbsp;&lt;em&gt;TipoClienteId&lt;/em&gt;. Las consultas siempre ven el estado actual.&lt;/p&gt;&lt;figure style=&quot;margin: 1.5rem 0px;&quot;&gt;&lt;img alt=&quot;Diagrama SCD Tipo 1: Sobrescritura&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgbwwdylV2zfIdgHlP8FjQ1K5sC5NOLsHrLFHdBcRef0K-N0oRkNeap8CZNTbBobrhSarBgHCOtglV7jaMPPVYIlWp4Kdi4yztHn2vRk8-PovKuDuUitHfbzISmQMJnls9_bxWxPWrCBgGZQ5-GQ5p6j3v8mNumb0QgBecowKNpetUceZ3wLPX-pA&quot; style=&quot;display: block; height: auto; margin: 0px auto; max-width: 100%;&quot; /&gt;&lt;figcaption style=&quot;color: #555555; font-size: 0.95rem; margin-top: 0.5rem; text-align: center;&quot;&gt;El JOIN por&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;ClienteId&lt;/code&gt;&amp;nbsp;usa el tipo actual; el pasado queda sobrescrito.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h3 style=&quot;line-height: 1.25;&quot;&gt;Ventajas&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Implementación simple.&lt;/li&gt;&lt;li&gt;No cambia el modelo físico.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;line-height: 1.25;&quot;&gt;Desventajas&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Pierde histórico: reportes del pasado se recalculan con el estado actual.&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;section id=&quot;scd2&quot; style=&quot;color: #222222; font-family: system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;&quot;&gt;&lt;h2 style=&quot;line-height: 1.25; margin-top: 2rem;&quot;&gt;SCD Tipo 2 — Histórico con versiones por rango de fechas&lt;/h2&gt;&lt;p&gt;Se mantienen&amp;nbsp;&lt;strong&gt;múltiples filas&lt;/strong&gt;&amp;nbsp;para el mismo&amp;nbsp;&lt;em&gt;Cliente&lt;/em&gt;, con&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;FechaInicio&lt;/code&gt;,&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;FechaFin&lt;/code&gt;&amp;nbsp;y un flag&amp;nbsp;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;EsRegistroActivo&lt;/code&gt;. Cada venta se asocia a la versión válida en su fecha.&lt;/p&gt;&lt;figure style=&quot;margin: 1.5rem 0px;&quot;&gt;&lt;img alt=&quot;Diagrama SCD Tipo 2: Histórico por rango de fechas&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiqGj7EpDuLYokEkg8OOy4eqXhIVaDjWmA2VMiz6Ey3zdR_DcOXLJbvB1xvKr0ODYVs9rNtDQ2ALNOqIUpIDCQFUOyaQ4xXVSnARedKHaerWNngrQlqrtKZ_KnwXyaUOeTDup-MCIOo521vMBPOEHZqbdDq6zczkqjN8HjR2zDknslzajTzDMvH9A&quot; style=&quot;display: block; height: auto; margin: 0px auto; max-width: 100%;&quot; /&gt;&lt;figcaption style=&quot;color: #555555; font-size: 0.95rem; margin-top: 0.5rem; text-align: center;&quot;&gt;Cada versión del cliente tiene validez. Las ventas se unen a la versión vigente en la fecha de la venta.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h3 style=&quot;line-height: 1.25;&quot;&gt;Estructura de la dimensión&lt;/h3&gt;&lt;pre style=&quot;background: rgb(15, 23, 42); border-radius: 6px; color: #e5e7eb; font-size: 0.95rem; overflow: auto; padding: 1rem;&quot;&gt;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;// Tabla Cliente (Dimensión historificada)
ClienteId*         // Negocio
ClienteSK*         // (opcional) surrogate key interno
ClienteNombre
TipoClienteId
FechaInicio        // DATETIME
FechaFin           // DATETIME (NULL = vigente)
EsRegistroActivo   // boolean&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&quot;line-height: 1.25;&quot;&gt;Proceso de cambio (ETL/Procedure GX)&lt;/h3&gt;&lt;pre style=&quot;background: rgb(15, 23, 42); border-radius: 6px; color: #e5e7eb; font-size: 0.95rem; overflow: auto; padding: 1rem;&quot;&gt;&lt;code style=&quot;font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace;&quot;&gt;// Pseudocódigo GeneXus para cerrar versión y abrir una nueva
&amp;amp;hoy = now()
for each Cliente
   where ClienteId = &amp;amp;ClienteId
   where EsRegistroActivo
      Cliente.FechaFin = &amp;amp;hoy
      Cliente.EsRegistroActivo = False
      update
endfor

new Cliente
   ClienteId        = &amp;amp;ClienteId
   ClienteNombre    = &amp;amp;ClienteNombre
   TipoClienteId    = &amp;amp;NuevoTipoClienteId
   FechaInicio      = &amp;amp;hoy
   FechaFin         = null
   EsRegistroActivo = True
endnew&lt;/code&gt;;&lt;/pre&gt;&lt;h3 style=&quot;line-height: 1.25;&quot;&gt;Ventajas&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Preserva histórico completo y consistente.&lt;/li&gt;&lt;li&gt;Permite “as of date”.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;line-height: 1.25;&quot;&gt;Desventajas&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Mayor complejidad de carga y mantenimiento.&lt;/li&gt;&lt;li&gt;Más filas en la dimensión y joins con rangos de fechas.&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;section id=&quot;comparativa&quot; style=&quot;color: #222222; font-family: system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;&quot;&gt;&lt;h2 style=&quot;line-height: 1.25; margin-top: 2rem;&quot;&gt;Comparativa rápida&lt;/h2&gt;&lt;table style=&quot;border-collapse: collapse; margin: 1rem 0px; width: 900px;&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;background: rgb(250, 250, 250); border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Modelo&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/th&gt;&lt;th style=&quot;background: rgb(250, 250, 250); border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Cuándo usar&lt;/th&gt;&lt;th style=&quot;background: rgb(250, 250, 250); border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Ventajas&lt;/th&gt;&lt;th style=&quot;background: rgb(250, 250, 250); border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Desventajas&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;&lt;strong&gt;SCD Tipo1&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Cuando no importa el histórico.&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Muy simple, sin cambios en modelo.&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Pierde historia; reportes pueden “moverse”.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;&lt;strong&gt;SCD Tipo2&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Cuando el histórico es crítico (ej. ventas por tipo en el tiempo).&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Histórico consistente; “as of date”.&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;Carga/ETL más compleja; join por rango de fechas.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(221, 221, 221); padding: 0.6rem; vertical-align: top;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section id=&quot;conclusion&quot; style=&quot;color: #222222; font-family: system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;&quot;&gt;&lt;h2 style=&quot;line-height: 1.25; margin-top: 2rem;&quot;&gt;Conclusión&lt;/h2&gt;&lt;p&gt;Define el manejo de SCD antes de publicar reportes. Si tu informe “Ventas por Tipo de Cliente” debe reflejar el estado correcto en cada fecha, el enfoque recomendado es&amp;nbsp;&lt;strong&gt;SCD Tipo 2&lt;/strong&gt;. Para escenarios simples o sin necesidad de histórico,&amp;nbsp;&lt;strong&gt;Tipo 1&lt;/strong&gt;&amp;nbsp;puede bastar.&lt;/p&gt;&lt;div class=&quot;callout&quot; style=&quot;background: rgb(245, 247, 251); border-left: 4px solid rgb(136, 146, 191); margin: 1rem 0px; padding: 0.75rem 1rem;&quot;&gt;&lt;strong&gt;Tip GeneXus:&lt;/strong&gt;&amp;nbsp;puedes resolver SCD2 en la capa de ETL/Procedures (actualizando la dimensión) y consumirla desde Data Providers, garantizando que cada&amp;nbsp;&lt;em&gt;hecho&lt;/em&gt;&amp;nbsp;apunte a la versión válida en su fecha. Se pueden usar atributos formulas con find() para ir a buscar el TipoCliente correcto en cada fecha.&amp;nbsp;&lt;/div&gt;&lt;/section&gt;&lt;footer class=&quot;footer&quot; style=&quot;color: #666666; font-family: system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif; font-size: 0.9rem; margin-top: 2rem;&quot;&gt;&lt;p&gt;**&amp;nbsp;&lt;span style=&quot;color: black; font-family: Roboto; font-size: medium;&quot;&gt;Tambien se puede modelar almacenando el TipoCliente en la tabla de Hechos (Ventas) para reflejar que la venta fue realizada a un cliente de ese tipo. Usa mas espacio y se justifica cuando con el TipoCliente se pueden definir otras cosas como descuentos y precios negociados.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/footer&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/3332158221054381669/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/08/como-manejar-slow-changing-dimensions.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3332158221054381669'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3332158221054381669'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/08/como-manejar-slow-changing-dimensions.html' title='Cómo manejar Slow Changing Dimensions (SCD) en GeneXus — Ejemplo práctico con Ventas y Clientes'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgbwwdylV2zfIdgHlP8FjQ1K5sC5NOLsHrLFHdBcRef0K-N0oRkNeap8CZNTbBobrhSarBgHCOtglV7jaMPPVYIlWp4Kdi4yztHn2vRk8-PovKuDuUitHfbzISmQMJnls9_bxWxPWrCBgGZQ5-GQ5p6j3v8mNumb0QgBecowKNpetUceZ3wLPX-pA=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-3016802793453088766</id><published>2025-07-30T11:42:00.001-03:00</published><updated>2025-07-30T11:42:28.050-03:00</updated><title type='text'>Extensiones/Asistentes en GeneXus que me gustaría tener </title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgiBl0xlYQzDxz1UZBuFs7dSMvVk0PXbBWDAFN5FchQ0wev60k9NlJLNC1vIv9rbIYXkMABSl46zudGyAPc5hJGXVlgSv1wJ51GyJ-4OxW9OS44dmtxycgbHpqKlSz6Mhy0OrhIwWDE7qQ1XQxTQG9IoyznGoblSorf-94qthCV-w-lmS2n6cnI0Q&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;266&quot; data-original-width=&quot;250&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgiBl0xlYQzDxz1UZBuFs7dSMvVk0PXbBWDAFN5FchQ0wev60k9NlJLNC1vIv9rbIYXkMABSl46zudGyAPc5hJGXVlgSv1wJ51GyJ-4OxW9OS44dmtxycgbHpqKlSz6Mhy0OrhIwWDE7qQ1XQxTQG9IoyznGoblSorf-94qthCV-w-lmS2n6cnI0Q&quot; width=&quot;226&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;br /&gt;Se viene una nueva versión de GeneXus, que es la primera en incorporar inteligencia artificial en el IDE.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Esto nos abre la posibilidad de tener nuevos asistentes dentro del ide que nos automaticen tareas que en general son aburridas de hacer.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Algunos ejemplos de tareas que llevan mucho tiempo y podrían automatizarse&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Analizador de Errores de Compilación&amp;nbsp;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Un programa que lea el output de Genexus con errores y proponga soluciones. Muchas veces Genexus tiene errores que se solucionan mandando a especificar forzado algún objeto. Lo que me interesa principalmente es deducir cuales son los objetos que deben forzarse y que los genere automáticamente.&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Generar Scripts de CREATE TABLE&lt;/h3&gt;&lt;p&gt;Dada una tabla, crear un script para crear dicha tabla.&amp;nbsp;&lt;br /&gt;Es común tener que elegir un conjunto de tablas para hacer alguna prueba. Genexus es muy bueno para generar scripts de creación de toda la base de datos para los diferentes DBMS. Pero no es tan bueno para generar solo algunas tablas.&amp;nbsp;&lt;br /&gt;Me gustaría contar con un asistente que le pueda dar un conjunto de tablas y genere los scripts de creación de dicha tabla.&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Generar programas para cargar datos.&amp;nbsp;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Tengo una tabla en el ambiente de desarrollo con datos y quiero pasar esa tabla con datos a otro ambiente.&amp;nbsp;&lt;br /&gt;Lo que me interesa es dada una tabla, que ya tiene datos en la base de datos, generar un programa GX que cargue dicha tabla al ejecutar.&amp;nbsp;&lt;br /&gt;Esto puede hacerse con un script SQL (si me mantengo en la misma base de datos) o con un Procedure GX&amp;nbsp; que permite hacerlo para múltiples environments.&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Adaptador de ambientes de ejecución&lt;/h3&gt;&lt;p&gt;Me gustaría contar con una herramienta que analice todo lo que voy a llevar a producción&amp;nbsp; con un DEPLOY y me pregunte cuales son los valores nuevos que tendrán en producción.&amp;nbsp;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Connection String para la base de datos&lt;/li&gt;&lt;li&gt;Cache&lt;/li&gt;&lt;li&gt;Proxy&lt;/li&gt;&lt;li&gt;Observability&lt;/li&gt;&lt;li&gt;Session&lt;/li&gt;&lt;li&gt;Locations de servicios consumidos&lt;/li&gt;&lt;li&gt;Variables de ambiente&lt;/li&gt;&lt;li&gt;Secretos necesarios&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Package ALL&lt;/h3&gt;&lt;div&gt;Tener una herramienta que permita ejecutar las tareas de Package de la aplicación, tomando todas las Deployment Units y empaquetando la solución para un ambiente determinado. Opcionalmente podría hacer el deploy de la aplicación en el ambiente de ejecución.&amp;nbsp;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Comparador de navegaciones&lt;/h3&gt;&lt;div&gt;Tener un comparador de navegaciones&amp;nbsp; integrado con el IDE que permita comparar navegaciones de versiones anteriores de Genexus con las mas nuevas. Que detecte los objetos que hayan modificado la navegación al especificalo y que clasifique las diferencias como Grandes, Medianas, Chicas y permitir que el desarrollador revise las mas graves.&amp;nbsp;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;GX-Linter&lt;/h3&gt;&lt;div&gt;Tener un mecanismo de analizar código al salvar o al hacer un build all, que permita analizar los objetos modificados y marcar diferentes errores potenciales o estilos de código que son mejorables.&lt;br /&gt;Por ejemplo se puede chequear&lt;br /&gt;&lt;br /&gt;* Uso de Atributos que no están en ninguna tabla&lt;br /&gt;* Código repetido&lt;br /&gt;* Código comentado&lt;br /&gt;* Variable definida pero no usada&lt;br /&gt;* Eventos no usados&lt;br /&gt;* Codigo demasiado largo&lt;br /&gt;* Codigo demasiado complejo&lt;br /&gt;* Lógica de negocio, en eventos de programas con UI&lt;br /&gt;* Formulas complejas&lt;br /&gt;* For each potencialmente lentos&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Mejoras en la modularizacon&lt;br /&gt;* Variables no basadas en atributos / dominios&lt;/div&gt;&lt;div&gt;* Atributos no basados en dominios&lt;br /&gt;* Descripciones incompletas de objetos&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/3016802793453088766/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/07/extensionesasistentes-en-genexus-que-me.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3016802793453088766'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3016802793453088766'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/07/extensionesasistentes-en-genexus-que-me.html' title='Extensiones/Asistentes en GeneXus que me gustaría tener '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgiBl0xlYQzDxz1UZBuFs7dSMvVk0PXbBWDAFN5FchQ0wev60k9NlJLNC1vIv9rbIYXkMABSl46zudGyAPc5hJGXVlgSv1wJ51GyJ-4OxW9OS44dmtxycgbHpqKlSz6Mhy0OrhIwWDE7qQ1XQxTQG9IoyznGoblSorf-94qthCV-w-lmS2n6cnI0Q=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-3550598975392065398</id><published>2025-07-30T10:16:00.002-03:00</published><updated>2025-07-30T10:16:24.849-03:00</updated><title type='text'> Por qué es clave actualizar tu versión de GeneXus (aunque duela un poco)</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhHuN6GKl9vu8P3lXWqMyPIfeR1-GE9Lq_jTFZetg_rgDbguxyFpL7lO_Opu6KSnjoe28RRqVhFZqnURvWm5TnwivD_T7POWmWVrw9UgGecbCUAOfkge_Tns_mzCaBRk2sALKrvJRN3JGL8E_h66QIDWKup5M7_5Mf8YENkpvn4FXsNmaZwgMOs4w&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;850&quot; data-original-width=&quot;1500&quot; height=&quot;181&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhHuN6GKl9vu8P3lXWqMyPIfeR1-GE9Lq_jTFZetg_rgDbguxyFpL7lO_Opu6KSnjoe28RRqVhFZqnURvWm5TnwivD_T7POWmWVrw9UgGecbCUAOfkge_Tns_mzCaBRk2sALKrvJRN3JGL8E_h66QIDWKup5M7_5Mf8YENkpvn4FXsNmaZwgMOs4w&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;En el mundo del desarrollo con GeneXus, trabajar con una versión antigua puede parecer cómodo, pero a la larga es una trampa silenciosa. Las migraciones o actualizaciones de versión no son solo una cuestión técnica: son una decisión estratégica que impacta en productividad, seguridad, mantenimiento y evolución del software.&lt;p&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;635&quot; data-start=&quot;600&quot;&gt;&amp;nbsp;¿Por qué actualizar GeneXus?&lt;/h3&gt;
&lt;ol data-end=&quot;1674&quot; data-start=&quot;637&quot;&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;637&quot;&gt;
&lt;p data-end=&quot;937&quot; data-start=&quot;640&quot;&gt;&lt;strong data-end=&quot;670&quot; data-start=&quot;640&quot;&gt;Seguridad y compatibilidad&lt;/strong&gt;&lt;br data-end=&quot;673&quot; data-start=&quot;670&quot; /&gt;
Cada nueva versión de GeneXus mejora el soporte para tecnologías modernas, navegadores actualizados, motores de base de datos y protocolos de seguridad (como OAuth, HTTPS, JWT). Seguir en versiones antiguas te expone a vulnerabilidades y dependencias obsoletas.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1198&quot; data-start=&quot;939&quot;&gt;
&lt;p data-end=&quot;1198&quot; data-start=&quot;942&quot;&gt;&lt;strong data-end=&quot;984&quot; data-start=&quot;942&quot;&gt;Mejoras de performance y productividad&lt;/strong&gt;&lt;br data-end=&quot;987&quot; data-start=&quot;984&quot; /&gt;
Desde nuevas estructuras como SD Panels hasta herramientas como los Design Systems, la evolución de GeneXus no solo permite hacer más, sino hacerlo mejor y más rápido. Ignorarlo es perder ventaja competitiva.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1449&quot; data-start=&quot;1200&quot;&gt;
&lt;p data-end=&quot;1449&quot; data-start=&quot;1203&quot;&gt;&lt;strong data-end=&quot;1241&quot; data-start=&quot;1203&quot;&gt;Soporte oficial y comunidad activa&lt;/strong&gt;&lt;br data-end=&quot;1244&quot; data-start=&quot;1241&quot; /&gt;
Las versiones antiguas eventualmente quedan sin soporte. Esto significa que ante un error crítico, quedas solo. Además, la comunidad y la documentación se centran cada vez más en las versiones actuales.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1674&quot; data-start=&quot;1451&quot;&gt;
&lt;p data-end=&quot;1674&quot; data-start=&quot;1454&quot;&gt;&lt;strong data-end=&quot;1506&quot; data-start=&quot;1454&quot;&gt;Preparación para la IA y asistentes inteligentes&lt;/strong&gt;&lt;br data-end=&quot;1509&quot; data-start=&quot;1506&quot; /&gt;
Las últimas versiones integran capacidades de automatización, testing asistido y generación de código mejorado, abriendo la puerta al desarrollo aumentado con IA.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1679&quot; data-start=&quot;1676&quot; /&gt;
&lt;h3 data-end=&quot;1722&quot; data-start=&quot;1681&quot;&gt;&amp;nbsp;Principales dificultades al migrar&lt;/h3&gt;
&lt;ol data-end=&quot;2567&quot; data-start=&quot;1724&quot;&gt;
&lt;li data-end=&quot;1967&quot; data-start=&quot;1724&quot;&gt;
&lt;p data-end=&quot;1967&quot; data-start=&quot;1727&quot;&gt;&lt;strong data-end=&quot;1768&quot; data-start=&quot;1727&quot;&gt;Dependencias con tecnologías antiguas&lt;/strong&gt;&lt;br data-end=&quot;1771&quot; data-start=&quot;1768&quot; /&gt;
Muchos sistemas heredados están ligados a plataformas como RPG, Win o WebForms. Migrar a Java, .NET Core o Angular implica revisar todo: desde la arquitectura hasta los procedimientos internos.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2160&quot; data-start=&quot;1969&quot;&gt;
&lt;p data-end=&quot;2160&quot; data-start=&quot;1972&quot;&gt;&lt;strong data-end=&quot;2009&quot; data-start=&quot;1972&quot;&gt;Cambios en el modelo de ejecución&lt;/strong&gt;&lt;br data-end=&quot;2012&quot; data-start=&quot;2009&quot; /&gt;
El paso de aplicaciones stateful (Win) a aplicaciones stateless (Web) obliga a replantear la gestión del estado, sesiones y llamadas encadenadas.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2356&quot; data-start=&quot;2162&quot;&gt;
&lt;p data-end=&quot;2356&quot; data-start=&quot;2165&quot;&gt;&lt;strong data-end=&quot;2209&quot; data-start=&quot;2165&quot;&gt;Requiere tiempo, planificación y pruebas&lt;/strong&gt;&lt;br data-end=&quot;2212&quot; data-start=&quot;2209&quot; /&gt;
Migrar no es apretar un botón. Requiere planificación, análisis de impacto, adaptación de código y mucho testing. Es un proyecto en sí mismo.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2567&quot; data-start=&quot;2358&quot;&gt;
&lt;p data-end=&quot;2567&quot; data-start=&quot;2361&quot;&gt;&lt;strong data-end=&quot;2404&quot; data-start=&quot;2361&quot;&gt;Adaptación de los equipos de desarrollo&lt;/strong&gt;&lt;br data-end=&quot;2407&quot; data-start=&quot;2404&quot; /&gt;
Nuevas versiones traen nuevos conceptos. Si el equipo no se capacita, la migración puede estancarse o generar soluciones forzadas que terminan siendo peores.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2572&quot; data-start=&quot;2569&quot; /&gt;
&lt;h3 data-end=&quot;2596&quot; data-start=&quot;2574&quot;&gt;&amp;nbsp;Recomendaciones&lt;/h3&gt;
&lt;ul data-end=&quot;2933&quot; data-start=&quot;2598&quot;&gt;
&lt;li data-end=&quot;2680&quot; data-start=&quot;2598&quot;&gt;
&lt;p data-end=&quot;2680&quot; data-start=&quot;2600&quot;&gt;Haz primero una &lt;strong data-end=&quot;2638&quot; data-start=&quot;2616&quot;&gt;prueba de concepto&lt;/strong&gt; con una parte representativa del sistema.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2762&quot; data-start=&quot;2681&quot;&gt;
&lt;p data-end=&quot;2762&quot; data-start=&quot;2683&quot;&gt;Documenta las &lt;strong data-end=&quot;2725&quot; data-start=&quot;2697&quot;&gt;dificultades encontradas&lt;/strong&gt; y las &lt;strong data-end=&quot;2761&quot; data-start=&quot;2732&quot;&gt;estrategias de mitigación&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2812&quot; data-start=&quot;2763&quot;&gt;
&lt;p data-end=&quot;2812&quot; data-start=&quot;2765&quot;&gt;Simplifica la KB si es posible antes de migrar, borrando todo lo que no se usa.&amp;nbsp; Medir cuantos objetos hay que migrar e indicadores claves (cantidad de lineas de codigo, cantidad de reglas, cantidad de controles en pantalla, cantidad de parámetros, etc) para identificar los programas mas propensos a tener diferencias en la migracion.&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2933&quot; data-start=&quot;2813&quot;&gt;
&lt;p data-end=&quot;2933&quot; data-start=&quot;2815&quot;&gt;Usa herramientas automáticas de GeneXus, pero &lt;strong data-end=&quot;2886&quot; data-start=&quot;2861&quot;&gt;no te fíes ciegamente&lt;/strong&gt;: revisa manualmente los comportamientos clave.&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2938&quot; data-start=&quot;2935&quot; /&gt;
&lt;p data-end=&quot;2998&quot; data-start=&quot;2940&quot;&gt;Migrar duele. Pero no migrar, tarde o temprano, duele más.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/3550598975392065398/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/07/por-que-es-clave-actualizar-tu-version.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3550598975392065398'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/3550598975392065398'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/07/por-que-es-clave-actualizar-tu-version.html' title=' Por qué es clave actualizar tu versión de GeneXus (aunque duela un poco)'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhHuN6GKl9vu8P3lXWqMyPIfeR1-GE9Lq_jTFZetg_rgDbguxyFpL7lO_Opu6KSnjoe28RRqVhFZqnURvWm5TnwivD_T7POWmWVrw9UgGecbCUAOfkge_Tns_mzCaBRk2sALKrvJRN3JGL8E_h66QIDWKup5M7_5Mf8YENkpvn4FXsNmaZwgMOs4w=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-6944545715054888696</id><published>2025-07-24T12:04:00.000-03:00</published><updated>2025-07-24T12:04:02.090-03:00</updated><title type='text'>Envío y Recepción de Emails con OAuth desde GeneXus (Gmail / Office 365)</title><content type='html'>&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;Con el aumento de las medidas de seguridad en servicios como Gmail y Office 365, el uso de usuario/contraseña para enviar correos electrónicos dejó de ser una opción viable. Actualmente, &lt;strong&gt;OAuth 2.0&lt;/strong&gt; es el estándar para autorizar el acceso a estos servicios. En este post, te muestro cómo integrarlo con &lt;strong&gt;GeneXus&lt;/strong&gt; para enviar y recibir correos de forma segura.&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;Por un tiempo funciono correctamente el generar &quot;application specific passwords&quot; generando y registrando dichas contraseñas, pero estan dejando de funcionar y ya no es tan facil llegar a generar nuevas contraseñas. Por eso, es importante actualizar las aplicationes que necesiten enviar o recibir mail con estos proveedores para que usen OAuth 2.0.&amp;nbsp;&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;Para esto, se necesita usar el &lt;a href=&quot;https://wiki.genexus.com/commwiki/wiki?50438,OAuth+Module&quot;&gt;OAuth Module&lt;/a&gt;,&amp;nbsp; y programar algo asi:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;      &amp;amp;Success&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; = OAuth.v2.RefreshToken(&lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;OAuthAuthorizationConfig&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;RefreshToken&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;,                    &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;OAuthAccessToken&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;DateTimeTokenExpire&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;Messages&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;)

   &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: #a90d91; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; (NOT &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;Success&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;)
      Log.&lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: #a90d91; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;Messages&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;)
      &lt;/span&gt;&lt;span class=&quot;hljs-literal&quot; style=&quot;box-sizing: border-box; color: #eb8500; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: #a90d91; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;   &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;AccessTokenString&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;OAuthAccessToken&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.access_token
   &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Host = &lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: #007400; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&#39;smtp.gmail.com&#39;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; 
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Port = &lt;/span&gt;&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: border-box; color: #eb8500; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;465&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; 
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Timeout = &lt;/span&gt;&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: border-box; color: #eb8500; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; 
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Secure = &lt;/span&gt;&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: border-box; color: #eb8500; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; 
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Authentication = &lt;/span&gt;&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: border-box; color: #eb8500; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.UserName = &lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: #007400; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&#39;Info@gmail.com&#39;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Password = &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;AccessTokenString&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.AuthenticationMethod = &lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: #007400; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&quot;XOAUTH2&quot;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;  
   &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Login()

&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;MailMessage&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Subject=&lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: #007400; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&quot;Email Subject&quot;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;MailMessage&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Text=&lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: #007400; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&quot;Message body&quot;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;nbsp;

   &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;MailRecipient&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Address = &lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: #007400; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&quot;xxx@gmail.com&quot;&lt;/span&gt;&lt;span style=&quot;font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #404040;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt; &amp;nbsp; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;background-color: white; box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #404040;&quot;&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;MailRecipient&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Name = &lt;/span&gt;&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: #007400; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&quot;xxx&quot;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;   &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;MailMessage&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.To.Add(&lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;MailRecipient&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;)
&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;SMTPSession&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;.Send(&lt;/span&gt;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: #c41a15; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&amp;amp;MailMessage&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;Para recibir mails, seria algo parecido (sin manejo de errores) &lt;/span&gt;&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;&lt;span style=&quot;color: #c41a15; font-family: Menlo, Monaco, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;/* Antes de usar esto, hay que obtener el 
&amp;amp;ClientId
&amp;amp;ClientSecret
&amp;amp;MailHostToken 
*/

&amp;amp;OAuthAuthorizationConfig.AccessTokenUrl  = OAuth.v2.AccessTokenProvider.Google
&amp;amp;OAuthAuthorizationConfig.ClientId        = &amp;amp;ClientID
&amp;amp;OAuthAuthorizationConfig.ClientSecret    = &amp;amp;ClientSecret

&amp;amp;Success = OAuth.v2.RefreshToken(&amp;amp;OAuthAuthorizationConfig, &amp;amp;MailHostToken,     &amp;amp;OAuthAccessToken, &amp;amp;DateTimeTokenExpire, &amp;amp;OutMessages)

if Not &amp;amp;Success
	Log.Error(&amp;amp;OutMessages.ToJson())
	...
	return
else

	&amp;amp;POP3Session.newMessages = 0
	&amp;amp;POP3Session.Host = &#39;pop.gmail.com&#39;
	&amp;amp;POP3Session.Port = 995
	&amp;amp;POP3Session.Secure=1
	&amp;amp;POP3Session.UserName = &amp;amp;MailUserName
	&amp;amp;POP3Session.Password = &amp;amp;OAuthAccessToken.access_token
	&amp;amp;POP3Session.AuthenticationMethod = &quot;XOAUTH2&quot;
	
	if &amp;amp;POP3Session.ErrCode &amp;lt;&amp;gt; 0
		....
	endif

endif

&lt;/span&gt;&lt;/span&gt;Una cosa que es importante si están con .net, es AGREGAR EL ARCHIVO&amp;nbsp;&lt;b&gt;config.gx&amp;nbsp; en la raíz de la KB&amp;nbsp;&lt;/b&gt;y poner las líneas:&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c41a15; font-family: Menlo, Monaco, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;SMTPSession=MailKit
OpenPOP=MailKit&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c41a15; font-family: Menlo, Monaco, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;&lt;span style=&quot;background-color: white; color: #404040; font-size: 13px; letter-spacing: 0.2px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;De esta forma se va modificar para que use esa biblioteca para el envio y recepcion de mails. &lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/6944545715054888696/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/07/envio-y-recepcion-de-emails-con-oauth.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6944545715054888696'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6944545715054888696'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/07/envio-y-recepcion-de-emails-con-oauth.html' title='Envío y Recepción de Emails con OAuth desde GeneXus (Gmail / Office 365)'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-300577897078186359</id><published>2025-07-03T11:30:00.001-03:00</published><updated>2025-07-03T11:43:03.487-03:00</updated><title type='text'>Edición masiva en GeneXus: Cerrar las pestañas References antes de empezar</title><content type='html'>&lt;!--Título principal--&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh48lH6G_-SSl3xO2kAbWLuilGm9avZmZ2stgSyG1ET_xZ-jAH9xQj4LRp95dYNrgc9PE9WrrCnpPyjptYlKulP-75wOGwIcwxwpTgDx8FPnKomnWphtG5PjtEyyBBHHPBWVIJm-ap8nFHSMFJOwcvpksLRtm_BVSULzr-x2-s-URi3qpWZOx3Mig&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh48lH6G_-SSl3xO2kAbWLuilGm9avZmZ2stgSyG1ET_xZ-jAH9xQj4LRp95dYNrgc9PE9WrrCnpPyjptYlKulP-75wOGwIcwxwpTgDx8FPnKomnWphtG5PjtEyyBBHHPBWVIJm-ap8nFHSMFJOwcvpksLRtm_BVSULzr-x2-s-URi3qpWZOx3Mig&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Si tu Knowledge Base contiene miles de objetos, cada Save puede convertirse en una pausa innecesaria: el IDE recalcula de inmediato la información mostrada en las pestañas References y Referenced by. Cuando estás haciendo cambios en serie (ajustes de propiedades, limpieza de variables sin uso, marcar objetos como Not Generated, importar objetos, etc.) ese refresco continuo añade segundos —o minutos— a tu tarea.

&lt;!--Por qué ocurre--&gt;
&lt;h2&gt;¿Qué está pasando en segundo plano?&lt;/h2&gt;
&lt;p&gt;
Las pestañas de referencia se alimentan de un grafo que describe todas las dependencias
entre objetos. Cada guardado desencadena:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Análisis sintáctico del objeto modificado.&lt;/li&gt;
  &lt;li&gt;Re-cálculo de las aristas que cambian en el grafo.&lt;/li&gt;
  &lt;li&gt;Render del resultado en cada pestaña abierta.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
En KB grandes el paso 2 puede tomar varios segundos.
Repetido cientos de veces se vuelve un cuello de botella innecesario.
&lt;/p&gt;

&lt;!--Recomendación--&gt;
&lt;h2&gt;La práctica recomendada&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Cierra todas las pestañas &lt;em&gt;References/Referenced by&lt;/em&gt; antes de iniciar los cambios.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Usa el botón &lt;code&gt;×&lt;/code&gt; de cada pestaña de referencias o usa la opcion &quot;Close All But this&quot; , que cierra todas los tabs, menos el activo.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Realiza toda la tanda de ediciones.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Guarda y confirma.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Cuando termines, vuelve a abrir las pestañas.&lt;/strong&gt;
El refresco se hará solo una vez, con todas las modificaciones ya consolidadas.&lt;/p&gt;

&lt;!--Beneficios--&gt;
&lt;h2&gt;Ventajas inmediatas&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Menos tiempo de espera:&lt;/strong&gt; la percepción de “lag” desaparece.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Menor carga de CPU y disco:&lt;/strong&gt; ideal en máquinas virtuales o KB con repositorio remoto.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Flujo de trabajo más fluido:&lt;/strong&gt; te concentras en los cambios y no en la interfaz.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;

&lt;!--Cierre--&gt;
&lt;h2&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;
El truco es simple: mantén cerradas las pestañas de referencias mientras haces
ediciones masivas. Ganarás agilidad sin perder la información; siempre podrás
consultarla cuando realmente la necesites y con un solo refresco.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Extra: SOLO PARA NERDS&lt;/h2&gt;Solo para los que les guste optimizar sentencias en la base de datos,&amp;nbsp;en GeneXus 18 Upgrade 12, para calcular las referencias, esta usando esta consulta sobre SQL Server.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;WITH ObjectsInModule AS (&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; SELECT&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr.ToEntityId &amp;nbsp; &amp;nbsp;AS ModuleId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr.FromEntityTypeId AS EntityTypeId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr.FromEntityId &amp;nbsp;AS EntityId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; FROM ModelCrossReference mcr WITH (NOLOCK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; WHERE ModelId = @ModelId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND ToEntityTypeId = @ModuleTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND LinkType = @ParentLinkType&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; UNION ALL&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; SELECT&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; oim.ModuleId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr.FromEntityTypeId AS EntityTypeId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr.FromEntityId &amp;nbsp; &amp;nbsp; AS EntityId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; FROM ModelCrossReference mcr WITH (NOLOCK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; INNER JOIN ObjectsInModule oim&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ON oim.EntityTypeId = mcr.ToEntityTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;AND oim.EntityId &amp;nbsp; &amp;nbsp; = mcr.ToEntityId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; WHERE mcr.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND mcr.FromEntityTypeId &amp;lt;&amp;gt; @ModuleTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND mcr.LinkType &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ParentLinkType&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND oim.EntityTypeId &amp;nbsp; &amp;nbsp; &amp;lt;&amp;gt; @ModuleTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;),&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;ModulesInModule AS (&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; SELECT&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; EntityId &amp;nbsp; &amp;nbsp;AS ModuleId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; CONVERT(VARCHAR(MAX), &#39;&#39;) AS ModuleName&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; FROM ModelEntityVersion WITH (NOLOCK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; WHERE ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ModelId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND EntityTypeId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModuleTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND ModelParentEntityTypeId = 0&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; UNION ALL&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; SELECT&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mev.EntityId &amp;nbsp; &amp;nbsp; AS ModuleId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; IIF(&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mim.ModuleName = &#39;&#39;,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mev.ModelEntityVersionName,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; CONCAT(mim.ModuleName, &#39;.&#39;, mev.ModelEntityVersionName)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; ) AS ModuleName&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; FROM ModelEntityVersion mev WITH (NOLOCK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; INNER JOIN ModulesInModule mim&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ON mev.ModelParentEntityId = mim.ModuleId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; WHERE mev.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND mev.EntityTypeId = @ModuleTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;SELECT&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; mcr.EntityTypeId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; mcr.EntityId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; COALESCE(mev.&lt;/span&gt;&lt;wbr style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&lt;/wbr&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;ModelEntityVersionName, &#39;&#39;) AS EntityVersionName,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; mcr.LinkType,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; mcr.LinkTypeInfo,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; mcr.ReferenceType,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; mcr.HasReferences,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; COALESCE(mim.ModuleName, &#39;&#39;) AS ModuleName&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;FROM (&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; SELECT&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr1.ToEntityTypeId AS EntityTypeId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr1.ToEntityId &amp;nbsp; &amp;nbsp; AS EntityId,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr1.LinkType,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr1.LinkTypeInfo,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; mcr1.ReferenceType,&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; CONVERT(BIT, (&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; SELECT TOP(1) 1&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; FROM ModelCrossReference mcr2 WITH (NOLOCK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; WHERE mcr2.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND mcr2.FromEntityTypeId = mcr1.ToEntityTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND mcr2.FromEntityId &amp;nbsp; &amp;nbsp; = mcr1.ToEntityId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND mcr2.LinkType &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ObjectLinkType&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND mcr2.ToEntityTypeId IN (&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SELECT EntityTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FROM EntityType&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WHERE EntityTypeIsModelable = 0&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; OR EntityTypeNamespace &amp;nbsp; &amp;nbsp;&amp;lt;&amp;gt; &#39;&#39;&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; )) AS HasReferences&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; FROM ModelCrossReference mcr1 WITH (NOLOCK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; WHERE mcr1.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND mcr1.FromEntityTypeId = @EntityTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND mcr1.FromEntityId &amp;nbsp; &amp;nbsp; = @EntityId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND mcr1.LinkType &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ObjectLinkType&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; AND mcr1.ToEntityTypeId IN (&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; SELECT EntityTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; FROM EntityType&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; WHERE EntityTypeIsModelable = 0&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; OR EntityTypeNamespace &amp;nbsp; &amp;nbsp;&amp;lt;&amp;gt; &#39;&#39;&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;) AS mcr&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;LEFT JOIN (&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; SELECT EntityTypeId, EntityId, ModelEntityVersionName&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; FROM ModelEntityVersion WITH (NOLOCK)&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; WHERE ModelId = @ModelId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;) AS mev&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; ON mev.EntityTypeId = mcr.EntityTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp;AND mev.EntityId &amp;nbsp; &amp;nbsp; = mcr.EntityId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;LEFT JOIN ObjectsInModule oim&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; ON oim.EntityTypeId = mcr.EntityTypeId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp;AND oim.EntityId &amp;nbsp; &amp;nbsp; = mcr.EntityId&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;LEFT JOIN ModulesInModule mim&lt;/span&gt;&lt;br style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #a64d79; font-family: monospace; font-size: small;&quot;&gt;&amp;nbsp; ON oim.ModuleId &amp;nbsp; &amp;nbsp; = mim.ModuleId;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;En la KB en la que estaba trabajando, es bastante ineficiente, pues demora hasta 18 segundos en la base, y eso lo repite tantas veces como tabs de referencias abiertos tengas, multiplicado por la cantidad de objetos que modifiques en forma batch.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Use un modelo de inteligencia artificial para optimizarlo, y paso de un costo de &lt;b&gt;158&lt;/b&gt; a un costo de &lt;b&gt;5 &lt;/b&gt;con la siguiente sentencia equivalente.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: blue; font-family: monospace;&quot;&gt;-- 1) Lista de tipos permitidos&lt;br /&gt;DECLARE @AllowedTypes TABLE (EntityTypeId INT PRIMARY KEY);&lt;br /&gt;INSERT INTO @AllowedTypes&lt;br /&gt;SELECT EntityTypeId&lt;br /&gt;FROM EntityType&lt;br /&gt;WHERE EntityTypeIsModelable = 0&lt;br /&gt;&amp;nbsp; &amp;nbsp;OR EntityTypeNamespace &amp;lt;&amp;gt; &#39;&#39;;&lt;br /&gt;&lt;br /&gt;-- 2) Precalcula flags de referencias&lt;br /&gt;;WITH RefFlags AS (&lt;br /&gt;&amp;nbsp; SELECT DISTINCT&lt;br /&gt;&amp;nbsp; &amp;nbsp; FromEntityTypeId AS EntityTypeId,&lt;br /&gt;&amp;nbsp; &amp;nbsp; FromEntityId,&lt;br /&gt;&amp;nbsp; &amp;nbsp; 1 AS HasReferences&lt;br /&gt;&amp;nbsp; FROM ModelCrossReference WITH (NOLOCK)&lt;br /&gt;&amp;nbsp; WHERE ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND LinkType &amp;nbsp; &amp;nbsp; = @ObjectLinkType&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND ToEntityTypeId IN (SELECT EntityTypeId FROM @AllowedTypes)&lt;br /&gt;),&lt;br /&gt;-- 3) CTE recursiva de módulos (sin cambios sustanciales)&lt;br /&gt;ObjectsInModule AS (&lt;br /&gt;&amp;nbsp; SELECT mcr.ToEntityId AS ModuleId&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;, mcr.FromEntityTypeId AS EntityTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;, mcr.FromEntityId AS EntityId&lt;br /&gt;&amp;nbsp; FROM ModelCrossReference mcr WITH (NOLOCK)&lt;br /&gt;&amp;nbsp; WHERE ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ModelId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND ToEntityTypeId &amp;nbsp;= @ModuleTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND LinkType &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ParentLinkType&lt;br /&gt;&lt;br /&gt;&amp;nbsp; UNION ALL&lt;br /&gt;&lt;br /&gt;&amp;nbsp; SELECT oim.ModuleId&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;, mcr.FromEntityTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;, mcr.FromEntityId&lt;br /&gt;&amp;nbsp; FROM ModelCrossReference mcr WITH (NOLOCK)&lt;br /&gt;&amp;nbsp; JOIN ObjectsInModule oim&lt;br /&gt;&amp;nbsp; &amp;nbsp; ON oim.EntityTypeId = mcr.ToEntityTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp;AND oim.EntityId &amp;nbsp; &amp;nbsp; = mcr.ToEntityId&lt;br /&gt;&amp;nbsp; WHERE mcr.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ModelId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND mcr.FromEntityTypeId&amp;lt;&amp;gt; @ModuleTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND mcr.LinkType &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ParentLinkType&lt;br /&gt;),&lt;br /&gt;ModulesInModule AS (&lt;br /&gt;&amp;nbsp; SELECT EntityId AS ModuleId&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;, CAST(&#39;&#39; AS VARCHAR(MAX)) AS ModuleName&lt;br /&gt;&amp;nbsp; FROM ModelEntityVersion WITH (NOLOCK)&lt;br /&gt;&amp;nbsp; WHERE ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND EntityTypeId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ModuleTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND ModelParentEntityTypeId= 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp; UNION ALL&lt;br /&gt;&lt;br /&gt;&amp;nbsp; SELECT mev.EntityId&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;, CASE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WHEN mim.ModuleName = &#39;&#39; THEN mev.ModelEntityVersionName&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ELSE mim.ModuleName + &#39;.&#39; + mev.ModelEntityVersionName&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;END&lt;br /&gt;&amp;nbsp; FROM ModelEntityVersion mev WITH (NOLOCK)&lt;br /&gt;&amp;nbsp; JOIN ModulesInModule mim&lt;br /&gt;&amp;nbsp; &amp;nbsp; ON mev.ModelParentEntityId = mim.ModuleId&lt;br /&gt;&amp;nbsp; WHERE mev.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;br /&gt;&amp;nbsp; &amp;nbsp; AND mev.EntityTypeId = @ModuleTypeId&lt;br /&gt;)&lt;br /&gt;SELECT&lt;br /&gt;&amp;nbsp; mcr.ToEntityTypeId AS EntityTypeId,&lt;br /&gt;&amp;nbsp; mcr.ToEntityId &amp;nbsp; &amp;nbsp; AS EntityId,&lt;br /&gt;&amp;nbsp; COALESCE(mev.&lt;wbr&gt;&lt;/wbr&gt;ModelEntityVersionName,&#39;&#39;) AS EntityVersionName,&lt;br /&gt;&amp;nbsp; mcr.LinkType,&lt;br /&gt;&amp;nbsp; mcr.LinkTypeInfo,&lt;br /&gt;&amp;nbsp; mcr.ReferenceType,&lt;br /&gt;&amp;nbsp; COALESCE(rf.HasReferences,0) &amp;nbsp; &amp;nbsp;AS HasReferences,&lt;br /&gt;&amp;nbsp; COALESCE(mim.ModuleName,&#39;&#39;) &amp;nbsp; &amp;nbsp; AS ModuleName&lt;br /&gt;FROM ModelCrossReference mcr WITH (NOLOCK)&lt;br /&gt;-- 4) Aplica filtros directos y únete a AllowedTypes&lt;br /&gt;JOIN @AllowedTypes at&lt;br /&gt;&amp;nbsp; ON mcr.ToEntityTypeId = at.EntityTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp;AND mcr.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp;= @ModelId&lt;br /&gt;&amp;nbsp; &amp;nbsp;AND mcr.FromEntityTypeId = @EntityTypeId&lt;br /&gt;&amp;nbsp; &amp;nbsp;AND mcr.FromEntityId &amp;nbsp; &amp;nbsp; = @EntityId&lt;br /&gt;&amp;nbsp; &amp;nbsp;AND mcr.LinkType &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ObjectLinkType&lt;br /&gt;&lt;br /&gt;-- 5) Enlaza el flag precomputado&lt;br /&gt;LEFT JOIN RefFlags rf&lt;br /&gt;&amp;nbsp; ON rf.EntityTypeId = mcr.ToEntityTypeId&lt;br /&gt;&amp;nbsp;AND rf.FromEntityId = mcr.ToEntityId&lt;br /&gt;&lt;br /&gt;-- 6) Trae nombre de versión si existe&lt;br /&gt;LEFT JOIN ModelEntityVersion mev WITH (NOLOCK)&lt;br /&gt;&amp;nbsp; ON mev.ModelId &amp;nbsp; &amp;nbsp; &amp;nbsp; = @ModelId&lt;br /&gt;&amp;nbsp;AND mev.EntityTypeId &amp;nbsp;= mcr.ToEntityTypeId&lt;br /&gt;&amp;nbsp;AND mev.EntityId &amp;nbsp; &amp;nbsp; &amp;nbsp;= mcr.ToEntityId&lt;br /&gt;&lt;br /&gt;-- 7) Finalmente enlaza con los módulos&lt;br /&gt;LEFT JOIN ObjectsInModule oim&lt;br /&gt;&amp;nbsp; ON oim.EntityTypeId &amp;nbsp;= mcr.ToEntityTypeId&lt;br /&gt;&amp;nbsp;AND oim.EntityId &amp;nbsp; &amp;nbsp; &amp;nbsp;= mcr.ToEntityId&lt;br /&gt;LEFT JOIN ModulesInModule mim&lt;br /&gt;&amp;nbsp; ON mim.ModuleId &amp;nbsp; &amp;nbsp; &amp;nbsp;= oim.ModuleId&lt;br /&gt;OPTION (RECOMPILE);&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;Se lo pase a la gente de Genexus por si les interesa hacer esta optimización o una parecida, pero muchas veces hay restricciones como las versiones de SQL Server soportadas, o&amp;nbsp; efectos secundarios que pueden acarrear estos cambios que impiden implementarla.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;En resumen, si quieren que GeneXus esta un poquito mas rapido, &lt;b&gt;CIERREN LAS VENTANAS DE REFERENCIAS&lt;/b&gt; cuando no las necesiten.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Conclusión Extra&lt;/h2&gt;Cada vez que veo este tipo de cosas, pienso que GeneXus debería utilizar una base de datos orientada a grafos, para almacenar las referencias de los objetos en la base de conocimiento.&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/300577897078186359/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/07/edicion-masiva-en-genexus-cerrar-las.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/300577897078186359'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/300577897078186359'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/07/edicion-masiva-en-genexus-cerrar-las.html' title='Edición masiva en GeneXus: Cerrar las pestañas References antes de empezar'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEh48lH6G_-SSl3xO2kAbWLuilGm9avZmZ2stgSyG1ET_xZ-jAH9xQj4LRp95dYNrgc9PE9WrrCnpPyjptYlKulP-75wOGwIcwxwpTgDx8FPnKomnWphtG5PjtEyyBBHHPBWVIJm-ap8nFHSMFJOwcvpksLRtm_BVSULzr-x2-s-URi3qpWZOx3Mig=s72-c" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-8200448146143985408</id><published>2025-06-19T14:36:00.000-03:00</published><updated>2025-06-19T14:36:11.110-03:00</updated><title type='text'> Preparando tu KB GeneXus para Aplicaciones de Inteligencia Artificial</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEitY0jwOP11Cl2w5rNv_QwYkltFzvRtZk4S1B4avPT7eJkkKGLd5B3w1UbV33XEFlnuPgWDmiTkaPjJQ5ncveRPPXlVIXXqTe9MdyQlZMAXDhAXfc1oBsuFamk1GQ2ZM5z-oQSFjPvHNSu5TvKNcXTHwbX-vE_7Xa5gaLlS539z8Pgl_whiLdHtSQ&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1024&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEitY0jwOP11Cl2w5rNv_QwYkltFzvRtZk4S1B4avPT7eJkkKGLd5B3w1UbV33XEFlnuPgWDmiTkaPjJQ5ncveRPPXlVIXXqTe9MdyQlZMAXDhAXfc1oBsuFamk1GQ2ZM5z-oQSFjPvHNSu5TvKNcXTHwbX-vE_7Xa5gaLlS539z8Pgl_whiLdHtSQ&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;En el desarrollo moderno, donde la IA se integra cada vez más en la creación y mantenimiento de aplicaciones, GeneXus ya ha mostrado que en su próxima versión vamos a tener dentro del IDE y vamos a poder generar asistentes de inteligencia artificial.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Como desarrollador GeneXus, ¿que es lo que puedo hacer hoy en las versiones liberadas, para prepararme para ese desafío?&amp;nbsp;&lt;/p&gt;&lt;p&gt;Las herramientas de inteligencia artificial en su estado actual, necesitan descripciones textuales para poder entender los elementos con los que operan.&amp;nbsp; Por lo tanto, tenemos que tener claro que vamos a tener que mejorar la metadata que describe nuestros objetos.&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;¿Por qué la metadata es tan importante?&lt;/h3&gt;&lt;p&gt;Describe la intención y contexto de cada componente, no solo su estructura técnica.&lt;/p&gt;&lt;p&gt;Permite a herramientas de IA entender cómo reutilizar, adaptar o proponer cambios en base a la semántica.&lt;/p&gt;&lt;p&gt;Facilita la generación de pruebas, documentación y migraciones automatizadas.&lt;/p&gt;&lt;p&gt;A continuación, paso una lista de las tareas que a mi me sirvieron para poder incorporar agentes a la KB&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;Prácticas clave para una KB lista para IA&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;1) Eliminar lo que no se usa&lt;/h4&gt;A las herramientas y agentes, hay que brindarle cuales son los objetos que debe usar en forma clara. Tener en la KB objetos que no se usan, dificulta mucho esta tarea.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Revisa y borra: atributos que no estén en tablas, objetos no alcanzables, objetos main no usados, tablas sin uso y variables no utilizadas.&lt;/p&gt;&lt;p&gt;Si hay objetos en folder Borrar, To_Delete, etc o con nombres del tipo _BACKUP, *_borrar, etc hay que hacer un esfuerzo y borrarlos.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Para esto hay herramientas como el KBDoctor, VariableCleaner que puede ayudarte.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;2) Mejora los campos Description y Documentation de los objetos&lt;/h4&gt;Completa el campo &lt;b&gt;Description &lt;/b&gt;en cada objeto, describiendo &lt;b&gt;QUE ES ese objeto&lt;/b&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;El orden de importancia que yo le doy a esto es:&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Tablas&lt;/li&gt;&lt;li&gt;Atributos&lt;/li&gt;&lt;li&gt;API&lt;/li&gt;&lt;li&gt;Objetos con UI mas usados (si tenes Google Analytics es facil hacer una lista)&lt;/li&gt;&lt;li&gt;Resto de los objetos&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Si la base de datos va a ser accedida por herramientas externas, también es bueno poner la propiedad &quot;Generate COMMENT ON statements&quot; en YES de forma que las descripciones de tablas y atributos lleguen a la base de datos, cuando se hacen reorganizaciones a través de GeneXus.&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Para objetos con UI, en el tab &lt;b&gt;Documentation&lt;/b&gt;, escribe el &lt;b&gt;PARA QUE de ese objeto &lt;/b&gt;o sea la intención de uso de la pantalla: qué operación realiza, en qué contexto se usa y a qué usuarios está dirigida.&lt;/p&gt;&lt;p&gt;Los nombre de los eventos, es bueno que tenga nombres que indique que operacion hacen desde el punto de vista del usuario, asegurándote de que tengan nombres claros que reflejen exactamente qué acción ejecutan (ValidarCamposEntrada, ConfirmarPago, EnviarNotificacionCliente).&lt;/p&gt;&lt;h4&gt;3) Nombrar con intención&lt;/h4&gt;&lt;p&gt;Evita nombres genéricos (Procedure1, Prompt1).&lt;/p&gt;&lt;p&gt;Usa nombres que expliciten acción y contexto: GenerarFacturaPDF, CalcularRetencionesProveedor.&lt;/p&gt;&lt;p&gt;Siempre pensar en para que va a usarse el objeto que estoy nombrando y describiendo.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Tener objetos chicos que solo hacen una cosa, facilita muchísimo ponerle nombre.&amp;nbsp;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;4) Modularizar la KB&amp;nbsp;&lt;/h4&gt;&lt;p&gt;La inteligencia artificial&amp;nbsp; funciona mejor si trabaja con un conjunto chico de objetos. En KB grandes, conviene clasificar las tablas y objetos en módulos&amp;nbsp; para reflejar los grupos funcionales de la aplicación y esto ayuda a tener contextos mas limitados para ciertos problemas.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Agrupa objetos por contexto funcional, no solo por tipo técnico, por ejemplo:&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;DatosBasicos/Clientes, &lt;/li&gt;&lt;li&gt;DatosBasicos/Depositos,&lt;/li&gt;&lt;li&gt;Facturacion, &lt;/li&gt;&lt;li&gt;Cobranza.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;5) Hacer explícita las funciones que cada modulo expone como servicio.&amp;nbsp;&lt;/h4&gt;&lt;p&gt;Si queremos que los agentes de inteligencia artificial usen los servicios provistos por nuestra KB, es bueno crear objetos API con nombres claros, parámetros significativo y una buena explicación de que es lo que hacen para que sea fácil a los agentes hacer llamadas a dichas API.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Consistencia en la forma de pasar parámetros y resultados. Usar formatos legibles para IA: JSON, YAML o tablas de base de datos.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;6) Encontrar&amp;nbsp; y agrupar las pantallas parecidas&amp;nbsp;&lt;/h4&gt;&lt;p&gt;Es común que en las aplicaciones tengamos patrones de pantallas (aunque no sean generadas con herramientas de GeneXus Patterns), sino que son pantallas que se usan de una forma consistente en todo el sistema.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Es bueno tener esos objetos catalogados (puede ser en categorías) de forma de luego poderle dar a los agentes un conjunto de objetos sobre los que trabajar.&amp;nbsp;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;7) Crear y mantener un glosario de sinónimos&lt;/h4&gt;&lt;p&gt;Empieza a generar una lista de sinónimos y términos equivalentes que tus usuarios usan para referirse a entidades y atributos clave. Para esta tarea, podemos usar inteligencia artificial.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Esto aun no tiene un lugar claro para guardar en la KB, pero es de mucha ayuda cuando hacemos agentes que sean usados por público diverso y mas si es de diferentes paises.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Facilita la comprensión de la KB por parte de la IA mejorando la precisión de asistentes de lenguaje natural o chatbots. Por ejemplo:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Término&amp;nbsp; &amp;nbsp; &amp;nbsp; Sinónimos&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Cliente&amp;nbsp; &amp;nbsp; Usuario, Comprador, Consumidor, CuentaCliente&lt;/p&gt;&lt;p&gt;Depósito&amp;nbsp; &amp;nbsp;Almacén, Bodega, CentroDistribución, StockLocation&lt;/p&gt;&lt;p&gt;Ciudad&amp;nbsp; &amp;nbsp; &amp;nbsp;Localidad, Municipio, Población, CiudadResidencia&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Beneficios concretos&lt;/h3&gt;&lt;p&gt;Si se aplican estos cambios, que ninguno es demasiado complejo, se tendrán varios beneficios:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Acelera la incorporación de asistentes a una KB existente&lt;/li&gt;&lt;li&gt;Facilita la migración o refactorización asistida por IA, haciendo mas fácil el mantenimiento&lt;/li&gt;&lt;li&gt;Potencia la precisión de asistentes conversacionales al entender sinónimos y términos usados por los usuarios finales.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;Conclusión&lt;/h3&gt;&lt;p&gt;Invertir en una buena estructura de metadata no es opcional: es la base para integrar inteligencia artificial en tu proceso de desarrollo. Empieza hoy a hacer explícita la intención de cada componente y a mantener un glosario de términos usados por tus usuarios: tu KB GeneXus se convertirá en una fuente de conocimiento vivo, lista para trabajar codo a codo con herramientas de IA.&lt;/p&gt;&lt;p&gt;Aunque aún no vayas a incorporar herramientas de IA, es un trabajo que se puede adelantar, es indispensable para lo que se viene y lleva bastante trabajo, por lo que conviene anticiparse en lo posible.&amp;nbsp; Es una tarea que puede ser hecha por usuarios con conocimiento funcional de la aplicación, sin necesitad de grandes conocimientos técnicos.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/8200448146143985408/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/06/preparando-tu-kb-genexus-para.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8200448146143985408'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8200448146143985408'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/06/preparando-tu-kb-genexus-para.html' title=' Preparando tu KB GeneXus para Aplicaciones de Inteligencia Artificial'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEitY0jwOP11Cl2w5rNv_QwYkltFzvRtZk4S1B4avPT7eJkkKGLd5B3w1UbV33XEFlnuPgWDmiTkaPjJQ5ncveRPPXlVIXXqTe9MdyQlZMAXDhAXfc1oBsuFamk1GQ2ZM5z-oQSFjPvHNSu5TvKNcXTHwbX-vE_7Xa5gaLlS539z8Pgl_whiLdHtSQ=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-5468789915702612013</id><published>2025-06-12T16:24:00.001-03:00</published><updated>2025-06-12T16:24:25.641-03:00</updated><title type='text'>Comparacion de herramientas de inteligencia artificial para la escritura de Post</title><content type='html'>&lt;p&gt; &lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9KTeoeydTAnx3kj_wxGUkFH6BAc83GijXSLI3Ci0NucHP7V-oYdVvKmmUT5D7NptWM3bloPgftjgXALo6f3A4HMP9Spotq3HWv8mG3_Pr4mz70ZIxtGszpdnb1jskWGrW1Jxh__gRzODrMP15wfNEoCS5ABKDkoF1_jpFEB1-bkvMMMHsH6Nz9w/s600/duda-conversion.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;600&quot; data-original-width=&quot;600&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9KTeoeydTAnx3kj_wxGUkFH6BAc83GijXSLI3Ci0NucHP7V-oYdVvKmmUT5D7NptWM3bloPgftjgXALo6f3A4HMP9Spotq3HWv8mG3_Pr4mz70ZIxtGszpdnb1jskWGrW1Jxh__gRzODrMP15wfNEoCS5ABKDkoF1_jpFEB1-bkvMMMHsH6Nz9w/s320/duda-conversion.jpg&quot; width=&quot;320&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;Hice un pequeño experimento, para ver el estado de las herramientas de inteligencia artificial para escribir documentación técnica. &lt;p&gt;&lt;/p&gt;&lt;p&gt;A partir del prompt. &lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://ealmeida.blogspot.com/2025/06/comparacion-de-herramientas-de.html#more&quot;&gt;Leer más »&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/5468789915702612013/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/06/comparacion-de-herramientas-de.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5468789915702612013'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/5468789915702612013'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/06/comparacion-de-herramientas-de.html' title='Comparacion de herramientas de inteligencia artificial para la escritura de Post'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9KTeoeydTAnx3kj_wxGUkFH6BAc83GijXSLI3Ci0NucHP7V-oYdVvKmmUT5D7NptWM3bloPgftjgXALo6f3A4HMP9Spotq3HWv8mG3_Pr4mz70ZIxtGszpdnb1jskWGrW1Jxh__gRzODrMP15wfNEoCS5ABKDkoF1_jpFEB1-bkvMMMHsH6Nz9w/s72-c/duda-conversion.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-1468344269020125926</id><published>2025-06-12T15:50:00.004-03:00</published><updated>2025-06-12T16:04:14.082-03:00</updated><title type='text'>El Impacto de la Inteligencia Artificial en el Desarrollo de Aplicaciones con GeneXus: Una Revolución Comparable a la Retroexcavadora (by Grok) </title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaAyLQTteoziK06ofw7K1oYiMuWILU6jAdHZClgxuIEFPc0rKxoFegfec4B38uxFDSDksL9jUxYqnu5tTXQiwqmb6lvUl4Ypze3eEcyMVB2w-SGkjQQLWYjPRPdqGiXpoyg9qk-4cks_ieyWk2IEAGXriA2AL9Npw8Ufe6d7hXMvuMe49M1nNFdQ/s896/da924009-b0a1-493a-91bb-a25261957900.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;504&quot; data-original-width=&quot;896&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaAyLQTteoziK06ofw7K1oYiMuWILU6jAdHZClgxuIEFPc0rKxoFegfec4B38uxFDSDksL9jUxYqnu5tTXQiwqmb6lvUl4Ypze3eEcyMVB2w-SGkjQQLWYjPRPdqGiXpoyg9qk-4cks_ieyWk2IEAGXriA2AL9Npw8Ufe6d7hXMvuMe49M1nNFdQ/s320/da924009-b0a1-493a-91bb-a25261957900.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot;&gt;La Analogía de la Retroexcavadora&lt;/h2&gt;&lt;p dir=&quot;ltr&quot;&gt;Imagina una obra en construcción hace un siglo. Cavar una zanja requería un equipo de obreros trabajando arduamente con palas, un proceso lento y físicamente agotador. Luego llegó la retroexcavadora: una máquina capaz de realizar el trabajo de varios operarios en una fracción del tiempo, con mayor precisión y menor esfuerzo físico. Este cambio no eliminó la necesidad de trabajadores, pero transformó sus roles, exigiendo operadores capacitados para manejar la maquinaria.&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;En el desarrollo de software, estamos viviendo una revolución similar. Antes, crear aplicaciones requería que los programadores escribieran línea por línea de código, un proceso laborioso que demandaba equipos numerosos para proyectos complejos. Hoy, los agentes de inteligencia artificial (IA) que generan código actúan como la retroexcavadora del desarrollo: automatizan tareas repetitivas, aceleran la producción y permiten a los desarrolladores enfocarse en aspectos más estratégicos. En este contexto, plataformas como GeneXus, conocidas por su capacidad de generar código automáticamente, se potencian aún más con la integración de la IA.&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot;&gt;Cómo la IA Está Transformando el Desarrollo con GeneXus&lt;/h2&gt;&lt;p dir=&quot;ltr&quot;&gt;GeneXus es una plataforma low-code que ya simplifica el desarrollo al generar aplicaciones multiplataforma a partir de modelos y especificaciones de alto nivel. Con la incorporación de la IA, esta capacidad se multiplica, llevando la productividad y la calidad del desarrollo a nuevos niveles. A continuación, exploramos cómo la IA está transformando el trabajo con GeneXus:&lt;/p&gt;&lt;ol dir=&quot;ltr&quot;&gt;&lt;li&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;strong&gt;Generación Automática de Código Mejorada&lt;/strong&gt;: Los agentes de IA, integrados en GeneXus, pueden interpretar requisitos en lenguaje natural y convertirlos en modelos o código funcional. Por ejemplo, un desarrollador puede describir una funcionalidad como &quot;crear un formulario para registrar clientes con validación de correo electrónico&quot; y la IA generará el código base, ajustado a las convenciones de GeneXus, en minutos. Esto reduce significativamente el tiempo de codificación manual.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;strong&gt;Optimización de Diseños y UX&lt;/strong&gt;: La IA analiza patrones de uso y tendencias de diseño para proponer interfaces de usuario optimizadas. En GeneXus, esto se traduce en recomendaciones automáticas para mejorar la experiencia del usuario, como layouts responsivos o flujos de navegación intuitivos, sin que el desarrollador deba invertir horas en investigación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;strong&gt;Pruebas y Depuración Automatizadas&lt;/strong&gt;: Los agentes de IA pueden generar casos de prueba, identificar errores en el código y sugerir correcciones antes de que el desarrollador los detecte. En GeneXus, esto asegura que las aplicaciones generadas sean más robustas y reduzcan el tiempo dedicado a la fase de testing.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;strong&gt;Mantenimiento Proactivo&lt;/strong&gt;: La IA puede monitorear aplicaciones en producción, detectar cuellos de botella y proponer mejoras en el código generado por GeneXus. Esto permite a los equipos anticiparse a problemas y mantener sistemas actualizados con menos esfuerzo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;strong&gt;Aceleración del Ciclo de Desarrollo&lt;/strong&gt;: Al combinar la capacidad de GeneXus para generar aplicaciones multiplataforma con la velocidad de la IA, los proyectos que antes tomaban meses ahora se completan en semanas. Esto es especialmente valioso en un mercado donde la rapidez para lanzar productos es un diferenciador competitivo.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir=&quot;ltr&quot;&gt;En resumen, la IA actúa como un &quot;copiloto&quot; para los desarrolladores en GeneXus, automatizando tareas rutinarias y permitiéndoles enfocarse en la lógica de negocio, la innovación y la estrategia. Sin embargo, al igual que una retroexcavadora no elimina la necesidad de un operador, la IA no reemplaza a los programadores, sino que redefine su rol.&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot;&gt;Conclusión: Nuevas Habilidades para una Nueva Era&lt;/h2&gt;&lt;p dir=&quot;ltr&quot;&gt;La llegada de la retroexcavadora no significó el fin de los trabajadores de la construcción, pero sí requirió que aprendieran a operar maquinaria avanzada. De manera similar, la integración de la IA en el desarrollo con GeneXus no elimina la necesidad de desarrolladores, pero exige habilidades más avanzadas. Los programadores deben aprender a supervisar, configurar y validar el trabajo de los agentes de IA, así como a interpretar sus sugerencias en el contexto del negocio. Esto incluye competencias en diseño de prompts efectivos, comprensión de modelos de IA y toma de decisiones estratégicas sobre cuándo y cómo usar estas herramientas.&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;En un mundo donde la IA es la retroexcavadora del desarrollo, los desarrolladores que dominen GeneXus y las herramientas de IA estarán mejor posicionados para construir aplicaciones innovadoras, rápidas y confiables. La clave está en abrazar esta transformación, capacitarse continuamente y liderar la evolución del desarrollo de software.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/1468344269020125926/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/06/el-impacto-de-la-inteligencia.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/1468344269020125926'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/1468344269020125926'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/06/el-impacto-de-la-inteligencia.html' title='El Impacto de la Inteligencia Artificial en el Desarrollo de Aplicaciones con GeneXus: Una Revolución Comparable a la Retroexcavadora (by Grok) '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaAyLQTteoziK06ofw7K1oYiMuWILU6jAdHZClgxuIEFPc0rKxoFegfec4B38uxFDSDksL9jUxYqnu5tTXQiwqmb6lvUl4Ypze3eEcyMVB2w-SGkjQQLWYjPRPdqGiXpoyg9qk-4cks_ieyWk2IEAGXriA2AL9Npw8Ufe6d7hXMvuMe49M1nNFdQ/s72-c/da924009-b0a1-493a-91bb-a25261957900.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-8323805782270662543</id><published>2025-06-12T15:42:00.002-03:00</published><updated>2025-06-12T15:42:31.424-03:00</updated><title type='text'>De la Pala a la Retroexcavadora: Cómo la IA Revoluciona el Desarrollo con GeneXus (by Claude.ai) </title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNlav_XJeGHgVeYhiOBuPCzn2-rIxTcagGlTInbRu2qZRuVOE3qHNHNX61NyCrEE5WylvZ2JOEeEtHC_KpmABuYPtCgrH1Si4UG-n3-AucUmIe1RRJJTKvP6jXIEgMgsxTTmOQ_bdUkRoKz3Mr_FYlWiUk6PwwRUa1Jh9_TdHKbAZmcgSYQ1I0Q/s1673/2025-06-12%2015%2040%2055.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;953&quot; data-original-width=&quot;1673&quot; height=&quot;182&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNlav_XJeGHgVeYhiOBuPCzn2-rIxTcagGlTInbRu2qZRuVOE3qHNHNX61NyCrEE5WylvZ2JOEeEtHC_KpmABuYPtCgrH1Si4UG-n3-AucUmIe1RRJJTKvP6jXIEgMgsxTTmOQ_bdUkRoKz3Mr_FYlWiUk6PwwRUa1Jh9_TdHKbAZmcgSYQ1I0Q/s320/2025-06-12%2015%2040%2055.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;em&gt;La evolución tecnológica siempre ha transformado la manera en que trabajamos. Hoy, los agentes de IA están redefiniendo el desarrollo de aplicaciones de la misma forma que las máquinas revolucionaron la construcción.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 class=&quot;text-xl font-bold text-text-100 mt-1 -mb-0.5&quot; level=&quot;2&quot;&gt;La Analogía Perfecta: De Cavar Zanjas a Escribir Código&lt;/h2&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Imagina una obra de construcción hace 50 años. Para cavar una zanja de 100 metros, se necesitaba un equipo de 8 a 10 operarios armados con palas, trabajando durante días bajo el sol. Era un proceso lento, físicamente demandante y costoso en términos de tiempo y recursos humanos.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Luego llegó la retroexcavadora y cambió las reglas del juego por completo. Lo que antes requería una cuadrilla completa y varios días de trabajo, ahora podía completarse en pocas horas con un solo operador especializado y una máquina potente.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Esta misma revolución está ocurriendo hoy en el desarrollo de software&lt;/strong&gt;, especialmente en plataformas como GeneXus, donde los agentes de IA que escriben código están cumpliendo el rol de esa retroexcavadora digital.&lt;/p&gt;
&lt;h2 class=&quot;text-xl font-bold text-text-100 mt-1 -mb-0.5&quot; level=&quot;2&quot;&gt;El Antes y el Después en el Desarrollo con GeneXus&lt;/h2&gt;
&lt;h3 class=&quot;text-lg font-bold text-text-100 mt-1 -mb-1.5&quot; level=&quot;3&quot;&gt;El Escenario Tradicional: &quot;Los Operarios con Palas&quot;&lt;/h3&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;En el desarrollo tradicional de aplicaciones con GeneXus, aunque la plataforma ya simplificaba muchos procesos, aún se requería:&lt;/p&gt;
&lt;ul class=&quot;[&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7&quot; depth=&quot;0&quot;&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;0&quot;&gt;&lt;strong&gt;Múltiples desarrolladores&lt;/strong&gt; trabajando en diferentes módulos&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;1&quot;&gt;&lt;strong&gt;Semanas o meses&lt;/strong&gt; para completar funcionalidades complejas&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;2&quot;&gt;&lt;strong&gt;Revisiones manuales&lt;/strong&gt; extensivas de código y lógica de negocio&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;3&quot;&gt;&lt;strong&gt;Pruebas iterativas&lt;/strong&gt; que consumían tiempo considerable&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;4&quot;&gt;&lt;strong&gt;Documentación manual&lt;/strong&gt; de cada componente desarrollado&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;text-lg font-bold text-text-100 mt-1 -mb-1.5&quot; level=&quot;3&quot;&gt;La Nueva Era: &quot;La Retroexcavadora de la IA&quot;&lt;/h3&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Con la integración de agentes de IA en el ecosistema GeneXus, el panorama ha cambiado radicalmente:&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Generación Automática de Código&lt;/strong&gt;: Los agentes de IA pueden escribir procedimientos, transacciones y web panels completos basándose en especificaciones de alto nivel, reduciendo el tiempo de desarrollo en un 70-80%.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Optimización Inteligente&lt;/strong&gt;: La IA analiza patrones en el código existente y sugiere mejoras automáticas, identificando redundancias y optimizando consultas SQL de forma proactiva.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Testing Automatizado&lt;/strong&gt;: Los agentes generan casos de prueba exhaustivos y ejecutan validaciones automáticas, detectando errores que podrían pasar desapercibidos en revisiones manuales.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Documentación Inteligente&lt;/strong&gt;: La IA crea documentación técnica y funcional de manera automática, manteniéndola actualizada con cada cambio en el código.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Refactoring Asistido&lt;/strong&gt;: Cuando es necesario modificar la arquitectura de una aplicación, la IA puede reestructurar miles de líneas de código en minutos, manteniendo la funcionalidad intacta.&lt;/p&gt;
&lt;h2 class=&quot;text-xl font-bold text-text-100 mt-1 -mb-0.5&quot; level=&quot;2&quot;&gt;Casos de Uso Reales en GeneXus&lt;/h2&gt;
&lt;h3 class=&quot;text-lg font-bold text-text-100 mt-1 -mb-1.5&quot; level=&quot;3&quot;&gt;Desarrollo de APIs REST&lt;/h3&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Donde antes un desarrollador tardaba días en crear una API completa con todos sus endpoints, validaciones y documentación, ahora la IA puede:&lt;/p&gt;
&lt;ul class=&quot;[&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7&quot; depth=&quot;0&quot;&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;0&quot;&gt;Generar automáticamente los web services basándose en el modelo de datos&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;1&quot;&gt;Crear la documentación OpenAPI correspondiente&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;2&quot;&gt;Implementar validaciones y manejo de errores estándar&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;3&quot;&gt;Todo en cuestión de minutos&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;text-lg font-bold text-text-100 mt-1 -mb-1.5&quot; level=&quot;3&quot;&gt;Migración de Aplicaciones Legacy&lt;/h3&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;La IA puede analizar aplicaciones antiguas desarrolladas en GeneXus y:&lt;/p&gt;
&lt;ul class=&quot;[&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7&quot; depth=&quot;0&quot;&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;0&quot;&gt;Identificar patrones obsoletos automáticamente&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;1&quot;&gt;Sugerir y aplicar mejores prácticas actuales&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;2&quot;&gt;Modernizar la interfaz de usuario siguiendo estándares contemporáneos&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;3&quot;&gt;Optimizar la estructura de datos para mejor rendimiento&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;text-lg font-bold text-text-100 mt-1 -mb-1.5&quot; level=&quot;3&quot;&gt;Generación de Reportes Complejos&lt;/h3&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Los agentes de IA pueden crear reportes sofisticados que antes requerían programación manual detallada:&lt;/p&gt;
&lt;ul class=&quot;[&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7&quot; depth=&quot;0&quot;&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;0&quot;&gt;Análisis automático de relaciones entre tablas&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;1&quot;&gt;Generación de consultas optimizadas&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;2&quot;&gt;Creación de visualizaciones apropiadas para cada tipo de dato&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;3&quot;&gt;Formateo profesional del output final&lt;/li&gt;&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 class=&quot;text-xl font-bold text-text-100 mt-1 -mb-0.5&quot; level=&quot;2&quot;&gt;El Impacto Cuantificable&lt;/h2&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Las métricas hablan por sí solas. Las organizaciones que han adoptado herramientas de IA en sus procesos de desarrollo con GeneXus reportan:&lt;/p&gt;
&lt;ul class=&quot;[&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7&quot; depth=&quot;0&quot;&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;0&quot;&gt;&lt;strong&gt;Reducción del 60-80%&lt;/strong&gt; en tiempo de desarrollo de funcionalidades estándar&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;1&quot;&gt;&lt;strong&gt;Mejora del 45%&lt;/strong&gt; en la calidad del código generado&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;2&quot;&gt;&lt;strong&gt;Disminución del 70%&lt;/strong&gt; en errores detectados en producción&lt;/li&gt;
&lt;li class=&quot;whitespace-normal break-words&quot; index=&quot;3&quot;&gt;&lt;strong&gt;Incremento del 200%&lt;/strong&gt; en la velocidad de entrega de proyectos&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Pero quizás lo más importante es el cambio cualitativo: los desarrolladores pueden dedicar más tiempo a arquitectura, innovación y resolución de problemas complejos, en lugar de escribir código repetitivo.&lt;/p&gt;
&lt;h2 class=&quot;text-xl font-bold text-text-100 mt-1 -mb-0.5&quot; level=&quot;2&quot;&gt;El Nuevo Perfil del Desarrollador GeneXus&lt;/h2&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Así como el operador de retroexcavadora necesita habilidades diferentes al obrero con pala, el desarrollador que trabaja con IA requiere un skillset evolucionado:&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Pensamiento Arquitectónico&lt;/strong&gt;: Capacidad para diseñar sistemas complejos y definir especificaciones de alto nivel que la IA pueda interpretar correctamente.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Supervisión Inteligente&lt;/strong&gt;: Habilidad para revisar, validar y optimizar el código generado por IA, identificando posibles mejoras o problemas potenciales.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt;: Competencia para comunicarse efectivamente con los agentes de IA, proporcionando contexto y restricciones apropiadas.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;&lt;strong&gt;Integración de Sistemas&lt;/strong&gt;: Experiencia en conectar diferentes herramientas de IA con el ecosistema GeneXus y otros sistemas empresariales.&lt;/p&gt;
&lt;h2 class=&quot;text-xl font-bold text-text-100 mt-1 -mb-0.5&quot; level=&quot;2&quot;&gt;Conclusión: Más Poder, Mayor Responsabilidad&lt;/h2&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;La analogía de la retroexcavadora nos enseña una lección fundamental: &lt;strong&gt;las herramientas más poderosas requieren operadores más capacitados&lt;/strong&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;Cualquiera puede tomar una pala y cavar, pero operar una retroexcavadora eficientemente requiere entrenamiento especializado, comprensión de mecánica, conocimiento de seguridad y habilidades de coordinación espacial avanzadas. El operador de retroexcavadora no solo debe saber &lt;em&gt;cómo&lt;/em&gt; usar la máquina, sino &lt;em&gt;cuándo&lt;/em&gt; usarla, &lt;em&gt;dónde&lt;/em&gt; aplicar la fuerza correcta y &lt;em&gt;cómo&lt;/em&gt; evitar daños colaterales.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;De la misma manera, &lt;strong&gt;supervisar herramientas de IA en el desarrollo con GeneXus exige habilidades más avanzadas&lt;/strong&gt; que la programación tradicional. El desarrollador moderno debe comprender arquitecturas complejas, ser capaz de validar código generado automáticamente, y tener la experiencia para guiar a los agentes de IA hacia soluciones óptimas.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;La diferencia es que, mientras el operario con pala quedó desplazado, el programador con IA se ha &lt;strong&gt;potenciado exponencialmente&lt;/strong&gt;. La clave está en evolucionar junto con la tecnología, desarrollando las competencias necesarias para ser no solo un usuario, sino un maestro de estas nuevas herramientas.&lt;/p&gt;
&lt;p class=&quot;whitespace-normal break-words&quot;&gt;El futuro del desarrollo no pertenece a quienes temen a la IA, sino a quienes aprenden a dirigirla con sabiduría y precisión. En GeneXus, esta revolución ya comenzó. ¿Estás listo para ser el operador de tu propia retroexcavadora digital?&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/8323805782270662543/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/06/de-la-pala-la-retroexcavadora-como-la.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8323805782270662543'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/8323805782270662543'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/06/de-la-pala-la-retroexcavadora-como-la.html' title='De la Pala a la Retroexcavadora: Cómo la IA Revoluciona el Desarrollo con GeneXus (by Claude.ai) '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNlav_XJeGHgVeYhiOBuPCzn2-rIxTcagGlTInbRu2qZRuVOE3qHNHNX61NyCrEE5WylvZ2JOEeEtHC_KpmABuYPtCgrH1Si4UG-n3-AucUmIe1RRJJTKvP6jXIEgMgsxTTmOQ_bdUkRoKz3Mr_FYlWiUk6PwwRUa1Jh9_TdHKbAZmcgSYQ1I0Q/s72-c/2025-06-12%2015%2040%2055.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-9143030015611131897</id><published>2025-06-12T15:33:00.001-03:00</published><updated>2025-06-12T16:04:39.811-03:00</updated><title type='text'>La Retroexcavadora Digital: Cómo la IA Potencia el Desarrollo de Aplicaciones con GeneXus (by Gemini)</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRFp-eGZKcbyF4sx26hRk00G_b2LyXn62nu2A9HSkbLr0qb6ZJCZoHMF0Iib7pikNPv9AAMQkGrWIuEdBZx-7ia_lDleEKawd2MSzBTnM313ZBjzKnBHqTN7IPerjeXBK4vblzFlpbp1zJXfOAVW_jAWcaikjrekuZo6WYVzFnoAkJI3ZW3d4jKg/s2048/Gemini_Generated_Image_1v1k4x1v1k4x1v1k.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;2048&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRFp-eGZKcbyF4sx26hRk00G_b2LyXn62nu2A9HSkbLr0qb6ZJCZoHMF0Iib7pikNPv9AAMQkGrWIuEdBZx-7ia_lDleEKawd2MSzBTnM313ZBjzKnBHqTN7IPerjeXBK4vblzFlpbp1zJXfOAVW_jAWcaikjrekuZo6WYVzFnoAkJI3ZW3d4jKg/s320/Gemini_Generated_Image_1v1k4x1v1k4x1v1k.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;¿Recuerdas cuando construir una zanja significaba horas de sudor y esfuerzo para un equipo de obreros, pala en mano? Era un trabajo arduo, lento y que demandaba una considerable cantidad de mano de obra. Luego, la tecnología nos trajo la retroexcavadora. De repente, una sola máquina, operada por una persona, podía realizar el trabajo de decenas de operarios en una fracción del tiempo. La eficiencia se disparó, los costos disminuyeron y la forma de abordar proyectos de excavación cambió para siempre.&lt;p&gt;&lt;/p&gt;&lt;p data-sourcepos=&quot;9:1-9:154&quot;&gt;Esta misma revolución, esta &quot;retroexcavadora digital&quot;, está ocurriendo ahora mismo en el mundo del desarrollo de software, y GeneXus está a la vanguardia.&lt;/p&gt;&lt;h3 data-sourcepos=&quot;11:1-11:71&quot;&gt;De la Pala del Programador al Agente de IA: Una Analogía Reveladora&lt;/h3&gt;&lt;p data-sourcepos=&quot;13:1-13:360&quot;&gt;Imagina a esos programadores del pasado, meticulosamente escribiendo línea tras línea de código, resolviendo cada detalle, depurando incansablemente. Cada nueva funcionalidad, cada ajuste, era como cavar una pequeña sección de esa zanja con una pala. Era un proceso manual, propenso a errores humanos y que escalaba linealmente con la complejidad del proyecto.&lt;/p&gt;&lt;p data-sourcepos=&quot;15:1-15:575&quot;&gt;Hoy, la Inteligencia Artificial, especialmente los agentes de IA capaces de generar código, está asumiendo el rol de esa retroexcavadora. Ya no se trata de que varios programadores caven con sus &quot;palas&quot; de código individual. Ahora, un único programador, con la ayuda de herramientas de IA, puede lograr resultados que antes requerirían un equipo mucho más grande y un tiempo considerablemente mayor. La IA puede generar fragmentos de código, completar funcionalidades, e incluso identificar y sugerir soluciones a problemas, acelerando drásticamente el proceso de desarrollo.&lt;/p&gt;&lt;h3 data-sourcepos=&quot;17:1-17:49&quot;&gt;La IA Transformando el Desarrollo con GeneXus&lt;/h3&gt;&lt;p data-sourcepos=&quot;19:1-19:307&quot;&gt;GeneXus, con su enfoque de desarrollo basado en modelos y su capacidad para generar automáticamente aplicaciones para múltiples plataformas, siempre ha sido un pionero en la automatización del desarrollo. La integración de la Inteligencia Artificial eleva esta automatización a un nivel completamente nuevo:&lt;/p&gt;&lt;ul data-sourcepos=&quot;21:1-26:0&quot;&gt;
&lt;li data-sourcepos=&quot;21:1-21:242&quot;&gt;&lt;strong&gt;Generación de Prototipos Inteligente:&lt;/strong&gt; La IA puede analizar descripciones de requisitos en lenguaje natural y sugerir estructuras de datos, interfaces de usuario y lógicas de negocio iniciales, acelerando la fase de diseño y prototipado.&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:1-22:239&quot;&gt;&lt;strong&gt;Optimización del Código Generado:&lt;/strong&gt; Los algoritmos de IA pueden analizar el código generado por GeneXus y sugerir optimizaciones para mejorar el rendimiento, la seguridad o la eficiencia, llevando el código a un nuevo nivel de calidad.&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:1-23:297&quot;&gt;&lt;strong&gt;Asistencia en la Depuración y el Mantenimiento:&lt;/strong&gt; La IA puede identificar patrones en errores, sugerir posibles causas y proponer soluciones, reduciendo el tiempo de depuración. Además, puede ayudar a entender y mantener código legacy, incluso si no fue desarrollado por el programador actual.&lt;/li&gt;
&lt;li data-sourcepos=&quot;24:1-24:281&quot;&gt;&lt;strong&gt;Creación de Agentes Conversacionales y Bots:&lt;/strong&gt; Integrar capacidades de IA permite a los desarrolladores de GeneXus incorporar asistentes virtuales y chatbots inteligentes directamente en sus aplicaciones, mejorando la experiencia del usuario y automatizando tareas repetitivas.&lt;/li&gt;
&lt;li data-sourcepos=&quot;25:1-26:0&quot;&gt;&lt;strong&gt;Análisis Predictivo e Inteligencia de Negocio:&lt;/strong&gt; La IA puede potenciar las aplicaciones GeneXus con capacidades de análisis predictivo, permitiendo a las empresas tomar decisiones más informadas basándose en grandes volúmenes de datos.&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;27:1-27:213&quot;&gt;En esencia, la IA permite a los desarrolladores de GeneXus enfocarse en la lógica de negocio y la innovación, mientras que las tareas repetitivas y de baja complejidad son manejadas por la inteligencia artificial.&lt;/p&gt;&lt;h3 data-sourcepos=&quot;29:1-29:57&quot;&gt;La Nueva Habilidad: Operar la Retroexcavadora Digital&lt;/h3&gt;&lt;p data-sourcepos=&quot;31:1-31:334&quot;&gt;Retomando nuestra analogía: así como operar una retroexcavadora no es lo mismo que usar una pala – exige una capacitación diferente, una comprensión de la máquina y sus límites, y una mayor responsabilidad –, supervisar y dirigir herramientas de IA en el desarrollo de software también demanda un conjunto de habilidades evolucionado.&lt;/p&gt;&lt;p data-sourcepos=&quot;33:1-33:83&quot;&gt;Los desarrolladores del futuro no solo necesitarán saber &quot;programar&quot;, sino también:&lt;/p&gt;&lt;ul data-sourcepos=&quot;35:1-39:0&quot;&gt;
&lt;li data-sourcepos=&quot;35:1-35:120&quot;&gt;&lt;strong&gt;Entender los principios de la IA:&lt;/strong&gt; Comprender cómo funcionan estas herramientas, sus fortalezas y sus limitaciones.&lt;/li&gt;
&lt;li data-sourcepos=&quot;36:1-36:123&quot;&gt;&lt;strong&gt;Diseñar prompts efectivos:&lt;/strong&gt; Saber cómo comunicarse con los agentes de IA para obtener el código o la solución deseada.&lt;/li&gt;
&lt;li data-sourcepos=&quot;37:1-37:185&quot;&gt;&lt;strong&gt;Evaluar y validar el código generado:&lt;/strong&gt; La IA es una herramienta; la validación y el criterio humano son cruciales para asegurar la calidad, la seguridad y la adecuación del código.&lt;/li&gt;
&lt;li data-sourcepos=&quot;38:1-39:0&quot;&gt;&lt;strong&gt;Ser &quot;arquitectos&quot; de la solución:&lt;/strong&gt; En lugar de solo &quot;constructores&quot;, los desarrolladores se convierten en orquestadores de múltiples herramientas y agentes de IA.&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;40:1-40:403&quot;&gt;La llegada de la IA al desarrollo de aplicaciones con GeneXus no es un reemplazo de los programadores, sino una &lt;strong&gt;amplificación de sus capacidades&lt;/strong&gt;. Es una invitación a subirnos a la retroexcavadora digital y transformar la forma en que construimos el futuro del software. Aquellos que dominen estas nuevas &quot;máquinas&quot; serán los que lideren la próxima era de la innovación en desarrollo de aplicaciones.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/9143030015611131897/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/06/la-retroexcavadora-digital-como-la-ia.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/9143030015611131897'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/9143030015611131897'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/06/la-retroexcavadora-digital-como-la-ia.html' title='La Retroexcavadora Digital: Cómo la IA Potencia el Desarrollo de Aplicaciones con GeneXus (by Gemini)'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRFp-eGZKcbyF4sx26hRk00G_b2LyXn62nu2A9HSkbLr0qb6ZJCZoHMF0Iib7pikNPv9AAMQkGrWIuEdBZx-7ia_lDleEKawd2MSzBTnM313ZBjzKnBHqTN7IPerjeXBK4vblzFlpbp1zJXfOAVW_jAWcaikjrekuZo6WYVzFnoAkJI3ZW3d4jKg/s72-c/Gemini_Generated_Image_1v1k4x1v1k4x1v1k.jpeg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-6011054286322411578</id><published>2025-06-12T15:24:00.002-03:00</published><updated>2025-06-12T16:14:15.907-03:00</updated><title type='text'>De palas a retroexcavadoras: el nuevo paradigma del desarrollo con IA (by GhatGpt) </title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSLXVwNpKgoz3NnfB7wK8nNIl6jT02IkckBurA9CCGHJUIPdbkNUh9zQZRP-Cbuq8VoJ35FR3ng5luNyA3IHJQ-lx18kwnUl_qL0EqniRncLLFfNhMt_BI0xdCcy5MlnNdzIG_s2wXGtFZWEO4nCbC0N3zCXaUpw-VkDCm2SB45YZh_PxrUsqrdg/s1024/ChatGPT%20Image%20Jun%2012,%202025,%2003_18_38%20PM.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1024&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSLXVwNpKgoz3NnfB7wK8nNIl6jT02IkckBurA9CCGHJUIPdbkNUh9zQZRP-Cbuq8VoJ35FR3ng5luNyA3IHJQ-lx18kwnUl_qL0EqniRncLLFfNhMt_BI0xdCcy5MlnNdzIG_s2wXGtFZWEO4nCbC0N3zCXaUpw-VkDCm2SB45YZh_PxrUsqrdg/s320/ChatGPT%20Image%20Jun%2012,%202025,%2003_18_38%20PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;En el mundo de la construcción, hubo un antes y un después con la aparición de la retroexcavadora. Antes, hacer una zanja requería a varios operarios con palas, trabajando durante horas bajo el sol. Luego llegó una máquina que no solo reemplazó a varios de ellos, sino que lo hizo más rápido, con mayor precisión y sin descanso.&lt;p&gt;&lt;/p&gt;
&lt;p data-end=&quot;693&quot; data-start=&quot;618&quot;&gt;Hoy, en el desarrollo de software, estamos viviendo una revolución similar.&lt;/p&gt;
&lt;h3 data-end=&quot;745&quot; data-start=&quot;695&quot;&gt;&lt;strong data-end=&quot;745&quot; data-start=&quot;699&quot;&gt;De líneas de código a agentes inteligentes&lt;/strong&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1027&quot; data-start=&quot;747&quot;&gt;Durante décadas, el desarrollo de aplicaciones con herramientas como GeneXus fue sinónimo de modelar, codificar, generar, probar y ajustar. Aunque GeneXus ya ofrecía una ventaja al abstraer muchos de estos pasos, la inteligencia artificial está empujando los límites aún más allá.&lt;/p&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1029&quot;&gt;Los agentes de IA que escriben código, entienden requerimientos, generan pruebas automáticas, refactorizan programas o incluso diseñan interfaces, están transformando profundamente cómo se construyen las soluciones. Lo que antes requería un equipo entero durante semanas, ahora puede comenzar a resolverse en horas con un solo desarrollador apoyado por una batería de asistentes inteligentes.&lt;/p&gt;
&lt;h3 data-end=&quot;1480&quot; data-start=&quot;1423&quot;&gt;&lt;strong data-end=&quot;1480&quot; data-start=&quot;1427&quot;&gt;La retroexcavadora digital ya está entre nosotros&lt;/strong&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1734&quot; data-start=&quot;1482&quot;&gt;Así como nadie en su sano juicio construiría una zanja a pala hoy en día si tiene acceso a maquinaria, tampoco tiene sentido enfrentar un desarrollo complejo sin aprovechar IA. No se trata de reemplazar al programador, sino de multiplicar su capacidad.&lt;/p&gt;
&lt;p data-end=&quot;1928&quot; data-start=&quot;1736&quot;&gt;El desarrollador moderno debe convertirse en operador de esta nueva “retroexcavadora digital”: saber cómo usarla, cuándo intervenir manualmente, y cómo guiarla para obtener el mejor resultado.&lt;/p&gt;
&lt;h3 data-end=&quot;1962&quot; data-start=&quot;1930&quot;&gt;&lt;strong data-end=&quot;1962&quot; data-start=&quot;1934&quot;&gt;¿Y qué pasa con GeneXus?&lt;/strong&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2241&quot; data-start=&quot;1964&quot;&gt;GeneXus, como plataforma low-code basada en modelos, está especialmente posicionada para aprovechar estos avances. Su enfoque declarativo, la separación clara entre modelo y código generado, y su integración con extensiones y asistentes, permite incorporar IA de forma natural.&lt;/p&gt;
&lt;p data-end=&quot;2439&quot; data-start=&quot;2243&quot;&gt;Desde la generación de reglas y validaciones a partir de lenguaje natural, hasta la automatización de documentación o pruebas, la IA está empujando a GeneXus hacia un nuevo nivel de productividad.&lt;/p&gt;&lt;h3 data-end=&quot;121&quot; data-start=&quot;103&quot;&gt;&lt;strong data-end=&quot;121&quot; data-start=&quot;107&quot;&gt;Conclusión&lt;/strong&gt;&lt;/h3&gt;&lt;p data-end=&quot;422&quot; data-start=&quot;123&quot;&gt;No estamos ante una moda pasajera. Estamos ante una transformación de fondo. Así como la retroexcavadora cambió la forma de construir, los agentes de IA están cambiando la forma de desarrollar. Resistirse a adoptarlos es como aferrarse a la pala cuando la zanja puede estar lista antes del mediodía.&lt;/p&gt;&lt;p data-end=&quot;827&quot; data-start=&quot;424&quot;&gt;Pero esta nueva herramienta también exige algo más: &lt;strong data-end=&quot;492&quot; data-start=&quot;476&quot;&gt;capacitación&lt;/strong&gt;. Así como para manejar una retroexcavadora se requiere un operador capacitado y no solo alguien con fuerza física, &lt;strong data-end=&quot;743&quot; data-start=&quot;608&quot;&gt;para supervisar y aprovechar al máximo los agentes de inteligencia artificial también se necesita un perfil técnico más sofisticado&lt;/strong&gt;, capaz de entender el contexto, validar resultados y tomar decisiones estratégicas.&lt;/p&gt;&lt;p data-end=&quot;2439&quot; data-start=&quot;2243&quot;&gt;


&lt;/p&gt;&lt;p data-end=&quot;957&quot; data-start=&quot;829&quot;&gt;El futuro del desarrollo no es humano &lt;em data-end=&quot;870&quot; data-start=&quot;867&quot;&gt;o&lt;/em&gt; máquina. Es humano &lt;em data-end=&quot;895&quot; data-start=&quot;890&quot;&gt;con&lt;/em&gt; máquina. Y ese humano deberá estar mejor preparado que nunca.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/6011054286322411578/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/06/de-palas-retroexcavadoras-el-nuevo.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6011054286322411578'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6011054286322411578'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/06/de-palas-retroexcavadoras-el-nuevo.html' title='De palas a retroexcavadoras: el nuevo paradigma del desarrollo con IA (by GhatGpt) '/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSLXVwNpKgoz3NnfB7wK8nNIl6jT02IkckBurA9CCGHJUIPdbkNUh9zQZRP-Cbuq8VoJ35FR3ng5luNyA3IHJQ-lx18kwnUl_qL0EqniRncLLFfNhMt_BI0xdCcy5MlnNdzIG_s2wXGtFZWEO4nCbC0N3zCXaUpw-VkDCm2SB45YZh_PxrUsqrdg/s72-c/ChatGPT%20Image%20Jun%2012,%202025,%2003_18_38%20PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5980598.post-6748246590778454204</id><published>2025-05-19T12:52:00.003-03:00</published><updated>2025-05-19T12:52:52.126-03:00</updated><title type='text'>Agente AI para automatizar el ciclo de vida de nuevas funcionalidades en una KB GeneXus</title><content type='html'>&lt;h2 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhsiKmtEi9GhsypmkNAgxFkWCDqQFKWhSSjXEF44xa0LwB19bPX46LHwR_PDmU0N0HZbsQu8FN3pcXTHTIPXNpOXsZoHAnpstPVOQizd2OqVwl655nx49EzzkcUO4hl6uZ_1qmnVV5-qiodzH6fflEtjLmBC5Unjq7j-er89hVhkQxtR9fyO4LoVQ&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1000&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhsiKmtEi9GhsypmkNAgxFkWCDqQFKWhSSjXEF44xa0LwB19bPX46LHwR_PDmU0N0HZbsQu8FN3pcXTHTIPXNpOXsZoHAnpstPVOQizd2OqVwl655nx49EzzkcUO4hl6uZ_1qmnVV5-qiodzH6fflEtjLmBC5Unjq7j-er89hVhkQxtR9fyO4LoVQ&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Introducción&lt;/h2&gt;
&lt;p class=&quot;&quot; data-end=&quot;929&quot; data-start=&quot;530&quot;&gt;La adopción de agentes inteligentes en los procesos de desarrollo de software está revolucionando la forma en que las tareas repetitivas, complejas o de largo plazo se gestionan en proyectos reales. Imaginemos un escenario en el que un Agente AI se integra con nuestra KB GeneXus y, a lo largo de varias semanas o meses, realiza todo el proceso de evolución controlada de una funcionalidad crítica.&lt;/p&gt;
&lt;p class=&quot;&quot; data-end=&quot;1205&quot; data-start=&quot;931&quot;&gt;En este post, describo un caso práctico sobre cómo este agente podría manejar de manera autónoma la implementación, testeo, despliegue progresivo y, eventualmente, el retiro seguro de una funcionalidad en producción, utilizando Feature Flags y pruebas automáticas. El ejemplo me gusta porque permite unificar en un flujo el trabajo de varios asistentes (el que hace programas, el que hace deploy, el que prueba, etc0&amp;nbsp;&lt;/p&gt;
&lt;hr class=&quot;&quot; data-end=&quot;1210&quot; data-start=&quot;1207&quot; /&gt;
&lt;h3 class=&quot;&quot; data-end=&quot;1282&quot; data-start=&quot;1212&quot;&gt;Caso de uso: Automatización inteligente de una nueva funcionalidad&lt;/h3&gt;
&lt;p class=&quot;&quot; data-end=&quot;1570&quot; data-start=&quot;1284&quot;&gt;&lt;strong data-end=&quot;1298&quot; data-start=&quot;1284&quot;&gt;Escenario:&lt;/strong&gt;&lt;br data-end=&quot;1301&quot; data-start=&quot;1298&quot; /&gt;
Queremos incorporar una nueva forma de calcular precios en un sistema core, pero sin arriesgar la estabilidad del entorno productivo. Usaremos una Feature Flag para controlar la activación progresiva y aseguraremos calidad a través de pruebas automáticas en producción.&lt;/p&gt;
&lt;h4 class=&quot;&quot; data-end=&quot;1638&quot; data-start=&quot;1572&quot;&gt;Paso 1: Recepción de la especificación y generación de código&lt;/h4&gt;
&lt;ul data-end=&quot;2011&quot; data-start=&quot;1640&quot;&gt;
&lt;li class=&quot;&quot; data-end=&quot;1801&quot; data-start=&quot;1640&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;1801&quot; data-start=&quot;1642&quot;&gt;El agente AI recibe la especificación de la nueva funcionalidad (puede ser una descripción en lenguaje natural, un documento formal, o un issue en el backlog).&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;1888&quot; data-start=&quot;1802&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;1888&quot; data-start=&quot;1804&quot;&gt;Traduce esa especificación a lógica GeneXus (procedimientos, reglas, paneles, etc.).&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;2011&quot; data-start=&quot;1889&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;2011&quot; data-start=&quot;1891&quot;&gt;Integra el nuevo código en la KB, pero bajo el control de una Feature Flag (por ejemplo: &lt;code data-end=&quot;2009&quot; data-start=&quot;1980&quot;&gt;Feature.NewPriceCalculation&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;&quot; data-end=&quot;2063&quot; data-start=&quot;2013&quot;&gt;Paso 2: Diseño de casos de prueba automáticos&lt;/h4&gt;
&lt;ul data-end=&quot;2277&quot; data-start=&quot;2065&quot;&gt;
&lt;li class=&quot;&quot; data-end=&quot;2167&quot; data-start=&quot;2065&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;2167&quot; data-start=&quot;2067&quot;&gt;El agente diseña y programa varios casos de prueba que cubren las ramas críticas de la nueva lógica. Aqui es fundamental la intervención humana para chequear que las pruebas estén bien diseñadas. En el caso de programas que reciben parámetros y devuelven algún resultado, puede ser mas fácil probar que hacer las llamadas con ambos programas devuelve el mismo resultado. En caso que tenga algún cambio en el entorno (por ejemplo, grabar en la base de datos o grabar archivos) es necesario pruebas mas rigurosas.&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;2277&quot; data-start=&quot;2168&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;2277&quot; data-start=&quot;2170&quot;&gt;Estas pruebas están diseñadas para ejecutarse automáticamente en los ambientes de QA, staging y producción.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;&quot; data-end=&quot;2324&quot; data-start=&quot;2279&quot;&gt;Paso 3: Despliegue paulatino y monitoreo&lt;/h4&gt;
&lt;ul data-end=&quot;2567&quot; data-start=&quot;2326&quot;&gt;
&lt;li class=&quot;&quot; data-end=&quot;2443&quot; data-start=&quot;2326&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;2443&quot; data-start=&quot;2328&quot;&gt;La Feature Flag permite activar la nueva funcionalidad solo para un porcentaje controlado de usuarios o escenarios.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;2567&quot; data-start=&quot;2444&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;2567&quot; data-start=&quot;2446&quot;&gt;El agente monitorea diariamente los resultados de las pruebas automáticas y analiza logs, errores y feedback de usuarios.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;&quot; data-end=&quot;2619&quot; data-start=&quot;2569&quot;&gt;Paso 4: Gestión de rollback y mejora continua&lt;/h4&gt;
&lt;ul data-end=&quot;3002&quot; data-start=&quot;2621&quot;&gt;
&lt;li class=&quot;&quot; data-end=&quot;2765&quot; data-start=&quot;2621&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;2765&quot; data-start=&quot;2623&quot;&gt;Si se detectan errores, el agente puede desactivar automáticamente la nueva lógica (gracias a la Feature Flag) y enviar un reporte de errores.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;2895&quot; data-start=&quot;2766&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;2895&quot; data-start=&quot;2768&quot;&gt;Luego, intenta corregir la funcionalidad en base al análisis de los incidentes, reprogramando el ciclo de pruebas y despliegue.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;3002&quot; data-start=&quot;2896&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;3002&quot; data-start=&quot;2898&quot;&gt;Este proceso se repite tantas veces como sea necesario hasta que las pruebas pasen de forma consistente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;&quot; data-end=&quot;3068&quot; data-start=&quot;3004&quot;&gt;Paso 5: Retiro del código viejo y limpieza de Feature Flags&lt;/h4&gt;
&lt;ul data-end=&quot;3364&quot; data-start=&quot;3070&quot;&gt;
&lt;li class=&quot;&quot; data-end=&quot;3257&quot; data-start=&quot;3070&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;3257&quot; data-start=&quot;3072&quot;&gt;Cuando la nueva funcionalidad ha estado activa durante &lt;strong data-end=&quot;3138&quot; data-start=&quot;3127&quot;&gt;3 meses&lt;/strong&gt; sin errores ni incidentes relevantes, el agente propone la eliminación del código anterior y la Feature Flag asociada.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;3364&quot; data-start=&quot;3258&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;3364&quot; data-start=&quot;3260&quot;&gt;Sugiere y/o ejecuta una refactorización para dejar la KB limpia y actualizada, eliminando deuda técnica.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class=&quot;&quot; data-end=&quot;3369&quot; data-start=&quot;3366&quot; /&gt;
&lt;h3 class=&quot;&quot; data-end=&quot;3401&quot; data-start=&quot;3371&quot;&gt;Beneficios de este enfoque&lt;/h3&gt;
&lt;ul data-end=&quot;3846&quot; data-start=&quot;3403&quot;&gt;
&lt;li class=&quot;&quot; data-end=&quot;3512&quot; data-start=&quot;3403&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;3512&quot; data-start=&quot;3405&quot;&gt;&lt;strong data-end=&quot;3429&quot; data-start=&quot;3405&quot;&gt;Reducción de riesgo:&lt;/strong&gt; El despliegue controlado y automatizado minimiza impactos negativos en producción.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;3622&quot; data-start=&quot;3513&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;3622&quot; data-start=&quot;3515&quot;&gt;&lt;strong data-end=&quot;3544&quot; data-start=&quot;3515&quot;&gt;Aceleración del delivery:&lt;/strong&gt; Automatizar el ciclo completo acorta tiempos y reduce la intervención humana.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;3721&quot; data-start=&quot;3623&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;3721&quot; data-start=&quot;3625&quot;&gt;&lt;strong data-end=&quot;3645&quot; data-start=&quot;3625&quot;&gt;Mejora continua:&lt;/strong&gt; El agente puede aprender de los errores y ajustar futuras implementaciones.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;&quot; data-end=&quot;3846&quot; data-start=&quot;3722&quot;&gt;
&lt;p class=&quot;&quot; data-end=&quot;3846&quot; data-start=&quot;3724&quot;&gt;&lt;strong data-end=&quot;3752&quot; data-start=&quot;3724&quot;&gt;Mantenimiento evolutivo:&lt;/strong&gt; La eliminación programada de código obsoleto evita la acumulación de complejidad innecesaria.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class=&quot;&quot; data-end=&quot;3851&quot; data-start=&quot;3848&quot; /&gt;
&lt;h3 class=&quot;&quot; data-end=&quot;3869&quot; data-start=&quot;3853&quot;&gt;Conclusiones&lt;/h3&gt;
&lt;p class=&quot;&quot; data-end=&quot;4253&quot; data-start=&quot;3871&quot;&gt;La incorporación de agentes AI autónomos para gestionar el ciclo de vida de funcionalidades en GeneXus abre un nuevo paradigma en la productividad y calidad del desarrollo low-code. Automatizar desde la programación hasta la refactorización final permite que los equipos humanos se enfoquen en la innovación, dejando las tareas repetitivas y de control a la inteligencia artificial.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;&quot; data-end=&quot;4253&quot; data-start=&quot;3871&quot;&gt;Por el momento, esto no es posible hacer en un cien por ciento, pero es algo que nos amos aproximando en forma acelerada. Cuando tengamos este tipo de ayudas, vamos a poder aumentar nuestra productividad, sustituyendo varias tareas repetitivas y que se prolongan en el tiempo.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Publicado en http://ealmeida.blogspot.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://ealmeida.blogspot.com/feeds/6748246590778454204/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='https://ealmeida.blogspot.com/2025/05/agente-ai-para-automatizar-el-ciclo-de.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6748246590778454204'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5980598/posts/default/6748246590778454204'/><link rel='alternate' type='text/html' href='https://ealmeida.blogspot.com/2025/05/agente-ai-para-automatizar-el-ciclo-de.html' title='Agente AI para automatizar el ciclo de vida de nuevas funcionalidades en una KB GeneXus'/><author><name>Enrique Almeida</name><uri>http://www.blogger.com/profile/14840952830880488550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPKMxvej3LziI2NNapsmgcV8AsfDr6lD-KuCj69POqUMJPWchx-UB6T5cs1suBHp1pIY72R2FZx19uQMeD83n2b4PxJFXkgf9fO19ydzw2qf6oO-6-li1ER9QwzPLm6GsSZWiLAVx0A2jW5dwTgP3gAba2fcJeN7oH5RytQFknnSw66SQ/s220/WhatsApp%20Image%202024-09-09%20at%2013.08.32_0a6ab4fe.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhsiKmtEi9GhsypmkNAgxFkWCDqQFKWhSSjXEF44xa0LwB19bPX46LHwR_PDmU0N0HZbsQu8FN3pcXTHTIPXNpOXsZoHAnpstPVOQizd2OqVwl655nx49EzzkcUO4hl6uZ_1qmnVV5-qiodzH6fflEtjLmBC5Unjq7j-er89hVhkQxtR9fyO4LoVQ=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry></feed>