Ir al contenido principal

Context en el Pattern WorkWith de GX Evolution 1

Me sucedió trabajar en un proyecto que usaba el Work With Pattern y precisaba filtrar la información a mostrar utilizando como filtros valores que venian dados de antes.

En particular quería mostrar en el WWCustomer solo los clientes de determinado país (el país asociado al usuario que estaba logueado), pero podrían aplicar a multiples casos.Mi tendencia inicial fue utilizar cookies.

Es decir, en el login determinar el país correspondiende al usuario y hacer un "setCookie("Country", CountryId)".
Luego en el WWClientes simplemente agregar la condición: CountryId=getCookie("Country")

Si bien esto me funcionó había dos cosas que no me convencieron:

1. Parece un esquema algo "débil" en el sentido que no está formalizado que esa es información de contexto importante para el WW. Cualquiera podría modificar esa cookie con otro valor o directamente eliminarla y mi esquema dejaría de funcionar.

2. Al utilizar esa condición (con el "getcookie") la misma no va en el SELECT  resultante lo cual puede significar una pérdida de performance, etc.

Dejemos lo del esquema "débil" de lado porque es algo "opinable", lo que si me preocupaba era la performance, paginado, etc,  porque ahí es claro: es mejor que la condición sea parte del SELECT resultante de modo que la consulta la resuelva el DBMS.

¿Cómo hacer que la condición vaya en el SQL?

Fácil, se puede asignar una variable en el evento start y filtrar por ella.
El problema con esto es que si modifico los eventos del WWCustomer entonces pierdo el dinamismo de esa parte con el Pattern y es algo que no quiero perder.

Ahí apareció la solución de usar el contexto.

Es bastante simple:

1. En lugar de un SetCookie lo que se hace es agregar al SDT:Context el elemento que se desea mantener, en mi caso el CountryId:

contextsdt.PNG

y luego en el programa que hacía el SetCookie lo que hago es invocar al procedure SetContext:

contextsetcountry.PNG

2. Una vez que lo tengo “seteado” en el contexto luego solo debo poner la condición en la instancia del Pattern: CountriId=&Context.CountryId

contextconditionpattern.PNG

¿Cómo funciona?

Es bastante sencillo, en el objeto WWCustomer se crea automáticamente la variable &Context basada en el SDT:Context. Esa variable tiene como “Initial Value” el procedure “LoadContext” que es el que se encarga de instanciar &Context con lo que se tiene almacenado en la sesión.

En resumen, todo me queda optimizado y mantengo la automatización, el dinamismo con el pattern, etc.

Moraleja: si usa el WorkWith Pattern préstele atención al manejo del Context, es algo que está bueno para resolver varios casos del estilo.

Hay una KB con un ejemplo sencillo en el GXServer Publico

Comentarios

  1. Esta misma técnica yo la utilizo para hacer mis aplicaciones multitenant. Basta con poner el TenantId en el context, también en el momento del login como en el ejemplo de Gustavo, y luego en cada WW agregar la condición TenantId=&context.TenantId.

    Esto me lleva a pensar que no parece muy complicado potenciar al pattern Work With, para que tenga la opción de ayudarnos a crear aplicaciones multitenant.

    Imaginemos que exista una propiedad de la kb que sea Multitenant true o false, y si fuera true, que solicite informar el atributo que sea Id de la entidad Tenant. Luego en cada instancia de WW también una propiedad que sea Multitenant true, false o “Use environment property value”, esto es porque probablemente existan algunas entidades compartidas por los distintos tenant, por ejemplo Países.

    Con esto el Genexus ya dispondría de la información como para agregar en las condition de cada objeto el filtro por tenant; y lo que parecería más difícil, agregar en la estructura el TenantId, pero bueno, ya tenemos el Category pattern que toca la estructura cuando es aplicado.

    Para el equipo de desarrollo de Genexus seguramente no será tan simple de hacerlo como para mí describirlo (habría que resolver el tratamiento de autonuméricos, por ejemplo), pero me parece una idea alineada con lo que a futuro van a necesitar todos los sistemas y de paso se agrega funcionalidad al viejo pattern Work With que si bien es muchísimo lo que aporta actualmente, a veces extraño poder hacer un prompt o hacer múltiples WW para una misma transacción como lo hacía en las primeras versiones sobre la 9.0. También se me ocurre que por el porte del cambio, podríamos recibirlo en algún Ux de la evo 1 y no esperar hasta la evo 2 con las alternativas que Artech está evaluando según una conferencia que presencié en el encuentro.

    Saludos.
    Marcelo Arias
    marcelo.arias@saasforeach.com

    ResponderBorrar
  2. Marcelo,

    Compartimos la importancia del tema y se está trabajando en eso (que hacer app multitenant sea basicamente una propiedad), incluso Federico Azzato dio una charla en el XX Encuentro (http://www.events.genexus.com/portal/hgxpp001.aspx?16,73,1248,O,S,0,,2185) no tengo claro el status a hoy e incluso hay unos cuantos casos "divertidos" como formulas, etc, pero seguro es un objetivo a cubrir en el corto plazo.

    Saludos,
    Gustavo

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Liberar una versión: el fin del principio

Quienes desarrollamos software buscamos afectar positivamente la vida de las personas a través de nuestras aplicaciones. Ese es nuestro objetivo final, ese es nuestro éxito. Quienes desarrollamos , que ayuda a nuestros colegas en esa misión, solo tenemos éxito cuando ellos tienen éxito, por eso solemos decir que cuando liberamos una versión es "el fin del principio". Es un escalón fundamental, pero solo el primero. Tuve el privilegio de formar parte del equipo de y de su pero a su vez no he podido dedicarle tanto tiempo   como quisiera, casi no he podido  , ni  he podido leer. El mundo siguió girando, hay  , hay que me perdí y . Casi de casualidad me enteré del encuentro del a partir del 16/marzo en Montevideo. En cualquier caso: ¡el esfuerzo valió la pena!. Ahora que está siendo liberada en el   , hay que celebrar porque aplica aquello de "release is a feature". Podría tirarme en mi casa y estrenar mi  con una buena peli o sino aprovechar ir al un poco má...

El miedo, ese asesino silencioso

Hace unas semanas compré por Mercado Libre un tejido de alambre (de esos electrosoldados que se usan para cercos, pérgolas, etc) para armar una pérgola en casa. Como me suele pasar: compré de más. Así que decidí vender el resto del alambre por el mismo medio (Mercado Libre). Lo publiqué un Miércoles a las 13:00 y 4 horas después recibo un aviso de Mercado Libre que lo había vendido. Perfecto! Incluso lo había puesto al mismo precio x metro que la compra original así que notable! Revisé la compra y me pagó mediante Mercado Pago usando una tarjeta VISA, en fin, todo normal. Un rato después del aviso me llaman de un teléfono fijo al celular un tal Juan Rodriguez que coincidía con el nombre del comprador que me había llegado. Capitulo 1: ¡para qué abrís la boca! No sé cómo decir esto de un modo "políticamente correcto" pero la manera de expresarse parecía de alguien que no tenía un gran nivel de educación. Demasiado "lunfardo" para hablar con alguien que no con...

Sobre plomeros y sanitarios

Hace unos días estaba en casa de mi madre, quien sigue viviendo en la ciudad donde yo nací (Florida-Uruguay), cuando sonó el timbre. Fui a atender y me encontré con Martín, un ex compañero de liceo que hacía años no veía. Luego de preguntarle cómo andaba y el saludo de rigor, le pregunté que estaba haciendo por allí y me dijo "estoy trabajando aquí", ahí noté que venía con baldes y herramientas y recordé que es hijo del plomero que toda la vida trabajó en mi casa. El baño de mi madre estaba con problemas en la presión de agua así que llamó al plomero "tradicional" y este le comentó que estaba retirado pero que enviaría a su hijo. Allí pues estaba Martín. Es interesante encontrarse con compañeros de escuela/liceo que uno no ve hace muchos años, da para otro post seguramente. La cuestión es que seguimos conversando mientras él trabajaba. Le pregunté por el padre y me dijo que estaba bien pero ya medio cansado del trabajo y que nunca se había podido adaptar a los cambi...