誕生月の一覧を作成する

お世話になっております。

会社情報に代表者の誕生日が入力してあり、一覧として「今月誕生日の代表者」や「来月誕生日の代表者」という一覧を作成したいと考えていますが、なかなかうまい方法が思い浮かびません。

最終手段としてデータ登録の際にJSで誕生月のみを取得し、他の項目に保存し、「○月誕生日の代表者一覧」といったものを12個作成するという方法を考えていますが、他にも同じようなことを行いたい項目がいくつかあるため、あまりスマートではないと考えています。

どなたか知識をお貸しいただけると幸いです。

Kohei Hasebe様
cstapの落合です。

今月についてはTHIS_MONTH()を使ったクエリで取得できるかと思います。
https://cybozudev.zendesk.com/hc/ja/articles/202331474#step2

来月については、現在から来月1日(next)と再来月1日(afterNext)を算出し、"birthday >= next and Birthday < afterNext"といった感じで取得できるのではないでしょうか?

あくまでイメージで動作確認はしていないですが、参考になりますでしょうか?

落合様

いつも回答ありがとうございます。
なるほど、クエリを指定するのですね。

一覧を生成するときのクエリはどのように指定するのでしょうか?

イメージとしてはボタンを設置して「今月誕生日の代表者を取得」というものを作成するのかなと想像しています。そうなると表示項目をどこで指定するのかがわからないという状況です。

もしくはviewIDによって生成する一覧を制御できるようなAPIがあるのでしょうか?

勉強不足で申し訳ありません。

APIを使用しないで実現する方法を考えてみましたが、確かに思いつきませんね。仮に「誕生月」という項目を設けたとしても、やはり○月生まれ代表者一覧を12個作ることになり、一覧が増えすぎる感があります。

誕生月別代表者表示アプリ を別で作って、誕生月指定用テキストを配置。その下部に、関連レコード一覧として、「誕生月」が一致するレコードをを表示すれば、一覧は増えませんが、アプリが増えてしまいますね(^^;
試しに作ってみましたが、関連レコード一覧は最大30行までしか表示できず、ページ送りが発生するので、ちょっと使いにくいです。

あまり役に立たない書き込みですみません。

上海レンユアー 松村様

回答ありがとうございます。
同じ課題にぶつかった方がどのような反応をするのかを教えていただけただけでもとてもありがたいです。

確かに関連レコードで引っ張ってくると30件ごとにしか見れないのが難点ですね。

APIを使うことは全然OKなのですが、それでもどうすれば良いのか。。。もう少し考えてみます。

Kohei Hasebe様

>一覧を生成するときのクエリはどのように指定するのでしょうか?
kintone.api(‘/k/v1/records’, ‘GET’, params, callback, errback);を利用してレコード一覧を取得します。
paramsにappとqueryを与え、queryを前の回答のように指定します。

一覧を取得するタイミングはボタンクリックでもいいですし、showイベントでもいいかと思います。

詳細で表示するなら、スペースフィールドに表示すればいいのではないでしょうか?

一覧ではカスタマイズビューを利用しないと難しいですね。

>もしくはviewIDによって生成する一覧を制御できるようなAPIがあるのでしょうか?
これは私も認識してないので、おそらく現時点ではなかと思います。
クエリーは自作するしかないかと思います。

以上、参考になりますでしょうか?

落合様

回答ありがとうございます。
なるほど、カスタマイズビューですか。

落合様や山下様の書いたTipsを参考に頑張ってみます!

Kohei Hasebeさん

カスタマイズビューで一覧リンクを動的に生成するTipsありですね…
検討します!by Tipsプロデューサー

にしかわ様

こんにちわ。

営業の顧客管理などでは威力を発揮するものかと思います。
現状では代表者誕生日や決算月を動的に取得したいと考えております。

ぜひ検討をよろしくお願いいたします。

Kohei Hasebe 様
誕生月一覧の作成について、ちょっと思いついた事があったので、勉強を兼ねて検証してみました。

2014/07/13 の定期メンテナンスにおけるアップデート情報
https://cybozudev.zendesk.com/hc/ja/articles/202594150

ここに、「レコード⼀覧画⾯のURLにクエリを含めることで、一覧と絞り込み条件を指定する機能」の事が書いてありました。

誕生月(birthmonth)という項目が、誕生日とは別で独立して存在する必要がありますが、理屈上は、JavaScriptで、 birthmotn=当月 というクエリ文字を生成して、そのリンクを作成すれば、そこをクリックする事で、当月誕生日の一覧が出るであろうという推測です。

下記例は、"6"という数字を固定でリンク生成していますが、ここに当月の数字をあてはめれば、当月誕生日 というリンクを生成できると思います。
(JavaScript初心者なので、人様に見てもらうのは恥ずかしいのですが(笑)、変な書き方をしていたらごめんなさい)

(function ()
{
function editSubmit(event){

//レコード詳細画面右側の空白部分の要素を取得
var el = kintone.app.getHeaderMenuSpaceElement();

//aタグの生成
    var link = document.createElement('a');

    link.href='https:// ******.cybozu.com/k/*** /?query=birthmonth%3d%226%22';

    link.id = 'test';
    link.name = 'test';

    //要素の追加
    el.appendChild(link);
    link.appendChild(document.createTextNode('6月誕生月抽出'));

}

kintone.events.on(['app.record.index.show'], editSubmit);

})();

上記で一覧画面に追加されたリンクをクリックしたら、きちんと抽出できました。

私の勉強のメモ書きで恐縮ですが、とりあえず書込みさせて頂きました。

上海レンユアー 松村様

回答ありがとうございます。
なるほど、そういう方法もあるのですね!
誕生月の抽出はできるようにしてあるので、もしかしたらいけるかもしれません。

後日試させていただきます!
サンプルコードもありがとうございます!

呼ばれたような感じと似通ったものをやっていたので、遅ればせながら。

私のやった分は、月次の請求関係で多くて百数件でしたので、落合さんと菊地さんのTipsを参考にカスタマイズビューで実現しました。
https://cybozudev.zendesk.com/hc/ja/articles/202122544
https://cybozudev.zendesk.com/hc/ja/articles/201501294

誕生付きのフィールドをキーにして、カスタマイズビューで表示するような感じに書き換えるとこんな感じかと思います。

【カスタマイズビューのHTML(JSに合わせて今月と来月で同じモノを貼付け)】
<table class=“kintone-recordlist”>
<thead id=“kintone_thead”>
<tr><th>レコード番号</th><th>氏名</th><th>誕生日</th></tr>
</thead>
<tbody id=“kintone_tbody”></tbody>
</table>

<style type=“text/css”>
.kintone-recordlist {
width: 100%;
font-size: 12px;
border-radius: 3px;
border-collapse: separate;
border-top: 1px solid #f2f2f2;
border-left: 1px solid #f2f2f2;
}
#kintone_thead th {
background: #f2f2f2;
}
#kintone_tbody th {
background: #f2f2f2;
}

#kintone_tbody tr:nth-child(even) {
background: #f2f2f2;
}
#kintone_tbody tr:nth-child(odd) {
background: #ffffff;
}
</style>

【JavaScript】
(function () {
“use strict”;

function getMonthlyRecords(diff){
    var offsetMonth;
    if(!diff){
        offsetMonth = 0;
    }else{
        offsetMonth = parseInt(diff);
    }
    var now = new Date();
    var month = (now.getMonth()+1+offsetMonth)%12;
    if(month < 0){
        month = month + 12;
    }

    var offset=0;
    var records = [];
    var loopendflag = false;

    while(!loopendflag){
        var query = 'birthMonth = \"' + month + '\" limit 100 offset ' + offset;
        var appUrl = kintone.api.url('/k/v1/records') + '?app='+ kintone.app.getId() + '&query=' + encodeURIComponent(query);
        var xmlHttp;
        xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", appUrl, false);
        xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
        xmlHttp.send(null);
        var resObj = JSON.parse(xmlHttp.responseText);
        if(resObj.records.length > 0){
            for(var i = 0; resObj.records.length > i; i++){
                records.push(resObj.records[i]);
            }
            offset += resObj.records.length;
        }else{
            loopendflg = true;
        }
        return records;
    }
}

kintone.events.on('app.record.index.show', function(event){
    var records
    if (event.viewId == '5113315'){ // 今月分
        records = getMonthlyRecords();
    } else if (event.viewId == '5113317'){ // 来月分
        records = getMonthlyRecords(1);
    }
    var tbody = document.getElementById('kintone_tbody');

    for (var i = 0 ; i < records.length; i++) {
        var record = records[i];

        var row = tbody.insertRow(tbody.rows.length);
        var cell1 = row.insertCell(0);
        var cell2 = row.insertCell(1);
        var cell3 = row.insertCell(2);
        cell1.innerHTML = '<a title="表示する" target="_self" href="/k/' + kintone.app.getId() + '/show#record='+ record['$id']['value']+'">' + record['$id']['value'] + '</a>';
        cell2.innerHTML = record['name']['value'];
        cell3.innerHTML = record['BirthDay']['value'];
    }
}); // kintone.events.on('app.record.index.show')

})();

当たり前と言えば当たり前ですが、カスタマイズビューはkintone一覧表示の「一覧」の選択肢に入ることからkintoneのUI/UXに揃えることが出来る綺麗さがありながら、自由度が高いページ作りが出来るので、私もevent.viewIdをifで分岐する方法は良くやります。

別トピとされていましたスマホでカスタマイズビューを対応しようとすると、kintone.mobile.app.getHeaderSpaceElement関数頼りで同様に出来ないことは無いですが、既存のレコードの表示も残りますので禁じ手的なDOM操作で非表示(kintone.app.record.setFieldShownもPCのみですし)にする等の対応も必要になってきますので、悩ましい所ですね。

Ryu Yamashita様

回答ありがとうございます!
カスタマイズビューは最近知って少しいじり始めましたが、とても便利な印象です。

スマホでカスタマイズビューをやる意味があるのかと言えば微妙かもしれませんが、表示項目と取得方法を好きなように指定できるのはかなりメリットなような気がします。

例に出させていただいたがために、回答してきただきありがとうございます。
参考にさせていただきます!

Kohei Hasebeさん
スマホ対応はまだまだの所があり、一覧では「カレンダー」と「カスタマイズビュー」が対応していませんので、私も結構無理してやってたりします。一覧名だけ何もかからないような検索条件でダミーを作って、実はPCもスマホもHeaderSpace系にJSで少し書き込む方法(禁じ手で要素消したりも)ですので今となってはメンテはイマイチですが、必要な時にはやむなしといった感じです。

しかし、仰る通り私も便利な機能だと思います。私自身もTipsでもチャレンジしましたが、PCとスマホのカスタマイズのアンバランスは意外にちょっとの追加で解消出来ることもありますし、ちょっとならモバイル利便性を上げるのにやる価値もあるかなぁと思っています。

iOS系のモバイルビューであれば、こちらを参考に色々触ってみるのも面白いと思いますので、お試し頂ければと思います。
https://cybozudev.zendesk.com/hc/communities/public/questions/200769210

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。