Statusgrund im Vertrag setzen

10. Juli 2013 14:22

Hallo Zusammen,

wie kann ich den Statusgrund eines aktiven Vertrages ändern?

Ziel ist es in einem Plugin, oder Workflow einen Vertrag der verlängert wurde von Aktiv/Aktiv in Aktiv/Verlängert zu ändern.
Den Wert für "Verlängert" habe ich bereits den Statusgründen hinzugefügt. Mein Plugincode sieht so aus.

Code:
        public void setOriginatingContractState()
        {
            if (newEntity.Contains("originatingcontract"))
            {
                EntityReference originatingContractId = newEntity.GetAttributeValue<EntityReference>("originatingcontract");

                String fetchXml = "<fetch mapping='logical' version='1.0'>"
                                    + "<entity name='contract'>"
                                        + "<attribute name='originatingcontract' />"
                                        + "<attribute name='statecode' />"
                                        + "<attribute name='statuscode' />"
                                        + "<filter>"
                                            + "<condition attribute='contractid' operator='eq' value='" + originatingContractId.Id.ToString() + "' />"
                                        + "</filter>"
                                    + "</entity>"
                                + "</fetch>";

                EntityCollection fetchresult = Utils.excecuteFetchXml(this.Helper, fetchXml.ToString());

                if (fetchresult.Entities.Count == 1)
                {
                    Entity originatingContract = fetchresult[0];
                    if (originatingContract.GetAttributeValue<OptionSetValue>("statecode").Value == 2)
                    {
                        SetStateRequest stateRequest = new SetStateRequest();
                        stateRequest.EntityMoniker = originatingContractId;
                        stateRequest.State = originatingContract.GetAttributeValue<OptionSetValue>("statecode");
                        stateRequest.Status = new OptionSetValue(383910000);

                        this.Helper.Service.Execute(stateRequest);

                    }
                }
            }

        }


Der Code läuft ohne Fehler druch. Auch über den Service.Execute(stateRequest). Leider ändert sich am Vertrag nix :/

Ideen?

Viele Grüße
Pascal

Re: Statusgrund im Vertrag setzen

10. Juli 2013 16:17

hm muss beim setstaterequest nicht noch sowas definiert werden:
Code:
stateRequest.EntityMoniker = new EntityReference();

stateRequest.EntityMoniker.Id = originatingContractId;

stateRequest.EntityMoniker.Name = "contract";

stateRequest.EntityMoniker.LogicalName = contract.EntityLogicalName;

Re: Statusgrund im Vertrag setzen

10. Juli 2013 18:50

Hallo,

du must deinem Moniker schon sagen, für welche Entität er arbeiten soll.
Und bist du sicher, das es deinen Status tatsächlich gibt?

Ich verwende immer diesen Code, wobei du natürlich die Werte anpassen musst:
Code:
SetStateRequest _SetStateRequest = new SetStateRequest();
_SetStateRequest.EntityMoniker = new EntityReference(ENTITY, GUID));
_SetStateRequest.State = new OptionSetValue(1);
_SetStateRequest.Status = new OptionSetValue(8);
SetStateResponse _SetStateResponse = (SetStateResponse)lclCrmService.Execute(_SetStateRequest);

Re: Statusgrund im Vertrag setzen

11. Juli 2013 08:17

Guten Morgen,

erstmal danke für die Antworten, ich werde es gleich ausprobieren.

du must deinem Moniker schon sagen, für welche Entität er arbeiten soll.


Der Moniker ist doch eine Entityreferenz, oder?

Dann sollte das mit diesem Code doch auch funktionieren:

Code:
if (newEntity.Contains("originatingcontract"))
            {
                EntityReference originatingContractId = newEntity.GetAttributeValue<EntityReference>("originatingcontract");


Ich habe es aber mittlerweile geschaft, den Vertrag mit meinem Code auf "Hold" zu stellen. dabei habe ich nur die Werte geändert.
Ich kann ihn aber von Hold nicht zurück auf Aktiv setzen und schon garnicht auf "Verlängert" :-(

Wenn ich nur Aktiv/Verlängert eintrage, ändert sich an dem Vertrag einfach garnix.

Viele Grüße
Pascal

Re: Statusgrund im Vertrag setzen

11. Juli 2013 10:37

HI,
eine EntityReference besteht immer aus dem Logical Entityname und der Guid des Datensatzes. Sowie ich das sehe fehlt bei dir die Guid. Wichtig ist auch, dass der Status auch zum richtigen statecode passt!
ich finde bei Michael sieht man es auch gut.
SetStateRequest _SetStateRequest = new SetStateRequest();
_SetStateRequest.EntityMoniker = new EntityReference(ENTITY, GUID)); !!!!! Logical Name, Guid des Datensatzes ;-)
_SetStateRequest.State = new OptionSetValue(1);
_SetStateRequest.Status = new OptionSetValue(8);
SetStateResponse _SetStateResponse = (SetStateResponse)lclCrmService.Execute(_SetStateRequest);
Ich frage mich auch warum du mit FetchXml arbeitest? Gleiche kannst du auch mit QueryExpressions machen ist auch übersichtlicher ;-) [läuft aber aufs gleiche heraus].

Grüße
gE3z

Re: Statusgrund im Vertrag setzen

11. Juli 2013 14:02

Hallo,

eine EntityReference besteht immer aus dem Logical Entityname und der Guid des Datensatzes. Sowie ich das sehe fehlt bei dir die Guid. Wichtig ist auch, dass der Status auch zum richtigen statecode passt!

Das ist mir bewusst und ich bin mir 100 %tig Sicher das es auch funktioniert.

Sezte ich den Status auf onHold und den Statusgrund ebenfalls auf onHold, funktioniert das mit meinem Code ohne Probleme!
Es geht nur dann nicht, wenn ich Active/ Verlängert einstellen will! Es ist auch nicht so, als wenn er einen Fehler bringt. Er tut einfach garnix!. Kein SetStateResponse, kein Fehler, nix!

ich finde Fetch recht einfach und habe bis dahin alles hinbekommen, damit ;-)

Bitte fügt im Statusgrund beim Vertrag doch mal für Active einen neuen Wert hinzu und versucht diesen zu setzen.

Viele Grüße
Pascal

Re: Statusgrund im Vertrag setzen

11. Juli 2013 18:58

Hallo Pascal,

ausprobieren kann ich das aktuell nicht, ich bin im Urlaub:-)

Hast du schon mal das Tracing eingeschaltet und nachgesehen, ob er dir dort vielleicht einen Fehler meldet?