Benutzer mit den meisten Antworten
Ermitteln des Primärattributes

Frage
-
Hallo liebe Experten,
für eine Abfragedefinition werden für eine Entität nur Schlüssel/Wertpaare übergeben (z.B. {crm_countryid;DE}{crm_select;test1}{crm_comment;Testkommentar}. Nun soll eine Abfrage auf die zuvor definiere Entität ausgeführt werden. Das Problem: crm_countryid ist ein Lookup, für die Abfrage muss die ID ermittelt werden; crm_select ist eine Picklist, hier wird für die Abfrage der Index benötigt. crm_comment ist ein string und kann als Abfragewert verwendet werden.
Das Problem habe ich jetzt mit den Lookup-Werten. Hierbei lege ich fest, dass der Wert nur im Primär-Attribut gesucht wird. Das Primär-Attribut ist eigentlich immer prefix_name. Sauberer wäre es, meiner meinung nach, das System zu fragen welches von den Attributen denn das Primärattribut ist.
Wie kann ich das Primärattribut ermitteln?
Hier der Codeausschnitt:
/// <summary> /// Sucht nach Abfragewerten die sich aus dem attributeValue ergeben würden /// nachdem der Attributtyp ermittelt worden ist /// </summary> /// <param name="entityName">Name der Entität</param> /// <param name="attributeName">Name des Attributes</param> /// <param name="attributeValue">Wert des Attributes</param> /// <returns></returns> public object findValue(string entityName, string attributeName, object attributeValue) { object result = new object(); RetrieveAttributeRequest AttrReq = new RetrieveAttributeRequest(); AttrReq.EntityLogicalName = entityName; AttrReq.LogicalName = attributeName; RetrieveAttributeResponse AttrRes = (RetrieveAttributeResponse)_metaservice.Execute(AttrReq); switch (AttrRes.AttributeMetadata.AttributeType.Value) { case AttributeType.Lookup: { Guid lookupGuid = new Guid(); lookupGuid = Guid.Empty
try { lookupGuid = new Guid(attributeValue.ToString()); } catch { } LookupAttributeMetadata lookup = (LookupAttributeMetadata)AttrRes.AttributeMetadata; DynamicEntity lookupEntity = new DynamicEntity(lookup.Targets[0].ToString()); //Primärattribut (Name) für Retrieve ermitteln //... result = lookupGuid; break; } case AttributeType.Picklist: { int picklistValue = 0; if (int.TryParse(attributeValue.ToString(), out picklistValue)) { result = picklistValue; } else { PicklistAttributeMetadata picklist = (PicklistAttributeMetadata)AttrRes.AttributeMetadata; Option o = (Option)picklist.Options.Where(item => item.Label == attributeValue); result = o.Value; } break; } case AttributeType.Boolean: { result = new CrmBoolean(attributeValue.ToString().Contains("1") || attributeValue.ToString().ToLower().Contains("true")); break; } default: { result = attributeValue; break; } } return result; }
Antworten
-
Hallo KriegerK!
Benutze das Attribut "PrimaryNameAttribute" der Klasse "EntityMetadata".
Damit bekommst du das primäre Attribut von einer Entität.Ich hoffe das bringt weiter. Andreas(a)Donaubauer.com www.crmfaq.de
- Als Antwort vorgeschlagen Andreas Donaubauer Freitag, 8. Juni 2012 07:21
- Als Antwort markiert KriegerK Freitag, 8. Juni 2012 07:34
-
Hallo Herr Donaubauer,
Danke für den Tipp! Wieder ein RTFM-Error :-)) ich hab´s so gemacht:
public RetrieveEntityResponse getEntityMetaData(string entityname) { RetrieveEntityResponse result = new RetrieveEntityResponse(); RetrieveEntityRequest entityRequest = new RetrieveEntityRequest(); entityRequest.RetrieveAsIfPublished = false; entityRequest.LogicalName = entityname; entityRequest.EntityItems = EntityItems.EntityOnly; try { result = (RetrieveEntityResponse)_metaservice.Execute(entityRequest); } catch { } return result; } public RetrieveAttributeResponse getAttributeMetaData(string entityName, string attributeName) { RetrieveAttributeResponse result = new RetrieveAttributeResponse(); RetrieveAttributeRequest AttrReq = new RetrieveAttributeRequest(); AttrReq.EntityLogicalName = entityName; AttrReq.LogicalName = attributeName; try { result = (RetrieveAttributeResponse)_metaservice.Execute(AttrReq); } catch { } return result; } /// <summary> /// Sucht nach Abfragewerten die sich aus dem attributeValue ergeben würden /// nachdem der Attributtyp ermittelt worden ist /// </summary> /// <param name="entityName">Name der Entität</param> /// <param name="attributeName">Name des Attributes</param> /// <param name="attributeValue">Wert des Attributes</param> /// <returns></returns> public object findValue(string entityName, string attributeName, object attributeValue) { object result = new object(); RetrieveAttributeResponse AttrRes = getAttributeMetaData(entityName, attributeName); switch (AttrRes.AttributeMetadata.AttributeType.Value) { case AttributeType.Lookup: { Guid lookupGuid = new Guid(); lookupGuid = Guid.Empty; try { lookupGuid = new Guid(attributeValue.ToString()); } catch { LookupAttributeMetadata lookup = (LookupAttributeMetadata)AttrRes.AttributeMetadata; string lookupPrimaryAttribute = lookup.Targets[0].ToString(); RetrieveEntityResponse EntityRes = getEntityMetaData(lookupPrimaryAttribute); BusinessEntityCollection tempCollection = findEntityByAttribute(lookup.Targets[0].ToString(), new List<string>() { EntityRes.EntityMetadata.PrimaryField }, new List<object>() { attributeValue }); if (tempCollection.BusinessEntities.Count > 0) { lookupGuid = ((Key)((DynamicEntity)tempCollection.BusinessEntities[0]).Properties[EntityRes.EntityMetadata.PrimaryKey]).Value; } } result = lookupGuid; break; } case AttributeType.Picklist: { int picklistValue = 0; if (int.TryParse(attributeValue.ToString(), out picklistValue)) { result = picklistValue; } else { try { PicklistAttributeMetadata picklist = (PicklistAttributeMetadata)AttrRes.AttributeMetadata; Option o = (Option)picklist.Options.Where(item => item.Label == attributeValue); result = o.Value; } catch { } } break; } case AttributeType.Boolean: { result = new CrmBoolean(attributeValue.ToString().Contains("1") || attributeValue.ToString().ToLower().Contains("true")); break; } default: { result = attributeValue; break; } } return result; }
Alle Antworten
-
... also eine erste Lösung sieht so aus:
/// <summary> /// Sucht nach Abfragewerten die sich aus dem attributeValue ergeben würden /// nachdem der Attributtyp ermittelt worden ist /// </summary> /// <param name="entityName">Name der Entität</param> /// <param name="attributeName">Name des Attributes</param> /// <param name="attributeValue">Wert des Attributes</param> /// <returns></returns> public object findValue(string entityName, string attributeName, object attributeValue) { object result = new object(); RetrieveAttributeRequest AttrReq = new RetrieveAttributeRequest(); AttrReq.EntityLogicalName = entityName; AttrReq.LogicalName = attributeName; RetrieveAttributeResponse AttrRes = (RetrieveAttributeResponse)_metaservice.Execute(AttrReq); switch (AttrRes.AttributeMetadata.AttributeType.Value) { case AttributeType.Lookup: { Guid lookupGuid = new Guid(); lookupGuid = Guid.Empty; try { lookupGuid = new Guid(attributeValue.ToString()); } catch { LookupAttributeMetadata lookup = (LookupAttributeMetadata)AttrRes.AttributeMetadata; string lookupPrimaryAttribute = lookup.Targets[0].ToString(); lookupPrimaryAttribute = lookupPrimaryAttribute.Substring(0, lookupPrimaryAttribute.IndexOf("_")) + "_name"; string lookupKeyAttibute = lookup.Targets[0].ToString() + "id"; BusinessEntityCollection tempCollection = findEntityByAttribute(lookup.Targets[0].ToString(), new List<string>() { lookupPrimaryAttribute }, new List<object>() { attributeValue }); if (tempCollection.BusinessEntities.Count > 0) { lookupGuid = ((Key)((DynamicEntity)tempCollection.BusinessEntities[0]).Properties[lookupKeyAttibute]).Value; } } result = lookupGuid; break; } case AttributeType.Picklist: { int picklistValue = 0; if (int.TryParse(attributeValue.ToString(), out picklistValue)) { result = picklistValue; } else { try { PicklistAttributeMetadata picklist = (PicklistAttributeMetadata)AttrRes.AttributeMetadata; Option o = (Option)picklist.Options.Where(item => item.Label == attributeValue); result = o.Value; } catch { } } break; } case AttributeType.Boolean: { result = new CrmBoolean(attributeValue.ToString().Contains("1") || attributeValue.ToString().ToLower().Contains("true")); break; } default: { result = attributeValue; break; } } return result; }
... gefällt mir aber nicht so weil die Attributsnamen "HardCoded" erzeugt werden ...
- Bearbeitet KriegerK Mittwoch, 6. Juni 2012 12:23 ouups;
-
Hallo KriegerK!
Benutze das Attribut "PrimaryNameAttribute" der Klasse "EntityMetadata".
Damit bekommst du das primäre Attribut von einer Entität.Ich hoffe das bringt weiter. Andreas(a)Donaubauer.com www.crmfaq.de
- Als Antwort vorgeschlagen Andreas Donaubauer Freitag, 8. Juni 2012 07:21
- Als Antwort markiert KriegerK Freitag, 8. Juni 2012 07:34
-
Hallo Herr Donaubauer,
Danke für den Tipp! Wieder ein RTFM-Error :-)) ich hab´s so gemacht:
public RetrieveEntityResponse getEntityMetaData(string entityname) { RetrieveEntityResponse result = new RetrieveEntityResponse(); RetrieveEntityRequest entityRequest = new RetrieveEntityRequest(); entityRequest.RetrieveAsIfPublished = false; entityRequest.LogicalName = entityname; entityRequest.EntityItems = EntityItems.EntityOnly; try { result = (RetrieveEntityResponse)_metaservice.Execute(entityRequest); } catch { } return result; } public RetrieveAttributeResponse getAttributeMetaData(string entityName, string attributeName) { RetrieveAttributeResponse result = new RetrieveAttributeResponse(); RetrieveAttributeRequest AttrReq = new RetrieveAttributeRequest(); AttrReq.EntityLogicalName = entityName; AttrReq.LogicalName = attributeName; try { result = (RetrieveAttributeResponse)_metaservice.Execute(AttrReq); } catch { } return result; } /// <summary> /// Sucht nach Abfragewerten die sich aus dem attributeValue ergeben würden /// nachdem der Attributtyp ermittelt worden ist /// </summary> /// <param name="entityName">Name der Entität</param> /// <param name="attributeName">Name des Attributes</param> /// <param name="attributeValue">Wert des Attributes</param> /// <returns></returns> public object findValue(string entityName, string attributeName, object attributeValue) { object result = new object(); RetrieveAttributeResponse AttrRes = getAttributeMetaData(entityName, attributeName); switch (AttrRes.AttributeMetadata.AttributeType.Value) { case AttributeType.Lookup: { Guid lookupGuid = new Guid(); lookupGuid = Guid.Empty; try { lookupGuid = new Guid(attributeValue.ToString()); } catch { LookupAttributeMetadata lookup = (LookupAttributeMetadata)AttrRes.AttributeMetadata; string lookupPrimaryAttribute = lookup.Targets[0].ToString(); RetrieveEntityResponse EntityRes = getEntityMetaData(lookupPrimaryAttribute); BusinessEntityCollection tempCollection = findEntityByAttribute(lookup.Targets[0].ToString(), new List<string>() { EntityRes.EntityMetadata.PrimaryField }, new List<object>() { attributeValue }); if (tempCollection.BusinessEntities.Count > 0) { lookupGuid = ((Key)((DynamicEntity)tempCollection.BusinessEntities[0]).Properties[EntityRes.EntityMetadata.PrimaryKey]).Value; } } result = lookupGuid; break; } case AttributeType.Picklist: { int picklistValue = 0; if (int.TryParse(attributeValue.ToString(), out picklistValue)) { result = picklistValue; } else { try { PicklistAttributeMetadata picklist = (PicklistAttributeMetadata)AttrRes.AttributeMetadata; Option o = (Option)picklist.Options.Where(item => item.Label == attributeValue); result = o.Value; } catch { } } break; } case AttributeType.Boolean: { result = new CrmBoolean(attributeValue.ToString().Contains("1") || attributeValue.ToString().ToLower().Contains("true")); break; } default: { result = attributeValue; break; } } return result; }