日付の自動更新について

いつもお世話になっております。

下記記事を参考に経過年数を表示しているのですが、

フィールドに値を計算セットしたが画面上に反映されない件

・フィールド「生年月日」が空白の場合に、フィールド「年齢」も空白に表示する方法

・フィールド「基準日」がレコード追加イベントや編集イベントをしなくても自動的に今日の日付に更新する方法

上記2点について、ご教示いただけると幸いです。

よろしくお願いいたします。

Naoさん

 

こんにちは。

>・フィールド「生年月日」が空白の場合に、フィールド「年齢」も空白に表示する方法
レコード保存実行前イベント(新規、編集)で、「生年月日」フィールドが空だった場合、「年齢」フィールドを空にすることで可能です。

レコード保存イベント

https://cybozudev.zendesk.com/hc/ja/articles/201941984#step2

https://cybozudev.zendesk.com/hc/ja/articles/202166270#step2

 

サンプル

var record = event.record;

if (!record['生年月日'].value) {
 //年齢を空にする
 record['年齢'].value = '';
}

return event;

 

>・フィールド「基準日」がレコード追加イベントや編集イベントをしなくても自動的に今日の日付に更新する方法
例えばですが、レコード詳細画面表示イベントで「基準日」が今日ではない場合、レコード更新(RestAPI)で基準日を今日に更新して、リロード(location.reload())することで実現できます。

レコード詳細画面表示イベント

https://cybozudev.zendesk.com/hc/ja/articles/201941974#step1

レコード更新

https://cybozudev.zendesk.com/hc/ja/articles/201941784#step1

カキ氷様

早速のご返信ありがとうございます。

・フィールド「生年月日」が空白の場合に、フィールド「年齢」も空白に表示する方法

こちらに上記につきましては、サンプルを参考に実装できました。ありがとうございます。

・フィールド「基準日」がレコード追加イベントや編集イベントをしなくても自動的に今日の日付に更新する方法

こちらは、下記のコードを合わせて行うのでしょうか?

*---------------------------------------------------------------------------------------------------------*

【レコード詳細画面表示イベント】

kintone.events.on([‘app.record.detail.delete.submit’], function(event) {
    var record = event.record;
    if (record[‘基準日’].value !== today) {
    record[‘基準日’].value = today;
    }
    return event;
});

*---------------------------------------------------------------------------------------------------------*

【レコード更新】

{
    “app”: (アプリのID),
    “records”: [
        {   // 基準日のデータ
            “id”: (更新するレコードのID),
            “revision”: (更新するレコードのリビジョン),// 不要の場合は記載しない
            “record”: {
                “(基準日)”: {
                    “value”: (today)
                },
                “(基準日)”: {
                    “value”: (today)
                }
            }
        },
    ]
}

*---------------------------------------------------------------------------------------------------------*

度々、申し訳ございません。

ご教授いただければ幸いです。宜しくお願い致します。

Naoさん

そのイメージでOKです。

上記のレコード表示イベントが「app.record.detail.delete.submit’」になっていましたが、正しくは「app.record.detail.show’」になります。ご注意ください。

下に組み合わせた時のサンプルを記載しています。

このサンプルでは日付フォーマット処理を楽にするためにmoment.jsというライブラリを利用しています。

このコードをお使いになる場合はカスタマイズ設定の「PC用のJavaScriptファイル」の一番上に「https://js.cybozu.com/momentjs/2.17.1/moment.min.js」を追加してください。

// 詳細画面表示イベント
kintone.events.on(['app.record.detail.show'], function(event) {
  var record = event.record;

  var today = moment().format('YYYY-MM-DD'); // 今日の日付を 2017-01-01 フォーマットで取得

  // 基準日は本日ではない場合、基準日を更新する
  if (record['基準日'].value !== today) {

    // 基準日をtodayにする
    record['基準日'].value = today;

    // 更新するレコード内容を設定
    var body = {
      "app": kintone.app.getId(),//現在のアプリID取得
      "id": kintone.app.record.getId(),//現在のレコードID取得
      "record": record // 基準日をtodayにしたレコード情報
    }

    // レコード更新 RestAPI
    kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body, function(resp) {
      // success
      console.log('更新完了');

      // 更新が成功したら画面をリフレッシュする
      location.reload();
    }, function(error) {
      // error
      console.log('更新エラー' + error);
    });
  }
  return event;
});

 

 

 

 

 

カキ氷様

ご返信ありがとうございます。

上記サンプルコードを設置しましたが、更新ができませんでした。。。

以下コードで間違っている部分はありますでしょうか?

*--------------------------------------------------------------------------------------------------------------------------------------------*

(function () {
    “use strict”;
// 基準日までの年月計算(経過年月数の計算)
    function nen_set(dtDate, dtRefDate, typeDate) {
        var dtToday = new Date(dtRefDate);  //基準日
        var dtFrom = new Date(dtDate);
        switch (typeDate) {
            case ‘yy’:
                var intDays = (dtToday - Date.parse(dtDate)) / 1000 / 60 / 60 / 24;
                return Math.floor(intDays / 365);
            case ‘yymm’:
                var intYear = dtToday.getFullYear() - dtFrom.getFullYear();
                var intMonth = dtToday.getMonth() - dtFrom.getMonth();
                if (intMonth < 0) {
                    intYear–;
                    intMonth += 12;
                }
                return intYear + “年” + intMonth + “ケ月”;
            default:
                return null;
        }
    }

//前ゼロの文字列を作成する関数
    function zeroformat(v, n) {
        var v1 = String(v).length;
        if (n > v1) {
            return (new Array((n - v1) + 1).join(0)) + v;
        } else {
            return v;
        }
    }

    var flg = true;
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    kintone.events.on([‘app.record.edit.change.生年月日’,
        ‘app.record.create.change.生年月日’,
        ‘app.record.index.edit.change.生年月日’,
        ‘app.record.edit.change.基準日’,
        ‘app.record.create.change.基準日’,
        ‘app.record.index.edit.change.基準日’,
        ‘app.record.create.show’,
        ‘app.record.edit.show’], function (event) {
        var record = event.record;

        if (event.type === ‘app.record.create.show’ || event.type === ‘app.record.edit.show’) {
            // フィールド制御
            record[‘年齢’][‘disabled’] = true;

            // 基準日に今日をセット
            var dt = new Date();
            var today = dt.getFullYear() + “-” + zeroformat((dt.getMonth() + 1), 2) + “-” + zeroformat(dt.getDate(), 2);
            if (record[‘基準日’].value !== today) {
                record[‘基準日’].value = today;
                flg = false;
                return tekitou(event);
            }
        } else if (flg) {
            return tekitou(event);
        } else {
            flg = true;
        }

        return event;
    });

    function tekitou(event) {
        var record = event.record;
        var wkDate = record[‘生年月日’].value;
        var wkReferenceDate = record[‘基準日’].value;

        if ((wkDate === undefined) || (wkReferenceDate === undefined)) {
            record[‘年齢’].value = “”;
            return event;
        }

        alert(‘wkDate=’ + wkDate + ‘,wkReferenceDate=’ + wkReferenceDate);
        var wkRetVal = nen_set(wkDate, wkReferenceDate, ‘yymm’);        //「○年○ケ月」を求める
        alert(‘wkRetVal=’ + wkRetVal);
        record[‘年齢’].value = wkRetVal;
        return event;
    }

    function kuhaku(event) {
        var record = event.record;

        if (!record[‘生年月日’].value) {
//年齢を空にする
record[‘年齢’].value = ‘’;
}

 return event;  

    }

// 詳細画面表示イベント
    kintone.events.on([‘app.record.detail.show’], function(event) {
        var record = event.record;

        var today = moment().format(‘YYYY-MM-DD’); // 今日の日付を 2017-01-01 フォーマットで取得

        // 基準日は本日ではない場合、基準日を更新する
        if (record[‘基準日’].value !== today) {

        // 基準日をtodayにする
        record[‘基準日’].value = today;

        // 更新するレコード内容を設定
        var body = {
“app”: kintone.app.getId(),//現在のアプリID取得
“id”: kintone.app.record.getId(),//現在のレコードID取得
“record”: record // 基準日をtodayにしたレコード情報
}

        // レコード更新 RestAPI
        kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body, function(resp) {
// success
console.log(‘更新完了’);

 // 更新が成功したら画面をリフレッシュする  
 location.reload();  
 }, function(error) {  
 // error  
 console.log('更新エラー' + error);  
 });  

     }
     return event;
    });

})();

*--------------------------------------------------------------------------------------------------------------------------------------------*

何度も、質問させていただき、恐縮でございますが、

ご教授いただければ幸いでございます。

 

Naoさん

 

申し訳ありません。

更新するrecordデータの作成が誤っていました。正しくは以下になります。

 

  // 詳細画面表示イベント
  kintone.events.on(['app.record.detail.show'], function(event) {
    var record = event.record;

    var today = moment().format('YYYY-MM-DD'); // 今日の日付を 2017-01-01 フォーマットで取得

    // 基準日は本日ではない場合、基準日を更新する
    if (record['基準日'].value !== today) {

      // 更新するレコード内容を設定
      var body = {
        "app": kintone.app.getId(), //現在のアプリID取得
        "id": kintone.app.record.getId(), //現在のレコードID取得
        "record": { // 基準日をtodayにしたレコード情報
          "基準日": {
            "value": today
          }
        }
      }

      // レコード更新 RestAPI
      kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body, function(resp) {
        // success
        console.log('更新完了');

        // 更新が成功したら画面をリフレッシュする
        location.reload();
      }, function(error) {
        // error
        console.log('更新エラー' + error);
      });
    }
    return event;
  });

カキ氷様

ご返信ありがとうございます。

上記コードにて無事、実装ができました。

ご丁寧に教えていただき誠にありがとうございます。

今後とも宜しくお願い致します。

Nao様

突然で大変失礼致します。

Naoさんの投稿している内容で私も似たような操作をしたいですが、

初心者のため、全然進めなくて困っております。

お手数ですと十分承知しておりますが、以下についてアドバイス頂ければ幸いです。

①生年月日を入力するとフォームにでる確認の画面をなくしたい。

https://developer.cybozu.io/hc/ja/community/posts/211020666-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E5%80%A4%E3%82%92%E8%A8%88%E7%AE%97%E3%82%BB%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E3%81%8C%E7%94%BB%E9%9D%A2%E4%B8%8A%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E4%BB%B6

のように、一件保存後、基準日を再編集をすると基準日はどうしても今日の日付に戻ってしまうのです。

お手すきなときに教えていただけますでしょうか?よろしくお願い致します。