webdevqa.jp.net

APIを使用してMicrosoft Dynamics CRMの連絡先エンティティに注釈を作成する

この質問は、APIを通じて呼び出すMicrosoft Dynamics CRM 2015に関連しています。

連絡先エンティティを作成します。

POST [organization URI]/api/data/contacts
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "emailaddress1": "[email protected]",
}

パネルにログインすると、新しいレコードが表示されます。そして、私はAPIを介してそれを呼び出すことができます:

[organization URI]/api/data/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)
{
  "@odata.context":"[organization URI]/api/data/$metadata#contacts/$entity",
  "@odata.etag":"W/\"460199\"",
  ...
  "contactid":"f76e4e7c-ea61-e511-80fd-3863bb342b00",
  "emailaddress1":"[email protected]",
  ....
}

次に、その連絡先に関連付けられた注釈レコードを追加します。 ガイド の後に私が呼び出す:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST",
    '[email protected]': 'contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
}

しかし、それは400エラーを返します:

ペイロードにプロパティアノテーションのみがあり、ペイロードにプロパティ値が見つからない、宣言されていないプロパティ 'contact'。 ODataでは、宣言されたナビゲーションプロパティと宣言された名前付きストリームのみを、値のないプロパティとして表すことができます。

私が電話するとき:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST",
}

新しいエンティティが作成されますが、連絡先との関係はありません。

これを適切に作成する方法POSTリクエスト?ここで何が欠けているのですか?疑わしいです[email protected]は、どういうわけか別の形で提示する必要があります。私は試しました[email protected][email protected][email protected]-影響なし。

何か案は?

17
maicher

私はこれが機能していることを発見しましたが、2つのリクエストがあります:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST"
}

POST [organization URI]/api/data/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)/Contact_Annotation/$ref
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "@odata.id": "[organization URI]/annotations(annotation_id_from_first_request)"
}

編集:

annotation_id_from_first_request値は、最初のリクエストの応答から取得されます。

8
maicher

[email protected]を使用する代わりに、[email protected]を使用する必要があります。この結果は次のとおりです。

"[email protected]": "/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)"

プロパティのリストを取得するには、 documentation の単一値ナビゲーションプロパティの下を調べます。

17
Justin

パート1:
MSDNリファレンス: Deep Insert

ナビゲーションプロパティの値として定義することにより、互いに関連するエンティティを作成できます。これはdeep insertとして知られています。基本的な作成と同様に、レスポンスのOData-EntityIdヘッダーには、作成されたエンティティのUriが含まれています。作成された関連エンティティのURIは返されません。

以下のコードは、アカウントを作成し(1)、主要連絡先を作成して関連付け(2)、商談を作成して関連付け(3)、タスクを作成して関連付けます(4)

POST [Organization URI]/api/data/v8.2/accounts HTTP/1.1
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json

{
 "name": "Sample Account",
 "primarycontactid":
 {
     "firstname": "John",
     "lastname": "Smith"
 },
 "opportunity_customer_accounts":
 [
  {
      "name": "Opportunity associated to Sample Account",
      "Opportunity_Tasks":
      [
       { "subject": "Task associated to opportunity" }
      ]
  }
 ]
}

パート2:
注釈を連絡先に関連付けるには、以下の構文を使用します。

note["[email protected]"] = "/contacts(C5DDA727-B375-E611-80C8-00155D00083F)";

参照 SOリンクブログ

パート3:
annotation_id_from_first_requestに関する別の回答に対するコメントへの回答:

最後のリクエストからの応答として作成されたレコードIDを取得するには、以下のように解析できます。

                //get Response from Created Record
                entityIdWithLink = XMLHttpRequest.getResponseHeader("OData-EntityId");

                //get EntityId from ResponseHeader of Created Record  
                getEntityId = entityIdWithLink.split(/[()]/);
                getEntityId = getEntityId[1];

あなたはできます もっと読む

POSTリクエストを作成して、作成されたレコードのデータが201(Created)のステータスで返されるようにすることができます。
この結果を取得するには、リクエストヘッダーでreturn=representation設定を使用する必要があります。返されるプロパティを制御するには、エンティティセットのURLに$ selectクエリオプションを追加します。
$ expandクエリオプションを使用しても無視されます。この方法でエンティティが作成されると、作成されたレコードへのURIを含むOData-EntityIdヘッダーは返されません

:この機能は、Dynamics 365の2016年12月の更新で追加されました

MSDNリファレンス: データを返して作成

更新
レコード+アノテーションをディープインサートする有効なペイロードサンプルを探している人がいる場合、以下は私のプロジェクトからのものです:

data = {
        "new_attribute1": "test attribute 1",
        "new_attribute2": "test attribute 2",
        "new_comments": "test comments",
        "new_recordurl": recordURL,
        "new_feedback_Annotations":
            [
                {
                    "notetext": "Screenshot attached",
                    "subject": "Attachment",
                    "filename": file.name,
                    "mimetype": file.type,
                    "documentbody": base64str,
                }
            ]
    };
7
Arun Vinoth

作成とリンクにこのC#コードを使用しています(Task.Awaitのものはあまり賢くないので、注意してください)。

dynamic testAno = new ExpandoObject();
testAno.NoteText = "Hello World!";
testAno.Subject = "Note Subject";

dynamic refAccount = new ExpandoObject();
refAccount.LogicalName = "account";
refAccount.Id = "003CCFC2-4012-DE11-9654-001F2964595C";

testAno.ObjectId = refAccount;
testAno.ObjectTypeCode = refAccount.LogicalName;

var demo = JsonConvert.SerializeObject(testAno);

HttpContent content = new StringContent(demo, Encoding.UTF8, "application/json");

var handler = new HttpClientHandler { UseDefaultCredentials = true };

HttpClient client = new HttpClient(handler);
var test = client.PostAsync(new Uri("http://crm/.../XRMServices/2011/OrganizationData.svc/AnnotationSet"), content).Result;

JSONは次のようになります。

{"NoteText":"Hello World!",
 "Subject":"Note Subject",
 "ObjectId": {"LogicalName":"account",
              "Id":"003CCFC2-4012-DE11-9654-001F2964595C"}
,"ObjectTypeCode":"account"}
4
Robert Muehsig

この回答は、Web APIの使用に適用されます。

参照プロパティが大文字を使用して定義されている場合は、更新および挿入時にプロパティで大文字を使用する必要があります。プライマリエンティティのプロパティリストでスキーマ名を確認します。

アカウントエンティティへの参照を含むmyprefix_entityというエンティティがあり、それにAccountという名前を付け、スキーマ名がmyprefix_AccountIdになったとすると、次のように参照する必要があります。

"[email protected]":"/accounts(f76e4e7c-ea61-e511-80fd-000000000000)"

myprefix_AccountIdの大文字のAと大文字のIは、スキーマ名が定義されている方法である場合に重要です。

4
Kjeld Poulsen

以下を使用できます。

'[email protected]': '/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'

ほとんどのレコードでは、パラメーター名として_contactid_valueを取得します。したがって、パラメーターとして[email protected]のように渡し、値にcontactsとGUIDである 'EntitySetName'を渡す必要があります。 '/ EntitysetName(GUID)'したがって、値は '/ contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'になります

0
Amit Patel

これには少し遅れるかもしれませんが、次のリンクの答えはバインディングが本当にうまく機能する方法を説明しています。

基本的に、フィールドスキーマ名をサフィックス@ odata.bindとともに使用する必要があり、値は "/ entityschemaname(recordGUID)"entityschemanameには 's'が必要であり、recordGUIDが必要であることに注意してください。中括弧はありません。

詳細については、この情報を以下のリンクから入手してください。

Web API経由でレコードを作成しようとしたときの「宣言されていないプロパティ」

0
David Mendes