我在PhoneCall功能区上创建了一个按钮,用于创建跟进呼叫。我尝试使用XrmServiceToolkit使用javascript执行此操作。看起来我根本不能用SOAP端点来做这件事,用REST做这件事有点棘手。
如何将to
和from
字段复制到新活动?
更新最初我尝试使用XrmServiceToolkit javascript库,但在Peter的回答之后切换到C#进行复制。
仍然没有结果。我是这样做的:
EntityCollection toCollection = new EntityCollection();
foreach (var activityParty in ((EntityCollection)previousActivity["to"]).Entities)
{
Entity newActivityParty = new Entity(ActivityParty.EntityLogicalName);
newActivityParty["activityid"] = new EntityReference(context.PrimaryEntityName, context.PrimaryEntityId);
newActivityParty["partyid"] = activityParty["partyid"];
newActivityParty["participationtypemask"] = new OptionSetValue(2);//activityParty["participationtypemask"];
//service.Create(newActivityParty);
toCollection.Entities.Add(newActivityParty);
}
entity["to"] = toCollection;
这样做的正确方法是什么?
答案 0 :(得分:1)
如果您发现使用JavaScript会遇到麻烦,而您希望采用更前端的处理方式,那么您可以找到一个解决方案,点击功能区按钮,打开一个新的电话表格,其中包含您需要的详细信息预填充。您使用当前表单中所需的参数构建URL,这将在新表单上设置值(您的后续电话)。看看MSDN - Setting field values using paramaters。
您应该能够以这种方式将to
和from
字段复制到新表单。
请注意,这是另一种选择。如果您想完全使用JavaScript自动创建后续电话,那么我建议您使用REST端点并在遇到问题时发布一些代码。
答案 1 :(得分:1)
编辑:在考虑这个问题时,最符合逻辑的方法如下:
PhoneCall
实体(其目标为PhoneCall
)中创建自引用查找字段/关系,称为new_OriginatingCall
。这将为您提供后续电话的跟踪记录。Create
实体上创建一个PhoneCall
预操作/验证插件,用于检查new_OriginatingCall
字段中是否存在值。如果存在,请填充原始to
中的from
和PhoneCall
字段。PhoneCall
,其中填充了new_OriginatingCall
。这样,无论后续调用如何生成,to
和from
字段始终在服务器端正确填充。
编辑:有关如何通过Linq检索和设置PartyList
的示例,请参见下文。
// newPc is the Target entity of the plugin.
var pc = xsc.PhoneCallSet
.Single(x => x.ActivityId == newPc.new_OriginatingCall.Id);
// pc is now a copy of the original phone call.
// Have to make new activity party lists because the activity parties attached to
// the original phone call activity have the activity id set to the original
// phone call.
// Trying to attach them unchanged to the new phone call (which would have a new
// activity id) results in a FaultException.
var to = pc.To.Select(x => new ActivityParty { PartyId = x.PartyId });
var from = pc.From.Select(x => new ActivityParty { PartyId = x.PartyId });
// Prep the new phone call.
PhoneCall pcNew = new PhoneCall
{
To = to,
From = from,
Subject = pc.Subject,
ActualDurationMinutes = pc.ActualDurationMinutes,
DirectionCode = pc.DirectionCode,
PhoneNumber = pc.PhoneNumber
};
// Create the new phone call.
service.Create(pcNew);
如果您可以更轻松地在.NET中汇编 PartyList
而不是javascript,我强烈建议您使用优秀问题Call C# Code from Ribbon JScript CRM Online 2011中建议的两个最佳答案之一(即触发您的代码)通过创建“插件”自定义实体或在PhoneCall
实体中包含一个通过javascript设置的字段,并在更新时触发一个插件,该插件检查该字段的状态并做出相应的反应。)
我经常使用这两种方法,因为在使用javascript的CRM中实现类似的结果通常很复杂。
答案 2 :(得分:1)
毕竟,使用JavaScript完成了这项工作:
function main() {
var newActivity = new XrmServiceToolkit.Soap.BusinessEntity('phonecall');
newActivity.attributes['phonecall'] = {
id : Xrm.Page.data.entity.getId(),
logicalName : 'phonecall',
type : 'EntityReference'
}
newActivity.attributes['to'] = {
type: 'EntityCollection',
value: lookupToEntityReferenceCollection('to')
}
var newId = XrmServiceToolkit.Soap.Create(newActivity);
}
function lookupToEntityReferenceCollection(lookupName) {
var result = [],
lookupValue = Xrm.Page.getAttribute(lookupName).getValue();
if (lookupValue === null) {return result;}
var arrayLength = lookupValue.length;
for (var i = 0; i < arrayLength;i++) {
result.push({
id: lookupValue[i].id,
logicalName: lookupValue[i].typename,
type: 'EntityReference'
});
}
return result;
}