0

CRMのタスクをキャンセルするカスタムボタンがあります。カスタムボタンは、タスクをキャンセルするjavascriptをトリガーします。 blog by Guru Prasadに基づいてスクリプトを作成しました。CRM 2016 Javascriptが新しいCRMターボフォームで動作しない

以前はCRM 2013で動作していましたが、CRM 2016にアップグレードした後はもう動作しません。ボタンをクリックしても何もしません。エラーメッセージはありません。これはCRM 2016の新しいTurboフォーム機能のために機能しません。Turboフォームを使用して従来のフォームを使用すると、タスクのキャンセルボタンが正常に機能しています。

以下は私のスクリプトです - スクリプトが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

私はスクリプトのアラートポップアップウィンドウに潜入し、ターボフォームがオンかどうかにかかわらず、トリガします。作業していないキャンセルタスクの部分です。キャンセルタスクは、ターボフォームがオフの場合にのみ機能します。 スクリプト上に、ターボフォームがアクティブなときに動作しないものはありますか? また、スクリプトのsave()。then部分を削除しましたが、ターボフォームがアクティブな場合でも何もキャンセルされません。 – ichachan

答えて

1

あなたのコメントでは、両方のケースでコードがトリガーされていると述べました。これは、SetStateリクエストを実行するための実際のJquery呼び出しに問題があることを意味します。あなたの次のステップは2つあります。実際に両方のケースでリクエストを送信していますか(Jqueryは正しくロードされていますか)、同じリクエストが送信されています。警告がある場合は、コードにブレークポイントを置き、jqueryがどちらの場合でも動作していることを確認できます。また、フィドラーをインストールし、ターボフォームとレガシーの両方の要求を比較して、要求が同一かどうかを確認することもできます。

関連する問題