4

ケース自体の状態を解決済みに設定する前に、CRM 2011 のケース (インシデント) エンティティに関連するすべてのアクティビティの状態が完了に設定されていることを確認する必要があります。

複数の取得を実行して、考えられるすべてのアクティビティ タイプを個別に取得し、各タイプに対して適切な SetStateRequest(...) を実行できます。この記事は、アクティビティ タイプ レコードが作成されるたびに ActivityPointer レコードが作成され、両方のレコードが同じ ID を持つことを示唆しているようです。案の定、ケースと活動を見ると、すべての活動タイプ レコードには、同じ ID を持つ関連付けられた ActivityPointer レコードがあります。ここまでは順調ですね。

これは、自分のケースに関連するすべての ActivityPointer レコードを 1 回取得し、それらに状態を設定してクロスタイプのアクティビティ状態設定を実現できるということですか? 一般的なアクティビティ操作を実行できない場合、ActivityPointer の目的を理解していないと思います。それがポイントですか?また、ActivityPointer エンティティには SetStateRequest メッセージがないため、ActivityPointer レコードに状態コード/ステータスを設定する方法を誰かが説明できますか? 理想的には、完了の状態とキャンセルの状態が必要です。

更新: SetStateRequestの公式ドキュメントは、ActivityPointer エンティティをサポートしていないことを示しているようですが、このブログは私が望むものを正確に示しているようです。明日試してみますが、最善の方法について誰かアドバイスがあれば、私は義務付けられます.

Update2: さらに読むと、ActivityPointer エンティティは状態セットしか持てないという状況だと思います。したがって、すべての activitypointer レコードを、このセットアップごとにキャンセルされた状態に設定できるはずです。アクティビティの種類によって異なるため、「ステータスの理由」を一般的に設定できないのは理にかなっていると思います。アクティビティポインターの状態ステータスを設定できることを示唆しているように見えるという点で、以前のリンクについてはまだ少し混乱していますが、これが正しいかどうか、どの値の組み合わせが許可されているか、およびそれらが何を意味するかは明らかではありません...

4

2 に答える 2

5

アクティビティポインタを説明する最も良い方法は、Eメールや電話などの派生クラスの基本クラスであるということです。

アクティビティポインタは、任意のアクティビティの基本属性をカプセル化するため、カスタムアクティビティを作成すると、それもアクティビティポインタから拡張されます。

このことから、アクティビティポインタにはすべてのアクティビティの状態とステータスの値が含まれていることは理にかなっていますが、SetStateRequestからアクセスできないことも理にかなっています。

アクティビティの実際の状態(オープン、クローズ、スケジュール済み、キャンセル済み)はすべてのアクティビティに適用できると思いますが、ステータスは各アクティビティに固有です。

例えば。タスクは開いている可能性がありますが、ステータスの理由も開いている可能性があります。一方、電子メールも開いている可能性がありますが、ステータスの理由は「送信待ち」です。

この違いにより、SetStateRequestではおそらくActivityPointerで実行できませんが、個々のアクティビティエンティティでは実行できます。

設定したことを実行するという点で、サポートされている方法は、関連するすべてのアクティビティを個別に取得してから、状態設定要求を実行することです。

必要に応じて一度にすべてを実行できますが、データベースで直接実行する必要があるという点で、少し「サポートされていない」状態が発生します。ただし、状態をCompleteに設定する場合、ステータス理由はその状態に属するステータスも反映する必要があります。そうでなければ、私は活動がエラーになると信じています。

残念ながら、エレガントな方法でそれを回避する方法を見つけることはできませんが、見つけたら更新してください!

于 2011-12-15T09:29:24.530 に答える
5

クリス。アクティビティ ポインター レコードを使用してすべてのアクティビティ タイプを一般的に閉じる方法があるため、ここで自分の質問に答えています。これだけの記録があるのも理由の一つかもしれません。これは、アクティビティ ポインター レコードに、それが表すアクティビティの種類を定義するフィールドがあるという事実に依存しています。コードは次のとおりです。

// do a search for all activities that have a status of open or scheduled
// that covers them all
// here's the filter expression to use
/*
FilterExpression filterStateCode = new FilterExpression();
            filterStateCode.FilterOperator = LogicalOperator.Or;
            filterStateCode.AddCondition("statecode", ConditionOperator.Equal, "Open");
            filterStateCode.AddCondition("statecode", ConditionOperator.Equal, "Scheduled");
*/
// the search returns a list of entities called AllOpenRelatedActivities

foreach (var currentActivityPointer in AllOpenRelatedActivities.Entities)
            {
                if (currentActivityPointer.Attributes.Contains("activityid") & currentActivityPointer.Attributes.Contains("activitytypecode"))
                {
                    currentActivityPointer.LogicalName = currentActivityPointer.Attributes["activitytypecode"].ToString();
                    currentActivityPointer.Id = (Guid)currentActivityPointer.Attributes["activityid"];

                    SetStateRequest setState = new SetStateRequest();
                    setState.EntityMoniker = currentActivityPointer.ToEntityReference();
                    setState.State = new OptionSetValue();
                    setState.State.Value = 2;
                    setState.Status = new OptionSetValue();
                    setState.Status.Value = -1;



                    SetStateResponse setStateResponse = (SetStateResponse)service.Execute(setState);


                }
            }
于 2011-12-25T01:50:23.110 に答える