CRM 2013: JavaScript для отмены задачи не работает при открытии записи из расширенного поиска

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

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

Скрипт работает нормально. При нажатии кнопки «Отмена» статус изменится на «Отменено».

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

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

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

Знаете ли вы, есть ли какие-либо различия между запуском скриптов для записей, открытых с помощью расширенного поиска, и обычных?

Вот код 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>

Спасибо, очень признателен за вашу помощь.


person ichachan    schedule 27.09.2014    source источник


Ответы (1)


Эта ссылка нам очень помогает. Это новая функция CRM 2013: http://msdn.microsoft.com/en-us/library/dn481607.aspx

person ichachan    schedule 29.09.2014