Plugin Low Code Dataverse Caso de Uso combinado con Command Bar
Una de las últimas características del Low Code que han sido introducida a Power Platform son los Plugin a nivel de Low Code, usando una aplicación “Basada de Modelo” que realmente es más como Page, pero que nos permite construir Plugin usando Power Fx como lenguaje de programación, es lo más cercano a los complementos de Plugin que se escriben en C#. Es importante destacar que la funcionalidad esta en preview pero nos da un mapa de lo que Microsoft viene trabajando en base a la plataforma de Low Code y esa visión de usar Power Fx dentro de sus productos
Así como esta característica nos permite el uso de Low Code dentro de mis aplicaciones, otra de las características que nos brinda la plataforma es la barra de comando modernas, que nos permite introducir Power FX como lenguaje de programación para ejecutar acciones cuando presionamos un botón de la barra de comandos. Al igual que los plugin anteriormente usábamos herramientas de programación para ejecutar acciones dentro de los botones usando la multi conocida Ribbon Workbecth donde podríamos ejecutar múltiples acciones como pueden ser llamar a JS, llamar acciones, flujos, Power Automate etc.
Para nuestro caso de uso queremos usar estas dos características de la plataforma para aprovechar al máximo el Low Code y sobre todo Power FX, existen otras formas como resolver este escenario, el punto no es cual es el mejor, solo es una POC para ver y explorar las funcionalidades y uso de estas características.
Caso de Uso: Tenemos una tabla llamada Proyecto y otra tabla llamada Estimaciones, estas tienen una relación Proyecto 1:N Estimaciones. Como requisito de negocio necesitamos crear una versión de la tabla proyecto y que duplique las líneas de la tabla estimaciones. El requisito es aún mayor, tenemos campos acumulativos que no están hechos como RollUp sino son campos numéricos que se acumulan cada vez que se agrega una nueva línea de estimación, esta construidos con Javascript por lo cual esta en el front end, y cualquier proceso que cree un registro a nivel del backend no ejecutara el JS ya que se necesita interactuar con la interfaz del usuario. Así que dentro del requisito no es solo crear una nueva versión sino también sumar las estimaciones de las líneas que se agreguen al proyecto.
Para resolver esta casuística usaremos ambas funcionalidades, en primer lugar usaremos la barra de comando modernas para crear el versionado (clonar con un número de versión superior) de la tabla proyecto y clonar las líneas asociadas.
Para ello usaremos dos formulas claves, Confirm y With, Confirm me permitirá un cuadro de dialogo en la model driven, y With me permitirá estar en el mismo ámbito de la formula y usar el guid del registro creado para hacer el patch de todos los elementos de la tabla estimaciones asociado al proyecto clonado basado en el proyecto anterior.
No entrare en como se crea el botón ni nada, existen otras publicaciones en mi linkedin donde enseño hacerlo
Aquí la fórmula empleada.
Recomendado por LinkedIn
If(
Confirm(
"Desea crear una versión del proyecto: " & Self.Selected.Item.Nombre;
{
Title: "Nueva Versión del Proyecto";
Subtitle: "¿Estas seguro que desea crear la nueva versión?";
ConfirmButton: "Aceptar";
CancelButton: "Cancelar"
}
);
With(
{
CreateNewRecord: Patch(
Proyectos;
Defaults(Proyectos);
{Nombre: Self.Selected.Item.Nombre};
{Código: Blank()};
{
'Proyecto Original': If(
IsBlank(Self.Selected.Item.'Proyecto Original');
Self.Selected.Item;
Self.Selected.Item.'Proyecto Original'
)
};
{Versión: 'Versión (Proyectos)'.Yes};
{'Proyecto Versión Anterior':Self.Selected.Item}
)
};
With(
{Navigate: Navigate('Proyectos (Views)'.'Active Proyectos')};
ForAll(
Self.Selected.Item.Estimaciones As TableEstimaciones;
Patch(
Estimaciones;
Defaults(Estimaciones);
{
'Descripción del componente': TableEstimaciones.'Descripción del componente';
Recurso: LookUp(
Recursos;
Recurso = TableEstimaciones.Recurso.Recurso
);
Proyecto: CreateNewRecord;
Componente: LookUp(
Componentes;
Componente = TableEstimaciones.Componente.Componente
);
'Tipo de Componente': LookUp(
'Tipo de Componentes';
'Tipo de Componente (enc_tipodecomponenteid)' = TableEstimaciones.'Tipo de Componente'.'Tipo de Componente (enc_tipodecomponenteid)'
);
'Tipo de proyecto': LookUp(
'Tipo de Proyectos';
'Tipo de Proyecto' = TableEstimaciones.'Tipo de proyecto'.'Tipo de Proyecto'
);
Fase: LookUp(
Fases;
Fases = TableEstimaciones.Fase.Fases
);
'Nº de Componentes': TableEstimaciones.'Nº de Componentes';
Nombre: TableEstimaciones.Nombre;
Duplicado: 'Duplicado (Estimaciones)'.Yes
}
)
)
)
);
Notify(
"No se ha creado ninguina versión";
NotificationType.Information;
4000
)
)
Ahora bien, esto solo resuelve la clonación o versionado de un nuevo proyecto, pero no estamos resolviendo la suma de las líneas de estimación del proyecto clonado. Para ello usaremos los Plugin de Low Code, en este caso los automatizados. Para este caso por cada línea de estimación creada el Plugin lo que hace es sumar en la columna de agregación de la tabla proyecto, por lo cual esto se enlaza con el patch que hacemos en la barra de comandos, ya que desde allí se realiza la creación y desde el plugin una vez creado se suma y todo se realiza en el backend.
Este es el código del plugin
If(NewRecord.enc_duplicado=NewRecord.enc_estimaciones_enc_estimaciones_enc_duplicado.'1', With({ProyectoID:LookUp(Estimaciones,Estimaciones=NewRecord.enc_estimacionesid)},Patch(Proyectos,ProyectoID.Proyecto,{'Total Horas':Sum(Filter(Estimaciones,Proyecto.Proyecto=ProyectoID.Proyecto.Proyecto),'Total Horas')},{'Total Horas Ajustada':Sum(Filter(Estimaciones,Proyecto.Proyecto=ProyectoID.Proyecto.Proyecto),'Total Horas Ajustada')},{'Jornadas Totales':Sum(Filter(Estimaciones,Proyecto.Proyecto=ProyectoID.Proyecto.Proyecto),'Jornadas Totales')},{'Jornadas Totales Ajustadas':Sum(Filter(Estimaciones,Proyecto.Proyecto=ProyectoID.Proyecto.Proyecto),'Jornadas Totales Ajustadas')})))
De esta forma estamos combinando ambas funcionalidades para resolver el caso de uso. A través de la barra de comando clono y creo la versión, a través del plugin hago la suma en la tabla de proyecto de las estimaciones que se crearon a través del botón de la barra de comando.
En el siguiente video muestro la creación de una versión, Uno de los aspectos que vemos en el video es que la creación de los 21 registros no es de forma inmediata hay un tiempo de espera, y en este aspecto aún la barra de comando no me permite bloquear la pantalla como haría con JS, y lo segundo es la suma no es inmediata porque responde a la creación de los registros de estimaciones.
Jonathan Manrique
Solution and Innovation Lead ENCAMINA