El día de hoy vamos a ver cómo usar la función Patch en PowerApps para actualizar simultáneamente varios registros en una lista de SharePoint como fuente de datos. La función Patch en Power Apps es usada para modificar un registro, o bien, un conjunto de registros de una fuente de datos. Solo va a actualizar los valores de los campos especificados en la fórmula mientras que otros campos permanecerán tal y como están sin ser afectados.
Primeros pasos
Para empezar, modificaremos o crearemos un registro en una fuente de datos y luego introduciremos la siguiente la síntaxis:
Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, … ])
Con respecto a cada parámetro, tenemos lo siguiente.
- DataSource: Obligatorio. Es la fuente de datos que contiene el registro que queremos modificar o bien contendrá el registro que queremos crear.
- BaseRecord: Obligatorio. Es el registro a modificar o crear. Si el registro viniera de una fuente de datos, el registro es encontrado y modificado. Si el resultado de Defaults es usado, entonces se creará un registro.
- ChangeRecord(s): Obligatorio. Uno o más registros que contengan propiedades a modificar en BaseRecord. Los cambios del registro son procesados en orden desde el inicio de la lista de argumentos hasta el final, con los últimos valores de propiedad estando primero que los anteriores.
Ahora modificaremos o crearemos un conjunto de registros en una fuente de datos:
Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, … ] )
- DataSource: Obligatorio. Es la fuente de datos que contiene el registro que queremos modificar o bien contendrá el registro que queremos crear.
- BaseRecordTable: Obligatorio. Una tabla de registros a modificar o crear. Si el registro viniera de una fuente de datos, el registro será encontrado y modificado. Si el resultado de Defaults es usado, entonces se creará un registro.
- ChangeRecordTable(s): Obligatorio. Una o más tablas de registros que contengan las propiedades a modificar para cada registro de BaseRecordTable. Los cambios de registro serán procesados en orden desde el inicio de la lista de argumentos hasta el final, con los últimos valores de propiedad estando primero que los anteriores.
ESCENARIO
Hay una lista de SharePoint llamada «Tareas», la cual está siendo usada como fuente de datos en PowerApps para control de Galería. Cada tarea tiene una secuencia y vamos a estar añadiendo capacidad para mover estas tareas hacia arriba o hacia abajo en el control de galería, lo cual es básicamente actualizar sus secuencias.
Ingredientes de Power Automate y Sharepoint
La lista personalizada «Tareas» será creada con las siguientes columnas:
- Título (una sola línea de texto)
- AsignadoA
- Secuencia (número)
- Estado (A elegir: Incompleto, Completo y Activo)
Y aquí mostramos una app ya creada con los siguientes detalles:
- Una pantalla
- Un control de galería. Diseño vertical «Título y subtítulo»
- Lista de «Tareas» como fuente de datos.
- Tres etiquetas dentro del control de galería: Titulo, Asignado y Sequencia.
- Dos íconos: flechas arriba y abajo.
- Dos variables locales: CurSequence y NextSequence (con valor por defecto 0)
Respecto a cómo crear una app y añadir control de galería, aquí hay un artículo de Microsoft al respecto.
Nuestra app se ve de la siguiente manera:
Ahora añadamos la funcionalidad para mover tareas hacia arriba o hacia abajo.
Patch para incrementar la ordenación
- Daremos click al ícono de «Arriba» y seleccionaremos la propiedad «OnSelect». El valor por defecto para esta propiedad será «Select(Parent)», el cual actualizaremos.
- Ahora, vamos a insertar varias funciones dentro de la propiedad OnSelect.
- Vamos a actualizar nuestras variables en base a la flecha hacia arriba que seleccionamos usando la función UpdateContext.
UpdateContext({CurSeq:Parent.Selected.Secuencia,NextSeq:Parent.Selected.Secuencia-1})
Ahora crearemos una tabla de registro base de los registros seleccionados usando la función ClearCollect:
ClearCollect(BaseRecord,Parent.Selected,First(Filter(Gallery1.AllItems,Secuencia=NextSeq)))
Y modificaremos los registros usando la función Patch. El primer parámetro será la lista de Tareas (fuente de datos), el segundo es la tabla base (BaseRecord) y la tercera tabla serán los registros ya cambiados. Con esto, tanto BaseRecord como ChangedRecord tienen un mapeo de los registros uno a uno. Secuencia será la columna que se va a actualizar con los nuevos valores.
If(ThisItem.Secuencia<>1,Patch(Tareas,BaseRecord,Table({Secuencia:NextSeq},{Secuencia:CurSeq})),Notify("No se puede actualizar el valor 1",NotificationType.Error))
Esta sentencia Patch será ejecutada condicionalmente para revisar si este no es el primer paso. Ya puesto todo junto, se deberá ver así:
UpdateContext({CurSeq:Parent.Selected.Secuencia,NextSeq:Parent.Selected.Secuencia-1});ClearCollect(BaseRecord,Parent.Selected,First(Filter(Gallery1.AllItems,Secuencia=NextSeq)));If(ThisItem.Secuencia<>1,Patch(Tareas,BaseRecord,Table({Secuencia:NextSeq},{Secuencia:CurSeq})),Notify("No se puede actualizar el valor 1",NotificationType.Error))
O para que se entienda mejor:
UpdateContext( {CurSeq:Parent.Selected.Secuencia, NextSeq:Parent.Selected.Secuencia-1 } ); ClearCollect( BaseRecord,Parent.Selected,First( Filter( Gallery1.AllItems,Secuencia=NextSeq ) ) ); If( ThisItem.Secuencia<>1,Patch( Tareas,BaseRecord,Table( {Secuencia:NextSeq}, {Secuencia:CurSeq} ) ),Notify("No se puede actualizar el valor 1",NotificationType.Error) )
Guardaremos la aplicación, daremos click al botón Play y revisaremos la funcionalidad para la flecha arriba.
Patch para reducir la ordenación
Para mover abajo habrá que seguir los mismos pasos que para mover arriba, con una excepción en la función UpdateContext y Patch (aquí será la condición If), tal y como se muestra en este código:
UpdateContext({CurSeq:Parent.Selected.Secuencia,NextSeq:Parent.Selected.Secuencia+1});ClearCollect(BaseRecord,Parent.Selected,First(Filter(Gallery1.AllItems,Secuencia=NextSeq)));If(ThisItem.Secuencia<>Last(Gallery1.AllItems).Secuencia,Patch(Tareas,BaseRecord,Table({Secuencia:NextSeq},{Secuencia:CurSeq})),Notify("No se puede actualizar el ultimo valor",NotificationType.Error))
Leyendolo por capas:
UpdateContext( {CurSeq:Parent.Selected.Secuencia, NextSeq:Parent.Selected.Secuencia+1 } ); ClearCollect( BaseRecord,Parent.Selected,First( Filter( Gallery1.AllItems,Secuencia=NextSeq ) ) ); If( ThisItem.Secuencia<>Last(Gallery1.AllItems).Secuencia,Patch( Tareas,BaseRecord,Table( {Secuencia:NextSeq}, {Secuencia:CurSeq} ) ),Notify("No se puede actualizar el valor 1",NotificationType.Error) )
La función Patch es una parte vital del uso de las Apps, aprende a usarla y ten mucho cuidado, los cambios se realizan automáticamente.
Cualquier duda nos leemos abajo.