Treballar amb fluxos de núvol mitjançant codi
Tots els fluxos s'emmagatzemen i Dataverse podeu utilitzar l'SDK per a .NET o l'API Dataverse web per gestionar-los.
En aquest article s'explica la gestió dels fluxos inclosos a la pestanya Solucions Power Automate. Actualment, la gestió de fluxos a Els meus fluxos no és compatible amb el codi.
Interactuar amb Dataverse les API
Dataverse proporciona capacitats equivalents utilitzant l'SDK per a .NET o l'API Dataverse web.
Quin mètode he d'utilitzar?
El millor mètode depèn de la tecnologia del projecte i de les habilitats que tingueu.
Si el teu projecte utilitza .NET, et recomanem que utilitzis l'SDK. L'SDK simplifica la vostra experiència de desenvolupament proporcionant un model d'objecte mecanografiat i mètodes per autenticar-vos.
Més informació: Utilitzar el servei Organització
Com connectar-se?
La manera de connectar-se depèn de si utilitzeu l'SDK per a .NET o l'API Dataverse web.
Amb l'SDK, heu de connectar-vos amb una aplicació client per obtenir accés a una instància de l'IOrganizationService . IOrganizationService
és una interfície que proporciona mètodes que podeu utilitzar per interactuar Dataverse.
Més informació:
Taula de flux de treball
Els fluxos de núvol s'emmagatzemen a la taula Procés (flux de treball) que es representa a l'API web com a flux de treball EntityType
La taula següent descriu columnes importants a la taula de flux de treball:
Nom lògic | Type | Descripció |
---|---|---|
category |
Elecció | La categoria del flux. Aquestes són les diferents categories. 0 - Fluxos de treball clàssics Dataverse .1 - Diàlegs clàssics Dataverse . 2 - Regles de negoci. 3 - Accions clàssiques Dataverse . 4 - Fluxos del procés de negoci. 5 - Flux modern (fluxos automatitzats, instantanis o programats).6 - Fluxos d'escriptori. |
clientdata |
String | Un JSON codificat per cadenes de la definició de flux i la seva connexióReferències. |
createdby |
Cerca | L'usuari que ha creat el flux. |
createdon |
Data/hora | La data en què es va crear el flux. |
description |
String | La descripció proporcionada per l'usuari del flux. |
ismanaged |
Bool | Indica si el flux s'ha instal·lat a través d'un solució administrada. |
modifiedby |
Cerca | L'últim usuari que ha actualitzat el flux. |
modifiedon |
Data/hora | L'última vegada es va actualitzar el flux. |
name |
String | El nom de visualització que heu donat al flux. |
ownerid |
Cerca | L'usuari o equip propietari del flux. |
statecode |
Elecció | L'estat del flux. L'estat pot ser:0 - Esborrany (desactivat)1 - Activat (encès)2 -Suspès. |
type |
Elecció | Indica si el flux és un flux en execució o una plantilla que es pot utilitzar per crear més fluxos. 1 -Definició2 -Activació3 -Plantilla. |
workflowid |
GUID | L'identificador únic per a un flux de núvol en totes les importacions. |
workflowidunique |
GUID | L'identificador únic per a aquesta instal·lació del cabal. |
Nota
Amb l'API web, els valors de cerca són propietats de navegació d'un sol valor que es poden ampliar per obtenir detalls del registre relacionat.
Les columnes de cerca també tenen les propietats de cerca GUID corresponents que es poden utilitzar a les consultes. Les propietats de cerca tenen aquesta convenció de nomenclatura: _<logical name>_value
. Per al tipus d'entitat del flux de treball a l'API web podeu fer referència a aquestes propietats de cerca: _createdby_value
, _modifiedby_value
, and _ownerid_value
.
Enumeració dels fluxos
Per recuperar una llista de fluxos al núvol, podeu consultar la taula de flux de treball. La consulta següent retorna el primer flux automatitzat, instantani o programat que està actualment "activat":
Aquest mètode estàtic OutputFirstActiveFlow
requereix un client autenticat que implementi la IOrganizationService. Utilitza el mètode 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"]}");
}
Per recuperar més registres, suprimiu el límit TopCount .
Sortida
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és informació:
Crea un flux de núvol
Les propietats necessàries per als fluxos automatitzats, instantanis i programats són: category
, name
, type
,, primaryentity
i clientdata
. Ús none
per a primaryentity
aquest tipus de fluxos.
Aquest mètode estàtic requereix un client autenticat que implementi la IOrganizationService. Utilitza el mètode IOrganizationService.Crea .
/// <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és informació: Crear files de taula mitjançant el Servei d'organització
Els statecode
de tots els fluxos creats d'aquesta manera es defineixen a 0
(Esborrany o "Desactivat"). Cal habilitar el flux abans de poder utilitzar-lo.
La propietat més important és la clientdata
, que conté el connectionReferences
que utilitza el flux, i la definició del flux. Són connectionReferences
les assignacions a cada connexió que utilitza el flux.
{
"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"
}
Actualitzar un flux de núvol
Per actualitzar un flux, definiu només les propietats que voleu canviar.
Aquest mètode estàtic requereix un client autenticat que implementi la IOrganizationService. Utilitza el mètode IOrganizationService.Update per actualitzar una descripció del flux i definir el propietari.
/// <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és informació: Actualitzar i suprimir files de taules mitjançant l'actualització bàsica del Servei > d'Organització
Suprimir un flux de núvol
Els exemples següents mostren com suprimir el registre de flux de treball que representa un flux de núvol.
El mètode estàtic DeleteCloudFlow
suprimeix un registre de flux de treball.
/// <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és informació: Suprimir un registre mitjançant l'SDK
Obteniu tots els usuaris amb els quals es comparteix un flux al núvol
Utilitzeu el RetrieveSharedPrincipalsAndAccess
missatge per obtenir una llista de tots els usuaris amb els quals es comparteix un flux de núvol.
Amb l'SDK, utilitzeu la classe RetrieveSharedPrincipalsAndAccessRequest i amb l'API web utilitzeu la funció RetrieveSharedPrincipalsAndAccess.
Més informació: Obtenció de directors amb accés a un registre
Compartir o deixar de compartir un flux de núvol
Compartiu un flux de núvol com qualsevol altre Dataverse registre mitjançant el GrantAccess
missatge. Amb l'SDK, utilitzeu la classe GrantAccessRequest i amb l'API web utilitzeu l'acció GrantAccess. Més informació: BecaExemple d'accés
Si voleu canviar els drets d'accés que concediu quan compartiu un registre, utilitzeu el ModifyAccess
missatge. Amb l'SDK, utilitzeu la classe ModifyAccessRequest i amb l'API web utilitzeu l'acció ModifyAccess. Més informació: ModificarExemple d'accés
Per deixar de compartir un registre, utilitzeu el RevokeAccess
missatge. Amb l'SDK, utilitzeu la classe RevokeAccessRequest i amb l'API web utilitzeu l'acció RevokeAccess. Més informació: Revocació d'accés
Fluxos d'exportació
Quan un flux forma part d'una solució, podeu exportar-lo exportant la solució que conté el flux mitjançant el ExportSolution
missatge.
El mètode d'exemple estàtic ExportSolution
següent utilitza ExportSolutionRequest per recuperar un byte[]
fitxer ZIP de la solució no administrada amb el UniqueName especificat.
/// <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 d'importació
Quan tingueu un fitxer ZIP de solució, podeu importar-lo mitjançant el ImportSolution
missatge.
Quan importeu fluxos, heu d'establir els paràmetres següents:
Nom de la propietat | Descripció |
---|---|
OverwriteUnmanagedCustomizations |
Si hi ha instàncies existents d'aquests fluxos Dataverse, cal definir true aquest indicador per importar-los. En cas contrari, no se sobreescriuran. |
PublishWorkflows |
Indica si els fluxos de treball clàssics Dataverse s'activaran en importar. Aquesta configuració no s'aplica a altres tipus de fluxos. |
CustomizationFile |
Un fitxer zip codificat en base 64 que conté la solució. |
El mètode d'exemple estàtic ImportSolution
mostra com importar un fitxer de solució mitjançant la classe 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);
}
Consulteu també
Operacions de classe d'entitat mitjançant el servei Organization
Realitzar operacions mitjançant l'API web
Compartir i assignar
Verificació de l'accés en codi
Treballar amb solucions mitjançant l'SDK Dataverse