2016-10-09 1 views
0

Ich verfüge über eine benutzerdefinierte Workflowaktivität, die neue Opportunity aus meinen benutzerdefinierten Workflowaktivitäten erstellt. Ich habe diese Aktivität als Aktionsschritt. Ich benutze Aktion, weil sie eine Ausgabe hat. Ich muss eine Chance bekommen, die ich geschaffen habe. Ich rufe diese Aktion von JS Web-Ressource mit Process.js. Danach benutze ich Notify.js, um den Benutzer zu benachrichtigen, dass eine Opportunity erstellt wurde. Bei dieser Benachrichtigung muss ich eine Schaltfläche haben, die eine Verknüpfung zu der neu erstellten Opportunity darstellt.Fügen Sie einen Link zum neu erstellten Entitätsdatensatz mit Notify.js hinzu - CRM

Hier sind einige Teile des C# -Codes für den Ausgabeparameter. Nur, dass ein Teil des Codes bemerken Gelegenheit zum Erstellen, und einige weitere Aufgaben zu tun funktioniert:

//define variable 
[Output("Opportunity")] 
[ReferenceTarget("opportunity")] 
public OutArgument<EntityReference> NewOpportunity { get; set; } 

//create opportunity and entity reference(i am not sure do ineed entity reference, or something else for that link) 
Guid opportunityId = service.Create(opportunity); 
EntityReference OppId = new EntityReference(opportunity.LogicalName, opportunityId); 

//assign value to the output variable 
NewOpportunity.Set(Econtext, OppId); 

Hier ist, wie ich meine Aktionsparameter in Aktion Definition erstellt: enter image description here

Und hier ist die JS Code, wo Aktion aufgerufen wird:

function toOpportunity(){ 

Process.callAction("ad_opportunity", 
    [{ 
     key: "Target", 
     type: Process.Type.EntityReference, 
     value: { id: Xrm.Page.data.entity.getId(), entityType: "ad_productsamplerequest" } 
    }], 
    function (param) { 
     //Success    
     Notify.add("New Opportunity was created:", "INFO", "opportunity", 
    [{ 
     type: "button", 
     text: "Go to opportunity", 
     callback: function() { 

     } 
    }]); 
    }, 
    function() { 
     // Error 
     alert("Opportunity was not created"); 
    } 
); 

nur zu sagen, es funktioniert, wird Aktion aufgerufen, Möglichkeit geschaffen wird, gibt Benachrichtigung danach ist. Ich weiß einfach nicht, wie man den action output Parameter benutzt, um die Verbindung zu der Opportunity zu setzen.

Antwort

1

Es sieht so aus, als ob Sie versuchen, die Aktion in einer CodeActivity Klasse zu behandeln. Dies wird nicht funktionieren. OutArgument Eigenschaften sind nur im Workflow verfügbar, sie können nicht an einen aufrufenden Prozess zurückgegeben werden.

Erstellen Sie stattdessen eine Aktion mit den gewünschten Eingabe- und Ausgabeparametern. Erstellen Sie dann ein Plugin und registrieren Sie einen synchronen Post-Update-Schritt für diese Aktion. Die Plugin-Klasse-Implementierung muss die Möglichkeit ID an die OutputParameters Sammlung, wie folgt hinzufügen:

public void Execute(IServiceProvider serviceProvider) 
{ 
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 
    var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
    var service = factory.CreateOrganizationService(context.UserId); 

    Entity opportunity; 
    // TODO: add code here to build the opportunity. 

    Guid opportunityId = service.Create(opportunity); 
    context.OutputParameters.Add("NewOpportunity", new EntityReference("opportunity", opportunityId)); 
} 

Siehe auch diese Erklärung auf MSDN.

+0

Ist es irgendwie möglich, dies in Code Activity zu tun? Ich muss diese Code-Aktivität von Aktion aufrufen, weil ich wirklich bestimmte Bedingungen habe, wenn ich diese Bedingungen anrufe. Ich verwende eine Aktion, weil sie Ausgabeparameter hat, und ich lehrte, die ID unter Verwendung dieser Parameter zu erhalten. –

+0

Ist es vielleicht möglich, ein neues Plugin nur für die ID zu haben? Um den Post-Create-Schritt zu registrieren, wenn Opportunity erstellt wird, und um es nur zu verwenden, um die ID der erstellten Opportunity zu erhalten? –

+1

@MilosNikolic: Aktionen und Code-Aktivitäten sind zwei verschiedene Komponenten. Ich habe meine Antwort erweitert, um ein bisschen mehr Erklärung zu geben. Hilft das? –

0

Als Henk traurig, ist es nicht möglich Entitätsverweis passieren, so ging ich Guid als String in meiner CodeActivity:

[Output("Opportunity")] 
public OutArgument<string> NewOpportunity { get; set; } 

...

Guid opportunityId = service.Create(opportunity); 
string guidSend = opportunityId.ToString(); 
NewOpportunity.Set(Econtext, guidSend); 

Danach habe ich verwendet, dass Ausgang in JS:

var OGuid = param["NewOpportunity"]; 
     Opport = OGuid.replace(/ /g,''); 

Und gesetzt Bezug auf die neue Möglichkeit, wie folgt aus:

Xrm.Utility.openEntityForm("opportunity",""+Opport); 

Der erste Teil des JavaScript ist in Aktion Anruf, aber nicht in Benachrichtigung und die letzte Zeile ist in Benachrichtigung, so dass sie in anderen Teil des Codes. Deshalb habe ich Opport als globale Variable definiert und dann kann ich den Wert in einer Funktion setzen und von einem anderen in Benachrichtigung benachrichtigen.

Es gibt eine andere Option, ohne C# Teil. Es ist möglich, in der Benachrichtigungs-Callback-Funktion Fetch zu erstellen und die zuletzt erstellte Opportunity-ID zurückzugeben. Dies ist einfacher, aber nicht besser:

 var contactFetchXML = "<fetch mapping='logical' version='1.0' distinct='true' count='1' >"+ 
           "<entity name='opportunity' >"+ 
           "<attribute name='opportunityid' />"+ 
           "<order attribute='createdon' descending='true' />"+ 
           "</entity>"+ 
          "</fetch>"; 


    var Guid = XrmServiceToolkit.Soap.Fetch(contactFetchXML); 

    Xrm.Utility.openEntityForm("opportunity",""+Guid[0].id); 
Verwandte Themen