Travailler avec des objets sans type et dynamiques

Lors de l’utilisation d’actions dans Power Apps, il est possible de rencontrer des valeurs de retour ou des valeurs d’entrée non typées pour certaines actions. Auparavant, Power Apps ignorait les champs d’entrée non typés ou dynamiques, et ceux-ci n’étaient pas visibles dans les expressions PowerFX ; mais maintenant, vous pouvez travailler directement avec ces champs. Auparavant, lorsqu’un type de retour n’était pas typé, Power Apps renvoyait une valeur booléenne. À présent, il renvoie un objet non typé.

Notes

Supposons que vos expressions Power Fx reposent sur une valeur de retour booléenne issue de ces fonctions. Dans ce cas, vous devrez réécrire la formule et convertir explicitement l’objet non typé en booléen. Certaines fonctions, telles que « IfError », ne prennent pas encore entièrement en charge les objets non typés. Si votre expression contient une telle fonction, reportez-vous à la note à la fin de cet article pour connaître les solutions de contournement.

Transmettre des objets non typés en tant que paramètres

Certaines actions nécessitent un objet non typé comme valeur de paramètre. Si vous avez un enregistrement Power Fx, vous pouvez le convertir en un objet non typé, ce qui le rend apte à être transmis à l’action.

Dans l’exemple ci-dessous, l’action de fusion disponible sur une table Account Dataverse nécessite plusieurs arguments non typés. Pour nous préparer, nous allons définir trois variables pour contenir TargetObject, SubordinateObject et UpdateContextObject. Nous allons commencer par attribuer la chaîne de texte Microsoft.Dynamics.CRM.account à une variable, qui sera réutilisée tout au long de l’exemple.

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

Ensuite, TargetObject se voit attribuer un enregistrement Power Fx avec les propriétés name, accountid et @odata.type. Nous attribuons de même des enregistrements Power Fx aux objets Subordinate et 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 }); 

Ensuite, nous allons créer trois autres variables pour stocker les enregistrements non typés après la conversion : TargetUntypedObject, SubordinateUntypedObject et UpdateContextUntypedObject. Pour effectuer la conversion, nous allons utiliser la fonction ParseJSON(JSON()) sur les variables d’origine. Cette action transformera les enregistrements Power Fx en objets non typés.

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

Pour finir, nous appelons l’action de fusion merge en transmettant les paramètres nécessaires, à la fois pour les objets typés et non typés :

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

Utilisation d’un objet non typé renvoyé via une action

Si un connecteur basé sur une Action renvoie un objet, ses propriétés sont accessibles directement, qu’un type leur ait été attribué ou non. Toutefois, si vous avez l’intention d’utiliser une propriété dans un but précis dans Power Apps, comme pour l’étiquetage, vous devrez d’abord la convertir.

Dans l’exemple suivant, la fonction httpRequest renvoie un objet non typé qui a été précédemment converti en booléen.

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

L’une des propriétés de la réponse est displayName. Il est possible d’y accéder et de la convertir en expression Power Fx comme celle-ci :

Text(response.displayName)

Convertissez l’objet en Texte pour l’utiliser dans un contrôle label de Power Apps.

Utiliser des champs dynamiques

Les réponses d’action capturent désormais la sortie dynamique et vous pouvez utiliser la méthode décrite ci-dessus pour accéder à ces propriétés. De plus, il est également possible de travailler avec des champs de saisie dynamiques.

Pensez à l’action « GetMessageDetails » dans Microsoft Teams qui a un paramètre de corps d’entrée dynamique. Auparavant, ce paramètre ne pouvait pas être affiché ou spécifié. Avec la mise à jour récente, vous pouvez définir une variable appelée « body » avec la structure d’enregistrement Power Fx appropriée.

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

Ensuite, nous pouvons appeler l’action GetMessageDetails et attribuer la réponse à la variable teamsResponse.

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

Conversion de formules qui renvoient des objets non typés qui renvoyaient auparavant un booléen

Power Fx prend un nombre limité d’objets non typés, si bien que la conversion explicite peut être nécessaire pour votre formule. En particulier, si votre formule dépend d’une réponse booléenne, vous devrez effectuer une conversion. Si vous avez simplement besoin de savoir si une erreur existe, vous pouvez utiliser la fonction IsError :

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

Pour accéder aux informations d’erreur exclusivement disponibles via IfError, vous devez transformer l’objet non typé en un type valide à l’aide d’une fonction de conversion telle que Boolean, Text ou Value. Ces fonctions produiront une erreur si elles en reçoivent une. L’exemple suivant illustre ce point :

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