Compartir por


Traballar con fluxos de nube de negocio mediante código

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

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

Interactuar coas API Dataverse

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

Que método debería usar?

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

Se o teu proxecto usa .NET, recomendámosche usar o SDK. O SDK simplifica a experiencia de desenvolvemento ao proporcionar un modelo de obxectos tipados e métodos para autenticarse.

Máis información: Usar o servizo Organización

Como conectar?

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

Co SDK, cómpre conectarse a unha aplicación cliente para acceder a unha instancia de *IOrganizationService*. ... IOrganizationService é unha interface que proporciona métodos que podes usar para interactuar con Dataverse.

Máis información:

Táboa de fluxo de traballo

Os fluxos na nube almacénanse na táboa 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 clásicos. Dataverse
1 - Diálogos clásicos. Dataverse
2 - Normas empresariais.
3 - Accións clásicas. Dataverse
4 - Fluxos dos procesos empresariais.
5 - Modern Flow (fluxos automatizados, instantáneos ou programados).
6 - Fluxos de escritorio.
clientdata String Un JSON codificado en cadea de caracteres da definición do fluxo e as súas connectionReferences.
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 Booleano Indica se o fluxo se instalou a través dunha solución xestionada.
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 proporcionaches 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 (Ligado)
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 na 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 pode ampliar para obter detalles do rexistro relacionado.

As columnas de busca tamén teñen o GUID correspondente propiedades de busca que se poden usar en consultas. As propiedades de busca teñen esta convención de nomes: _<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 na nube, podes consultar a táboa de fluxos de traballo. A seguinte consulta devolve o primeiro fluxo automatizado, instantáneo ou programado que está actualmente "activado":

Esta estática OutputFirstActiveFlow O método require un cliente autenticado que implemente o IOrganizationService. Emprega o IOrganizationService.RecuperarMúltiples método.

/// <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, elimine o TopCount límite.

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 requiridas para fluxos automatizados, instantáneos e programados son: category, name, type, primaryentity, e clientdata. Usar none para o/a primaryentity para este tipo de fluxos.

Este método estático require un cliente autenticado que implemente o IOrganizationService. Emprega o IOrganizationService.Crear método.

/// <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: Crear filas de táboa usando o Servizo de organización

Os statecode fluxos creados deste xeito están configurados en 0 (Borrador ou "Desactivado"). O fluxo debe estar activado antes de poder usalo.

A propiedade máis importante é a clientdata, que contén a connectionReferences que usa o fluxo e a definición do fluxo. As connectionReferences son as asignacións a cada conexión que usa 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 na nube

Para actualizar un fluxo, defina só as propiedades que desexe cambiar.

Este método estático require un cliente autenticado que implemente o IOrganizationService. Emprega o método IOrganizationService.Update para actualizar a descrición dun 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: Actualizar e eliminar filas da táboa mediante o servizo de organización > Actualización básica

Eliminar un fluxo na nube

Os seguintes exemplos mostran como eliminar o rexistro do fluxo de traballo que representa un fluxo na 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: Eliminar un rexistro usando o SDK

Obter todos os usuarios cos que se comparte un fluxo na nube

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

Co SDK, usa a clase RetrieveSharedPrincipalsAndAccessRequest e coa API web usa a función RetrieveSharedPrincipalsAndAccess.

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

Compartir ou deixar de compartir un fluxo na nube

Comparte un fluxo na nube como calquera outro rexistro usando a mensaxe. Dataverse GrantAccess Co SDK, usa a clase GrantAccessRequest e coa API web usa a acción GrantAccess. Máis información: Exemplo de GrantAccess

Se queres cambiar os dereitos de acceso que outorgas ao compartir un rexistro, usa a mensaxe ModifyAccess . Co SDK, usa a clase ModifyAccessRequest e coa API web usa a acción ModifyAccess. Máis información: Exemplo de ModifyAccess

Para deixar de compartir un rexistro, usa a mensaxe RevokeAccess . Co SDK, usa a clase RevokeAccessRequest e coa API web usa a acción RevokeAccess. Máis información: Revogación do acceso

Fluxos de exportación

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

O seguinte método de exemplo estático ExportSolution usa a ExportSolutionRequest para recuperar un byte[] que contén o ficheiro ZIP da solución non xestionada co UniqueName especificado.

/// <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 teñas un ficheiro ZIP de solución, podes importalo usando a mensaxe ImportSolution .

Ao importar fluxos, debes definir os seguintes parámetros:

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

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

Preguntas máis frecuentes

E que pasa coa API de api.flow.microsoft.com?

A API en api.flow.microsoft.com non é compatible. Os clientes deberían usar as Dataverse API web para Power Automate documentadas anteriormente neste artigo.

De xeito alternativo, os clientes poden usar os conectores de xestión: Power Automate Xestión ou Power Automate para administradores.

Os clientes poden usar as API non compatibles baixo a súa propia responsabilidade. api.flow.microsoft.com Estas API están suxeitas a cambios, polo que poderían producirse cambios importantes.

Operacións da clase de entidade usando o servizo Organización
Realizar operacións usando a API web
Compartir e asignar
Verificación do acceso no código
Traballa con solucións empregando o Dataverse SDK