0

現在、一括編集機能を使用しているときに問題に対処しています。私は以下を達成しようとしています。また、以下のコードを提供しました。

  1. 一括編集フォーム で、2 つのオプション セットから値を選択します。
  2. value2 の変更イベントで、javascript 関数を呼び出します。

関数では、window.dialogArguments を使用して、一括編集用に選択されたすべてのレコードを変数にフェッチしています。for ループで、レコードを 1 つずつ取得し、各レコードに対して次のことを行います。レコードごとに、選択されたオプションセット値と現在のレコード データからのいくつかの値の両方を使用して、条件をチェックし、設定する最終的な値のセットを決定します。b. OData 更新を使用して、その特定のレコードに対して、一括編集フォームで使用可能なフィールドの一部 (たとえば 5 ) にこれらの最終値を設定しようとします。

ループを実行し、レコードをフェッチし、それをエンティティ オブジェクトに割り当て、OData 呼び出しを実行し、ステップ 1 で選択した値 (つまり、オプションセット値) を更新します。これらはすべてのレコードで同じです。これらの 5 つのフィールドについては、条件に従って値を設定し、ステップ b で取得した最終値セットを設定する必要があります。

その代わりに、最後のレコードのステップ b から取得した値と同等のすべてのレコードに 5 つのフィールド値を設定しています。

私が疑っているのは、最後に一括編集フォームを閉じる直前に、すべてのレコードのこれらの 5 つのフィールド値を同じ値で上書きしていることです (これは、一括編集のデフォルト機能によるものです)。

この最後のデータ値の上書きを防ぎ、以前に OData を使用して更新した値を保持するにはどうすればよいですか?

私は今これに行き詰まっています。どんな助けでも本当に感謝しています。以下はサンプルコードです:

    if (Xrm.Page.ui.getFormType() == 6) { 
    var records = window.dialogArguments; 
    for(i=0; i<records.length;i++){ 
     // oDataEndpointUrl Fetch
     var requestResultsOpp= fetchData(...);

     var optionset1 = Xrm.Page.getAttribute("optionset1").getValue();
     var optionset2 = Xrm.Page.getAttribute("optionset2").getValue();

     if (requestResultsOpp != null) {
      var case_value = requestResultsOpp.field;
      var entityObject = new Object();

     /* Check values from optionset and perform some condition checks */ 

     if (some condition ) {
      switch (case_value) {
      case 3 /* XYZ */:
      case 4 /* ABCD */:
      case 5 /* PQR */:
       if (optionset1 == 1 && optionset2 == 11)
              Set the 5 fields values
       if (optionset1 == 1 && optionset2 == 12 )
              Set the 5 fields values
        break;
    default:
       if (optionset1 == 2 && optionset2 == 12 )
          Set the 5 fields values
         break;
     }
    }

   entityObject.optionset1 = {Value: optionset1};
   entityObject.optionset2 = {Value: optionset2}; 
   entityObject.Field1 = {Value: field1};
   entityObject.Field2 = {Value: field2};
   entityObject.Field3 = {Value: field3};
   entityObject.Field4 = {Value: field4};
   entityObject.Field5 = {Value: field5};

   // oDataEndpointUrl update
   updateRecordSync("entityName", record[i] ,  entityObject);
  }
 }
}
4

1 に答える 1

0

簡単に言えばいいえです。一括編集フォームで JavaScript を実行できます (OData は CRM の JavaScript を想定しています)。良いニュースは、プラグイン内でそのロジックを正確に実行できることです。これは、一括編集で期待どおりに実行されます。プラグイン内では、前後のエンティティ イメージを使用して前後の値を比較できるため、実行するロジックについて非常に柔軟に対応できます。

あなたの質問は最終的な望ましい結果について少し混乱していますが、トランザクションをロールバックしたい (値を更新しない) 場合は、更新したくないレコードに対して InvalidPluginExecutionException をスローするか、単に実行が完了して、更新を持続できるようにします。

于 2016-01-11T19:06:59.720 に答える