2014-09-27 1 views
0

Мы находимся на CRM 2013. Требование состоит в том, чтобы полностью избавиться от кнопки «Закрыть» из формы «Задачи», а затем создать новая кнопка «Отмена», чтобы отменить задачу. Поэтому, нажав на эту кнопку, задача будет «Сохранить как отмененную».CRM 2013: Javascript для отмены задачи не работает, когда запись открыта из Advanced Find

Так мы последовали блог гуру Прасад об изменении записи с помощью JavaScript: http://guruprasadcrm.blogspot.com/2013/02/change-record-status-using-javascript.html

Скрипт работает нормально. Когда нажата кнопка «Отмена», она изменит статус на отмену.

Я также включил эту строку кода перед запросом SOAP в случае, если страница была изменена до отправки запроса на отмену.

Xrm.Page.data.entity.save("saveandclose"); 

Однако мы обнаружили очень странный баг, который по какой-то причине сценарий не срабатывает, когда запись открыта из расширенного поиска. Как будто страница закрывается сразу при нажатии этой новой пользовательской кнопки Отмена.

Знаете ли вы, есть ли какие-либо различия между запущенными скриптами в записях, открытых из Advanced Find vs. regular?

Вот Javascript, чтобы изменить состояние записи:

function changeRecordStatus(RECORD_ID, stateCode, statusCode) { 

    //first of all save all data before sending the request, in case if there are some data that hasn't been saved 
    Xrm.Page.data.entity.save("saveandclose"); 

    // 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.getServerUrl() + "/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); 
     } 
    }); 

}

Тогда здесь является определение команды новой кнопки пользовательской ленты, чтобы отменить задание. Я передал в statuscode = 2 и statecode = 6 в вышеприведенную функцию.

<CommandDefinitions> 
     <CommandDefinition Id="Mscrm.SaveAsCancelled"> 
     <EnableRules> 
      <EnableRule Id="Mscrm.VisualizationPaneNotMaximized" /> 
      <EnableRule Id="Mscrm.SaveAsCancelled.FormRule" /> 
     </EnableRules> 
     <DisplayRules> 
      <DisplayRule Id="Mscrm.CanWriteSelected" /> 
      <DisplayRule Id="Mscrm.SelectedEntityHasStatecode" /> 
     </DisplayRules> 
     <Actions> 
      <JavaScriptFunction FunctionName="changeRecordStatus" Library="$webresource:new_DeactivateTask.js"> 
      <CrmParameter Value="FirstPrimaryItemId" /> 
      <IntParameter Value="2" /> 
      <IntParameter Value="6" /> 
      </JavaScriptFunction> 
     </Actions> 
     </CommandDefinition> 

Спасибо, очень ценю вашу помощь.

ответ