コンテンツにスキップ

context.ResponseSet

概要

サーバスクリプトでフォームに情報を格納します。context.Addresponseのmethodパラメータに'Set'を指定した場合と同じ動作をします。

構文

context.ResponseSet(target,value)

パラメータ

パラメータ 型 概要
target string 対象の要素のIDを指定します。
value object 要素や値を指定します。

戻り値

戻り値はありません。

使用例

以下の例では、フォーム($p.data.MainForm)に以下の情報を格納します。

格納する情報

項目 値
数値A項目 123
1
2
3
context.ResponseSet('NumA',123);
// 以下と同じ動作をします。
// context.AddResponse('Set', 'NumA',123);

サンプルコード

1. 取引先の当月の受注実績から、推奨掛け率を初期値として入れる

「見積」テーブルで、取引先を選んで保存した見積を開いたとき、掛け率が空であれば、「受注実績」テーブルからその取引先の当月の受注金額の合計をitems.Sumで求め、推奨掛け率をcontext.ResponseSetで掛け率の欄に入れます。担当者は表示された値を確かめ、必要なら直して「更新」します。新規作成の画面で取引先を選んで「作成」すると、保存後に開き直した編集画面に推奨値が表示されます。

実務での使いどころ

取引先ごとの取引実績に応じて掛け率を決める見積業務で、担当者が受注実績を集計して掛け率を調べる手間と誤りを減らせます。modelに値を代入する方法では、「画面表示の前」では保存に反映されず、「更新前」では保存するまで値を確かめられません。context.ResponseSetは画面の入力欄に値を入れるため、担当者が値を確かめて直したうえで、そのまま保存できます。

事前準備

1:「受注実績」テーブルに以下の項目を有効化し、「テーブルの管理 > 全般」でサイト名に「受注実績」を設定してください。

項目コード 内容
分類A(ClassA) 取引先
数値A(NumA) 受注金額
日付A(DateA) 受注日

2:「見積」テーブルに以下の項目を有効化してください。

項目コード 内容
分類A(ClassA) 取引先(受注実績の取引先と同じ値)
数値A(NumA) 掛け率(%)

3:スクリプトを登録します。

3-1:「見積」テーブルの「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 3-2:タイトル: 任意の名前(例:responseSetRecommendedRate)
 3-3:スクリプト: 下記サンプルコードを貼り付け
 3-4:条件: 「画面表示の前」にチェック

JavaScript
// 受注実績のサイトの「サイト名」(テーブルの管理 > 全般 で設定する)
const ORDER_SITE_NAME = '受注実績';
// 当月の受注金額の合計に応じた推奨掛け率(%)。上から順に判定する
const RATE_TABLE = [
    { minAmount: 3000000, rate: 85 },
    { minAmount: 1000000, rate: 90 },
    { minAmount: 0, rate: 100 },
];
const LOG_TAG = '[responseSetRecommendedRate]';

// 当月の初日と末日を「yyyy/MM/dd」で返す
function currentMonthRange() {
    const today = new Date();
    const first = new Date(today.getFullYear(), today.getMonth(), 1);
    const last = new Date(today.getFullYear(), today.getMonth() + 1, 0);
    const format = (d) => `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;
    return { start: format(first), end: format(last) };
}

// 取引先の当月の受注金額の合計から、推奨掛け率を求める
function recommendedRate(orderSiteId, clientId) {
    const { start, end } = currentMonthRange();
    // 分類項目の絞り込みは、配列形式+ExactMatchMultipleでないと完全一致にならない
    const view = {
        View: {
            ColumnFilterHash: {
                ClassA: `["${clientId}"]`,
                DateA: `["${start} 00:00:00,${end} 23:59:59"]`,
            },
            ColumnFilterSearchTypes: { ClassA: 'ExactMatchMultiple' },
        },
    };
    const total = items.Sum(orderSiteId, 'NumA', JSON.stringify(view));
    const row = RATE_TABLE.find((r) => total >= r.minAmount);
    logs.LogInfo(`${LOG_TAG} 取引先 ${clientId} の当月の受注合計 ${total} 円 → 掛け率 ${row.rate}%`, 'recommendedRate');
    return row.rate;
}

function setRecommendedRate() {
    // 保存済みのレコードを開いたときだけ動かす(新規作成の画面では取引先がまだ選ばれていない)
    if (context.Action !== 'edit') {
        return;
    }
    // 掛け率が入っていれば何もしない(担当者が直した値を上書きしない)
    if (model.NumA) {
        return;
    }
    const clientId = model.ClassA;
    if (!clientId) {
        return;
    }
    const orderSite = items.GetClosestSite(ORDER_SITE_NAME);
    if (!orderSite) {
        logs.LogUserError(`${LOG_TAG} サイト名「${ORDER_SITE_NAME}」のサイトが見つかりません`, 'setRecommendedRate');
        return;
    }
    // 画面の掛け率の欄に、推奨値を初期値として入れる(保存は担当者が「更新」したとき)
    context.ResponseSet('NumA', recommendedRate(orderSite.SiteId, clientId));
}

setRecommendedRate();

注記

  • 新規作成の画面ではcontext.IdにサイトIDが入るため、保存済みのレコードかどうかはcontext.Actionで判定しています。
  • 新規作成の画面では掛け率が 0 になるため、0 も空として扱います。
  • 掛け率の表(RATE_TABLE)は、上から順に判定します。金額と掛け率は運用に合わせて変えてください。
2. 新規作成の画面に、自分が前回作ったレコードの値を初期値として入れる

作業日報などの新規作成の画面を開いたとき、自分が前回作ったレコードの現場名と作業区分を、画面の欄に初期値として入れます。値は作成者が「作成」したときに保存されるので、違う現場の日は書き換えて作成できます。

実務での使いどころ

同じ現場・同じ作業が何日も続く作業日報・点検記録・訪問記録で、毎日同じ値を入力する手間を省きたいときに使えます。項目の既定値は全員に同じ固定の値しか入れられません。レコードのコピーでも前回の値は引き継げますが、前回のレコードを探して開く必要があり、引き継がなくてよい項目まで写ります。

事前準備

1:「作業日報」テーブル(記録テーブル)で、以下の項目を有効化してください。

項目コード 内容
分類A(ClassA) 現場名
分類B(ClassB) 作業区分

2:スクリプトを登録します。

2-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 2-2:タイトル: 任意の名前(例:responseSetPreviousValues)
 2-3:スクリプト: 下記サンプルコードを貼り付け
 2-4:条件: 「画面表示の前」にチェック

JavaScript

条件:画面表示の前

// 前回の値を引き継ぐ項目(現場名・作業区分)
const CARRY_OVER_COLUMNS = ['ClassA', 'ClassB'];

// 新規作成の画面を開いたとき、自分が前回作ったレコードの値を初期値として入れる
function setPreviousValues() {
    if (context.Action !== 'new') {
        return;
    }
    // 自分が作ったレコードを、作成日時の新しい順に取る
    const view = {
        View: {
            ColumnFilterHash: { Creator: JSON.stringify([String(context.UserId)]) },
            ColumnSorterHash: { CreatedTime: 'desc' },
        },
    };
    const mine = Array.from(items.Get(context.SiteId, JSON.stringify(view)));
    if (mine.length === 0) {
        return;
    }
    const last = mine[0];
    for (const column of CARRY_OVER_COLUMNS) {
        if (last[column]) {
            // 画面の欄に初期値として入れる(保存は作成者が「作成」したとき)
            context.ResponseSet(column, last[column]);
        }
    }
}

setPreviousValues();

注記

  • 引き継ぐ項目は、CARRY_OVER_COLUMNSに項目名を並べて変えられます。
  • 前回のレコードは、作成者が自分のレコードのうち、作成日時が最も新しいものです。ほかの人が作ったレコードの値は入りません。
  • 保存済みのレコードを開いたときは何もしません。

関連情報