将电话呼叫“转移到”和“从”字段复制到新的电话呼叫

时间:2012-05-10 15:02:59

标签: dynamics-crm-2011

我在PhoneCall功能区上创建了一个按钮,用于创建跟进呼叫。我尝试使用XrmServiceToolkit使用javascript执行此操作。看起来我根本不能用SOAP端点来做这件事,用REST做这件事有点棘手。

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

更新最初我尝试使用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;

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

如果您发现使用JavaScript会遇到麻烦,而您希望采用更前端的处理方式,那么您可以找到一个解决方案,点击功能区按钮,打开一个新的电话表格,其中包含您需要的详细信息预填充。您使用当前表单中所需的参数构建URL,这将在新表单上设置值(您的后续电话)。看看MSDN - Setting field values using paramaters

您应该能够以这种方式将tofrom字段复制到新表单。

请注意,这是另一种选择。如果您想完全使用JavaScript自动创建后续电话,那么我建议您使用REST端点并在遇到问题时发布一些代码。

答案 1 :(得分:1)

编辑:在考虑这个问题时,最符合逻辑的方法如下:

  1. PhoneCall实体(其目标为PhoneCall)中创建自引用查找字段/关系,称为new_OriginatingCall。这将为您提供后续电话的跟踪记录。
  2. Create实体上创建一个PhoneCall预操作/验证插件,用于检查new_OriginatingCall字段中是否存在值。如果存在,请填充原始to中的fromPhoneCall字段。
  3. 在附加到按钮的javascript中,创建一个新的PhoneCall,其中填充了new_OriginatingCall
  4. 这样,无论后续调用如何生成,tofrom字段始终在服务器端正确填充。

    编辑:有关如何通过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;
}