Arbeta med molnflöden med hjälp av kod

Alla flöden lagras i Dataverse och du kan hantera dem med antingen Dataverse SDK för .NET eller webb-API.

Denna artikel omfattar hanteringen av flöden som finns med på fliken Lösningar i Power Automate. För närvarande hanterar flöden under Mina flöden stöds inte med kod.

Interagera med Dataverse API:er

Dataverse har likvärdiga funktioner med antingen Dataverse SDK för .NET eller webb-API.

Vilken metod ska jag använda?

Den bästa metoden beror på projekttekniken och dina kunskaper.

Om ditt projekt använder .NET rekommenderar vi att du använder SDK. SDK:n förenklar din utvecklingsupplevelse genom att tillhandahålla en maskinskriven objektmodell och metoder för autentisering.

Mer information: Använda organisationstjänsten

Anslut så här?

Hur du ansluter beror på om du använder Dataverse SDK för .NET eller webb-API.

Med SDK måste du ansluta till ett klientprogram för att få åtkomst till en IOrganizationService-instans. IOrganizationService är ett gränssnitt som innehåller metoder som du kan använda för att interagera med Dataverse.

Mer information:

Arbetsflödestabell

Molnflöden lagras i Process (arbetsflöde) tabell som representeras i webb-API:t som arbetsflöde EntityType

Följande tabell beskriver viktiga kolumner i arbetsflödestabellen:

Logiskt namn Typ Beskrivning
category Alternativ Kategori för flödet. Här är de olika kategorierna.
0 – Klassiska Dataverse arbetsflöden.
1 – Klassiska Dataverse dialogrutor.
2 – Verksamhetsregler.
3 – Klassiska Dataverse åtgärder.
4 – Affärsprocessflöden.
5 – Modernt flöde (automatiserade, omedelbara eller schemalagda flöden).
6 – Datorflöden.
clientdata String En strängkodad JSON för flödesdefinitionen och dess connectionReferences.
createdby Sökning Den användare som skapade flödet.
createdon Datum/tid Datum när flödet skapades.
description String Användarens beskrivning av flödet.
ismanaged Bool Anger om flödet installerades via en hanterad lösning.
modifiedby Sökning Den senaste användaren som uppdaterade flödet.
modifiedon Datum/tid Den senaste tidpunkten då flödet uppdaterades.
name String Visningsnamnet som du har tilldelat flödet.
ownerid Sökning Användaren eller teamet som äger flödet.
statecode Alternativ Status för flödet. Statusen kan vara:
0 – Utkast (Av)
1 – Aktiverad (På)
2 – Uppehåll.
type Alternativ Anger om flödet är ett löpande flöde eller en mall som kan användas för att skapa ytterligare flöden.
1 – Definition,
2 – Aktivering
3 – Mall.
workflowid GUID Den unika identifieraren för ett molnflöde för alla importer.
workflowidunique GUID Den unika identifieraren för den här installationen av flödet.

Kommentar

Med webb-API är uppslagsvärden är enkelvärderade navigeringsegenskaper som kan expanderas för att få information från den relaterade posten.

Uppslagskolumner har också motsvarande GUID egenskaper för uppslag som kan användas i frågor. Uppslagsegenskaper har den här namnkonvention: _<logical name>_value. För arbetsflödesentitetstypen i Webb-API kan du referera till dessa uppslagsegenskaper: _createdby_value_modifiedby_value och _ownerid_value.

Lista flöden

Om du vill hämta en lista över molnflöden kan du fråga i arbetsflödestabellen. Följande fråga returnerar det första automatiska, omedelbara eller schemalagda flödet som för närvarande är "på":

Denna statiska OutputFirstActiveFlow metoden kräver en autentiserad klient som implementerar IOrganizationService. Den använder metoden 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"]}");
}

Om du vill hämta fler poster tar du bort TopCount-gränsen.

Output

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

Mer information:

Skapa ett molnflöde

De nödvändiga egenskaperna för automatiserade, omedelbara och schemalagda flöden är: category, name, type, primaryentity och clientdata. Använd none för primaryentity för dessa typer av flöden.

Denna statiska metoden kräver en autentiserad klient som implementerar IOrganizationService. Den använder metoden 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);
}

Mer information: Skapa tabellrader med organisationstjänsten

För statecode alla flöden som skapas på det här sättet anges 0 (Utkast eller Av). Flödet måste aktiveras innan det kan användas.

Den viktigaste egenskapen är clientdata, som innehåller connectionReferences som flödet använder och definition i flödet. connectionReferences är mappningar för varje anslutning som flödet använder.

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

Uppdatera ett molnflöde

För att uppdatera ett flöde, ställ bara in de egenskaper du vill ändra.

Denna statiska metoden kräver en autentiserad klient som implementerar IOrganizationService. Den använder metoden IOrganizationService.Update metod för att uppdatera en flödesbeskrivning och ställa in ägaren.

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

Mer information: Uppdatera och ta bort tabellrader med hjälp av organisationstjänsten > enkel uppdatering

Ta bort ett molnflöde

Följande exempel visar hur du tar bort en arbetsflödespost som representerar ett molnflöde.

Den statiska DeleteCloudFlow metoden tar bort en arbetsflödespost.

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

}

Mer information: Ta bort en post med SDK

Hämta alla användare som ett molnflöde delas med

Använd RetrieveSharedPrincipalsAndAccess meddelandet om du vill visa en lista över alla användare som ett molnflöde delas med.

Med SDK, använd RetrieveSharedPrincipalsAndAccessRequest-klass och med webb-API:n använd RetrieveSharedPrincipalsAndAccess-funktion.

Mer information: Skaffa huvudkonto med tillgång till ett register

Dela eller sluta dela ett molnflöde

Dela ett molnflöde som andra Dataverse poster med hjälp av GrantAccess meddelandet. Med SDK, använd GrantAccessRequest-klass och med Webb-API använd GrantAccess-åtgärd. Mer information: GrantAccess-exempel

Om du vill ändra dina åtkomsträttigheter när du delar en post använder du ModifyAccess meddelandet. Med SDK, använd ModifyAccessRequest-klass och med Webb-API använd ModifyAccess-åtgärd. Mer information: ModifyAccess-exempel

Om du vill sluta dela en post använder du RevokeAccess meddelandet. Med SDK, använd RevokeAccessRequest-klass och med Webb-API använd RevokeAccess-åtgärd. Mer information: Återkallar åtkomst

Exportera flöden

När ett flöde är en del av en lösning kan du exportera det genom att exportera lösningen som innehåller flödet med hjälp av ExportSolution-meddelandet.

I den statiska ExportSolution exempelmetoden nedan använder du en ExportSolutionRequest för att hämta en byte[] som innehåller ZIP-filen för den ohanterade lösningen med det angivna 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;
}

Importera flöden

När du har en ZIP-fil i en lösning kan du importera den med hjälp av ImportSolution meddelandet.

När du importerar flöden ska du ange följande parametrar:

Egenskapsnamn Beskrivning
OverwriteUnmanagedCustomizations Om det finns befintliga instanser av dessa flöden i Dataverse, måste den här flaggan anges till true för att de ska kunna importeras. Annars skrivs de inte över.
PublishWorkflows Anger om klassiska Dataverse-arbetsflöden aktiveras under import. Den här inställningen gäller inte för andra typer av flöden.
CustomizationFile En base 64-kodad zip-fil som innehåller lösningen.

Den statiska ImportSolution exempelmetoden visar hur du importerar en lösningsfil med hjälp av ImportSolutionRequest-klass

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

Se även

Entitetsklassverksamhet med hjälp av organisationstjänsten
Utföra åtgärder med hjälp av webb-API
Dela och tilldela
Verifiera åtkomst i kod
Arbeta med lösningar med hjälp av Dataverse SDK