Werken met niet-getypeerde en dynamische objecten

Bij het omgaan met acties in Power Apps, is het mogelijk om niet-getypeerde retourwaarden of invoerwaarden voor sommige acties tegen te komen. Eerder zou Power Apps niet-getypeerde of dynamische invoervelden negeren en zouden ze niet zichtbaar zijn in PowerFX-expressies, maar nu kunt u rechtstreeks met deze velden werken. Wanneer eerder een retourtype niet getypeerd was, zou Power Apps een Booleaanse waarde retourneren. Nu retourneert het in plaats daarvan een niet-getypeerd object.

Notitie

Stel dat uw Power Fx expressies afhankelijk zijn van een Booleaanse retourwaarde van deze functies. In dat geval moet u de formule herschrijven en het niet-getypeerde object expliciet casten naar een Booleaanse waarde. Bepaalde functies, zoals 'IfError', ondersteunen niet-getypeerde objecten nog niet volledig. Als uw expressie een dergelijke functie bevat, raadpleegt u de opmerking aan het einde van dit artikel voor tijdelijke oplossingen.

Niet-getypeerde objecten doorgeven als parameters

Voor bepaalde acties is een niet-getypeerd object als parameterwaarde nodig. Als u een Power Fx record hebt, kunt u het converteren naar een niet-getypeerd object, waardoor het geschikt is om door te geven aan de actie.

In het onderstaande voorbeeld vereist de samenvoegactie beschikbaar op een Dataverse Account tabel verschillende niet-getypeerde argumenten. Ter voorbereiding definiëren we drie variabelen voor het TargetObject, SubordinateObject en UpdateContextObject. We beginnen met het toewijzen van de teksttekenreeks Microsoft.Dynamics.CRM.account aan een variabele, die in het hele voorbeeld opnieuw zal worden gebruikt.

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

Vervolgens krijgt TargetObject een Power Fx record met de eigenschappen name, accountid en @odata.type toegewezen. We wijzen op dezelfde manier ook Power Fx-records toe aan de objecten Subordinate en 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 }); 

Vervolgens maken we nog drie variabelen om de niet-getypeerde records na de conversie op te slaan: TargetUntypedObject, SubordinateUntypedObject en UpdateContextUntypedObject. Om de conversie uit te voeren, gebruiken we de functie ParseJSON(JSON()) op de oorspronkelijke variabelen. Deze actie zal de Power Fx records in niet-getypeerde objecten transformeren.

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

Ten slotte roepen we de samenvoegactie aan door de benodigde parameters door te geven, inclusief zowel niet-getypeerd als getypeerd:

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

Het gebruik van een niet-getypeerd object geretourneerd via een actie

Als een op Actie gebaseerde connector een object retourneert, zijn eigenschappen direct toegankelijk, ongeacht of er een type aan is toegewezen. Als u echter van plan bent een eigenschap voor een specifiek doel te gebruiken in Power Apps, zoals voor labelen, moet u deze eerst casten.

In het volgende voorbeeld retourneert de functie httpRequest een niet-getypeerd object dat eerder is gecast als Boolean.

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

Een van de eigenschappen in het antwoord is displayName. Het kan worden geopend en gecast met een Power Fx expressie zoals de volgende:

Text(response.displayName)

Cast naar het object Tekst om het te gebruiken in een Power Apps-labelbesturingselement.

Werken met dynamische velden

Actiereacties leggen nu dynamische uitvoer vast en u kunt de hierboven beschreven methode gebruiken om toegang te krijgen tot deze eigenschappen. Daarnaast is het ook mogelijk om met dynamische invoervelden te werken.

Overweeg de actie 'GetMessageDetails' in Microsoft Teams die een body-parameter voor dynamische invoer heeft. Voorheen kon deze parameter niet worden bekeken of opgegeven. Met de recente update kunt u een variabele genaamd 'body' instellen met de juiste Power Fx recordstructuur.

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

Vervolgens kunnen we de actie GetMessageDetails aanroepen en het antwoord toewijzen aan de teamsResponse-variabele.

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

Formules converteren die niet-getypeerde objecten retourneren die eerder Boolean retourneerden.

Power Fx neemt een beperkt aantal niet-getypeerde objecten, dus expliciete conversie kan nodig zijn voor uw formule. Met name als uw formule afhankelijk is van een Booleaans antwoord, moet u converteren. Als u gewoon wilt weten of er een fout is, kunt u de functie IsError gebruiken:

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

Om toegang te krijgen tot foutinformatie die exclusief beschikbaar is via IfError, moet u het niet-getypeerde object omzetten in een geldig type met behulp van een conversiefunctie zoals Boolean, Tekst of Waarde. Deze functies zullen een fout produceren als ze er een krijgen. Het volgende voorbeeld illustreert dit:

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)
) ) )