2

フォローアップ コールを作成する 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;

それを行う正しい方法は何ですか?

4

3 に答える 3

1

編集:これを考えてみると、最も論理的に正しいアプローチは次のとおりです。

  1. PhoneCallエンティティ(ターゲットはPhoneCall)に、のようなものと呼ばれる自己参照ルックアップフィールド/関係を作成しますnew_OriginatingCall。これにより、フォローアップの電話の軌跡がわかります。
  2. フィールドに値が存在するかどうかをチェックするエンティティCreateに、操作前/検証プラグインを作成します。存在する場合は、元の。からフィールドにデータを入力します。PhoneCallnew_OriginatingCalltofromPhoneCall
  3. ボタンに添付されているJavaScriptPhoneCallで、new_OriginatingCall入力された新しいJavaScriptを作成します。

このように、フォローアップコールがどのように生成されても、フィールドtofromフィールドは常にサーバー側に正しく入力されます。

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

javascriptよりも.NETでsを簡単にアセンブルできる場合PartyListは、すばらしい質問で提案されている2つのベストアンサーのいずれかを使用することを強くお勧めします。リボンJScript CRM Online 2011からC#コードを呼び出す(つまり、「プラグイン」を作成してコードをトリガーする「カスタムエンティティまたはPhoneCalljavascriptを介して設定されたエンティティにフィールドを含め、更新時に、そのフィールドの状態を調べてそれに応じて反応するプラグインをトリガーします)。

JavaScriptを使用してCRMで同様の結果を達成するのは複雑なことが多いため、私は両方のアプローチを頻繁に使用しました。

于 2012-05-11T14:12:58.757 に答える
1

JavaScript が面倒で、よりフロントエンドの方法が必要な場合は、リボン ボタンをクリックして、必要な詳細が事前入力された新しい電話フォームを開くソリューションを用意できます。現在のフォームから必要なパラメーターを使用して URL を作成すると、新しいフォームに値が設定されます (フォローアップの電話)。MSDN のパラメーターを使用したフィールド値の設定を参照してください。

toこの方法で、fromフィールドを新しいフォームにコピーできるはずです。

これは代替手段であることに注意してください。JavaScript を使用してフォローアップ電話の作成を完全に自動化したい場合は、REST エンドポイントを使用し、問題がある場合はコードを投稿することをお勧めします。

于 2012-05-10T16:00:31.497 に答える
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 に答える