背景
我们的一个客户一起发出每月信息与发票给他们的联系人的子集。首先将这些联系人添加到市场营销列表中,然后提取联系人的姓名,地址信息和OCR号码。将这些成员导出为Excel文件(因此可以将其发送给打印用户)时,我们的客户在生成文件时遇到了大量问题。一旦我们成功了,我们意识到生成的Excel文件 的大小约为550 MB,大约40k行和少于10列的名称和地址信息。过了一段时间,我们发现Dynamics CRM生成了另外160个隐藏列,不包含任何数据。删除 这些列使文件大小降低到更合理的4 MB。这些列在名为“processid”和“processts”之间交替出现。Dynamics CRM中2016产生巨大的Excel文件进行营销列表
导出时不会出现此问题,例如,来自高级查找的发票,所以我很想知道Dynamics CRM是否做了一些特殊的事情,因为在这种情况下,我们在出口时正在运行一个插件。
详细
我们的客户使用,更详细的流程,如下:创建
- 的运动。此广告系列会获取序列号,这是我们生成的唯一ID。
- 营销列表已创建并与广告系列相关联。
- 成员已添加到市场营销列表中。这些成员也有一个序列号,一个唯一的ID。
- 从营销列表表单切换到营销列表成员。
- 选择“导出视图”,我们创建的自定义视图。在我的最小复制代码中,此视图仅包含联系人的完整名称加上“生成的OCR”字段。
- 一个插件,在邮寄联系人上注册检索多个,被触发并根据其序列号加上活动的序列号为每个营销列表成员创建一个OCR编号。然后将其添加到“生成的OCR”字段。
- 该视图然后导出到Excel。插件再次被触发。
- 如果导出成功,生成的文件包含了一些空列,标有 “的ProcessID” 和processts”。
的PostContactRetrieveMultiple插件
protected override void Execute(PluginVars variables)
{
if (variables.Context.InputParameters.Contains("Query") && variables.Context.InputParameters["Query"] is QueryExpression)
{
QueryExpression objQueryExpression = (QueryExpression) variables.Context.InputParameters["Query"];
//Generate and fill the ocr number field when requested
if (objQueryExpression.EntityName == Contact.EntityLogicalName && objQueryExpression.ColumnSet.Columns.Contains("company_generatedocr"))
{
if (objQueryExpression.LinkEntities.Count > 0 && objQueryExpression.LinkEntities.Count(le => le.LinkToEntityName == ListMember.EntityLogicalName) > 0)
{
var contacts = ((EntityCollection)variables.Context.OutputParameters["BusinessEntityCollection"]);
Guid relatedListGuid = (Guid)objQueryExpression.LinkEntities.First(le => le.LinkToEntityName == ListMember.EntityLogicalName).LinkCriteria.Conditions[0].Values[0];
CampaignExtensions.GenerateOcrNumbersForCollection(contacts, relatedListGuid, variables.Dao);
}
}
}
}
的CampaignExtensions(剪下不相关的代码)
下面使用的OCREngine是我们用于基于例如序列号创建OCR编号的工具。联系人和活动,以及在支付相应发票时解释创建的号码。
public static void GenerateOcrNumbersForCollection(EntityCollection entityCollection, Guid marketingListId, DataAccess dao)
{
var campaignSequenceNumber = GetCampaignSequenceNumberFromList(marketingListId, dao);
foreach (var entity in entityCollection.Entities)
{
string sequenceNumber = entity.GetSequenceValue(dao); //Get the sequence number for the contact
var spec = new OCRSpecification();
spec.DonorNumber = sequenceNumber;
spec.CampaignNumber = campaignSequenceNumber;
entity.Attributes.Add("company_generatedocr", OCREngine.GenerateOCR(spec));
}
}
结果
当一个市场营销列表,只有一个成员出口成员,该文件只包含一个集“的ProcessID”和“processts”列(见下文)。出口40 000名成员时,它包含80套这些栏目。这些列在Dynamics CRM视图中不存在。
Complete Name Generated OCR processid processts Henric Fröberg 800004450000165
我的问题
- 为什么这些额外的列添加?
- 为什么似乎有一个 导出的成员数量和 列的数量之间的相关性?
- 我们可以做些什么来防止这种情况发生,导致出口文件大小为 ?
我们使用动态CRM 2016内部部署,汇总1(8.1.0.359),但我们有困难,出口营销列表Excel文件安装汇总1.
首先检查要做的事:创建一个新的组织,以便您完全没有任何习惯,尝试从那里导出市场营销列表,看看问题是否存在。如果确实如此,请打开支持凭单(这是一个平台错误),否则一些自定义逻辑会导致导出错误。 – Alex