Entradas

Temporal Databases: Auditoría de tablas con SQL Server (1)

Imagen
Desde hace un tiempo he estado mirando con cariño la funcionalidad de manejo de tiempo en tablas de las base de datos.

Uno de los escenarios mas fácil de implementar es el de Auditoría de tablas.

Suponiendo que tenemos una KB con una aplicación que usa SQL Server 2016 o superior, y tiene una tabla Productos

PRODUCTOS
*ProductoID
 ProductoNombre
 ProductoFamila
 UsuarioQueModifico 

y quiero tener una auditoria de como cambia dicha tabla a lo largo del tiempo.

Una forma fácil de lograr esto, es pasar la tabla a una tabla temporal de SQL Server .

Lo que se puede hacer es ejecutar:


Lo que hice fue un procedure AgregarTemporalidad que recibe un parámetro &TableName y ejecuta:

&Sentence = format("ALTER TABLE %1 ADD %1_ValidFrom datetime2 GENERATED ALWAYS AS ROW START HIDDEN constraint %1_DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME()), %1_ValidTo datetime2 GENERATED ALWAYS AS ROW END   HIDDEN constraint %1_DF_ValidTo DEFAULT '9999.12.31 23:59:59.99' , PERIOD FOR SY…

TDD y GeneXus

Imagen
TDD (Test Driven Development) es un proceso de desarrollo que se basa en repetir pasos muy cortitos y sencillos, traduciendo los nuevos requerimientos en casos de pruebas y luego modificar el código de la aplicación para que cumpla con esos casos de pruebas (y por lo tanto con los nuevos requerimientos).  Luego que tenemos el código que pasa todas las pruebas, se realiza el refactoring para evitar codigo repetido u optimizar lo que sea necesario, pero manteniendo todas los casos de prueba. 
El ciclo de ejecutar todas las pruebas de la KB, debería ser rapido para poder ser productivo, pues esto hay que hacer muchisimas veces en el dia.

Con GeneXus 16 se incorpora el objetos Unit Test y una forma fácil de poder ejecutar todos las pruebas de una KB, con lo cual se habilita el desarrollo basado en Test.  
Ventajas El usar pequeños pasos en el desarrollo, lleva a que es mas  fácil detectar los errores introducidos en la programación que con otros procesos de desarrollo.  También es siempre…

GetLocation() y sus errores en producción.

Imagen
En GeneXus para hacer paramétrico el consumo de servicios web SOAP, se necesita usar la funcion GetLocation() . Por ejemplo:

&Location = GetLocation('LocationName')

El 'LocationName', es un string que depende de:

* Nombre de objeto External Object SOAP
* Modulos en los cuales esta el external object.

Por ejemplo, si tengo el external object

&Calc basado en el EO  &Calculator y está en el modulo CALCULADORA, que a su vez esta en el modulo FUNCIONES, el nombre será

FUNCIONES_CALCULADORA_Calculator

Entonces en mi codigo voy a tener:

&Location = GetLocation('FUNCIONES_CALCULADORA_Calculator')
&Location.Host=DevuelveHost()
...
&Resultado=&Calc.Add(10,20)

Que problema tiene este código?

El problema es que dicho código es demasiado frágil ante cambios de la KB.
Si cambio el nombre del external object, o si cambio la modularizacion (nombre de modulo, muevo un modulo, etc) la función devuelve un &Location vacio y no es tomado en cuenta al eje…

Proyectos de innovación de 2019 de Concepto.

Imagen
En CONCEPTO, el año 2019 fue un buen año para la innovación.

Estamos trabajando en varios proyectos novedosos y que van a permitir mejorar la productividad de nuestros clientes.

Algunos de los proyectos que realizamos: Incorporación de Blockchain en intercambio con Aduanas del Mercosur (Operador Económico Autorizado) Pilotos de Inteligencia Artificial (Redes Neuronales, procesamiento de lenguaje natural, clasificación de descripciones comerciales, geolocalización de compras por internet)Primeros Pasos en BOTs (tenemos un prototipo funcionando con Whatsapp y GeneXus)Migración a la ultima versión de GeneXus 16 de varias bases de conocimiento. Automatización de Build y Deploy con Jenkins. División de una KB grande en tres KB más modulares, con deploy independiente y automatizado. Proyecto de Business Intelligence con PentahoUtilización de .NET Core en proyecto pilotoIncorporación de modelo de datos de la OMA (Organización Mundial de Aduanas) en algunos mensajes del sistema LUCIA. Mejora…

Receta: Como limpiar una KB GeneXus

Imagen
Ingredientes
KB GeneXus madura (de mas de 2 años)GeneXus (Evo3 o Superior, si es 16, mucho mejor)KBDoctor (http://marketplace.genexus.com/product.aspx?kbdoctor,en)LSIExtensions (http://marketplace.genexus.com/product.aspx?lsiextensiones,en)VariableCleaner (https://marketplace.genexus.com/product.aspx?variablescleanerbydvelop,en)KBTools (https://marketplace.genexus.com/product.aspx?kbtools,en)Build all exitoso (sin errores) Preparación 1 - Crear un punto de retorno seguro.  Las tareas de limpieza pueden borrar mas cosas de las deseadas, por lo que es importante crear siempre un punto seguro de retorno, por si algo sale mal.  Lo recomendable es hacer un Export de toda la KB y sus propiedades con GeneXus.  Ademas del export, es bueno hacer un Versión congelada y ponerle el nombre "Antes de la limpieza".  View / Versions / (botón derecho) Freeze 
2 - Revisar la KB y Comprimir la KB.  Salir de GeneXus y desde la linea de comandos, usar las KBTools y ejecutar KBTools/KBCompress/KBC…

Estado de automatización del proceso de desarrollo con Genexus (II)

Imagen
En el artículo anterior  comentaba mi evaluación del estado de automatización de las diferentes etapas del desarrollo GeneXus.

Un colega me preguntaba que se podía automatizar en la etapa de programación, donde lo que hay que hacer es "solo escribir código", lo cual es "poco automatizable". 
Mi sensación que es un etapa donde hay muchísimo para automatizar, sobre todo en el refactoring de código. 
Seria bueno, contar en forma nativa con las siguientes tareas automatizadas: 
renombrar una variable y que la renombre en todo el códigoagregar un parametro a un objeto y agregarlo a las invocaciones a dicho objeto en el resto de la KB. sacar un parámetro a un objeto y sacarlo de todas las llamadas. cambiar todas las llamadas de forma

call(objeto, parametrosIN, parametroOUT)  por
   ParametroOUT=Objeto(parametrosIN)
ordenar los eventos / subrutinas por su orden "natural"cuando escribo
objeto( que de la opción de copiar los parámetros de dicho y crear variables con e…

Estado de automatización del proceso de desarrollo con Genexus.

Imagen
En mi rol de dueño de una empresa de software, uno de los temas que me preocupa, es poder hacer proyectos grandes en forma competitiva. Es común tener que competir con empresas de otros países (que usan otras metodologías y herramientas) y debemos ser capaces de hacer un software mejor (o tan bueno como el de ellos) con menos recursos.
Una de las formas que tenemos de ser mas competitivos, es automatizar lo automatizable de todo el proceso de desarrollo. Los proyectos grandes que realizamos los hacemos con Genexus, y eso me lleva cada tanto, evaluar que tan bien o mal estamos en determinadas etapas y tareas del proceso de desarrollo. 
Las etapas y tareas pueden tener diferentes nombres y diferentes contenidos en diferentes empresas o metodologías, pero de cualquier forma, a mi me resulta útil ver el estado actual, su evolución en el tiempo y en que conviene focalizarse para tener mayores ganancias. 
Veo la importancia de dicha tareas (varia un poco de proyecto en proyecto), la frecue…