Felhőfolyamatok használata kóddal

Minden folyamat tárolásra Dataverse kerül, és a .NET-hez készült SDK vagy a Dataverse webes API használatával kezelheti őket.

Ez a cikk a Megoldások lapon található folyamatok kezelését ismerteti Power Automate. Jelenleg a Saját folyamatok alatt a folyamatok kezelése nem támogatott a kóddal.

API-k Dataverse használata

Dataverse egyenértékű képességeket biztosít a .NET-hez készült SDK vagy a Dataverse webes API használatával.

Melyik módszert használjam?

A legjobb módszer a projekt technológiájától és a készségektől függ.

Ha a projekt .NET-et használ, javasoljuk az SDK használatát. Az SDK leegyszerűsíti a fejlesztési élményt azáltal, hogy típusos objektummodellt és hitelesítési módszereket biztosít.

További információ: Az Organization szolgáltatás használata

Hogyan lehet csatlakozni?

A csatlakozás módja attól függ, hogy a .NET-hez készült SDK-t vagy a Dataverse webes API-t használja-e.

Az SDK-val csatlakoznia kell egy ügyfélalkalmazáshoz, hogy hozzáférjen egy IOrganizationService-példányhoz . IOrganizationService egy olyan felület, amely olyan módszereket biztosít, amelyekkel interakcióba Dataverse léphet.

További információ:

Munkafolyamat-táblázat

A felhőfolyamatok a Folyamat (munkafolyamat) táblában vannak tárolva, amely a webes API-ban munkafolyamatként van ábrázolva EntityType

Az alábbi táblázat a munkafolyamat-tábla fontos oszlopait ismerteti:

Logikai név Type Description
category Választási lehetőség A folyamat kategóriája. Itt vannak a különböző kategóriák.
0 - Klasszikus Dataverse munkafolyamatok.
1 - Klasszikus Dataverse párbeszédek.
2 - Üzleti szabályok.
3 - Klasszikus Dataverse akciók.
4 - Üzleti folyamatok.
5 - Modern Flow (automatizált, azonnali vagy ütemezett folyamatok).
6 - Asztali folyamatok.
clientdata Sztring A folyamat definíciójának és connectionReferences sztringkódolású JSON-fájlja.
createdby Lookup Az a felhasználó, aki a folyamatot létrehozta.
createdon Dátum/idő A folyamat létrehozásának dátuma.
description Sztring A folyamat a felhasználó által megadott leírása.
ismanaged Bool Azt jelzi, hogy a folyamat felügyelt megoldáson keresztül lett-e telepítve.
modifiedby Lookup Az utolsó felhasználó, aki frissítette a folyamatot.
modifiedon Dátum/idő A folyamat legutóbbi frissítésének időpontja.
name Sztring A folyamatnak adott megjelenítendő név.
ownerid Lookup A folyamat tulajdonosa vagy csoportja.
statecode Választási lehetőség A folyamat állapota. Az állapot a következő lehet:
0 - Vázlat (ki)
1 - Aktiválva (Be)
2 -Felfüggesztett.
type Választási lehetőség Azt jelzi, hogy a folyamat futó folyamat, vagy olyan sablon, amely további folyamatok létrehozására használható.
1 -Definíció
2 -Aktiválás
3 -Sablon.
workflowid GUID A felhőfolyamat egyedi azonosítója az összes importálás között.
workflowidunique GUID A folyamat ezen telepítéséhez használt egyedi azonosító.

Feljegyzés

A webes API-val a keresési értékek egyértékű navigációs tulajdonságok , amelyek kibonthatók a kapcsolódó rekord részleteinek lekéréséhez.

A keresőoszlopok megfelelő GUID keresési tulajdonságokkal is rendelkeznek, amelyek lekérdezésekben használhatók. A keresési tulajdonságok elnevezési konvenciója a következő: _<logical name>_value A webes API-ban a munkafolyamat entitástípusához hivatkozhat a következő keresési tulajdonságokra: _createdby_value, _modifiedby_value, és _ownerid_value.

Folyamatok listázása

A felhőfolyamatok listájának lekéréséhez lekérdezheti a munkafolyamat-táblát. A következő lekérdezés az első automatizált, azonnali vagy ütemezett folyamatot adja vissza, amely jelenleg be van kapcsolva:

Ehhez a statikus OutputFirstActiveFlow módszerhez hitelesített ügyfélre van szükség, amely megvalósítja a IOrganizationService. Az IOrganizationService.RetrieveMultiple metódust használja .

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

További rekordok beolvasásához távolítsa el a TopCount korlátot.

Kimenet

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

További információ:

Felhőfolyamat létrehozása

Az automatizált, azonnali és ütemezett folyamatokhoz szükséges tulajdonságok a következők: category, name, type,, primaryentity és clientdata. Használja none a primaryentity az ilyen típusú folyamatokhoz.

Ehhez a statikus módszerhez hitelesített ügyfélre van szükség, amely megvalósítja a IOrganizationService. Az IOrganizationService.Create metódust használja .

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

További információ: Táblasorok létrehozása a Szervezeti szolgáltatás használatával

Az statecode így létrehozott összes folyamat beállítása 0 (Vázlat vagy "Ki"). A folyamatot használat előtt engedélyezni kell.

A legfontosabb tulajdonság a clientdata, amely tartalmazza az connectionReferences áramlás által használt és az áramlás definícióját . A connectionReferences a folyamat által használt egyes kapcsolatok leképezései.

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

Felhőfolyamat frissítése

Egy folyamat frissítéséhez csak a módosítani kívánt tulajdonságokat állítsa be.

Ehhez a statikus módszerhez hitelesített ügyfélre van szükség, amely megvalósítja a IOrganizationService. Az IOrganizationService.Update metódussal frissíti a folyamat leírását, és beállítja a tulajdonost.

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

További információ: Táblasorok frissítése és törlése az Organization Service > Basic frissítéssel

Felhőfolyamat törlése

Az alábbi példák bemutatják, hogyan törölheti a felhőfolyamatot képviselő munkafolyamat-rekordot.

A statikus DeleteCloudFlow metódus töröl egy munkafolyamat-rekordot.

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

}

További információ: Rekord törlése az SDK használatával

Az összes felhasználó beolvasása, akivel a felhőfolyamat meg van osztva

Az üzenet segítségével lekérheti az RetrieveSharedPrincipalsAndAccess összes olyan felhasználó listáját, akivel a felhőfolyamat meg van osztva.

Az SDK-val használja a RetrieveSharedPrincipalsAndAccessRequest osztályt, a webes API-val pedig a RetrieveSharedPrincipalsAndAccess függvényt.

További információ: Rekordhoz hozzáféréssel rendelkező rendszerbiztonsági tagok lekérése

Felhőfolyamat megosztása vagy megosztásának törlése

Oszthat meg egy felhőfolyamatot, mint bármely más Dataverse rekordot az GrantAccess üzenet használatával. Az SDK-val használja a GrantAccessRequest osztályt , a webes API-val pedig a GrantAccess műveletet. További információ: GrantAccess-példa

Ha módosítani szeretné a rekord megosztásakor megadott hozzáférési jogokat, használja az ModifyAccess üzenetet. Az SDK-val használja a ModifyAccessRequest osztályt , a webes API-val pedig a ModifyAccess műveletet. További információ: Példa módosításAccess

Egy rekord megosztásának visszavonásához használja az RevokeAccess üzenetet. Az SDK-val használja a RevokeAccessRequest osztályt , a webes API-val pedig a RevokeAccess műveletet. További információ: Hozzáférés visszavonása

Folyamatok exportálása

Ha egy folyamat egy megoldás része, exportálhatja azt a folyamatot tartalmazó megoldás exportálásával az ExportSolution üzenet használatával.

Az alábbi statikus ExportSolution példametódus az ExportSolutionRequest használatával lekéri a byte[] nem felügyelt megoldás ZIP-fájlját tartalmazó fájlt a megadott UniqueName névvel.

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

Folyamatok importálása

Ha van megoldási ZIP-fájlja, importálhatja azt az ImportSolution üzenet használatával.

Folyamatok importálásakor a következő paramétereket kell beállítania:

Tulajdonság neve Description
OverwriteUnmanagedCustomizations Ha ezeknek a folyamatoknak Dataverse már vannak példányai, ezt a jelzőt be kell állítani az importálásukhoz true . Ellenkező esetben nem lesznek felülírva.
PublishWorkflows Azt jelzi, ha klasszikus Dataverse-munkafolyamatok importáláskor aktiválódnak. Ez a beállítás a többi folyamattípusra nem vonatkozik.
CustomizationFile Egy Base 64 kódolású zip-fájl, amely tartalmazza a megoldást.

A statikus ImportSolution minta módszer bemutatja, hogyan importálhat megoldásfájlt az ImportSolutionRequest osztály használatával

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

Kapcsolódó információk

Entitásosztály-műveletek az Organization szolgáltatás használatával
Műveletek végrehajtása a webes API használatával
Megosztás és hozzárendelés
Hozzáférés ellenőrzése kódban
Megoldások használata az Dataverse SDK használatával