[gelöst]: C#: Datensätze einer n:n-Beziehung abrufen

6. September 2010 14:55

Hallo zusammen,

ich könnte mal einen heißen Tipp gebrauchen:

Folgendes Szenario: Ich möchte eine benutzerdefinierte n:n - Beziehung via Plugin abfragen. Konkreter Fall: Ich habe eine n:n beziehung zwischen Lead und Produkt erstellt. Nun sollen alle Produkte, die auf diesem Wege an Lead hängen, beim Konvertieren von Lead zu Verkaufschance über die Entität Verkaufschance(Produkt) mitgenommen werden.

Zu diesem zweck habe ich mir ein Plugin gebaut, dass an "Create opportunity" als Post-Event registriert ist und ein
Code:
if (properties.Contains("originatingleadid"))

enthält. Folglich wird es nur ausgelöst, wenn eine Konvertierung losgetreten wird.

Soviel zum bisher geglückten Teil :-)

Nun möchte ich irgendwie die Produkte, die mit dem Lead verknüpft sind, zu fassen kriegen. Nur wie???
Das Erstellen einer Verknüpfung geschieht meines Wissen über "AssociateEntitiesRequest", aber das wäre einen Schritt weiter...

Mein Zwischenstand:
Code:
    public class Lead2Opportunity : IPlugin
    {
        public void Execute(IPluginExecutionContext context)
        {
            # region Allgemeines

            /* Umweg über DynamicEntity und TargetUpdateDynamic, so kann ein PropertyCollection.Contains(...) losgetreten werden,
             * das im Gegensatz zu entity.property == null keine Exeption schmeißt!
             * Nachteil: man kann nicht per Intellisense die Attribute der Entität auswählen...
            */
            Microsoft.Crm.Sdk.DynamicEntity target = (Microsoft.Crm.Sdk.DynamicEntity)context.InputParameters[ParameterName.Target];
            TargetUpdateDynamic update = new TargetUpdateDynamic();
            update.Entity = target;

            PropertyCollection properties = update.Entity.Properties;
            # endregion

            if (properties.Contains("originatingleadid"))
            {

                #region getLead

                lead leadEntity = null;
                ICrmService service = null;
                try
                {
                    Guid leadid = ((Lookup)target["originatingleadid"]).Value;

                    service = context.CreateCrmService(true);

                    TargetRetrieveLead retrieve = new TargetRetrieveLead();
                    retrieve.EntityId = leadid;

                    RetrieveRequest request = new RetrieveRequest();
                    request.Target = retrieve;
                    request.ColumnSet = new Microsoft.Crm.Sdk.Query.AllColumns();

                    RetrieveResponse response = (RetrieveResponse)service.Execute(request);
                   
                    BusinessEntity businessEntity = response.BusinessEntity;
                    leadEntity = (lead)businessEntity;
                }
                catch (Exception ex)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }

                #endregion getLead


                throw new InvalidPluginExecutionException(leadEntity.leadid.Value.ToString());

            }
            else
            {
                throw new InvalidPluginExecutionException("nur neu");
            }
        }

Anmerkung: region getLead wird später noch als Funktion ausgelagert, ist halt nen Entwicklungsstand...

@edit: tolles Symbol dem Thread hinzugefügt :-)
Zuletzt geändert von Kafetzke am 9. September 2010 11:04, insgesamt 1-mal geändert.

Re: C#: Verknüpfte Datensätze einer n:n-Beziehung abrufen

9. September 2010 10:46

Hallo Michael,

m:n Beziehungen werden in einer extra Tabelle gespeichert, so das du etwas anders darauf zugreifen musst.

Suche im SDK einmal nach diesem Begriff "Using Intersect Tables", dort wirst du ein entsprechendes Beispiel finden.
Du kannst auch direkt diesen Link verwenden.

Re: C#: Verknüpfte Datensätze einer n:n-Beziehung abrufen

9. September 2010 10:58

Ebenfalls Hallo Michael :-)

Danke für deine Antwort. Ich habe mir mittlerweile einen noch anderen Lösungsweg erdacht: Ich habe analog zu "Verkaufschance (Produkt)" eine Zwischenentität "Lead (Produkt)" erschaffen und kann daher den Prozess analog zu den Verkaufschancen programmieren. Das klappt erstaunlich gut, da ich ja auf 1:n / n:1 - per Filterabfragen zugreifen kann.