Praca z obiektami bez typu i dynamicznymi

Gdy wystąpi błąd nad działaniem Power Apps, można napotkać niezabębowane wartości zwracane lub wartości wejściowe dla niektórych akcji. Wcześniej usługa Power Apps ignorowała nieopisane lub dynamiczne pola wejściowe i nie były one widoczne w wyrażeniach programu PowerFX, ale teraz można pracować bezpośrednio z tymi polami. Wcześniej, gdy zwracany typ był nieokreślony, usługa Power Apps zwracała wartość logiczną. Teraz zwraca nieskonsekwowany obiekt.

Uwaga

Załóżmy, że wyrażenia Power Fx opierają się na wartości logicznej zwracanej przez te funkcje. W takim przypadku należy ponownie wpisać formułę i jawnie określić wartość logiczną. Niektóre funkcje, takie jak „IfError”, nie obsługują jeszcze w pełni obiektów bez typu. Jeśli wyrażenie zawiera taką funkcję, rozwiązania problemu można znaleźć w notce na końcu tego artykułu.

Przekazywanie w nieudychanych obiektach jako parametrów

Niektóre akcje wymagają podania obiektu bez typu jako wartości parametru. Jeśli posiadasz rekord Power Fx , możesz go przekonwertować na niezabłysły obiekt, co nadaje się do przekazywania akcji.

W przykładzie poniżej akcja korespondencji seryjnej dostępna w tabeli Dataverse Konto wymaga kilku nieudychanych argumentów. Aby przygotować, zdefiniujmy trzy zmienne do przechowywania obiektu TargetObject, SubordinateObject i UpdateContextObject. Zaczniemy od przypisania ciągu tekstowego Microsoft.Dynamics.CRM.account do zmiennej, która będzie używana w całym przykładzie.

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

Następnie element TargetObject jest przypisywany do rekordu Power Fx z właściwościami nazwy, accountid i @odata.type. Przypisujemy też rekordy Power Fx do obiektów Podrzędnych i 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 }); 

Następnie utworzymy trzy dodatkowe zmienne do przechowywania rekordów bez typu po konwersji: TargetUntypedObject, SubordinateUntypedObject i UpdateContextUntypedObject. Aby przeprowadzić konwersję, użyjemy funkcji ParseJSON(JSON()) na oryginalnych zmiennych. Ta czynność spowoduje przekształcenie rekordów Power Fx w obiekty bez typu.

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

Na koniec wywołujemy akcję scalania, przekazując niezbędne parametry, w tym zarówno dla typu bez typu, jak i z typem:

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

Używanie niewpisanego obiektu zwróconego przez akcję

Jeśli łącznik oparty na Akcja zwraca obiekt, jego właściwości są dostępne bezpośrednio, niezależnie od tego, czy przypisano im typ. Jeśli jednak użytkownik chce użyć właściwości do określonego celu w Power Apps, na przykład do oznaczania etykiet, musi to zrobić najpierw.

W poniższym przykładzie funkcja httpRequest zwraca obiekt bez określonego typu, który został wcześniej rzutowany jako wartość logiczna.

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

Jedną z właściwości w odpowiedzi jest displayName. Można do niego uzyskać dostęp i użyć następującego wyrażenia Power Fx:

Text(response.displayName)

Rzutuj na obiekt Tekst, aby użyć go w kontrolce etykiety usługi Power Apps.

Praca z polami dynamicznymi

Odpowiedzi akcji przechwytują teraz dynamiczne dane wyjściowe i możesz użyć metody opisanej powyżej, aby uzyskać dostęp do tych właściwości. Dodatkowo możliwa jest również praca z dynamicznymi polami wejściowymi.

Rozważ akcję „GetMessageDetails” w usłudze Microsoft Teams, która ma dynamiczny parametr treści danych wejściowych. Wcześniej tego parametru nie można było wyświetlić ani określić. Dzięki ostatniej aktualizacji możesz ustawić zmienną o nazwie „body” z odpowiednią strukturą rekordów Power Fx.

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

Następnie możemy wywołać akcję GetMessageDetails i przypisać odpowiedź do zmiennej TeamsResponse.

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

Konwersja formuł, które zwracają nieskonwertowane obiekty, które wcześniej były zwracane jako wartości logiczne.

Power Fx przyjmuje ograniczoną liczbę obiektów bez wpisu, więc dla formuły może być konieczna jawna konwersja. W szczególności, jeśli twoja formuła zależy od odpowiedzi logicznej, będziesz musiał przekonwertować. Aby po prostu sprawdzić, czy istnieje błąd, można użyć funkcji IsError:

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

Aby uzyskać dostęp do informacji o błędach, które są dostępne wyłącznie za pośrednictwem IfError, należy przekształcić obiekt bez typu na prawidłowy typ przy użyciu funkcji konwersji, takiej jak Boolean, Text lub Value. Funkcje te będą powodować błąd, jeśli zostanie on podany. Ilustruje to poniższy przykład:

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