示例#1
0
        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);
        }
示例#2
0
        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);
                }
            }
        }
示例#4
0
        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);
        }
示例#6
0
        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);
        }