Làm việc với dòng đám mây bằng mã

Tất cả các luồng đều được lưu trữ trong Dataverse và bạn có thể sử dụng Dataverse SDK cho .NET hoặc Web API để quản lý chúng.

Bài viết này đề cập đến việc quản lý các luồng được bao gồm trong tab Giải pháp trong Power Automate. Hiện tại, việc quản lý luồng trong Luồng của tôi không được hỗ trợ bằng mã.

Tương tác với Dataverse API

Dataverse cung cấp các khả năng tương đương bằng cách sử dụng Dataverse SDK cho .NET hoặc Web API.

Tôi nên sử dụng phương pháp nào?

Phương pháp tốt nhất phụ thuộc vào công nghệ dự án và các kỹ năng bạn có.

Nếu dự án của bạn sử dụng .NET, chúng tôi khuyên bạn nên sử dụng SDK. SDK đơn giản hóa trải nghiệm phát triển của bạn bằng cách cung cấp mô hình đối tượng được gõ và các phương thức để xác thực.

Thông tin thêm: Sử dụng dịch vụ Tổ chức

Làm thế nào để kết nối?

Cách kết nối phụ thuộc vào việc bạn đang sử dụng Dataverse SDK cho .NET hay Web API.

Với SDK, bạn cần kết nối với ứng dụng khách để có quyền truy cập vào phiên bản IOrganizationService . IOrganizationService là một giao diện cung cấp các phương pháp bạn có thể sử dụng để tương tác với Dataverse.

Thông tin khác:

Bảng quy trình làm việc

Luồng đám mây được lưu trữ trong bảng Quy trình (Luồng công việc) được biểu thị trong Web API dưới dạng Thực thể luồng công việc

Bảng sau đây mô tả các cột quan trọng trong bảng quy trình làm việc:

Tên Logic Loại Description
category Nhóm chọn Thể loại của dòng chảy. Sau đây là các danh mục khác nhau.
0 - Quy trình làm việc cổ điển. Dataverse
1 - Các hộp thoại cổ điển. Dataverse
2 - Quy tắc kinh doanh.
3 - Hành động cổ điển. Dataverse
4 - Luồng quy trình kinh doanh.
5 - Dòng chảy hiện đại (Luồng tự động, tức thời hoặc theo lịch trình).
6 - Luồng máy tính để bàn.
clientdata String Chuỗi JSON được mã hóa của định nghĩa luồng và connectionReferences của nó.
createdby Tra cứu Người dùng đã tạo ra luồng.
createdon Ngày giờ Ngày tạo luồng.
description String Mô tả luồng do người dùng cung cấp.
ismanaged Bool Chỉ ra liệu luồng có được cài đặt thông qua giải pháp được quản lý hay không.
modifiedby Tra cứu Người dùng cuối cùng cập nhật luồng.
modifiedon Ngày giờ Lần cuối cùng luồng được cập nhật.
name String Tên hiển thị mà bạn đã đặt cho luồng.
ownerid Tra cứu Người dùng hoặc nhóm sở hữu luồng.
statecode Nhóm chọn Trạng thái của luồng. Trạng thái có thể là:
0 - Bản nháp (Tắt)
1 - Đã kích hoạt (Bật)
2 - Cấm.
type Nhóm chọn Chỉ ra liệu luồng có phải là luồng đang chạy hay là mẫu có thể được sử dụng để tạo thêm nhiều luồng khác.
1 - Sự định nghĩa,
2 - Kích hoạt
3 - Bản mẫu.
workflowid Guid Mã định danh duy nhất cho dòng đám mây trên tất cả các lần nhập.
workflowidunique Guid Mã định danh duy nhất cho cài đặt luồng này.

Lưu ý

Với Web API, giá trị Tra cứu là thuộc tính điều hướng có giá trị đơn có thể được mở rộng để lấy thông tin chi tiết từ bản ghi liên quan.

Các cột tra cứu cũng có các thuộc tính tra cứu GUID tương ứng có thể được sử dụng trong các truy vấn. Thuộc tính tra cứu có quy ước đặt tên như sau: _<logical name>_value. Đối với loại thực thể quy trình công việc trong Web API, bạn có thể tham chiếu các thuộc tính tra cứu sau: _createdby_value, _modifiedby_value_ownerid_value.

Liệt kê dòng

Để lấy danh sách các luồng đám mây, bạn có thể truy vấn bảng quy trình công việc. Truy vấn sau đây trả về luồng tự động, tức thời hoặc theo lịch trình đầu tiên hiện đang 'bật':

Phương pháp tĩnh này OutputFirstActiveFlow yêu cầu một máy khách đã xác thực triển khai IOrganizationService. Nó sử dụng phương thức 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"]}");
}

Để lấy thêm bản ghi, hãy xóa giới hạn TopCount .

Đầu ra

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

Thông tin khác:

Tạo dòng đám mây

Các thuộc tính bắt buộc đối với luồng tự động, tức thời và theo lịch trình là: category, name, type, primaryentityclientdata. Sử dụng none cho primaryentity các loại luồng này.

Phương pháp tĩnh này yêu cầu một máy khách đã xác thực triển khai IOrganizationService. Nó sử dụng phương thức 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);
}

Thông tin thêm: Tạo hàng bảng bằng Dịch vụ tổ chức

statecode Tất cả các luồng được tạo theo cách này đều được đặt thành 0 (Bản nháp hoặc 'Tắt'). Luồng cần được bật trước khi có thể sử dụng.

Thuộc tính quan trọng nhất là clientdata, chứa connectionReferences thuộc tính mà luồng sử dụng và định nghĩa của luồng. connectionReferences Là các ánh xạ tới từng kết nối mà luồng sử dụng.

{
  "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"
}

Cập nhật dòng đám mây

Để cập nhật luồng, chỉ cần thiết lập các thuộc tính bạn muốn thay đổi.

Phương pháp tĩnh này yêu cầu một máy khách đã xác thực triển khai IOrganizationService. Nó sử dụng phương thức IOrganizationService.Update để cập nhật mô tả luồng và đặt chủ sở hữu.

/// <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);
}

Thông tin thêm: Cập nhật và xóa các hàng bảng bằng Dịch vụ tổ chức > Cập nhật cơ bản

Xóa dòng đám mây

Các ví dụ sau đây cho thấy cách xóa bản ghi quy trình công việc biểu thị dòng đám mây.

Phương pháp DeleteCloudFlow tĩnh xóa bản ghi quy trình công việc.

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

}

Thông tin thêm: Xóa bản ghi bằng SDK

Nhận tất cả người dùng được chia sẻ dòng đám mây

Sử dụng thông báo RetrieveSharedPrincipalsAndAccess để nhận danh sách tất cả người dùng được chia sẻ dòng đám mây.

Với SDK, hãy sử dụng Lớp RetrieveSharedPrincipalsAndAccessRequest và với Web API, hãy sử dụng Hàm RetrieveSharedPrincipalsAndAccess.

Thông tin thêm: Nhận các hiệu trưởng có quyền truy cập vào hồ sơ

Chia sẻ hoặc bỏ chia sẻ dòng đám mây

Chia sẻ dòng đám mây như bất kỳ bản ghi nào khác bằng cách sử dụng Dataverse tin nhắn. GrantAccess Với SDK, hãy sử dụng Lớp GrantAccessRequest và với Web API, hãy sử dụng Hành động GrantAccess. Thông tin thêm: Ví dụ GrantAccess

Nếu bạn muốn thay đổi quyền truy cập được cấp khi chia sẻ bản ghi, hãy sử dụng thông báo ModifyAccess . Với SDK, hãy sử dụng Lớp ModifyAccessRequest và với Web API, hãy sử dụng Hành động ModifyAccess. Thông tin thêm: Ví dụ về ModifyAccess

Để hủy chia sẻ một bản ghi, hãy sử dụng thông báo RevokeAccess . Với SDK, hãy sử dụng Lớp RevokeAccessRequest và với Web API, hãy sử dụng Hành động RevokeAccess. Thông tin thêm: Thu hồi quyền truy cập

Luồng xuất khẩu

Khi luồng là một phần của giải pháp, bạn có thể xuất luồng đó bằng cách xuất giải pháp có chứa luồng đó bằng cách sử dụng thông báo ExportSolution .

Phương pháp ví dụ tĩnh ExportSolution bên dưới sử dụng ExportSolutionRequest để truy xuất byte[] chứa tệp ZIP của giải pháp không được quản lý với UniqueName được chỉ định.

/// <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;
}

Luồng nhập khẩu

Khi bạn có tệp ZIP giải pháp, bạn có thể nhập tệp đó bằng cách sử dụng thông báo ImportSolution .

Khi bạn nhập luồng, bạn nên thiết lập các tham số sau:

Tên thuộc tính Description
OverwriteUnmanagedCustomizations Nếu có các phiên bản hiện tại của các luồng này trong Dataverse, cờ này cần được đặt thành true để nhập chúng. Nếu không, chúng sẽ không bị ghi đè.
PublishWorkflows Chỉ ra liệu quy trình công việc cổ điển có được kích hoạt khi nhập hay không. Dataverse Thiết lập này không áp dụng cho các loại luồng khác.
CustomizationFile Tệp zip được mã hóa theo chuẩn base 64 có chứa giải pháp.

Phương pháp ImportSolution sample tĩnh cho thấy cách nhập tệp giải pháp bằng cách sử dụng Lớp 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);
}

Các hoạt động của lớp thực thể sử dụng dịch vụ Tổ chức
Thực hiện các hoạt động bằng cách sử dụng Web API
Chia sẻ và chỉ định
Xác minh quyền truy cập trong mã
Làm việc với các giải pháp sử dụng Dataverse SDK