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


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

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

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

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

Dataverse предоставя еквивалентни възможности с помощта на Dataverse SDK за .NET или уеб API.

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

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

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

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

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

Начинът на свързване зависи от това дали използвате Dataverse SDK за .NET или уеб API.

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

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

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

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

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

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

Бележка

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

Справочните колони също имат съответните свойства за справка в GUID , които могат да се използват в заявки. Свойствата за справка имат следната конвенция за именуване: _<logical name>_value. За типа обект на работния поток в Web 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 (Draft или 'Off'). Потокът трябва да бъде активиран, преди да може да се използва.

Най-важното свойство е 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);
}

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

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

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

Статичният 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