Поділитися через


Робота з хмарними циклами за допомогою коду

Усі потоки зберігаються в Dataverse них, і ви можете використовувати Dataverse SDK для .NET або Web API для керування ними.

У цій статті описано керування потоками, включеними на вкладку Рішення Power Automate. Наразі керування ланцюжками в розділі «Мої ланцюжки » не підтримується кодом.

Взаємодія з Dataverse API

Dataverse надає еквівалентні Dataverse можливості за допомогою SDK для .NET або Web API.

Який метод слід використовувати?

Найкращий метод залежить від технології проекту та навичок, якими ви володієте.

Якщо ваш проект використовує .NET, рекомендуємо використовувати SDK. SDK спрощує процес розробки, надаючи типізовану об’єктну модель і методи автентифікації.

Додаткові відомості: Скористайтесь послугою «Організація»

Як підключити?

Спосіб підключення залежить від того, чи використовуєте Dataverse ви SDK для .NET або Web API.

За допомогою SDK вам потрібно підключитися до клієнтської програми, щоб отримати доступ до екземпляра IOrganizationService . IOrganizationService це інтерфейс, який надає методи, з Dataverse якими ви можете взаємодіяти.

Додаткові відомості:

Таблиця документообігу

Хмарні потоки зберігаються в таблиці Process (Workflow), яка представлена у веб-API як тип сутності робочого процесу

У наведеній нижче таблиці описано важливі стовпці таблиці робочого процесу.

Логічне ім’я Ввести Опис
category Вибір Категорія течії. Ось різні категорії.
0 - Класичні Dataverse робочі процеси.
1 - Класичні Dataverse діалоги.
2 - Правила ведення бізнесу.
3 - Класичні Dataverse дії.
4 - Потоки бізнес-процесів.
5 - Modern Flow (автоматизовані, миттєві або заплановані потоки).
6 - Потоки робочого столу.
clientdata String JSON у рядковому кодуванні визначення потоку та його з’єднанняПосилання.
createdby Підстановка Користувач, який створив ланцюжок.
createdon DateTime Дата створення ланцюжка.
description String Наданий користувачем опис ланцюжка.
ismanaged Булеве значення Указує, чи було встановлено потік через кероване рішення.
modifiedby Підстановка Останній користувач, який оновив ланцюжок.
modifiedon DateTime Останній раз ланцюжок оновлювався.
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.RetrieveMulti .

/// <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,, type,, primaryentity та clientdata. Використовуйте 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 (Чернетка або «Вимкнено»). Ланцюжок потрібно ввімкнути, перш ніж його можна буде використовувати.

Найважливішим властивістю є те clientdata, що містить в connectionReferences собі те, що використовує потік, і визначення течії. Це 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);
}

Додаткові відомості: Оновлення та видалення рядків таблиці за допомогою оновлення Organization Service > Basic

Як видалити хмарний потік

У наведених нижче прикладах показано, як видалити запис робочого процесу, який представляє хмарний потік.

Статичний 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 Zip-файл із кодуванням base 64, який містить розв’язок.

Метод статичної 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);
}

Див. також

Операції класу сутностей за допомогою сервісу Organization
Виконання операцій за допомогою веб-API
Спільний доступ і призначення
Перевірка доступу в коді
Робота з рішеннями Dataverse за допомогою SDK