diff --git a/msdyncrmWorkflowTools/msdyncrmWorkflowTools/Class/GetRecordUrl.cs b/msdyncrmWorkflowTools/msdyncrmWorkflowTools/Class/GetRecordUrl.cs new file mode 100644 index 0000000..6be07d1 --- /dev/null +++ b/msdyncrmWorkflowTools/msdyncrmWorkflowTools/Class/GetRecordUrl.cs @@ -0,0 +1,52 @@ +using Microsoft.Xrm.Sdk.Workflow; +using System; +using System.Activities; + +namespace msdyncrmWorkflowTools +{ + /// + /// Gets the URL for a record + /// + public class GetRecordUrl : CodeActivity + { + /// + /// A reference Record URL (use the URL for the record on which the flow is running) + /// + [RequiredArgument] + [Input("Reference Record URL")] + public InArgument ReferenceRecordUrl { get; set; } + + /// + /// ID of the record + /// + [RequiredArgument] + [Input("Record ID")] + public InArgument RecordId { get; set; } + + /// + /// Logical name of the entity + /// + [RequiredArgument] + [Input("Entity Logical Name")] + public InArgument EntityName { get; set; } + + /// + /// URL of the record + /// + [Output("Record URL")] + public OutArgument RecordUrl { get; set; } + + protected override void Execute(CodeActivityContext context) + { + Common objCommon = new Common(context); + msdyncrmWorkflowTools_Class commonClass = new msdyncrmWorkflowTools_Class(objCommon.service, objCommon.tracingService); + string entityName = this.EntityName.Get(context); + Guid recordId = Guid.Parse(this.RecordId.Get(context)); + string referenceRecordUrl = this.ReferenceRecordUrl.Get(context); + + var entityCode = objCommon.GetEntityCodeFromName(entityName, objCommon.service); + var recordUrl = commonClass.GetRecordUrl(referenceRecordUrl, entityCode, recordId); + this.RecordUrl.Set(context, recordUrl); + } + } +} diff --git a/msdyncrmWorkflowTools/msdyncrmWorkflowTools/Common.cs b/msdyncrmWorkflowTools/msdyncrmWorkflowTools/Common.cs index 7e65d51..ad4048c 100644 --- a/msdyncrmWorkflowTools/msdyncrmWorkflowTools/Common.cs +++ b/msdyncrmWorkflowTools/msdyncrmWorkflowTools/Common.cs @@ -55,6 +55,23 @@ public string sGetEntityNameFromCode(string ObjectTypeCode, IOrganizationService return entityMetadata.SchemaName.ToLower(); } + public string GetEntityCodeFromName(string entityName, IOrganizationService service) + { + MetadataFilterExpression entityFilter = new MetadataFilterExpression(LogicalOperator.And); + entityFilter.Conditions.Add(new MetadataConditionExpression("LogicalName", MetadataConditionOperator.Equals, entityName)); + EntityQueryExpression entityQueryExpression = new EntityQueryExpression() + { + Criteria = entityFilter + }; + RetrieveMetadataChangesRequest retrieveMetadataChangesRequest = new RetrieveMetadataChangesRequest() + { + Query = entityQueryExpression, + ClientVersionStamp = null + }; + RetrieveMetadataChangesResponse response = (RetrieveMetadataChangesResponse)service.Execute(retrieveMetadataChangesRequest); + EntityMetadata entityMetadata = response.EntityMetadata.Count > 0 ? (EntityMetadata)response.EntityMetadata[0] : null; + return entityMetadata?.ObjectTypeCode.Value.ToString(); + } public EntityCollection getAssociations(string PrimaryEntityName, Guid PrimaryEntityId, string _relationshipName, string entityName, string ParentId) { diff --git a/msdyncrmWorkflowTools/msdyncrmWorkflowTools/msdyncrmWorkflowTools.csproj b/msdyncrmWorkflowTools/msdyncrmWorkflowTools/msdyncrmWorkflowTools.csproj index 33625c9..ff612b4 100644 --- a/msdyncrmWorkflowTools/msdyncrmWorkflowTools/msdyncrmWorkflowTools.csproj +++ b/msdyncrmWorkflowTools/msdyncrmWorkflowTools/msdyncrmWorkflowTools.csproj @@ -99,6 +99,7 @@ + diff --git a/msdyncrmWorkflowTools/msdyncrmWorkflowTools_Class/msdyncrmWorkflowTools_Class.cs b/msdyncrmWorkflowTools/msdyncrmWorkflowTools_Class/msdyncrmWorkflowTools_Class.cs index 9106d45..3df17ba 100644 --- a/msdyncrmWorkflowTools/msdyncrmWorkflowTools_Class/msdyncrmWorkflowTools_Class.cs +++ b/msdyncrmWorkflowTools/msdyncrmWorkflowTools_Class/msdyncrmWorkflowTools_Class.cs @@ -319,6 +319,14 @@ public string GetRecordID(string recordURL) return objectId; } + public string GetRecordUrl(string referenceRecordUrl, string entityCode, Guid recordId) + { + string[] urlParts = referenceRecordUrl.Split("?".ToArray()); + string dynamicsUrl = urlParts[0]; + return $"{dynamicsUrl}?etc={entityCode}&id={recordId}"; + } + + public string GetAppModuleId(string appModuleUniqueName) { var query = new QueryExpression