我正在实施一个插件(POST引号创建,同步,沙盒),以便在修改报价时将Notes复制到新记录中。
我的插件归结为此(摘录):
var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
var Service = serviceFactory.CreateOrganizationService(context.UserId);
var notesQuery = new QueryExpression("annotation");
notesQuery.ColumnSet = new ColumnSet(true);
notesQuery.Criteria = new FilterExpression
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression("objecttypecode", ConditionOperator.Equal, "quote"),
new ConditionExpression("objectid", ConditionOperator.Equal, revisedQuoteId)
}
};
var notes = Service.RetrieveMultiple(notesQuery).Entities;
foreach (var n in notes)
{
var newNote = new Entity("annotation");
newNote.Attributes.Add("ownerid", n.GetAttributeValue<EntityReference>("ownerid"));
newNote.Attributes.Add("objectid", new EntityReference("quote", sourceEntity.Id));
newNote.Attributes.Add("objecttypecode", "quote");
newNote.Attributes.Add("subject", n.GetAttributeValue<string>("subject"));
newNote.Attributes.Add("notetext", n.GetAttributeValue<string>("notetext"));
newNote.Attributes.Add("isdocument", n.GetAttributeValue<bool>("isdocument"));
if (n.GetAttributeValue<bool>("isdocument"))
{
newNote.Attributes.Add("filesize", n.GetAttributeValue<int>("filesize"));
newNote.Attributes.Add("documentbody", n.GetAttributeValue<string>("documentbody"));
newNote.Attributes.Add("filename", n.GetAttributeValue<string>("filename"));
newNote.Attributes.Add("mimetype", n.GetAttributeValue<string>("mimetype"));
}
Service.Create(newNote);
}
基本上,我复制了一切,包括最终的附件。一切似乎都很好,新版本正确地显示字段,详细记录和注释......所有但附件的注释。
如果我只有一个音符,附加的test.txt
内容为:
测试附件
OrganizationData
服务内容如下:
<d:FileName>test.txt</d:FileName>
<d:FileSize m:type="Edm.Int32">39</d:FileSize>
<d:DocumentBody>H4sIAAAMaVMA/wtJLS5RSCwpSUzOyE3NK+HlAgCLmj1zEQAAAA==</d:DocumentBody>
其“克隆”具有正确的主题和文字,并且还显示附加了test.txt
的内容
mimetype
和(在检查odata时,我注意到filesize
filesize
不实际上是正确的!)似乎是正确(又名:和我试图复制的原始笔记相同),但OData似乎确认了某些内容(它不同!):
<d:FileName>test.txt</d:FileName>
<d:FileSize m:type="Edm.Int32">60</d:FileSize
<d:DocumentBody>H4sIAED6aVMA/5Pv5mBg4MkMZvjP7amrF+iho+npc+6E71nth0+ZGLpn2RYLMjAwAABXqCwTJQAAAA==</d:DocumentBody>
test.txt
文件是从命令提示符(COPY CON test.txt
,类型,CTRL+Z
)创建的。
我尝试更改文件,并通过PDFCreator创建了test.pdf
:AcroRead反过来发牢骚并说文档已损坏(所以看起来问题是mimetype-agnostic)。
我还尝试通过早期绑定(通过CRMSVCUTIL生成的类)重新实现相同的代码,但它产生完全相同的结果(垃圾而不是附件内容)。
我试图像这样手工制作documentbody
:
// "VGVzdCBhdHRhY2htZW50" is Base64 for "Test attachment"
newNote.Attributes.Add("documentbody", "VGVzdCBhdHRhY2htZW50");
,创建的文件正确。
我无法弄清楚发生了什么:据我所知,documentbody
应该是一个Base64编码的字符串(据我所知,再说一次)不应该有任何不同复制了一下。我错过了什么?
作为参考,CRM已更新为 UR13 ,但我在 UR16 环境中重新发布。
答案 0 :(得分:0)
编辑:不起作用(仅适用于CRM 4)
试试这个(未经验证):
var notes = Service.RetrieveMultiple(notesQuery).Entities;
foreach (var newNote in notes)
{
newNote.annotationid = null;
newNote.Attributes.Add("objectid", new EntityReference("quote", sourceEntity.Id));
newNote.Attributes.Add("objecttypecode", "quote");
Service.Create(newNote);
}
答案 1 :(得分:0)
刚刚在MSDN的一篇文章中看到了这一点:
Annotation setupAnnotation = new Annotation()
{
Subject = "Example Annotation",
FileName = "ExampleAnnotationAttachment.txt",
DocumentBody = Convert.ToBase64String(
new UnicodeEncoding().GetBytes("Sample Annotation Text")),
MimeType = "text/plain"
};
我看到文档正文根据Unicode编码进行编码。也许您应该尝试从文件中检索编码并相应地将其转换为字符串。