Tech Dynamics 365 (CRM)

Microsoft Dynamics 365 (CRM) を中心とした技術情報を提供しています。

業務ルールをJavaScriptから実行させる方法

こんにちは。

今回は、業務ルールをJavaScriptから実行させる方法をご紹介します。

説明にあたり、取引先企業エンティティに以下の様な業務ルールを作成しました。
・取引先企業名が設定されていたら、フリガナ(取引先企業名)を入力必須にする
f:id:westcoastline:20200205112208p:plain


業務ルールをJavaScriptから実行

業務ルールを作成する際、一番最初に必ずトリガ(条件コンポーネント)を設定する必要があるかと思いますが、このトリガをJavaScript側から強制的に発火させることで、業務ルールが実行されるようになります。

今回のケースだと「取引先企業名が設定されていたら」という部分がトリガとなり、これは「取引先企業名が変更された時」と同義です。

そのため、以下の様なJavaScriptを作成してイベントハンドラーに登録しておけば、取引先企業名を画面上から変更していない場合でも、変更があったと見なされて業務ルールが発動します。

function FireBusinessRule() {
    Xrm.Page.getAttribute("new_name").fireOnChange();
}

※上記JavaScriptが実行され、業務ルールでフリガナ(取引先企業名)が必須項目になった画面
f:id:westcoastline:20200205120007p:plain


以前の記事で、業務ルールをJavaScriptに置き換える方法をご紹介しましたが、この方法であればそもそも業務ルールを作成する必要がなくなるので、今回のような処理を実装するケースはほとんどなくなるかもしれません。

ただ、業務ルールをJavaScriptに置き換えてしまうことのデメリットとして、画面上からGUI操作で簡単に変更ができなくなってしまうということが挙げられるため、業務ルールは使いつつ、JavaScriptから実行させるようにしたいというようなケースがあれば、今回の手順を参考にされてみてはいかがでしょうか。

Dynamics 365 のトライアル環境を久しぶりに払い出してみて気づいたのですが、「業務ルール」って、「ビジネスルール」に名称が変わったのですね…。
過去の記事に記載のある「業務ルール」っていう文言を「ビジネスルール」に書き直した方がいいのか、悩ましいところです。

ブログタイトルとデザイン変更

こんにちは。

突然ですが、ブログタイトルとデザインを変更いたしました。


ブログタイトルについて

私のはてなブログID(id:westcoastline)をそのまま使用して『West Coastline』としていましたが、タイトルからは何のブログか判断できなかったため、今回から『Tech Dynamics 365 (CRM)』に変更いたします。


ブログデザインについて

はてなブログ標準のテンプレートから、JOE(id:dreamark)様制作の『Contents』テンプレートに変更いたします。
contents.hatenablog.com


今後とも、Tech Dynamics 365 (CRM) を、よろしくお願いいたします。

JavaScriptを使用してWordテンプレートをダウンロードする

こんにちは。

今回は、JavaScriptを使用してWordテンプレートをダウンロードする方法をご紹介します。

なお紹介にあたり、以下のサイトのQ&Aを参考にさせていただきました。
stackoverflow.com


WordテンプレートをダウンロードするためのJavaScript

通常、Wordテンプレートを出力する際はコマンドバーから登録されているWordテンプレートをクリックするという手順を踏みますが、以下のfunctionをイベントトリガーやhtmlのボタンから呼び出せば、直接Wordテンプレートのダウンロードが行えます。

function DownloadWordTemplate () {
    // 定数定義(ここの変数に情報をセットしてください)
    var entityTypeCode = 1061;
    var templateId = "a1b2c3d4-e5f6-g7h8-0123-a123b456c789";
    var templateType = 9940;
    var fileName = "テスト.docx";
    var entityId = new Array();
    entityId.push(Xrm.Page.data.entity.getId());

    // Wordテンプレート出力処理
    Xrm.Page.ui.clearFormNotification("docerror");
    var path = Xrm.Page.context.getClientUrl() + "/_grid/print/print_data.aspx";
    var req = new XMLHttpRequest();
    req.open("POST", path, true);
    req.responseType = "arraybuffer";
    req.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
    req.setRequestHeader("Accept-Language", "en-US,en;q=0.8");
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    req.onreadystatechange = function () {
        if (this.readyState == 4) {
            req.onreadystatechange = null;
            if (this.status >= 200 && this.status <= 299) {
                var mimeType = (2 === 2) ?
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document" :
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                var blob = new Blob([req.response], { type: mimeType });
                var dlodURL = URL.createObjectURL(blob);
                var a = document.createElement("a");
                if (navigator.msSaveOrOpenBlob) {
                    navigator.msSaveOrOpenBlob(blob, fileName);
                } else {
                    document.body.appendChild(a);
                    a.style = "display: none";
                    a.href = dloadurl;
                    a.download = fileName;
                    a.click();
                    URL.revokeObjectURL(dlodURL);
                }
            }
        }
    };
    var formData =
        "exportType=MergeWordTemplate&selectedRecords=" + encodeURIComponent(JSON.stringify(entityid)) +
        "&associatedentitytypecode=" + entityTypeCode +
        "&TemplateId=" + templateId +
        "&templatetype=" + templateType;
    req.send(formData);
}


定数定義の解説

entityTypeCode
エンティティコード(etc)を指定します。
画面を開いている状態であれば、ハードコーディングするより以下のコードで取得した方がよいと思います。

Xrm.Page.context.getQueryStringParameters().etc;

templateId
出力したいWordテンプレートのGUIDを指定します。
GUIDがわからない場合は、documenttemplateのFetchXMLを作成してSOAP通信すればidを取得できます。
もっと簡単に取得したい場合は、F12開発者ツールのDOM Explorerで出力したいWordテンプレートのリンクを指定するとその親の<li>タグ内のidの末尾にGUIDが表示されていますので、そちらで取得できます。
例:id="new_test|NoRelationship|Form|Mscrm.Form.new_test.WordTemplates.Menu.Wordテンプレート.Controls.a1b2c3d4-e5f6-g7h8-0123-a123b456c789"

templateType
出力したいWordテンプレートのタイプを指定します。
ここでは『9940』としておりますが、個人用テンプレートの場合は『9941』を指定します。

fileName
Wordテンプレートを出力するときのファイル名を指定します。