context.ResponseSet
概要¶
サーバスクリプトでフォームに情報を格納します。context.Addresponseのmethodパラメータに'Set'を指定した場合と同じ動作をします。
構文¶
パラメータ¶
| パラメータ | 型 | 概要 |
|---|---|---|
| target | string | 対象の要素のIDを指定します。 |
| value | object | 要素や値を指定します。 |
戻り値¶
戻り値はありません。
使用例¶
以下の例では、フォーム($p.data.MainForm)に以下の情報を格納します。
格納する情報
| 項目 | 値 |
|---|---|
| 数値A項目 | 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)は、上から順に判定します。金額と掛け率は運用に合わせて変えてください。
