Compartir a través de


Patch Función

Se aplica a: Aplicaciones de lienzo Copilot Studio Desktop fluyen aplicaciones controladas por modelos Funciones de Dataverse de la CLI de Power Platform

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

Use la Patch función para modificar registros en situaciones complejas, como cuando se realizan actualizaciones que no requieren interacción del usuario ni 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 aprender a usar la Patch función :

Introducción

Use la Patch función 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, LookUp( 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" } )

Nota:

Al aplicar revisiones a una colección mediante un registro de un origen de datos con valores predeterminados, la operación de revisión actualiza la colección con los valores de revisión especificados y los valores predeterminados del origen de datos. El DataSource de la instrucción patch y el DataSource de la función Defaults deben coincidir para crear un nuevo registro.

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. Es posible que el registro base haya llegado a través de la propiedad Items de una galería, se haya colocado en una variable de contexto o pase por alguna otra ruta de acceso. Sin embargo, puede realizar un seguimiento del registro base hasta el origen de datos. Esto es importante, ya que el registro incluye información adicional para ayudar a encontrar el registro de nuevo para su 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 que modificó o creó. Si creó un registro, el valor devuelto podría 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, puede surgir uno o varios problemas. Use IfError e IsError con el valor devuelto de Patch para detectar y responder a errores, como se describe en Control 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 se puede usar 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 con cada registro correspondiente uno para uno con los registros base y cambiar.

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 registros en 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.
  • Registro base : obligatorio. 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. El DataSource de la instrucción patch y el DataSource de la función Defaults deben coincidir para crear un nuevo registro.
  • ChangeRecords – Obligatorio. 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 – Obligatorio. 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. El DataSource de la instrucción patch y el DataSource de la función Defaults deben coincidir para crear un nuevo registro.
  • ChangeRecordTables – Obligatorio. 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 [, ...] )

  • Registros - Obligatorio. 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 Descripción 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 Result
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. (OrderID = A[@OrderID]) Se espera comparar el OrderId en el ámbito 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. Como 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.