Traballar con fluxos de nube de negocio mediante código

Todos os fluxos almacénanse en Dataverse e podes utilizar o Dataverse SDK para .NET ou a API web para xestionalos.

Este artigo abarca a xestión dos fluxos incluídos na pestana Solucións en Power Automate. Actualmente, a xestión de fluxos en Os meus fluxos non é compatible co código.

Interactúa con Dataverse APIs

Dataverse ofrece capacidades equivalentes mediante o Dataverse SDK para .NET ou a API web.

Que método debo usar?

O mellor método depende da tecnoloxía do proxecto e das habilidades que teñas.

Se o teu proxecto usa .NET, recomendamos usar o SDK. O SDK simplifica a túa experiencia de desenvolvemento proporcionando un modelo de obxectos escritos e métodos para autenticar.

Máis información: Utiliza o servizo de Organización

Como conectar?

A forma de conectar depende de se estás a usar o Dataverse SDK para .NET ou a API web.

Co SDK, cómpre conectarse cunha aplicación cliente para acceder a unha IOrganizationService instancia. IOrganizationService é unha interface que ofrece métodos que pode utilizar para interactuar con Dataverse.

Máis información:

Táboa de fluxo de traballo

Os fluxos de nube gárdanse na táboa de proceso (fluxo de traballo) que se representa na API web como o tipo de entidade do fluxo de traballo.

A seguinte táboa describe as columnas importantes da táboa de fluxo de traballo:

Nome lóxico Tipo Descripción
category Opción A categoría do fluxo. Aquí están as diferentes categorías.
0 - Fluxos de traballo Dataverse clásicos.
1 - Diálogos Dataverse clásicos.
2 - Normas comerciais.
3 - Accións clásicas Dataverse .
4 - Fluxos dos procesos de negocio.
5 - Fluxo moderno (fluxos automatizados, instantáneos ou programados).
6 - Fluxos de escritorio.
clientdata String Un JSON codificado en cadea da definición de fluxo e as súas referencias de conexión.
createdby Busca O usuario que creou o fluxo.
createdon DataHora A data na que se creou o fluxo.
description String A descrición do fluxo proporcionada polo usuario.
ismanaged Bool Indica se o fluxo se instalou mediante un solución administrada.
modifiedby Busca O último usuario que actualizou o fluxo.
modifiedon DataHora A última vez que se actualizou o fluxo.
name String O nome para mostrar que lle deu ao fluxo.
ownerid Busca O usuario ou equipo propietario do fluxo.
statecode Opción O estado do fluxo. O estado pode ser:
0 - Borrador (Desactivado)
1 - Activado (Activado)
2 - Suspendido.
type Opción Indica se o fluxo é un fluxo en execución ou un modelo que se pode usar para crear máis fluxos.
1 - Definición,
2 - Activación
3 - Modelo.
workflowid GUID O identificador único para un fluxo de nube en todas as importacións.
workflowidunique GUID O identificador único para esta instalación do fluxo.

Nota

Coa API web, os valores de busca son propiedades de navegación de valor único que se poden ampliar para obter detalles do rexistro relacionado.

As columnas de busca tamén teñen GUID propiedades de busca as correspondentes que se poden usar nas consultas. As propiedades de busca teñen esta convención de nomenclatura: _<logical name>_value. Para o tipo de entidade de fluxo de traballo na API web podes facer referencia a estas propiedades de busca: _createdby_value, _modifiedby_value e _ownerid_value.

Lista de fluxos

Para recuperar unha lista de fluxos de nube, pode consultar a táboa de fluxo de traballo. A seguinte consulta devolve o primeiro fluxo automatizado, instantáneo ou programado que está actualmente "activado":

Este método OutputFirstActiveFlow estático require un cliente autenticado que implemente o IOrganizationService. Usa o método 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"]}");
}

Para recuperar máis rexistros, elimina o límite TopCount .

Saída

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

Máis información:

Crear un fluxo de nube

As propiedades necesarias para os fluxos automatizados, instantáneos e programados son: category, name, type, primaryentity e clientdata. Use none para o primaryentity para estes tipos de fluxos.

Este método estático require un cliente autenticado que implemente o IOrganizationService. Usa o método 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);
}

Máis información: Cree filas da táboa mediante o Servizo de organización

O statecode de todos os fluxos creados deste xeito establécense en 0 (Borrador ou "Desactivado"). O fluxo debe estar activado antes de poder usar.

A propiedade máis importante é a clientdata, que contén o connectionReferences que utiliza o fluxo e a definición do fluxo. Os connectionReferences son as asignacións a cada conexión que utiliza o fluxo.

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

Actualizar un fluxo de nube

Para actualizar un fluxo, establece só as propiedades que queres cambiar.

Este método estático require un cliente autenticado que implemente o IOrganizationService. Usa o método IOrganizationService.Update para actualizar unha descrición do fluxo e definir o propietario.

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

Máis información: Actualiza e elimina filas da táboa mediante o Servizo de organización > Actualización básica

Eliminar un fluxo de nube

Os seguintes exemplos mostran como eliminar o rexistro de fluxo de traballo que representa un fluxo de nube.

O método estático DeleteCloudFlow elimina un rexistro de fluxo de traballo.

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

}

Máis información: Elimina un rexistro mediante o SDK

Obtén todos os usuarios cos que se comparte un fluxo de nube

Usa a RetrieveSharedPrincipalsAndAccess mensaxe para obter unha lista de todos os usuarios cos que se comparte un fluxo de nube.

Co SDK, use a Clase RetrieveSharedPrincipalsAndAccessRequest e coa API web use a Función RetrieveSharedPrincipalsAndAccess.

Máis información: Obter directores con acceso a un rexistro

Compartir ou deixar de compartir un fluxo de nube

Comparte un fluxo na nube como calquera outro Dataverse rexistro mediante a GrantAccess mensaxe. Co SDK, utiliza a Clase de solicitude de subvención e coa API web utiliza a Acción de GrantAccess. Máis información: Exemplo de GrantAccess

Se queres cambiar os dereitos de acceso que concedes cando compartes un rexistro, utiliza a mensaxe ModifyAccess . Co SDK, use a Clase de solicitude de modificación de acceso e coa API web use a Acción de modificación de acceso. Máis información: Exemplo de Modificar acceso

Para deixar de compartir un rexistro, utiliza a mensaxe RevokeAccess . Co SDK, use a Clase de solicitude de revocación de acceso e coa API web use a acción de RevokeAccess. Máis información: Revogar o acceso

Fluxos de exportación

Cando un fluxo forma parte dunha solución, pode exportalo exportando a solución que contén o fluxo mediante a mensaxe ExportSolution .

O método de exemplo ExportSolution estático que aparece a continuación utiliza a ExportSolutionRequest para recuperar un byte[] que contén o ficheiro ZIP da solución non xestionada co especificado Nome único.

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

Fluxos de importación

Cando tes un ficheiro ZIP de solución, podes importalo mediante a mensaxe ImportSolution .

Cando importe fluxos, debe establecer os seguintes parámetros:

Nome da propiedade Descripción
OverwriteUnmanagedCustomizations Se existen instancias destes fluxos en Dataverse, esta marca debe establecerse en true para importalos. En caso contrario, non se sobrescribirán.
PublishWorkflows Indica se os fluxos de traballo clásicos Dataverse se activarán ao importar. Esta configuración non se aplica a outros tipos de fluxos.
CustomizationFile Un ficheiro zip codificado en 64 base que contén a solución.

O método de mostra estático ImportSolution amosa como importar un ficheiro de solución mediante a clase 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);
}

Consulte tamén

Operacións de clase de entidade mediante o servizo Organización
Realiza operacións mediante a API web
Compartir e asignar
Verificando o acceso no código
Traballa con solucións mediante o Dataverse SDK