2

Dynamics CRM Onlineでのプログラミングに不慣れで、展開されたプラグインの更新に問題があります。IDEとしてVisualStudio2012を使用しています。変更する必要のあるプラグインをデプロイしました。VSを介してプラグインを再デプロイすると、CRMの変更日は正しいのですが、変更がありません。これが私のコードです。

if (context.InputParameters.Contains("Target") 
  && context.InputParameters["Target"] is Entity)
{
  Entity entity = (Entity)context.InputParameters["Target"];
  if (entity.LogicalName == "lead")
  {
    if (entity.Attributes.Contains("companyname") == true)
    {
      if (entity["firstname"].ToString() != "null")
        firstName = entity["firstname"].ToString();
      else
        firstName = "";

      if (entity["lastname"].ToString() != "null")
        lastName = entity["lastName"].ToString();
      else
        lastName = "";

      entity["companyName"] = "This is a test";
      //entity["companyname"] = firstName + " " + lastName;
    }
    else
      throw new InvalidPluginExecutionException(
        "The company name can only be set by the system.");
  }
}

リードを作成するとき、会社名は「これはテストです」ではありません。何が間違っているのかわかりません。

助けてくれてありがとう!

4

1 に答える 1

3

会社名のフィールドが存在するかどうかは、次の方法で検出します。

if (entity.Attributes.Contains("companyname") == true)

しかし、あなたは他の人に手紙を書きます、すなわち:

entity["companyName"] = "This is a test";

値はエンティティに配置されますが、メタデータに対応する値がないため、保存されていません。フィールド名をスキーマ名、つまり小文字に設定します。


追加のエラーが発生した場合に考慮すべきその他のいくつかの事項。

  • フィールドの値を設定した後、サービスでUpdateメソッドを呼び出す必要があります。
  • フィールドには、ある種のプレフィックス(new_somethingbeep_somethingなど)を付ける必要があります。
  • ここではキャメルケースは適用されません(スキーマ名は)ので、すべて小文字にします。

会社名は何ですか例外がスローされますか?


また、コード品質に関するいくつかの指針。スコープの不必要な複雑さを排除するためにロジックを再構築しました。余分なelseステートメントとtrueとの比較を削除しました。また、プロセスをさまざまな方法に分割することをお勧めしますが、それについてはすでに説明していると思います。また、補助メソッドを使用してフィールドから値を取得することもできます。私の提案でこの投稿を参照してください。

if (!context.InputParameters.Contains("Target") ||
  context.InputParameters["Target"] is Entity)
  return;

Entity entity = context.InputParameters["Target"] as Entity;
if (entity.LogicalName != "lead")
  return;
if (!entity.Attributes.Contains("companyname"))
  throw new InvalidPluginExecutionException(
    "The company name can only be set by the system.");

String firstName = String.Empty;
if (entity.Contains("firstname"))
  firstName = entity["firstname"] as String;

String lastName = String.Empty;
if (entity.Contains("lastname"))
  lastName = entity["lastname"] as String;

entity["companyname"] = "This is a test";
//entity["companyname"] = firstName + " " + lastName;

編集:

それでも要求された動作が得られない場合は、次のことを試してください。(あなたがどのレベルの専門知識を持っているのかわからないので、あなたがすでに何億回も試した非常に基本的なことについて言及することに侮辱されたと感じたら、私の謝罪を受け入れてください。)

技術的なトリック。

  1. すべてのカスタマイズを公開します(念のため、頻繁に公開します)。
  2. ヒットF5してリロードします。
  3. ログイン/ログアウト。
  4. IISを再起動します(オンプレミスの場合)。
  5. プラグインの登録を解除し、動作が続くかどうかを確認します。その後、再登録してください。
  6. 実行中のワークフローを忘れていないか確認してください。

多少の遅延や遅延が発生する可能性があります。かつて、設定からレコードを作成したか、Workplaceからレコードを作成したかに応じて、プラグインの古いバージョンと新しいバージョンの両方が実際に起動されていました。それは奇妙でしたが、数時間後には解決しました。真剣に。変だった

プログラムによるトリック。

  1. 非アクティブ化するのを忘れた可能性のある他のプラグインがあるかどうかを確認します。
  2. すべてのリードを削除し、新しいリードが作成されたときにプラグインが起動することを確認します。
  3. テキストを次のように変更します。たとえば、変更が確実に行われるようにするために、私は巨大なムースです。
  4. すべてのコードを削除します(または、実行の先頭にreturnを配置します。次に、コードを段階的に下に移動して、奇妙なことがいつ始まるかを検出します。

あなたが示したものの中で、関連するものについて言及しなかった(もちろん、100000行のコードを投稿しなかったことに感謝します)か、CRMが奇妙になっている(これは同様に迷惑で混乱している)ので、うまくいくはずです)。それでは、このことをトラブルシューティングしましょう。上記のトリックを試すとどうなりますか?

コードスタブに関しては、ええ、私はそこでのMSの努力をあまり誇りに思っていません。コードレビューのために、プログラマーのタグC#の下にそのコードを投稿してみてください。怒りの議論に備えてください。:)

于 2013-02-26T22:35:20.063 に答える