none
統一インターフェイスの日付と時間フィールドについて RRS feed

  • 質問

  • お世話になります。

    『日付と時間』フィールドについてですが、

    javascriptでフィールド値を取得した際、

    レガシー画面の場合は、秒数が正確に取得されますが、

    統一インターフェイス画面で取得すると、秒数が必ず0で取得されますが仕様なのでしょうか。

    // saveDateフィールドの日時の表示
    console.log(Xrm.Page.data.entity.attributes.get("saveDate").getValue());
    
    // レガシーの場合
    Mon Apr 13 2020 08:06:23 GMT+0900 (日本標準時)
    
    // 統一インターフェイスの場合
    Mon Apr 13 2020 08:06:00 GMT+0900 (日本標準時)


    • 編集済み rias.crm 2020年4月13日 1:53
    2020年4月13日 1:51

回答

  • こんにちは。

    Dynamics 365 公式の getValue() のリファレンスを確認しましたが、秒数の取得については特に言及がありませんでした。

    https://docs.microsoft.com/ja-jp/powerapps/developer/model-driven-apps/clientapi/reference/attributes/getvalue

    現在、統一インターフェイスの環境がないので検証は行えないのですが、以下を実施してみてはいかがでしょうか?

    [構文を確認する]

    念のためですが、以下、書き間違えですよね?

    誤:Xrm.Page.data.entity.attributes.get("saveDate").getValue();

    正:Xrm.Page.data.entity.attributes("saveDate").getValue();

    [新APIを利用してみる]

    "Xrm.Page"のAPIですが、現在は非推奨の書き方となりますので、以下の様に新しい構文で置き換えてみてはいかがでしょうか?

    function getTime(executionContext) {
        // 実行コンテキストの取得
        var formContext = executionContext.getFormContext();
        alert(formContext.getAttribute("saveDate").getValue());
    }

    上記について、詳しくは私の過去のブログ記事を参考にしてください。

    http://westcoastline.hatenablog.com/entry/2018/02/26/161906

    [WebAPIを利用してみる]

    getAttributeはクライアント側で値の取得を試みますが、以下のWebAPIを使用すればサーバ側の値を取得することができますので、もしかしたら秒数まで返却されるかもしれません。

    function getTimeFromServer(executionContext) {
        // 実行コンテキストの取得
        var formContext = executionContext.getFormContext();
        var id = formContext._entityReference.id.guid;
        Xrm.WebApi.retrieveRecord("EntityName", id).then(
            function success(result) {
                alert(result.savedate);
            },
            function (error) {
                alert("Error");
            }
        );
    }

    こちらも過去にブログを書いていますので、参考にしてください。

    http://westcoastline.hatenablog.com/entry/2019/09/03/105411

    なお、上記全ての方法を試しても秒数が取得できない場合は、以下の様な原因が考えられます。

    ・日付型項目の値取得の仕様が変更され、統一インターフェイスでは秒数が読み捨てられるようになった

    ・サーバ側にそもそも秒数を格納しなくなった

    • 回答としてマーク rias.crm 2020年4月15日 0:19
    2020年4月14日 1:12

すべての返信

  • こんにちは。

    Dynamics 365 公式の getValue() のリファレンスを確認しましたが、秒数の取得については特に言及がありませんでした。

    https://docs.microsoft.com/ja-jp/powerapps/developer/model-driven-apps/clientapi/reference/attributes/getvalue

    現在、統一インターフェイスの環境がないので検証は行えないのですが、以下を実施してみてはいかがでしょうか?

    [構文を確認する]

    念のためですが、以下、書き間違えですよね?

    誤:Xrm.Page.data.entity.attributes.get("saveDate").getValue();

    正:Xrm.Page.data.entity.attributes("saveDate").getValue();

    [新APIを利用してみる]

    "Xrm.Page"のAPIですが、現在は非推奨の書き方となりますので、以下の様に新しい構文で置き換えてみてはいかがでしょうか?

    function getTime(executionContext) {
        // 実行コンテキストの取得
        var formContext = executionContext.getFormContext();
        alert(formContext.getAttribute("saveDate").getValue());
    }

    上記について、詳しくは私の過去のブログ記事を参考にしてください。

    http://westcoastline.hatenablog.com/entry/2018/02/26/161906

    [WebAPIを利用してみる]

    getAttributeはクライアント側で値の取得を試みますが、以下のWebAPIを使用すればサーバ側の値を取得することができますので、もしかしたら秒数まで返却されるかもしれません。

    function getTimeFromServer(executionContext) {
        // 実行コンテキストの取得
        var formContext = executionContext.getFormContext();
        var id = formContext._entityReference.id.guid;
        Xrm.WebApi.retrieveRecord("EntityName", id).then(
            function success(result) {
                alert(result.savedate);
            },
            function (error) {
                alert("Error");
            }
        );
    }

    こちらも過去にブログを書いていますので、参考にしてください。

    http://westcoastline.hatenablog.com/entry/2019/09/03/105411

    なお、上記全ての方法を試しても秒数が取得できない場合は、以下の様な原因が考えられます。

    ・日付型項目の値取得の仕様が変更され、統一インターフェイスでは秒数が読み捨てられるようになった

    ・サーバ側にそもそも秒数を格納しなくなった

    • 回答としてマーク rias.crm 2020年4月15日 0:19
    2020年4月14日 1:12
  • westcoastline様

    詳細の回答ありがとうございます。

    まず結論からですが、
    統一インターフェイスでは、WebAPIを使用すると秒数が取得できました。

    検証では、作成日(createdon)で秒数が保存されている事を確認したレコードで確認しました。

    function valueData(executionContext){ // 旧API var rt1 = Xrm.Page.data.entity.attributes.get("createdon").getValue(); console.log(`rt1-->:${rt1}`); var rt2 = Xrm.Page.getAttribute("createdon").getValue(); console.log(`rt2-->:${rt2}`); // 新API var formContext = executionContext.getFormContext(); var rt3 = formContext.getAttribute("createdon").getValue(); console.log(`rt3-->:${rt3}`); // WebAPI getTimeFromServer(executionContext); } function getTimeFromServer(executionContext) { // 実行コンテキストの取得 var formContext = executionContext.getFormContext(); var id = formContext._entityReference.id.guid; Xrm.WebApi.retrieveRecord("EntityName", id).then( function success(result) { console.log(`rt4-->:${result.createdon}`); }, function (error) { alert("Error"); } ); }

    // 【レガシー】
    // ・旧API:〇
    // ・新API:〇

    // 【統一インターフェイス】
    // ・旧API:×
    // ・新API:×
    // ・WebAPI:〇

    getAttributeですが、

    正式にはXrm.Page.data.entity.attributes.getでショートカットバージョンとして提供されていると

    記載がありましたので、そのまま使用していました。


    また、ほぼ毎日データを作成してますが、

    『日付と時間』フィールドに以下のコードで保存したデータを確認した所、

    2018/10/15付近から秒数が反映(保存)されていない状況でした。

    (仕様変更なのかは不明)

    var nowDate = new Date();
    Xrm.Page.data.entity.attributes.get("saveDate").setValue(nowDate);
    Xrm.Page.data.entity.attributes.get("saveDate").setSubmitMode("always");

    今後は、非推奨のコードを順次変更予定です。

    • 編集済み rias.crm 2020年4月14日 7:23
    2020年4月14日 6:54