Споделяне чрез


Работа с нетипизирани и динамични обекти

Когато работите с действия в Power Apps, е възможно да срещнете нетипизирани върнати стойности или входни стойности за някои действия. Преди Power Apps игнорираха нетипизирани или динамични полета за въвеждане и те нямаше да се виждат в изразите на PowerFX, но сега можете да работите директно с тези полета. Преди, когато връщаният тип не беше въведен, Power Apps връщаше булева стойност. Сега вместо това връща нетипизиран обект.

Бележка

Да предположим, че вашите Power Fx изрази разчитат на булева стойност, връщана от тези функции. В този случай ще трябва да пренапишете формулата и изрично да прехвърлите нетипизиран обект към Boolean. Някои функции, като "IfError", все още не поддържат напълно нетипизирани обекти. Ако вашият израз съдържа такава функция, вижте бележката в края на тази статия за заобиколни решения.

Предаване на нетипизирани обекти като параметри

Някои действия изискват нетипизиран обект като стойност на параметър. Ако имате запис, Power Fx можете да го конвертирате в нетипизиран обект, което го прави подходящ за предаване на действието.

В примера по-долу действието за обединяване, налично в таблица Dataverse на акаунт, изисква няколко невъведени аргумента. За да се подготвим, ще дефинираме три променливи, които да съдържат TargetObject, SubordinateObject и UpdateContextObject. Ще започнем с присвояване на текстовия низ Microsoft.Dynamics.CRM.account на променлива, която ще се използва повторно в целия пример.

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

След това на TargetObject се присвоява Power Fx запис със свойствата на name, accountid и @odata.type. По подобен начин присвояваме Power Fx записи и на обектите Subordinate и 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 }); 

След това ще създадем още три променливи за съхраняване на нетипизираните записи след преобразуването: TargetUntypedObject, SubordinateUntypedObject и UpdateContextUntypedObject. За да извършим преобразуването, ще използваме функцията ParseJSON(JSON()) върху първоначалните променливи. Това действие ще трансформира записите Power Fx в нетипизирани обекти.

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

Накрая наричаме действието за сливане, като подаваме необходимите параметри, включително както за нетипизирани, така и за въведени:

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

Използване на нетипизиран обект, върнат чрез действие

Ако конектор, базиран на действие, върне обект, неговите свойства могат да бъдат достъпни директно, независимо дали им е присвоен тип. Ако обаче възнамерявате да използвате свойство за конкретна цел Power Apps, като например за етикетиране, първо ще трябва да го изпълните.

В следващия пример функцията httpRequest връща нетипизиран обект, който преди това е бил издаден като булев.

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

Едно от свойствата в отговора е displayName. Той може да бъде достъпен и прехвърлен с Power Fx израз като следния:

Text(response.displayName)

Предайте към обекта Текст, за да го използвате в Power Apps контрола на етикета.

Работа с динамични полета

Отговорите на действие вече улавят динамичен изход и можете да използвате метода, описан по-горе, за достъп до тези свойства. Освен това е възможна и работа с динамични полета за въвеждане.

Помислете за действието Microsoft Teams "GetMessageDetails", което има динамичен параметър на тялото на входа. Преди това този параметър не можеше да бъде видян или посочен. С последната актуализация можете да зададете променлива, наречена 'body' със съответната Power Fx структура на записа.

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

След това можем да извикаме действието GetMessageDetails и да присвоим отговора на променливата teamsResponse.

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

Преобразуване на формули, които връщат нетипизирани обекти, които преди това са върнали булев.

Power Fx Приема ограничен брой нетипизирани обекти, така че може да е необходимо изрично преобразуване за вашата формула. По-специално, ако вашата формула зависи от булев отговор, тогава ще трябва да конвертирате. Ако просто трябва да знаете дали съществува грешка, можете да използвате функцията IsError:

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

За да получите достъп до информацията за грешка, която е достъпна изключително чрез IfError, трябва да трансформирате нетипизиран обект в валиден тип с помощта на функция за преобразуване, като например Boolean, Text или Value. Тези функции ще доведат до грешка, ако им бъде дадена такава. Следният пример илюстрира това:

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