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 de 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ón3 - 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"
}
Actualiza 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
Use 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
Comparte ou deixa de compartir un fluxo de nube
Comparte un fluxo de 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 revocación de acceso. 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 ExportSolution
mensaxe.
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 importalas. 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);
}
Información relacionada
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