Plugin bei Create mit PostStep

28. Mai 2015 13:22

Hallo zusammen,

ich habe ein neues Plugin das mir Probleme macht. Ich habe eine benutzerdefinierte Entität Gutschrift unter der eine ebenfalls benutzerdefinierte Entität Gutschriftprodukte hängt. Die einzelnen Gutschriftprodukte haben Summen und diese möchte ich in der zugehörigen Gutschrift hochsummieren. Also im Prinzip genau wie bei Angebot Auftrag und Rechnung.
Das alte Plugin das dies in CRM 4 gemacht hat habe ich jetzt angepasst damit es CRM 2011 und hoffentlich auch 2013 und 2015 tauglich ist. Soweit so gut. Ich stoße hier aber auf das selbe Problem, dass ich schon einmal hatte, ich möchte beim Create auf den Entitätstyp zugreifen zu dem ich gerade einen neu erstelle und das geht scheinbar im Poststep nicht, weil ich immer einen Timeout bekomme. Da ich aber auf den Preis des Gutschriftsproduktes das ich gerade erzeuge ebenso zugreifen muss wie auf alle anderen zur Gutschrift gehörenden Produkte muss ich bei Create einen Poststep verwenden beim Prestep habe ich ja den wert noch gar nicht und ich kann auch kein Image zu einem Prestep vom Typ Create zufügen.
Wie kann ich denn so ein Dilemma lösen?

Hier ist der Codeteil den ich im Create Step ansteuern will:
Code:
if (entity.LogicalName == OPD_gutschriftprodukt.EntityLogicalName)
                    {
                        tracingService.Trace("Entität ist gutschriftprodukt");

                        bool isSupportedMessage =
                            (context.MessageName == "Create") ||
                            (context.MessageName == "Update") ||
                            (context.MessageName == "Delete") ||
                            (context.MessageName == "SetState") ||
                            (context.MessageName == "SetStateDynamicEntity");
                        bool isDeleteMessage = (context.MessageName == "Delete");
                        bool isSetStateMessage = (context.MessageName == "SetState" || context.MessageName == "SetStateDynamicEntity");

                        // Run the PlugIn only once for each update/delete
                        bool proceedProcessing = (((context.MessageName == "SetState") ||
                            (context.MessageName == "SetStateDynamicEntity")) && context.Depth < 8) ||
                            (context.Depth < 2);

                        if (proceedProcessing && isSupportedMessage)
                        {
                            tracingService.Trace("proceedProcessing und isSupportedMessage sind true");
                            if (isDeleteMessage)
                            {
                                tracingService.Trace("isDeleteMessage true");
                                // A PreEntityImage "Target" has to be registered for this PlugIn-Step
                                prePostImageEntity = (Entity) context.PreEntityImages["PreUpdateImage"];
                                //gutschriftprodukt = new OpdGutschriftprodukt((DynamicEntity)context.PreEntityImages.Properties["opd_gutschriftprodukt"]);

                            }
                            else
                            {
                                tracingService.Trace("isDeleteMessage false");
                                prePostImageEntity = (Entity)context.PostEntityImages["PostUpdateImage"];
                                //gutschriftprodukt = new OpdGutschriftprodukt((DynamicEntity)context.PostEntityImages.Properties["opd_gutschriftprodukt"]);
                            }
                        }
                        if (prePostImageEntity != null && prePostImageEntity.Contains("opd_gutschriftid") && prePostImageEntity["opd_gutschriftid"] != null)
                        {
                            EntityReference gutschriftid = (EntityReference)prePostImageEntity["opd_gutschriftid"];
                            tracingService.Trace("image nicht null und enthält opdgutschrift id nicht nll");
                            if (isDeleteMessage)
                            {
                                tracingService.Trace("isdeletemessage true");
                                QueryExpression query = new QueryExpression();
                                query.EntityName = OPD_gutschriftprodukt.EntityLogicalName;
                                query.ColumnSet = new ColumnSet();
                                query.ColumnSet.Columns.Add("opd_erw_betrag");

                                FilterExpression filter = new FilterExpression();
                                ConditionExpression condition = new ConditionExpression("opd_gutschriftid", ConditionOperator.Equal, gutschriftid.Id);
                                filter.Conditions.Add(condition);
                                condition = new ConditionExpression("opd_erw_betrag", ConditionOperator.NotNull);
                                filter.Conditions.Add(condition);
                                condition = new ConditionExpression("opd_gutschriftproduktid", ConditionOperator.NotEqual, prePostImageEntity["opd_gutschriftproduktid"]);
                                filter.Conditions.Add(condition);
                                query.Criteria = filter;

                                DataCollection<Entity> entityCollection = _service.RetrieveMultiple(query).Entities;
                                tracingService.Trace("Entitycollection geladen");

                                decimal gutschriftsumme = 0;

                                foreach (OPD_gutschriftprodukt produkt in entityCollection)
                                {
                                    gutschriftsumme += produkt.OPD_erw_betrag.Value;
                                }

                                OPD_gutschrift gutschrift = new OPD_gutschrift();

                                gutschrift.Id = gutschriftid.Id;
                                gutschrift.OPD_Gutschriftbetrag_netto = new Money(gutschriftsumme);

                                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                                //</snippetFollowupPlugin4>

                                // Create the task in Microsoft Dynamics CRM.
                                tracingService.Trace("gutschriftupdate");
                                service.Update(gutschrift);
                            }
                            else
                            {
                                tracingService.Trace("isdeletemessage false");
                                QueryExpression query = new QueryExpression();
                                query.EntityName = OPD_gutschriftprodukt.EntityLogicalName;
                                query.ColumnSet = new ColumnSet();
                                query.ColumnSet.Columns.Add("opd_erw_betrag");

                                FilterExpression filter = new FilterExpression();
                                ConditionExpression condition = new ConditionExpression("opd_gutschriftid", ConditionOperator.Equal, gutschriftid.Id);
                                filter.Conditions.Add(condition);
                                condition = new ConditionExpression("opd_erw_betrag", ConditionOperator.NotNull);
                                filter.Conditions.Add(condition);
                                query.Criteria = filter;

                                DataCollection<Entity> entityCollection = _service.RetrieveMultiple(query).Entities;

                                decimal gutschriftsumme = 0;

                                foreach (OPD_gutschriftprodukt produkt in entityCollection)
                                {
                                    gutschriftsumme += produkt.OPD_erw_betrag.Value;
                                }

                                OPD_gutschrift gutschrift = new OPD_gutschrift();

                                gutschrift.Id = gutschriftid.Id;
                                gutschrift.OPD_Gutschriftbetrag_netto = new Money(gutschriftsumme);

                                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                                //</snippetFollowupPlugin4>

                                // Create the task in Microsoft Dynamics CRM.
                                tracingService.Trace("gutschriftupdate");
                                service.Update(gutschrift);
                            }
                        }
                    }


Ich hoffe es hat jemand eine Idee bzw. kann mir auf den Richtigen Weg helfen.

Re: Plugin bei Create mit PostStep

28. Mai 2015 14:58

Hallo Nicole,
Was verstehst du unter "beim Create auf den Entitätstyp zugreifen"? Komme damit gerade nicht ganz klar =). Vllt dein Code updaten wo du was brauchst bzw was nicht geht.
Du kannst in deinem PostStepImage die Attribute angeben, welche übergeben werden sollen, vllt hilft dir das?

Grüße
gE3z

Re: Plugin bei Create mit PostStep

29. Mai 2015 12:52

Hallo Nicole,

auch ich habe dein Problem nicht wirklich verstanden.

Auf welche Entität ist das PlugIn im Create registriert?
Auf die Daten welcher Entität soll dann lesend zugegriffen werden?
In welche Entität sollen dann Daten geschrieben werden?

Re: Plugin bei Create mit PostStep

1. Juni 2015 12:14

Hallo gE3z, hallo Michael,

also das Plugin ist im Create auf die Entität opd_gutschrift_produkt registriert. Sie läuft als Poststep im synchronen Modus.
Im Postimage habe ich gesagt es soll mir alle Attribute zurück liefern.
Im Plugin selbst versuche ich dann mit einer Query Expression Datensätze aus opd_gutschrift_produkt auszulesen. Damit läuft mir das ganze dann aber in einen Timeout.

Query Expression die Timeout auslöst:
Code:
                                QueryExpression query = new QueryExpression();
                                query.EntityName = OPD_gutschriftprodukt.EntityLogicalName;
                                query.ColumnSet = new ColumnSet();
                                query.ColumnSet.Columns.Add("opd_erw_betrag");

                                FilterExpression filter = new FilterExpression();
                                ConditionExpression condition = new ConditionExpression("opd_gutschriftid", ConditionOperator.Equal, gutschriftid.Id);
                                filter.Conditions.Add(condition);
                                condition = new ConditionExpression("opd_erw_betrag", ConditionOperator.NotNull);
                                filter.Conditions.Add(condition);
                                query.Criteria = filter;

                                DataCollection<Entity> entityCollection = _service.RetrieveMultiple(query).Entities;


ich hoffe ich konnte mich so etwas verständlicher ausdrücken wo das Problem liegt.

Viele Grüße
Nicole

Re: Plugin bei Create mit PostStep

1. Juni 2015 14:50

Hallo Nicole,
läuft das ganze Async oder Sync? Ich könnte mir gut vorstellen, dass beim Synchronen aufruf, das Gutschrift Produkt noch nicht vollständig angelegt ist und deswegen du in einen TimeOut rein läufst. Mal das ganze auf Async getestet?
Ansonsten müsste ich mal, wenn ich Zeit hab auf einer Dev Umgebung etwas ähnliches zusammen basteln.

Grüße
gE3z

Re: Plugin bei Create mit PostStep

2. Juni 2015 08:56

Hallo gE3z,

ja das Ganze läuft im Sync. Ich möchte ja das die Gesamtsumme in der Gutschrift gleich angepasst ist. Async läuft es nicht in einen Timeout, das stimmt aber es scheint dann auch gar nicht zu laufen jedenfalls läuft er nie in den Debugger rein und der Gutschriftdatensatz wird nicht entsprechend des Plugins angepasst auch nach fünf Minuten noch nicht. Also scheint Async auch keine Option zu sein. Schade dachte ich bekomm das im CRM 2011 irgendwie hin das er auch die Gesamtsumme für die Gutschriftprodukte wieder einträgt. Unter CRM 4 hatte das mit dem Plugin geklappt :(

Viele Grüße
Nicole

Re: Plugin bei Create mit PostStep

2. Juni 2015 09:41

Hi Nicole,
gut zu wissen. Man müsste mal grob die 2 Entitäten nachbauen und dann selber testen. Ob das nur bei dir so ist oder allgemeines Problem.
Zumindest spontan fällt mir grade keine Lösung ein, Sorry.

Grüße
gE3z

Re: Plugin bei Create mit PostStep

3. Juni 2015 08:36

Hallo Nicole,

also prinzipiell muss das ganze funktionieren, wir haben eine ganze Reihe von PlugIns ei Kunden im Einsatz, die ähnliche Funktionen ausführen.

Wenn du mit dem Debugger durch das PlugIn gehst, an welcher Stelle kommt es dann zum Timeout?

Hast du mal das Tracing eingeschaltet und dir die Meldungen im Trace angesehen, wenn dein Plugin auf ein TimeOut gelaufen ist?

Re: Plugin bei Create mit PostStep

3. Juni 2015 09:09

Hallo Michael,

Tracing habe ich noch nicht eingeschaltet das versuche ich nochmal. der Timeout tritt genau hier auf:

Code:
DataCollection<Entity> entityCollection = _service.RetrieveMultiple(query).Entities;


Viele Grüße
Nicole