none
Ermitteln des Primärattributes RRS feed

  • 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; }


    Mittwoch, 6. Juni 2012 10:41

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
    Freitag, 8. Juni 2012 07:20
  • 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;
    }


    • Als Antwort markiert KriegerK Mittwoch, 13. Juni 2012 14:05
    • Bearbeitet KriegerK Mittwoch, 13. Juni 2012 14:07 Ouups
    Mittwoch, 13. Juni 2012 14:04

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;
    Mittwoch, 6. Juni 2012 12:21
  • 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
    Freitag, 8. Juni 2012 07:20
  • 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;
    }


    • Als Antwort markiert KriegerK Mittwoch, 13. Juni 2012 14:05
    • Bearbeitet KriegerK Mittwoch, 13. Juni 2012 14:07 Ouups
    Mittwoch, 13. Juni 2012 14:04