Arbejde med cloudflow ved hjælp af kode

Alle flows gemmes i Dataverse, og du kan enten bruge Dataverse SDK til .NET eller web-API'en til at administrere dem.

Dette indhold dækker administrationen af flows, som er inkluderet på fanen Løsninger i Power Automate. I øjeblikket understøttes administrationsflows under Mine flows ikke med kode.

Interagere med Dataverse API'er

Dataverse indeholder tilsvarende funktioner, der enten bruger Dataverse SDK til .NET eller Web-API.

Hvilken metode skal jeg bruge?

Den bedste metode afhænger af projektteknologien og de færdigheder, du har.

Hvis der bruges .NET i projektet, anbefales det, at du bruger SDK. SDK forenkler din udviklingsoplevelse ved at levere en type objektmodel og metoder til godkendelse.

Flere oplysninger: Brug af tjenesten Organisation

Hvordan oprettes der forbindelse?

Hvordan du opretter forbindelse, afhænger af, om du bruger Dataverse SDK til .NET eller Web-API.

Med SDK skal du oprette forbindelse til et klientprogram for at få adgang til en forekomst af IOrganizationService. IOrganizationService er en brugergrænseflade, der indeholder metoder, du kan bruge til at arbejde med Dataverse.

Flere oplysninger:

Arbejdsprocestabel

Cloudflows lagres i den procestabel (arbejdsproces), der er repræsenteret i web-API'en som arbejdsprocesobjekttypen

I tabellen nedenfor beskrives vigtige kolonner i arbejdsprocestabellen:

Logisk navn Type Beskrivelse
category Choice Kategorien for flowet. Her er de forskellige kategorier.
0 - Klassiske Dataverse-arbejdsprocesser.
1 - Klassiske Dataverse-dialoger.
2 - Forretningsregler.
3 - Klassiske Dataverse-handlinger.
4 - Forretningsprocesforløb.
5 - Moderne flow (Automatiseret, Øjeblikkeligt eller Planlagt).
6 - Skrivebordsflows.
clientdata String En strengkodet JSON af flowdefinitionen og dens connectionReferences.
createdby Søg Den bruger, som oprettede flowet.
createdon Datetime Den dato, hvor flowet blev oprettet.
description String Den brugerangivne beskrivelsen af flowet.
ismanaged Bool Angiver, om flowet blev installeret via en administreret løsning.
modifiedby Søg Den sidste bruger, som opdaterede flowet.
modifiedon Datetime Den sidste gang, flowet blev opdateret.
name String Det viste navn, du har givet flowet.
ownerid Søg Bruger eller tema, der ejer flowet.
statecode Choice Status af flowet. Status kan være:
0 - Kladde (fra)
1 - Aktiveret (til)
2 - Suspenderet.
type Choice Angiver, om flowet er et kørende flow eller en skabelon, der kan bruges til at oprette yderligere flows.
1 - Definition,
2 - Aktivering
3 - Skabelon.
workflowid GUID Det entydige id for et cloudflow på tværs af alle importer.
workflowidunique GUID Det entydige id for denne installation af flowet.

Bemærk

Med Web-API er opslagsværdier navigationsegenskaber med en enkelt værdi, der kan udvides for at få detaljer fra den relaterede post.

Opslagskolonner har også tilsvarende egenskaber for GUID-opslag -egenskaber, der kan bruges i forespørgsler. Opslagsegenskaber har denne navngivningskonvention: _<logical name>_value. I forbindelse med arbejdsprocesobjekttypen i web-API'en kan du referere til følgende opslagsegenskaber: _createdby_value, _modifiedby_value og _ownerid_value.

Vis liste over flows

Hvis du vil hente en liste over cloudflows, kan du forespørge om arbejdsprocestabellen. Følgende forespørgsel returnerer først de automatiserede, øjeblikkelige eller planlagte flows, der i øjeblikket er slået til:

Denne statiske OutputFirstActiveFlow metode kræver en godkendt klient, der implementerer IOrganizationService. Den bruger 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"]}");
}

Hvis du vil hente flere poster, skal du fjerne grænsen for TopCount.

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

Flere oplysninger:

Opret et cloudflow

De krævede egenskaber for automatiserede, øjeblikkelige og planlagte flows er: category, name, type, primaryentity og clientdata. Brug none som primaryentity for disse typer flows.

Denne statiske metode kræver en godkendt klient, der implementerer IOrganizationService. Den bruger 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);
}

Flere oplysninger: Oprettelse af tabelrækker ved hjælp af organisationstjenesten

De statecode af alle strømme, der oprettes på denne måde, er angivet til 0 (Kladde eller Fra). Flowet skal aktiveres, før det kan bruges.

Den vigtigste egenskab er clientdata, der indeholder connectionReferences, som flowet bruger, og flowets definition. connectionReferences er tilknytningerne til hver forbindelse, som flowet bruger.

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

Opdatere et cloudflow

Hvis du vil opdatere et flow, skal du kun angive de egenskaber, du vil ændre.

Denne statiske metode kræver en godkendt klient, der implementerer IOrganizationService. Den bruger metoden IOrganizationService.Update til at opdatere en flowbeskrivelse og angive ejeren.

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

Flere oplysninger: Opdatere og slette tabelrækker ved hjælp af opdateringen Grundlæggende om > organisationstjenesten

Slette et cloudflow

I følgende eksempler kan du se, hvordan du kan slette den arbejdsprocespost, der repræsenterer et cloudflow.

Ved den statiske DeleteCloudFlow metode slettes en arbejdsprocespost.

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

}

Flere oplysninger: Slette en post med SDK

Se alle brugere, som et cloudflow er delt med

Brug meddelelsen RetrieveSharedPrincipalsAndAccess til at få vist en liste over alle de brugere, som et cloudflow deles med.

I SDK skal du bruge RetrieveSharedPrincipalsAndAccessRequest-klassen, og med Web-API skal du bruge funktionen RetrieveSharedPrincipalsAndAccess.

Flere oplysninger: Få sikkerhedskonto med adgang til en post

Dele eller annullere deling af et cloudflow

Del et cloudflow som enhver anden Dataverse-post ved hjælp af GrantAccess-meddelelsen. I SDK skal du bruge GrantAccessRequest Class, og med Web-API skal du bruge funktionen GrantAccess Action. Flere oplysninger: GrantAccess-eksempel

Hvis du vil ændre de adgangsrettigheder, du tildeler, når du deler en post, skal du bruge ModifyAccess meddelelsen. I SDK skal du bruge ModifyAccessRequest Class, og med Web-API skal du bruge funktionen ModifyAccess Action. Flere oplysninger: ModifyAccess-eksempel

Hvis du vil ophæve delingen af en post, skal du bruge RevokeAccess meddelelsen. I SDK skal du bruge RevokeAccessRequest Class, og med Web-API skal du bruge funktionen RevokeAccess Action. Flere oplysninger: Tilbagekalde adgang

Eksporter flows

Når et flow er en del af en løsning, kan du eksportere den ved at eksportere den løsning, der indeholder flowet, ved hjælp af ExportSolution meddelelsen.

Den statiske ExportSolution eksempelmetode nedenfor bruger ExportSolutionRequest til at hente en byte[], der indeholder ZIP-filen for den ikke-administrerede løsning med det angivne 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;
}

Importer flows

Når du har en ZIP-fil med løsninger, kan du importere den ved hjælp af ImportSolution meddelelsen.

Når du importerer flow, skal du angive følgende parametre:

Egenskabsnavn Beskrivelse
OverwriteUnmanagedCustomizations Hvis der findes forekomster af disse flows i Dataverse, skal dette flag angives til true for at importere dem. Ellers overskrives de ikke.
PublishWorkflows Angiver, om klassiske arbejdsprocesser i Dataverse aktiveres ved import. Denne indstilling gælder ikke for andre typer af flows.
CustomizationFile En grundlæggende 64-kodet zip-fil, der indeholder løsningen.

Den statiske ImportSolution eksempelmetode viser, hvordan du importerer en løsningsfil ved hjælp af ImportSolutionRequest Class

/// <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 også

Handlinger til objektklasse ved hjælp af tjenesten Organisation
Udføre handlinger ved hjælp af Web-API'en
Deling og tildeling
Kontrol af adgang i kode
Arbejde med løsninger ved hjælp af Dataverse-SDK