0

Wir haben eine benutzerdefinierte Schaltfläche zum Abbrechen der Aufgabe in CRM. Die benutzerdefinierte Schaltfläche löst ein JavaScript aus, mit dem die Aufgabe abgebrochen wird. Wir haben das Skript basierend auf einer blog by Guru Prasad erstellt.CRM 2016 Javascript funktioniert nicht mit New CRM Turbo Formular

Früher hat es in CRM 2013 funktioniert, aber nach dem Upgrade auf CRM 2016 funktioniert es nicht mehr. Klicken Sie auf die Schaltfläche wird nichts tun - keine Fehlermeldung usw. Dies funktioniert nicht wegen der neuen Turbo Form-Funktion in CRM 2016. Wenn ich Turbo Form deaktiviert, um Legacy-Formular zu verwenden, funktioniert die Schaltfläche Abbrechen Aufgabe ordnungsgemäß.

Unten ist mein Skript - wissen Sie, ob es etwas gibt, das verhindert, dass das Skript mit CRM 2016 Turbo Form funktioniert?

PS: Zunächst wird der Code in Guru Prasad-Blog ist immer noch mit getServerUrl(), aber laut msdn link hat es sich als veraltet und geändert getClientUrl() die wir unser Skript aktualisiert haben - aber immer noch nicht funktioniert.

function cancelTaskRecord(RECORD_ID) { 
    //set Task record to Cancel status, then force to close the page 
    Xrm.Page.data.save().then(changeRecordStatus(RECORD_ID, 2, 6), Xrm.Page.ui.close()); 
} 

function changeRecordStatus(RECORD_ID, stateCode, statusCode) 
    { 
    // create the SetState request 
    var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"; 
    request += "<s:Body>"; 
    request += "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"; 
    request += "<request i:type=\"b:SetStateRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">"; 
    request += "<a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">"; 
    request += "<a:KeyValuePairOfstringanyType>"; 
    request += "<c:key>EntityMoniker</c:key>"; 
    request += "<c:value i:type=\"a:EntityReference\">"; 
    request += "<a:Id>" + RECORD_ID + "</a:Id>"; 
    request += "<a:LogicalName>task</a:LogicalName>"; 
    request += "<a:Name i:nil=\"true\" />"; 
    request += "</c:value>"; 
    request += "</a:KeyValuePairOfstringanyType>"; 
    request += "<a:KeyValuePairOfstringanyType>"; 
    request += "<c:key>State</c:key>"; 
    request += "<c:value i:type=\"a:OptionSetValue\">"; 
    request += "<a:Value>" + stateCode + "</a:Value>"; 
    request += "</c:value>"; 
    request += "</a:KeyValuePairOfstringanyType>"; 
    request += "<a:KeyValuePairOfstringanyType>"; 
    request += "<c:key>Status</c:key>"; 
    request += "<c:value i:type=\"a:OptionSetValue\">"; 
    request += "<a:Value>" + statusCode + "</a:Value>"; 
    request += "</c:value>"; 
    request += "</a:KeyValuePairOfstringanyType>"; 
    request += "</a:Parameters>"; 
    request += "<a:RequestId i:nil=\"true\" />"; 
    request += "<a:RequestName>SetState</a:RequestName>"; 
    request += "</request>"; 
    request += "</Execute>"; 
    request += "</s:Body>"; 
    request += "</s:Envelope>"; 

    //send set state request 
    $.ajax({ 
     type: "POST", 
     contentType: "text/xml; charset=utf-8", 
     datatype: "xml", 
     url: Xrm.Page.context.getClientUrl() + "/XRMServices/2011/Organization.svc/web", 
     data: request, 
     beforeSend: function (XMLHttpRequest) { 
      XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*"); 
      XMLHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"); 
     }, 
     success: function (data, textStatus, XmlHttpRequest) { 
      Xrm.Page.ui.close(); 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      alert(errorThrown); 
     } 
    }); 

} 
+0

Nichts offensichtlich, sieht aus wie es sollte funktionieren. Hast du überprüft, ob dein Code überhaupt ausgelöst wird? 'save(). then 'würde nur funktionieren, wenn es keine Validierungsfehler gibt oder wenn es einen benutzerdefinierten Code gibt, der ein Speichern verhindert. – dynamicallyCRM

+1

Ich schlich in ein Alarm-Pop-up-Fenster auf meinem Skript und es löst aus, unabhängig davon, Turbo-Form ist an oder nicht. Es ist der Cancelling Task-Teil, der nicht funktioniert. Die Cancelling-Aufgabe funktioniert nur, wenn das Turbo-Formular deaktiviert ist. Gibt es irgendetwas in meinem Skript, das nicht funktioniert, wenn Turbo Form aktiv ist? Auch ich entfernte die save(). Dann Teil auf meinem Skript und es noch nichts abbrechen, wenn Turbo-Formular aktiv ist. – ichachan

Antwort

1

In Ihrem Kommentar haben Sie erwähnt, dass der Code in beiden Fällen ausgelöst wird. Dies bedeutet, dass Ihr Problem mit dem tatsächlichen Jquery-Aufruf zur Ausführung der SetState-Anforderung besteht. Ihr nächster Schritt ist zweifach, senden Sie die Anfrage tatsächlich in beiden Fällen (wird Jquery korrekt geladen) und ist die Anfrage, die gesendet wird, identisch. Wenn Sie eine Warnung haben, können Sie einen Unterbrechungspunkt in den Code einfügen und sicherstellen, dass jQuery in beiden Fällen funktioniert. Sie können auch fiddler installieren und die Anfragen in Turbo Forms und Legacy vergleichen, um zu sehen, ob die Anfragen identisch sind oder nicht.

Verwandte Themen