Función Patch

Se aplica a: Aplicaciones de lienzo Aplicaciones basadas en modelos Power Platform CLI Flujos de escritorio

Modifica o crea uno o varios registros de un origen de datos o combina registros fuera de un origen de datos.

Use la función Patch para modificar registros en situaciones complejas, como cuando se realizan actualizaciones que no requieren interacción del usuario o se usan formularios que abarcan varias pantallas.

Para actualizar registros en un origen de datos más fácilmente para cambios simples, use el control Edit form en su lugar. Cuando agrega un control Edit form, proporciona a los usuarios un formulario para rellenar y después guarda los cambios en un origen de datos. Para más información, consulte Descripción de los formularios de datos.

Vea este vídeo para saber cómo usar la función Patch:

Introducción

Use la función Patch para modificar uno o varios registros de un origen de datos. Los valores de campos específicos se modifican sin que otras propiedades se vean afectadas. Por ejemplo, esta fórmula cambia el número de teléfono de un cliente llamado Contoso:

Patch( Customers, First( Filter( Customers, Name = "Contoso" ) ), { Phone: "1-212-555-1234" } )

Use Patch con la función Defaults para crear registros. Use este comportamiento para crear una sola pantalla tanto para crear como para editar registros. Por ejemplo, la siguiente fórmula crea un registro para un cliente llamado Contoso:

Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )

Incluso si no está trabajando con un origen de datos, puede usar Patch para combinar dos o más registros. Por ejemplo, esta fórmula combina dos registros en uno que identifica tanto el número de teléfono como la ubicación de Contoso:

Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )

Descripción

Modificar o crear un registro en un origen de datos

Para usar esta función con un origen de datos, especifique el origen de datos y, a continuación, especifique un registro base:

  • Para modificar un registro, el registro base debe proceder de un origen de datos. El registro base puede proceder de una propiedad Items de la galería, haberse colocado en una variable de contexto o proceder de algún otro sitio. Sin embargo, puede realizar un seguimiento del registro base hasta el origen de datos. Esto es importante, ya que el registro incluirá información adicional para ayudar a encontrar el registro para la modificación.
  • Para crear un registro, use la función Defaults para crear un registro base con valores predeterminados.

A continuación, especifique uno o más registros de cambio, cada uno de los cuales contenga nuevos valores de propiedad que reemplacen los valores de propiedad en el registro base. Los registros de cambio se procesan en orden, desde el principio de la lista de argumentos hasta el final, donde los valores de propiedad últimos reemplazan a los primeros.

El valor devuelto de Patch es el registro modificado o creado. Si ha creado un registro, el valor devuelto puede incluir propiedades que el origen de datos generó automáticamente. Sin embargo, el valor de retorno no proporciona un valor para los campos de una tabla relacionada.

Por ejemplo, usa Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); y luego MyAccount.'Primary Contact'.'Full Name'. No puede proporcionar un nombre completo en este caso. En su lugar, para acceder a los campos de una tabla relacionada, use una búsqueda separada como:

LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'

Al actualizar un origen de datos, pueden surgir uno o varios problemas. Utilice IfError e IsError con el valor devuelto por Patch para detectar y responder a los errores, como se describe en Tratamiento de errores. También puede usar la función Errors para identificar y examinar los problemas, como se describe en el tema sobre el uso de los orígenes de datos.

Las funciones relacionadas incluyen Update para reemplazar un registro entero o Collect para crear un registro. Use la función UpdateIf para modificar propiedades específicas de varios registros según una condición.

Modificar o crear un conjunto de registros en un origen de datos

Patch también puede utilizarse para crear o modificar varios registros con una sola llamada.

En lugar de pasar un único registro base, se puede proporcionar una tabla de registros base en el segundo argumento. También se proporcionan registros de cambio en una tabla, que se corresponden uno a uno con los registros base. El número de registros en cada tabla de cambios debe ser el mismo que el número de registros en la tabla base.

Cuando se usa Patch de esta manera, el valor devuelto también es una tabla donde cada registro se corresponde uno a uno con los registros base y de cambio.

Combinar registros fuera de un origen de datos

Especifique dos o más registros que desee combinar. Los registros se procesan en orden, desde el principio de la lista de argumentos hasta el final, donde los valores de propiedad últimos reemplazan a los primeros.

Patch devuelve el registro combinado y no modifica sus argumentos ni los registros de ningún origen de datos.

Sintaxis

Modificar o crear un registro en un origen de datos

Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, … ])

  • DataSource: requerido. El origen de datos que contiene el registro que desea modificar o que contendrá el registro que desea crear.
  • BaseRecord: requerido. El registro para modificar o crear. Si el registro proviene de un origen de datos, el registro se encuentra y se modifica. Si se usa el resultado de Defaults, se crea un registro.
  • ChangeRecord(s): requerido. Uno o más registros que contienen propiedades para modificar en BaseRecord. Los registros de cambio se procesan en orden, desde el principio de la lista de argumentos hasta el final, donde los valores de propiedad últimos reemplazan a los primeros.

Modificar o crear un conjunto de registros en un origen de datos

Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, … ] )

  • DataSource: requerido. El origen de datos que contiene los registros que desea modificar o que contendrá los registros que desea crear.
  • BaseRecordTable: requerido. Una tabla de registros para modificar o crear. Si el registro proviene de un origen de datos, el registro se encuentra y se modifica. Si se usa el resultado de Defaults, se crea un registro.
  • ChangeRecordTable(s): requerido. Una o varias tablas de registros que contienen propiedades para modificar de cada registro de BaseRecordTable. Los registros de cambio se procesan en orden, desde el principio de la lista de argumentos hasta el final, donde los valores de propiedad últimos reemplazan a los primeros.

Combinación de registros

Patch( Record1, Record2 [, …] )

  • Record(s): requerido. Al menos dos de los registros que desea combinar. Los registros se procesan en orden desde el principio de la lista de argumentos hasta el final, donde los valores de propiedad últimos reemplazan a los primeros.

Ejemplos

Modificar o crear un registro (en un origen de datos)

En estos ejemplos, modificará o creará un registro en un origen de datos denominado IceCream, que contiene los datos de esta tabla y generará automáticamente los valores de la columnaID:

Helado de ejemplo.

Fórmula Description Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Modifica un registro del origen de datos IceCream:
  • La columna ID del registro para modificar contiene el valor de 1. (El registro Chocolate tiene ese ID).
  • El valor de la columna Quantity cambia a 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

La entrada Chocolate del origen de datos IceCream se ha modificado.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Crea un registro en el origen de datos IceCream:
  • La columna ID contiene el valor 3, que el origen de datos genera automáticamente.
  • La columna Quantity contiene 0, que es el valor predeterminado de esa columna en el origen de datos IceCream, como especifica la función Defaults.
  • La columna Flavor contiene el valor de Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Se ha creado la entrada Strawberry en el origen de datos IceCream.

Después de que se han evaluado las fórmulas anteriores, el origen de datos termina con estos valores:

Ejemplo de icecream después.

Combinar registros (fuera de un origen de datos)

Fórmula Descripción Resultado
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Combina dos registros fuera de un origen de datos:
  • Los valores de la columna Name de cada registro no coinciden. El resultado contiene el valor (Jim) en el registro que se aproxima más al final de la lista de argumentos en lugar del valor (James) en el registro que está más cerca del principio.
  • El primer registro contiene una columna (Score) que no existe en el segundo registro. El resultado contiene esa columna con su valor (90).
  • El segundo registro contiene una columna (Passed) que no existe en el primer registro. El resultado contiene esa columna con su valor (true).
{ Name: "Jim", Score: 90, Passed: true }

Uso de As o ThisRecord

Utilizando la palabra clave As o ThisRecord en la fórmula evita un contexto de evaluación ambiguo.

En el siguiente ejemplo, considere la primera búsqueda en la declaración If. Se espera que (OrderID = A[@OrderID]) compare el OrderId en el alcance de búsqueda con el OrderId de la colección A en el ámbito ForAll. En este caso, es probable que desee que A[@OrderId] se resuelva como un parámetro local. Pero es ambiguo.

Power Apps actualmente interpreta tanto el lado izquierdo OrderId y lado derecho A[@OrderId] como un campo en el ámbito de búsqueda. Por lo tanto, la búsqueda siempre encontrará la primera fila en [dbo].[Orders1] porque la condición es siempre true (es decir, cualquier fila OrderId es igual a sí misma).

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Uso de As o ThisRecord

Siempre que sea posible utilice el operador As o ThisRecord para desambiguar el lado izquierdo. As se recomienda para el escenario anterior.

Cuando su fórmula usa múltiples ámbitos con ForAll, Filter y Lookup en el mismo origen de datos o tabla, es posible que los parámetros del alcance puedan colisionar con un mismo campo en otro lugar. Por tanto, se recomienda utilizar el operador As o ThisRecord para resolver el nombre del campo y evitar ambigüedades.

Por ejemplo, puede utilizar el operador As para eliminar la ambigüedad en el ejemplo siguiente.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]' As B,
            B.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]' As C,
                C.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Alternativamente, puede usar ThisRecord con el mismo propósito.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            ThisRecord.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                ThisRecord.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Para obtener más información sobre el uso del operador As y ThisRecord vea el artículo Operadores.