protected override void Execute(System.Activities.CodeActivityContext context) { var workflowContext = context.GetExtension <IWorkflowContext>(); var service = this.RetrieveOrganizationService(context); Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest metadataRequest = new Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest() { LogicalName = workflowContext.PrimaryEntityName, EntityFilters = EntityFilters.Relationships }; var metadataResponse = service.Execute(metadataRequest) as Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse; var relationship = metadataResponse.EntityMetadata.ManyToManyRelationships.FirstOrDefault(m => m.SchemaName.Equals(RelationshipName.Get(context), StringComparison.InvariantCultureIgnoreCase) || m.IntersectEntityName.Equals(RelationshipName.Get(context), StringComparison.InvariantCultureIgnoreCase)); if (relationship == null) { throw new Exception($"Entity '{workflowContext.PrimaryEntityName}' does not have relationship with schema name or relationship entity name '{RelationshipName.Get(context)}'"); } QueryExpression qe = new QueryExpression(relationship.IntersectEntityName); qe.Criteria.AddCondition(relationship.Entity1IntersectAttribute, ConditionOperator.Equal, workflowContext.PrimaryEntityId); qe.ColumnSet = new ColumnSet(relationship.Entity2IntersectAttribute); var associated = service.RetrieveMultiple(qe).Entities.Select(e => new EntityReference(relationship.Entity2LogicalName, (Guid)e[relationship.Entity2IntersectAttribute])).ToList(); service.Disassociate(workflowContext.PrimaryEntityName, workflowContext.PrimaryEntityId, new Relationship(relationship.SchemaName), new EntityReferenceCollection(associated)); NumberOfRelationshipChanges.Set(context, associated.Count); }
protected int?RetrieveEntityObjectTypeCode(IWorkflowContext workflowContext, IOrganizationService service) { int?returnValue = null; Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest metadataRequest = new Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest() { LogicalName = workflowContext.PrimaryEntityName }; Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse metadataResponse = service.Execute(metadataRequest) as Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse; if (metadataResponse != null) { returnValue = metadataResponse.EntityMetadata.ObjectTypeCode; } return(returnValue); }
protected void SetWorkflowRecordInfo(CodeActivityContext context, IWorkflowContext workflowContext, IOrganizationService service) { // Record info this.WorkflowRecord_LookupID.Set(context, workflowContext.PrimaryEntityId.ToString()); this.WorkflowRecord_LookupEntityName.Set(context, workflowContext.PrimaryEntityName); Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest metadataRequest = new Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest() { LogicalName = workflowContext.PrimaryEntityName }; Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse metadataResponse = service.Execute(metadataRequest) as Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse; if (metadataResponse != null) { this.WorkflowRecord_LookupObjectTypeCode.Set(context, metadataResponse.EntityMetadata.ObjectTypeCode); if (metadataResponse.EntityMetadata.DisplayName != null && metadataResponse.EntityMetadata.DisplayName.UserLocalizedLabel != null) { this.WorkflowRecord_LookupEntityDisplayName.Set(context, metadataResponse.EntityMetadata.DisplayName.UserLocalizedLabel.Label); } } }
public SystemForm GetForm(string entityLogicalName, string formName) { var forms = (from f in uow.SystemForms.GetQuery() where f.ObjectTypeCode == entityLogicalName && f.Name == formName && f.Type.Value == 2 && f.FormActivationState.Value != 0 select new SystemForm { EntityLogicalName = entityLogicalName, FormXml = f.FormXml, Name = f.Name }).ToArray(); if (forms.Length == 0) { throw new Exception($"Form {formName} on entity {entityLogicalName} was not found."); } if (forms.Length > 1) { throw new Exception($"More than one form with name {formName} was found on entity {entityLogicalName}."); } if (!entities.TryGetValue(entityLogicalName, out Microsoft.Xrm.Sdk.Metadata.EntityMetadata entity)) { var req = new Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest { LogicalName = entityLogicalName, EntityFilters = Microsoft.Xrm.Sdk.Metadata.EntityFilters.All }; var resp = uow.ExecuteRequest <Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse>(req); entity = resp.EntityMetadata; entities[entityLogicalName] = entity; } forms[0].Parse(entity); return(forms[0]); }
protected DataTable BuildDataTable(CodeActivityContext context, IWorkflowContext workflowContext, IOrganizationService service) { TimeZoneSummary timeZone = StaticMethods.CalculateTimeZoneToUse(this.TimeZoneOption.Get(context), workflowContext, service); DataTable table = new DataTable() { TableName = workflowContext.PrimaryEntityName }; table.Columns.AddRange(new DataColumn[] { new DataColumn("Date"), new DataColumn("User"), new DataColumn("Attribute"), new DataColumn("Old Value"), new DataColumn("New Value") }); DateTime oldestUpdate = DateTime.MinValue; if (this.Units != null && this.Number != null && this.Number.Get <int>(context) != 0) { OptionSetValue value = this.Units.Get <OptionSetValue>(context); if (value != null) { switch (value.Value) { case 222540000: oldestUpdate = DateTime.Now.AddYears(this.Number.Get <int>(context) * -1); break; case 222540001: oldestUpdate = DateTime.Now.AddMonths(this.Number.Get <int>(context) * -1); break; case 222540002: oldestUpdate = DateTime.Now.AddDays(this.Number.Get <int>(context) * -7); break; case 222540003: oldestUpdate = DateTime.Now.AddDays(this.Number.Get <int>(context) * -1); break; case 222540004: oldestUpdate = DateTime.Now.AddHours(this.Number.Get <int>(context) * -1); break; default: oldestUpdate = DateTime.Now.AddMinutes(this.Number.Get <int>(context) * -1); break; } } } RetrieveRecordChangeHistoryRequest request = new RetrieveRecordChangeHistoryRequest() { Target = new EntityReference(workflowContext.PrimaryEntityName, workflowContext.PrimaryEntityId), PagingInfo = new PagingInfo() { Count = 100, PageNumber = 1 } }; RetrieveRecordChangeHistoryResponse response = service.Execute(request) as RetrieveRecordChangeHistoryResponse; var detailsToInclude = response.AuditDetailCollection.AuditDetails .Where(ad => ad is AttributeAuditDetail && ad.AuditRecord.Contains("createdon") && ((DateTime)ad.AuditRecord["createdon"]) > oldestUpdate) .OrderByDescending(ad => ((DateTime)ad.AuditRecord["createdon"])) .ToList(); if (detailsToInclude.Any()) { Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest retrieveEntityRequest = new Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest() { EntityFilters = EntityFilters.Attributes, LogicalName = workflowContext.PrimaryEntityName }; Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse retrieveEntityResponse = service.Execute(retrieveEntityRequest) as Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse; EntityMetadata metadata = retrieveEntityResponse.EntityMetadata; foreach (var detail in detailsToInclude.Select(d => d as AttributeAuditDetail).Where(d => d.NewValue != null && d.OldValue != null)) { DateTime dateToModify = (DateTime)detail.AuditRecord["createdon"]; if (dateToModify.Kind != DateTimeKind.Utc) { dateToModify = dateToModify.ToUniversalTime(); } LocalTimeFromUtcTimeRequest timeZoneChangeRequest = new LocalTimeFromUtcTimeRequest() { UtcTime = dateToModify, TimeZoneCode = timeZone.MicrosoftIndex }; LocalTimeFromUtcTimeResponse timeZoneResponse = service.Execute(timeZoneChangeRequest) as LocalTimeFromUtcTimeResponse; DateTime timeZoneSpecificDateTime = timeZoneResponse.LocalTime; var details = detail.NewValue.Attributes.Keys.Union(detail.OldValue.Attributes.Keys) .Distinct() .Select(a => new { AttributeName = a, DisplayName = GetDisplayLabel(metadata, a) }) .OrderBy(a => a.DisplayName); foreach (var item in details) { DataRow newRow = table.NewRow(); newRow["User"] = GetDisplayValue(detail.AuditRecord, "userid"); newRow["Date"] = timeZoneSpecificDateTime.ToString("MM/dd/yyyy h:mm tt"); newRow["Attribute"] = item.DisplayName; newRow["Old Value"] = GetDisplayValue(detail.OldValue, item.AttributeName); newRow["New Value"] = GetDisplayValue(detail.NewValue, item.AttributeName); table.Rows.Add(newRow); } } } return(table); }
public static void Run(string[] args) { try { var sourcefile = args.GetParameter("source", true); var targetfile = args.GetParameter("output", true); var forms = Kipon.WebResources.Tools.Generator.Config.forms.GetFromXmlFile(sourcefile); IOrganizationService service = Kipon.WebResources.Tools.Service.Factory.GetOrganizationService(args); using (var uow = new Entities.CrmUnitOfWork(service)) { using (var writer = new CodeWriter(targetfile)) { writer.Writeline("/// <reference path=\"xrm.d.ts\" />"); writer.Writeline(""); writer.Writeline("declare namespace XrmForm {"); foreach (var form in forms.form) { var xrmEntityForm = (from f in uow.Systemforms.GetQuery() where f.ObjectTypeCode == form.entity && f.Name == form.name select f).SingleOrDefault(); if (xrmEntityForm == null) { Console.WriteLine("Entity " + form.entity + " Form " + form.name + " was not found"); continue; } Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse entity = null; if (entities.ContainsKey(form.entity)) { entity = entities[form.entity]; } else { var req = new Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest { RetrieveAsIfPublished = true, LogicalName = form.entity, EntityFilters = Microsoft.Xrm.Sdk.Metadata.EntityFilters.Attributes }; entity = uow.ExecuteRequest <Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse>(req); entities.Add(form.entity, entity); } #region XrmForm interface writer.Writeline("interface " + form.asname + " {"); var reader = new System.IO.StringReader(xrmEntityForm.FormXml); var serializer = new XmlSerializer(typeof(Kipon.WebResources.Tools.Generator.Xrm.form)); var xrmform = (Kipon.WebResources.Tools.Generator.Xrm.form)serializer.Deserialize(reader); WriteFormControls(writer, entity, xrmform, true); writer.Writeline("ui: " + form.asname + "UI;"); writer.Writeline("}"); #endregion #region entity ui interface writer.Writeline("interface " + form.asname + "UI {"); writer.Writeline("controls: " + form.asname + "UIControls;"); writer.Writeline("tabs: " + form.asname + "UITabs;"); writer.Writeline("}"); #endregion #region controls writer.Writeline("interface " + form.asname + "UIControls {"); WriteFormControls(writer, entity, xrmform, false); writer.Writeline("}"); #endregion #region generate tabs writer.Writeline("interface " + form.asname + "UITabs {"); writer.Writeline("get(name: string): void;"); var ix = 0; foreach (var tab in xrmform.tabs) { writer.Writeline("get(name: \"" + tab.name + "\"): " + form.asname + "UITab" + ix.ToString() + ";"); ix++; } writer.Writeline("}"); ix = 0; foreach (var tab in xrmform.tabs) { writer.Writeline("interface " + form.asname + "UITab" + ix + " extends Xrm.Controls.UiStandardElement, Xrm.Controls.UiFocusable {"); writer.Writeline("sections: " + form.asname + "UITab" + ix + "Sections;"); writer.Writeline("}"); ix++; } ix = 0; foreach (var tab in xrmform.tabs) { writer.Writeline("interface " + form.asname + "UITab" + ix + "Sections {"); writer.Writeline("get(name: string): void;"); foreach (var col in tab.columns) { foreach (var sec in col.sections) { writer.Writeline("get(name: \"" + sec.name + "\"): Xrm.Controls.Section;"); } } writer.Writeline("}"); ix++; } #endregion } writer.Writeline("}"); } } } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); Console.WriteLine("Usage: Kipon.WebResources.Tools generate /url:url /user:user /password:password /source:definitionsourcefilename /output:output.d.name"); } }
protected DataTable BuildDataTable(CodeActivityContext context, IWorkflowContext workflowContext, IOrganizationService service) { DataTable table = new DataTable() { TableName = workflowContext.PrimaryEntityName }; table.Columns.AddRange(new DataColumn[] { new DataColumn("Attribute"), new DataColumn("Old Value"), new DataColumn("New Value") }); RetrieveRecordChangeHistoryRequest request = new RetrieveRecordChangeHistoryRequest() { Target = new EntityReference(workflowContext.PrimaryEntityName, workflowContext.PrimaryEntityId), PagingInfo = new PagingInfo() { Count = 100, PageNumber = 1 } }; RetrieveRecordChangeHistoryResponse response = service.Execute(request) as RetrieveRecordChangeHistoryResponse; if (response != null && response.AuditDetailCollection.Count > 0) { string onlyIfField = LastUpdateWithThisField.Get(context); AttributeAuditDetail detail = null; for (int i = 0; i < response.AuditDetailCollection.Count; i++) { AttributeAuditDetail thisDetail = response.AuditDetailCollection[i] as AttributeAuditDetail; if (thisDetail != null && (String.IsNullOrEmpty(onlyIfField) || (thisDetail.OldValue.Attributes.Keys.Contains(onlyIfField) || thisDetail.NewValue.Attributes.Keys.Contains(onlyIfField)))) { detail = thisDetail; break; } } if (detail != null && detail.NewValue != null && detail.OldValue != null) { Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest retrieveEntityRequest = new Microsoft.Xrm.Sdk.Messages.RetrieveEntityRequest() { EntityFilters = EntityFilters.Attributes, LogicalName = workflowContext.PrimaryEntityName }; Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse retrieveEntityResponse = service.Execute(retrieveEntityRequest) as Microsoft.Xrm.Sdk.Messages.RetrieveEntityResponse; EntityMetadata metadata = retrieveEntityResponse.EntityMetadata; var details = detail.NewValue.Attributes.Keys.Union(detail.OldValue.Attributes.Keys) .Distinct() .Select(a => new { AttributeName = a, DisplayName = this.GetDisplayLabel(metadata, a), OldValue = String.Empty, NewValue = String.Empty }) .OrderBy(a => a.DisplayName); foreach (var item in details) { DataRow newRow = table.NewRow(); newRow["Attribute"] = item.DisplayName; newRow["Old Value"] = GetDisplayValue(detail.OldValue, item.AttributeName); newRow["New Value"] = GetDisplayValue(detail.NewValue, item.AttributeName); table.Rows.Add(newRow); } } } return(table); }