Trabalhar com objetos dinâmicos e sem tipo

Quando tratar de ações no Power Apps, é possível encontrar valores de devolução sem tipo ou valores de entrada para algumas ações. Anteriormente, o Power Apps ignorava campos de entrada dinâmicos ou sem tipo e não estariam visíveis nas expressões PowerFX. Agora, pode trabalhar diretamente com estes campos. Antes, quando um tipo de devolução era sem tipo, o Power Apps devolvia um valor Booleano. Agora, devolve um objeto sem tipo.

Nota

Suponha que as expressões do Power Fx se baseiam num valor de devolução Booleano destas funções. Neste caso, terá de reescrever a fórmula e converter explicitamente o objeto sem tipo para Booleano. Algumas funções, tais como 'IfError', ainda não suportam objetos sem tipo. Se a sua expressão contiver essa função, consulte a nota no fim deste artigo para obter uma solução.

Escolher objetos sem tipo como parâmetros

Determinadas ações requerem um objecto sem tipo como valor de parâmetro. Se tiver um registo do Power Fx, pode convertê-lo num objeto sem tipo, tornando-o adequado para ser escolhido para a ação.

No exemplo abaixo, a ação de união disponível numa tabela do Dataverse Conta requer vários argumentos sem tipo. Para preparar, definiremos três variáveis para manter o TargetObject, SubordinateObject e UpdateContextObject. Vamos começar por atribuir a cadeia de texto Microsoft.Dynamics.CRM.account a uma variável, que será reutilizada no exemplo.

Set (OdataType, “Microsoft.Dynamics.CRM.account”);

Em seguida, é atribuído um registo do Power Fx ao TargetObject com as propriedades de nome, accountid e @odata.type. Também atribuímos os registos do Power Fx aos objetos Subordinate e UpdateContext.

Set (TargetObject, {name: "Test 2", accountid: "145dc2ba-85a2-ed11-aado-0022482d76a5", '@odata.type': OdataType});
Set (SubordinateObject, {name: FirstRecord.’Account name’, accountid: FirstRecord.Account, ‘@odata.type’ : OdataType });
Set (UpdateContextObject, {telephone1: FirstRecord.’Main Phone’, address1_city: FirstRecord.’Address 1 : City’, ‘@odata.type’ : OdataType }); 

Em seguida, vamos criar mais três variáveis para armazenar os registos sem tipo após a conversão: TargetUntypedObject, SubordinateUntypedObject e UpdateContextUntypedObject. Para efetuar a conversão, utilizaremos a função ParseJSON(JSON()) nas variáveis originais. Esta ação irá transformar os registos do Power Fx em objetos sem tipo.

Set (TargetUntypedObject, ParseJSON(JSON(TargetObject)));
Set (SubordinateUntypedObject, ParseJSON(JSON(SubordinateObject)));
Set (UpdateContextUntypedObject, ParseJSON(JSON(UpdateContextObject)));

Por último, chamamos a ação de união ao escolher os parâmetros necessários, incluindo para sem tipo e com tipo:

Environment.Merge({Target: TargetUntypedObject, Subordinate: SubordinateUntypedObject, UpdateContent: UpdateContextUntypedObject, PerformParentingChecks: false  });

Utilizar um objeto sem tipo devolvido através de uma ação

Se um conector baseado na Ação devolver um objeto, as propriedades do mesmo podem ser diretamente acedidas, independentemente de ter sido ou não atribuído um tipo. No entanto, se pretender utilizar uma propriedade para uma finalidade específica no Power Apps, tal como para etiquetar, terá de a criar primeiro.

No seguinte exemplo, a função httpRequest devolve um objeto sem tipo anteriormente conhecido como Booleano.

Set (response, Office365Groups.HttpRequest("/v1.0/me", "GET", ""));

Uma das propriedades na resposta é displayName. Pode ser acedido e convertido com uma expressão do Power Fx, como a seguinte:

Text(response.displayName)

Transmita para o objeto Texto para utilizar num controlo de etiquetas do Power Apps.

Trabalhar com campos do Dynamic

As respostas à ação agora capturam resultados dinâmicos e pode utilizar o método descrito acima para aceder a estas propriedades. Além disso, também é possível trabalhar com campos de entrada dinâmicos.

Considere a ação 'GetMessageDetails' no Microsoft Teams, que tem um parâmetro do corpo de entrada dinâmico. Anteriormente, não era possível ver ou especificar este parâmetro. Com a atualização recente, pode definir uma variável denominada 'corpo' com a estrutura do registo do Power Fx apropriada.

Set ( body, ParseJSON(JSON( {recipient: { groupID: “7f733b36-7c7f-4f4c-9699-0a7b7a2b3897”, channelID: “19: 085d522328fb4a439220641006f7f25@thread.tacv2”}}));

Em seguida, podemos chamar a ação GetMessageDetails e atribuir a resposta à variável teamsResponse.

Set (teamsResponse, MicrosoftTeams.GetMessageDetails ( 1661365068558, “channel”, body ));

Converter fórmulas que devolvem objetos sem tipo que devolviam anteriormente Booleano.

O Power Fx requer um número limitado de objetos sem tipo para que seja necessária conversão explícita para a fórmula. Especificamente, se a fórmula depender de uma resposta Booleana, terá de converter. Se precisar de saber simplesmente se existe um erro, pode utilizar a função IsError:

If(
  IsError(Office365Outlook.CalendarDeleteItemV2("Calendar", 1)),
  Notify("An Outlook appointment could not be found or could not be deleted")
)

Para aceder às informações de erro disponíveis exclusivamente através de IfError, tem de transformar o objeto sem tipo num tipo válido utilizando uma função de conversão, tal como Booleano, Texto ou Valor. Estas funções irão produzir um erro se lhe for dado um. O exemplo seguinte ilustra este ponto:

With({result: Office365Outlook.CalendarDeleteItemV2("Calendar", 1)},
If( IsError(result),
  IfError(
    Boolean(result),  // any conversion function would do, such as Text, Value, …
    Notify("An Outlook appointment could not be found or could not be deleted: " & FirstError.Message)
) ) )