2

我正在 PhoneCall 功能区上创建一个按钮,用于创建后续呼叫。我尝试使用 javascript 和XrmServiceToolkit来做到这一点。看起来我根本不能用 SOAP 端点来做这件事,而用 REST 做这件事有点棘手。

如何将字段复制tofrom新活动?

更新最初我尝试使用 XrmServiceToolkit javascript库,但按照彼得的回答切换到 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;

正确的方法是什么?

4

3 回答 3

1

如果您发现 JavaScript 很麻烦,并且想要更前端的做事方式,您可以有一个解决方案,单击功能区按钮,打开一个新的电话表单,其中包含您需要预先填充的详细信息。您使用当前表单中所需的参数构建 URL,这将在新表单上设置值(您的后续电话)。看看MSDN - Setting field values using paramaters

您应该可以通过这种方式将您的tofrom字段复制到新表单中。

请注意,这是一种替代方法。如果您想使用 JavaScript完全自动化创建后续电话呼叫,那么我建议您使用 REST 端点并在遇到困难时发布一些代码。

于 2012-05-10T16:00:31.497 回答
1

编辑:考虑到这一点,最符合逻辑的方法如下:

  1. PhoneCall在实体(其目标是)中创建一个自引用查找字段/关系PhoneCall,称为new_OriginatingCall. 这将为您提供后续电话的跟踪。
  2. 在检查字段中是否存在值的实体上创建一个Create操作前/验证插件。如果存在,则从原始填充和字段。PhoneCallnew_OriginatingCalltofromPhoneCall
  3. 在附加到您的按钮的 javascript 中,创建一个新PhoneCallnew_OriginatingCall填充。

这样,无论后续调用如何生成,toandfrom字段总是在服务器端正确填充。

编辑:有关如何PartyList通过 Linq 检索和设置 s 的示例,请参见下文。

// 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);

如果您可以PartyList在 .NET 中比在 javascript 中更轻松地组装 s,我强烈建议您使用从 Ribbon JScript CRM Online 2011 调用 C# 代码的好问题中建议的两个最佳答案之一(即通过创建“插件”来触发您的代码“自定义实体或在通过javascript设置的实体中包含一个字段PhoneCall,并在更新时触发一个插件,该插件检查该字段的状态并做出相应反应)。

我经常使用这两种方法,因为使用 javascript 在 CRM 中实现类似结果通常很复杂。

于 2012-05-11T14:12:58.757 回答
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;
}
于 2012-05-31T11:08:28.310 回答