関連レコードの設定に フィールド上の日付項目を設定したい(等しいではなく、以上)

お助け下さい。よろしくおねがいします。

関連レコード一覧の設定で、

表示するレコードの条件
社員名=社員名

さらに絞り込む条件
取得日 >= フィールド上の「処理日」
(フィールド上の「処理日」日以降の日付)
を指定したいです。

日付のフィールドでは、選択できないのかと考え、
「DATE_FORMAT(取得日, “YYYY-MM-dd”, “Etc/GMT”)」
にて文字列に変換した項目も作成しましたが、
「等しい」は選択できても「以降」が設定できませんでした。

関連レコードの事態をJavaScriptで設定するしかないのでしょうか。

設定した関連レコードの合計値を表示したりは

JavaScriptで設定できたのですが、関連レコードの設定自体も、

JavaScriptで設定できるのでしょうか。

よろしくお願いします。

 

今開いているレコードのフィールドの値と比較するような関連レコードは標準機能では難しいです。

JavaScriptカスタマイズであれば、複数のレコードを取得するを使って、クエリに

'社員名 = "' + event.record['社員名'].value + '" and 取得日 >= "' + event.record['処理日'].value + '"'

こんな感じで指定すればご希望のレコードが取得できるかと思います。それを使って合計なりテーブルなり描画する必要がありますが。

mls-hashimoto様

比較する関連レコードは、標準機能では難しいとのこと。

ご教示ありがとうござます。

データの取得クエリも挙げて頂きありがとうございます。

そのような中、大変申し訳ないのですが、

そのデータを関連レコードに入れ込む部分もご教示願えないでしょうか。

挙げて頂いたサイト上の、

 fields: [‘レコード番号’, ‘作成日時’, ‘ドロップダウン’]の部分で

データを入れ込んでいるのでしょうか。

関連レコードの場合、1つの値(合計値)を代入するのと違い、

もともと設定している項目に列名を指定して当てはめていく必要があるのでしょうか。

未熟過ぎて、申し訳ないです。宜しくお願いします。

 

つかさ さま

関連レコードにデータを入れ込むとありますが、関連レコード一覧を使うのではなく、REST APIでレコードの取得をし、その返り値を使って「関連レコードと同じようなテーブルを新たにhtmlで描画」する必要があります。関連レコードの設定を変えることはできないので、同等の機能をJavaScriptで自作するという意味です。そのため、強いて使うとしたら関連レコード一覧ではなくid付きのスペースですね。

リクエストボディのfieldsはREST APIで取得するフィールド(少なくするほど処理が早くなる)の配列で、テーブルの描画とはあまり関係ないです。

 

「設定した関連レコードの合計値を表示したりはJavaScriptでできた」とのことで、それを理解していてできるなら簡単にできるはずです。合計を表示するのも、関連レコードと同じクエリを作成してAPIを実行し、返り値の計算をしているだけなので、やっていることは同じようなものです。

…恐らく、江田さんの作られた集計コンストラクタ等をコピペして「できた」ということであれば、言わない方がいいです。こちらもその内容を理解できる前提で話をしますので。

 

試しに簡単に作ってみましたが、イメージとして以下のような感じになりそうです。width等の細かい装飾は調整する必要があるのと、添付ファイルは大変なので対応させていないです。またガッツリkintoneのクラス名を使用したDOM操作になるので、kintone側のデザインのアップデートに合わせて変えなければならないのはご了承下さい(本当なら51-modern-defaultを使わなければならないです)。

(() => {
    'use strict';

    let spaceId = 'SPACE'; // スペースID
    let dateField = '取得日'; // 取得日のフィールドコード
    let nameField = '社員名'; // 社員名のフィールドコード
    let appId = 201; // 関連レコードで参照するアプリのID
    let referenceFields = ['フィールド1', 'フィールド2', 'フィールド3']; // 表示したいフィールドを表示順

    kintone.events.on([
        'app.record.detail.show', 'app.record.edit.show',
        `app.record.create.change.${dateField}`, `app.record.edit.change.${dateField}`,
        `app.record.create.change.${nameField}`, `app.record.edit.change.${nameField}`
    ], (event) => {
        let record = event.record;
        let space = kintone.app.record.getSpaceElement(spaceId);
        space.innerHTML = '';

        if (record[dateField].value && record[nameField].value) {
            let getRecordsParam = {
                app: appId,
                query: `社員名 = "${record[nameField].value}" and 取得日 >= "${record[dateField].value}"`,
                fields: referenceFields.concat('$id')
            };

            kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', getRecordsParam, (resp) => {
                let table = document.createElement('table');
                table.classList.add('subtable-gaia', 'reference-subtable-gaia');

                let firstTr = document.createElement('tr');

                referenceFields.forEach((field, index) => {
                    let th = document.createElement('th');
                    th.className = 'subtable-label-gaia';
                    let thSpan = document.createElement('span');
                    thSpan.className = 'subtable-label-inner-gaia';

                    if (index === 0) {
                        let firstTh = th.cloneNode(false);
                        let firstThSpan = document.createElement('span');
                        firstTh.appendChild(firstThSpan);
                        firstTr.appendChild(firstTh);
                    }

                    thSpan.innerHTML = field;
                    th.appendChild(thSpan);
                    firstTr.appendChild(th);
                });

                table.appendChild(firstTr);

                resp.records.forEach((record) => {
                    let tr = document.createElement('tr');

                    referenceFields.forEach((field, index) => {
                        let td = document.createElement('td');
                        let tdDiv = document.createElement('div');
                        tdDiv.classList.add('control-gaia', 'control-horizon-gaia', 'control-show-gaia');

                        if (index === 0) {
                            let firstTd = td.cloneNode(false);
                            firstTd.classList.add('listTable-actionCell-gaia', 'listTale-action-show-gaia');
    
                            let a = document.createElement('a');
                            a.href = `/k/${appId}/show#record=${record['$id'].value}`;
                            a.setAttribute('target', '_blank');
    
                            let span = document.createElement('span');
                            span.classList.add('show-image-gaia', 'image-link-gaia');
                            span.textContent = 'レコードの詳細を表示する';
    
                            a.appendChild(span);
                            firstTd.appendChild(a);
                            tr.appendChild(firstTd);
                        }

                        switch(record[field].type) {
                            case 'SUBTABLE':
                            case 'FILE':
                                break;
                            case 'CHECK_BOX':
                            case 'MULTI_SELECT':
                                tdDiv.innerHTML = record[field].value.join(' ');
                                break;
                            case 'USER_SELECT':
                            case 'ORGANIZATION_SELECT':
                            case 'GROUP_SELECT':
                            case 'STATUS_ASSIGNEE':
                                tdDiv.innerHTML = record[field].value.map((user) => user.name).join(' ');
                                break;
                            case 'CREATOR':
                            case 'MODIFIER':
                                tdDiv.innerHTML = record[field].value.name;
                                break;
                            default:
                                tdDiv.innerHTML = record[field].value || '';

                        };
                        td.appendChild(tdDiv);
                        tr.appendChild(td);
                    });

                    table.appendChild(tr);
                });

                space.appendChild(table);
            }, (error) => {
                console.error(error);
            });
        }

        return event;
    });
})();

mls-hashimoto様

ソースコードありがとうございます。

>…恐らく、江田さんの作られた集計コンストラクタ等をコピペして「できた」ということであれば、言わない方がいいです。こちらもその内容を理解できる前提で話をしますので。

→大変申し訳ございません。

頂いた内容をコピペではなく理解し、もっと精進するよう努めます。

本当にありがとうございました。

つかさ さま

謝る必要はありません。言葉が悪かったです。申し訳ありません。ここは元々技術者同士で交流する場なので(よくサポートと勘違いされるので、今では未経験者がいきなり答えを得ようと質問をする場になっていますが…)、どの程度習熟されているか分からない場合は相手が技術者である前提での受け答えをせざるを得ない、という感じです。

私も非エンジニアで右も左も分からないところからスタートしている身なので、今後のご活躍を応援しております。

 

コードの補足を忘れていたんですが、REST APIによるレコードの取得は何も指定しないと100件が上限になるので、不都合がある場合はクエリにlimit 500等を指定すれば500件まで増やせます(関連レコードフィールドと違ってページネーションを指定する機能を入れていないので500件も取得したら大変なことになりますが…)。それ以上のレコードを取得する場合、いろんな方法がありますが@kintone-rest-api-clientというものがあり、そちらを使うと便利かと思います。

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