Работа с потоци за облак посредством код

Всички потоци се съхраняват в Dataverse и можете да използвате Dataverse SDK за .NET или Web API, за да ги управлявате.

Тази статия обхваща управлението на потоците, включени в раздела Решения в Power Automate. В момента управлението на потоци под My Flows не се поддържа с код.

Взаимодействайте с Dataverse API

Dataverse предоставя еквивалентни възможности, Dataverse използвайки SDK за .NET или Web API.

Кой метод трябва да използвам?

Най-добрият метод зависи от технологията на проекта и уменията, които имате.

Ако вашият проект използва .NET, препоръчваме ви да използвате SDK. SDK опростява вашия опит в разработката, като предоставя модел на печатен обект и методи за удостоверяване.

Повече информация: Използване на услугата "Организация"

Как да се свържа?

Как да се свържете зависи от това дали използвате Dataverse SDK за .NET или Web API.

С SDK трябва да се свържете с клиентско приложение, за да получите достъп до екземпляр на IOrganizationService . IOrganizationService е интерфейс, който предоставя методи, които можете да използвате, за да взаимодействате с Dataverse тях.

Допълнителна информация:

Таблица на работния поток

Потоците в облака се съхраняват в таблицата "Процес" (работен поток), която е представена в уеб API като тип обект на работния поток

Следната таблица описва важни колони в таблицата на работния поток:

Логическо име Тип Описание
category Възможност за избор Категорията на потока. Ето различните категории.
0 - Класически Dataverse работни процеси.
1 - Класически Dataverse диалози.
2 - Бизнес правила.
3 - Класически Dataverse действия.
4 - Бизнес процес потоци.
5 - Модерен поток (автоматизирани, незабавни или планирани потоци).
6 - Десктоп потоци.
clientdata String Низ-кодиран JSON на дефиницията на потока и неговата връзкаРеференции.
createdby Справка Потребителят, който е създал потока.
createdon ДатаЧас Датата, на която е създаден потокът.
description String Предоставеното от потребителя описание на потока.
ismanaged Буул Показва дали потокът е инсталиран чрез завършено решение.
modifiedby Справка Последният потребител, който актуализира потока.
modifiedon ДатаЧас Последният път, когато потокът беше актуализиран.
name String Показваното име, което сте дали на потока.
ownerid Справка Потребителят или екипът, който притежава потока.
statecode Възможност за избор Състоянието на потока. Статусът може да бъде:
0 - Чернова (изкл.)
1 - Активиран (Вкл.)
2 -Спряно.
type Възможност за избор Показва дали потокът е течащ поток или шаблон, който може да се използва за създаване на повече потоци.
1 -Определение
2 -Активиране
3 -Шаблон.
workflowid GUID Уникалният идентификатор за поток в облака при всички импортирания.
workflowidunique GUID Уникалният идентификатор за тази инсталация на потока.

Бележка

С уеб API справочните стойности са свойства за навигация с единична стойност, които могат да бъдат разширени, за да получите подробности от свързания запис.

Колоните за справка също имат съответни свойства за справка на GUID , които могат да се използват в заявки. Свойствата на справката имат следната конвенция за именуване: _<logical name>_value За типа на обекта на работния поток в уеб API можете да препращате към тези свойства за справка: _createdby_value, _modifiedby_value, и _ownerid_value.

Изброяване на потоци

За да извлечете списък с потоци в облака, можете да направите заявка към таблицата на работния поток. Следната заявка връща първия автоматизиран, незабавен или планиран поток, който в момента е "включен":

Този статичен OutputFirstActiveFlow метод изисква удостоверен клиент, който имплементира . IOrganizationService Той използва метода IOrganizationService.RetrieveMultiple .

/// <summary>
/// Outputs the first active flow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
public static void OutputFirstActiveFlow(IOrganizationService service)
{
   var query = new QueryExpression("workflow")
   {
         ColumnSet = new ColumnSet("category",
                                    "createdby",
                                    "createdon",
                                    "description",
                                    "ismanaged",
                                    "modifiedby",
                                    "modifiedon",
                                    "name",
                                    "ownerid",
                                    "statecode",
                                    "type",
                                    "workflowid",
                                    "workflowidunique"),
         Criteria = new FilterExpression(LogicalOperator.And)
         {
            Conditions = {
            {  new ConditionExpression(
               "category",
                     ConditionOperator.Equal,
                     5) }, // Cloud Flow
            {  new ConditionExpression(
                     "statecode",
                     ConditionOperator.Equal,
                     1) } // Active
         }
         },
         TopCount = 1 // Limit to one record
   };

   EntityCollection workflows = service.RetrieveMultiple(query);

   Entity workflow = workflows.Entities.FirstOrDefault();

   Console.WriteLine($"category: {workflow.FormattedValues["category"]}");
   Console.WriteLine($"createdby: {workflow.FormattedValues["createdby"]}");
   Console.WriteLine($"createdon: {workflow.FormattedValues["createdon"]}");
   // Description may be null
   Console.WriteLine($"description: {workflow.GetAttributeValue<string>("description")}");
   Console.WriteLine($"ismanaged: {workflow.FormattedValues["ismanaged"]}");
   Console.WriteLine($"modifiedby: {workflow.FormattedValues["modifiedby"]}");
   Console.WriteLine($"modifiedon: {workflow.FormattedValues["modifiedon"]}");
   Console.WriteLine($"name: {workflow["name"]}");
   Console.WriteLine($"ownerid: {workflow.FormattedValues["ownerid"]}");
   Console.WriteLine($"statecode: {workflow.FormattedValues["statecode"]}");
   Console.WriteLine($"type: {workflow.FormattedValues["type"]}");
   Console.WriteLine($"workflowid: {workflow["workflowid"]}");
   Console.WriteLine($"workflowidunique: {workflow["workflowidunique"]}");
}

За да извлечете повече записи, премахнете ограничението за TopCount .

Резултат

category: Modern Flow
createdby: SYSTEM
createdon: 5/20/2020 9:37 PM
description:
ismanaged: Unmanaged
modifiedby: Kiana Anderson
modifiedon: 5/6/2023 3:37 AM
name: When an account is updated -> Create a new record
ownerid: Monica Thomson
statecode: Activated
type: Definition
workflowid: d9e875bf-1c9b-ea11-a811-000d3a122b89
workflowidunique: c17af45c-10a1-43ca-b816-d9cc352718cf

Допълнителна информация:

Създаване на поток за облак

Необходимите свойства за автоматизирани, незабавни и планирани потоци са:,,,, category и name. typeprimaryentityclientdata Използвайте none за primaryentity тези видове потоци.

Този статичен метод изисква удостоверен клиент, който имплементира . IOrganizationService Той използва метода IOrganizationService.Create .

/// <summary>
/// Creates a cloud flow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <returns>The workflowid</returns>
public static Guid CreateCloudFlow(IOrganizationService service)
{
   var workflow = new Entity("workflow")
   {
         Attributes = {
            {"category", new OptionSetValue(5) }, // Cloud flow
            {"name", "Sample flow name"},
            {"type", new OptionSetValue(1) }, //Definition
            {"description", "This flow reads some data from Dataverse." },
            {"primaryentity", "none" },
            {"clientdata", "{\"properties\":{\"connectionReferences\":{\"shared_commondataserviceforapps\":{\"impersonation\":{},\"runtimeSource\":\"embedded\",\"connection\":{\"name\":\"shared-commondataser-114efb88-a991-40c7-b75f-2693-b1ca6a0c\",\"connectionReferenceLogicalName\":\"crdcb_sharedcommondataserviceforapps_109ea\"},\"api\":{\"name\":\"shared_commondataserviceforapps\"}}},\"definition\":{\"$schema\":\"https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#\",\"contentVersion\":\"1.0.0.0\",\"parameters\":{\"$connections\":{\"defaultValue\":{},\"type\":\"Object\"},\"$authentication\":{\"defaultValue\":{},\"type\":\"SecureObject\"}},\"triggers\":{\"manual\":{\"metadata\":{\"operationMetadataId\":\"76f87a86-89b3-48b4-92a2-1b74539894a6\"},\"type\":\"Request\",\"kind\":\"Button\",\"inputs\":{\"schema\":{\"type\":\"object\",\"properties\":{},\"required\":[]}}}},\"actions\":{\"List_rows\":{\"runAfter\":{},\"metadata\":{\"operationMetadataId\":\"9725b30f-4a8e-4695-b6fd-9a4985808809\"},\"type\":\"OpenApiConnection\",\"inputs\":{\"host\":{\"apiId\":\"/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps\",\"connectionName\":\"shared_commondataserviceforapps\",\"operationId\":\"ListRecords\"},\"parameters\":{\"entityName\":\"accounts\",\"$select\":\"name\",\"$top\":1},\"authentication\":\"@parameters('$authentication')\"}}}}},\"schemaVersion\":\"1.0.0.0\"}" }
         }
   };

   return service.Create(workflow);
}

Повече информация: Създаване на редове на таблица с помощта на организационната услуга

От statecode всички потоци, създадени по този начин, са настроени на 0 (Draft или 'Off'). Потокът трябва да бъде активиран, преди да може да се използва.

Най-важното свойство е clientdata, което съдържа connectionReferences това, което потокът използва, и определението на потока. R connectionReferences са съпоставянията към всяка връзка, която потокът използва.

{
  "properties": {
    "connectionReferences": {
      "shared_commondataserviceforapps": {
        "runtimeSource": "embedded",
        "connection": {},
        "api": { 
         "name": "shared_commondataserviceforapps" 
         }
      }
    },
    "definition": {
      "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "$connections": { "defaultValue": {}, "type": "Object" },
        "$authentication": { "defaultValue": {}, "type": "SecureObject" }
      },
      "triggers": {
        "manual": {
          "metadata": {},
          "type": "Request",
          "kind": "Button",
          "inputs": {
            "schema": { "type": "object", "properties": {}, "required": [] }
          }
        }
      },
      "actions": {
        "List_rows": {
          "runAfter": {},
          "metadata": {},
          "type": "OpenApiConnection",
          "inputs": {
            "host": {
              "apiId": "/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps",
              "connectionName": "shared_commondataserviceforapps",
              "operationId": "ListRecords"
            },
            "parameters": {
              "entityName": "accounts",
              "$select": "name",
              "$top": 1
            },
            "authentication": "@parameters('$authentication')"
          }
        }
      }
    }
  },
  "schemaVersion": "1.0.0.0"
}

Актуализиране на поток в облака

За да актуализирате поток, задайте само свойствата, които искате да промените.

Този статичен метод изисква удостоверен клиент, който имплементира . IOrganizationService Той използва метода IOrganizationService.Update , за да актуализира описанието на потока и да зададе собственика.

/// <summary>
/// Updates a cloud flow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="workflowid">The ID of the flow to update.</param>
/// <param name="systemuserid">The id of the user to assign the flow to.</param>
public static void UpdateCloudFlow(IOrganizationService service, Guid workflowid, Guid systemuserid) {

   var workflow = new Entity("workflow",workflowid)
   {
         Attributes = {

            {"description", "This flow will ensure consistency across systems." },
            {"ownerid", new EntityReference("systemuser",systemuserid)},
            {"statecode", new OptionSetValue(1) } //Turn on the flow.
         }
   };

   service.Update(workflow);
}

Повече информация: Актуализиране и изтриване на редове на таблица с помощта на основната актуализация на организационната услуга >

Изтриване на поток в облака

Следващите примери показват как да изтриете записа на работния поток, който представлява поток в облака.

Статичният DeleteCloudFlow метод изтрива запис на работен поток.

/// <summary>
/// Deletes a workflow
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="workflowId">The id of the cloud flow to delete.</param>
public static void DeleteCloudFlow(IOrganizationService service, Guid workflowId) { 

service.Delete(entityName:"workflow",id: workflowId);

}

Повече информация: Изтриване на запис с помощта на SDK

Получаване на всички потребители, с които е споделен поток в облака

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

С SDK използвайте класа RetrieveSharedPrincipalsAndAccessRequest, а с уеб API използвайте функцията RetrieveSharedPrincipalsAndAccess.

Повече информация: Получаване на директори с достъп до запис

Споделяне или прекратяване на споделянето на поток в облака

Споделете поток в облака като всеки друг Dataverse запис, като използвате съобщението GrantAccess . С SDK използвайте класа GrantAccessRequest, а с уеб API използвайте действието GrantAccess. Повече информация: GrantAccess пример

Ако искате да промените правата за достъп, които давате, когато споделяте запис, използвайте съобщението ModifyAccess . С SDK използвайте класа ModifyAccessRequest, а с уеб API използвайте действието ModifyAccess. Повече информация: Пример за ModifyAccess

За да премахнете споделянето на запис, използвайте съобщението RevokeAccess . С SDK използвайте класа RevokeAccessRequest , а с уеб API използвайте действието RevokeAccess. Повече информация: Отмяна на достъпа

Експортни потоци

Когато даден поток е част от решение, можете да го експортирате, като експортирате решението, съдържащо потока, като използвате съобщението ExportSolution .

Статичният ExportSolutionпримерен метод по-долу използва ExportSolutionRequest, за да извлече съдържащ byte[] ZIP файла на незавършеното решение с указаното UniqueName.

/// <summary>
/// Exports an unmanaged solution
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="solutionUniqueName">The uniquename of the solution.</param>
/// <returns></returns>
public static byte[] ExportSolution(
   IOrganizationService service, 
   string solutionUniqueName) 
{
   ExportSolutionRequest request = new() { 
         SolutionName = solutionUniqueName,
         Managed = false
   };

   var response = (ExportSolutionResponse)service.Execute(request);

   return response.ExportSolutionFile;
}

Импортиране на потоци

Когато имате ZIP файл на решение, можете да го импортирате с помощта на съобщението ImportSolution .

Когато импортирате потоци, трябва да зададете следните параметри:

Име на свойството Описание
OverwriteUnmanagedCustomizations Ако има съществуващи екземпляри на тези потоци в Dataverse, този флаг трябва да бъде настроен да true ги импортира. В противен случай те няма да бъдат презаписани.
PublishWorkflows Показва дали класическите Dataverse работни потоци ще бъдат активирани при импортиране. Тази настройка не се прилага за други типове потоци.
CustomizationFile Базов 64-кодиран zip файл, който съдържа решението.

Статичният ImportSolution примерен метод показва как се импортира файл с решение с помощта на класа ImportSolutionRequest

/// <summary>
/// Imports a solution.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="solutionFile">The byte[] data representing a solution file. </param>
public static void ImportSolution(
   IOrganizationService service, 
   byte[] solutionFile) {

   ImportSolutionRequest request = new() { 
         OverwriteUnmanagedCustomizations = true,
         CustomizationFile = solutionFile
   };

   service.Execute(request);
}

Вижте също

Операции с клас обекти с използване на услугата "Организация"
Извършване на операции с помощта на уеб API
Споделяне и присвояване
Проверка на достъпа в кода
Работа с решения с помощта на Dataverse SDK