0

У нас есть пользовательская кнопка для отмены задачи в CRM. Пользовательская кнопка запускает javascript, который отменяет задачу. Мы создали сценарий на основе blog by Guru Prasad.CRM 2016 Javascript не работает с новой формой CRM Turbo

Раньше он работал в CRM 2013, но после того, как мы перешли на CRM 2016, он больше не работает. Щелчок по кнопке ничего не сделает - сообщение об ошибке и т. Д. Это не работает из-за новой функции Turbo Form в CRM 2016. Когда я отключил Turbo Form для использования устаревшей формы, кнопка «Отменить задание» работает нормально.

Ниже приведен мой сценарий - знаете ли вы, что есть что-то, что мешает скрипту работать с функцией CRM 2016 Turbo Form?

PS: Изначально код в блоге Гуру Прасада все еще использует getServerUrl(), но согласно msdn link он устарел и изменен getClientUrl(), который мы обновили наш сценарий - но до сих пор не работает.

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

Ничего очевидно, похоже, что он должен работать. Вы проверяли, действительно ли ваш код запускается? 'save(). then' будет работать только в том случае, если нет ошибок проверки или если есть специальный код, который предотвращает сохранение. – dynamicallyCRM

+1

Я проскользнул во всплывающем окне предупреждения по моему сценарию, и он запускается, независимо от того, включена ли форма turbo или нет. Это часть «Отменить задание», которая не работает. Задача «Отмена» работает только при отключении турбоформы. Есть ли что-нибудь в моем скрипте, который не работает при активной форме турбо? Также я удалил save(), а затем часть на моем скрипте, и он все еще ничего не отменяет, когда турбо форма активна. – ichachan

ответ

1

В своем комментарии вы упомянули, что код запускается в обоих случаях. Это означает, что ваша проблема связана с фактическим вызовом Jquery для выполнения запроса SetState. Ваш следующий шаг в два раза, вы отправляете запрос в обоих случаях (правильно ли загружается Jquery), и этот запрос отправляется идентично. Если у вас есть предупреждение, вы можете разместить точку останова в коде и убедиться, что jquery работает в обоих случаях. Вы также можете установить скрипт и сравнить запросы в Turbo Forms и legacy, чтобы узнать, идентичны ли запросы или нет.

Смежные вопросы