12

Questa domanda è correlata a Microsoft Dynamics CRM 2015, che sto chiamando tramite API.Creare annotazione per un'entità di contatto in Microsoft Dynamics CRM tramite API

creo un'entità contatto:

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

Funziona, vedo nuovo record, dopo annoto nel pannello. E posso chiamarlo attraverso l'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]", 
    .... 
} 

La prossima cosa che voglio fare, è quello di aggiungere record di annotazione associato con quel contatto. A seguito della guide io chiamo:

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)' 
} 

ma restituisce 400 errore:

An undeclared property 'contact' which only has property annotations in the payload but no property value was found in the payload. In OData, only declared navigation properties and declared named streams can be represented as properties without values.

Quando chiamo: si crea

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

nuova entità, ma senza una relazione da contattare.

Come comporre correttamente questa richiesta POST? Cosa mi manca qui? Sospetto che il [email protected] debba essere presentato in qualche modo diverso, ho provato [email protected], [email protected], [email protected] - ma nessun effetto.

Qualche idea?

+0

perché stai usando il web API di anteprima e non l'endpoint REST? –

+0

il codice dovrebbe essere "" [email protected] ":"/contacts (f76e4e7c-ea61-e511-80fd-3863bb342b00) "' nota '/' prima dei contatti e delle virgolette (nel caso) –

+0

@GuidoPreite I Ho provato e il messaggio di errore è: 'Una proprietà 'objectid' che ha solo annotazioni di proprietà nel payload ma nessun valore di proprietà è dichiarato di tipo 'Edm.Guid'. In OData, solo le proprietà di navigazione e gli stream con nome possono essere rappresentati come proprietà senza valori. – maicher

risposta

5

ho trovato questo lavoro, ma in due richieste: la risposta è preso

annotation_id_from_first_request valore modulo prima di richiesta:

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)" 
} 

Modifica.

+1

come sai annotation_id_from_first_request ???? –

+0

Dalla risposta della prima richiesta. – maicher

11

Invece di utilizzare [email protected], è necessario utilizzare [email protected]. Questi risultati sono in:

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

per ottenere l'elenco delle proprietà, guardate sotto le proprietà a valore singolo di navigazione nel documentation.

+1

Questo è migliore della risposta accettata poiché utilizza solo 1 chiamata. Immagino che l'aggiunta di "_contact" (o qualcosa di simile) dipenda da se il record corrente è genitore o figlio. – zabby

+1

Credo che sia perché questo è specifico per il campo relativo alle note, che può cercare varie entità. Pertanto, il _contact dipende da quale entità si desidera impostarlo riguardo (sempre objectid_entityname per le note relative al campo). – Justin

4

Sto usando questo codice C# per la creazione e il collegamento (la roba Task.Await non è molto intelligente, quindi ... attenzione):

 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; 

Il JSON è simile a questo:

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

Questa risposta vale per il web l'utilizzo dell'API:

Se la proprietà riferimenti è stato definito usando le lettere maiuscole, è necessario utilizzare le lettere maiuscole nella proprietà aggiornata e inserire. Guarda il nome dello schema nell'elenco delle proprietà dell'entità primaria.

Diciamo che avere un'entità chiamata myprefix_entity con un riferimento all'entità conto, e si chiamarono Account, e il nome dello schema è diventato myprefix_AccountId, si dovrebbe fare riferimento come:

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

Il maiuscolo A e il maiuscolo I in myprefix_AccountId sono importanti, se è così che è stato definito il nome dello schema.

4

Parte 1:
MSDN Riferimento: Deep Insert

You can create entities related to each other by defining them as navigation properties values. This is known as deep insert. As with a basic create, the response OData-EntityId header contains the Uri of the created entity. The URIs for the related entities created aren’t returned.

Di seguito il codice è quello di creare account (1), creare + associato contatto principale (2), creare & Opportunità Associate (3) e creare + associato Task (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" } 
     ] 
    } 
] 
} 

Parte 2:
L'associazione dell'annotazione al contatto utilizza la seguente sintassi.

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

consultare SO link & blog

Parte 3:
risposta al tuo commento su un'altra risposta su annotation_id_from_first_request:

per vedere la scheda creata Id in risposta da parte dell'ultima richiesta, è possibile analizzare come di seguito:

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

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

Puoi read more

You can compose your POST request so that data from the created record will be returned with a status of 201 (Created).
To get this result, you must use the return=representation preference in the request headers. To control which properties are returned, append the $select query option to the URL to the entity set.
The $expand query option will be ignored if used. When an entity is created in this way the OData-EntityId header containing the URI to the created record is not returned

Note: This capability was added with December 2016 update for Dynamics 365

MSDN Riferimento: Create with data returned