$p.siteId
概要¶
サイトIDを取得します。
構文¶
パラメータ¶
| パラメータ名 | 型 | 必須 | 概要 |
|---|---|---|---|
| siteTitle | string | サイトのタイトル。省略できます。 |
戻り値¶
引数を省略した場合は、本メソッドを実行したサイト(フォルダ、テーブル、Wiki、ダッシュボードなど)のサイトIDを返却します。
引数を指定した場合は、本メソッドを実行したサイトと、そのサイトとリンクで結び付いたサイトのうち、タイトルが一致するサイトのサイトIDを返却します。一致するサイトが無い場合はundefinedを返却します。
使用例¶
サイトID:100のサイト「WBS」で実行した場合
// 引数を省略した場合
$p.siteId(); // 100
// 引数を指定した場合(タイトルが一致する)
$p.siteId('WBS'); // 100
// 引数を指定した場合(タイトルが一致するサイトが無い)
$p.siteId('課題管理'); // undefined
サンプルコード¶
Note
コード内の【 ... 】は適宜修正してください。
1. 「タイトル+対象日+作成者」の組み合わせによる条件付き重複チェック
このサンプルは「$p.events.before_validate」のサンプルコードにあります。
2. 取引先コードを入力すると、取引先マスタから名称・住所を自動入力する
受注管理の編集画面で取引先コードを入力すると、$p.siteId('取引先マスタ')で取引先マスタのサイトIDを名前から求め、$p.apiGetでコードが完全一致する取引先を探して、取引先名と住所を自動で入れます。取引先コードが空のとき、マスタに無いコードのときは、保存を止めてエラーメッセージを表示します。
実務での使いどころ¶
取引先が少なければ、標準の「ルックアップ」機能でプルダウンから選び、名称や住所を転記できます。ただし、取引先が数百〜数千件あるとプルダウンから探すのは難しく、伝票や他のシステムから取引先コードをそのまま入力・貼り付けしたい場面もあります。このサンプルを使うと、コードを入れれば名称と住所が入り、存在しないコードのまま保存されることもありません。
サイトIDをコードに直接書かず、$p.siteIdでタイトルから求めているので、サイトパッケージで別の環境に移しても、スクリプトを書き換えずに使えます。
事前準備¶
1:取引先マスタのテーブル(記録テーブル)に以下の項目を有効化してください。テーブルのタイトルは「取引先マスタ」にします(スクリプトのMASTER_SITE_TITLEと合わせます)。
| 項目コード | 内容 |
|---|---|
| タイトル(Title) | 取引先名 |
| 分類A(ClassA) | 取引先コード |
| 分類B(ClassB) | 住所 |
2:受注管理のテーブルに以下の項目を有効化してください。
| 項目コード | 内容 |
|---|---|
| 分類A(ClassA) | 取引先コード(選択肢一覧は設定せず、自由入力にします) |
| 分類B(ClassB) | 取引先名(自動入力) |
| 分類C(ClassC) | 住所(自動入力) |
| 分類D(ClassD) | 取引先マスタへのリンク用。選択肢一覧に[[取引先マスタのサイトID]]を設定します。$p.siteIdで使う項目のため、エディタに表示しなくて構いません |
分類B・分類Cは、項目の設定で「読取専用」にしないでください。読取専用の項目は、スクリプトで入れた値が画面に出ず、保存もされません。代わりにスクリプトが入力欄を書き換えできないようにします。
3:受注管理のテーブルにスクリプトを登録します。
3-1:「テーブルの管理 > スクリプト」タブで「新規作成」を選択する。
3-2:タイトル: 任意の名前(例:取引先の自動入力)
3-3:スクリプト: 下記サンプルコードを貼り付け
3-4:出力先:「新規作成」と「編集」にチェック
JavaScript¶
/**
* ================================================================
* サンプル 取引先コードを入力すると、取引先マスタから名称・住所を自動入力する
* ================================================================
*
* 【概要】
* 受注管理の編集画面で取引先コードを入力すると、$p.siteId('取引先マスタ') で
* 取引先マスタのサイトIDを名前から求め、$p.apiGet でコードが完全一致する
* 取引先を探して、取引先名と住所を自動で入れます。
* 取引先コードが空のとき、マスタに無いコードのときは、保存を止めて
* エラーメッセージを表示します。
*
* 【標準の「ルックアップ」との使い分け】
* 取引先が少なく、プルダウンから選べば足りる場合は、標準の「ルックアップ」を
* 使ってください。このサンプルは、取引先が数百〜数千件あってプルダウンから
* 探すのが難しい場合や、伝票などからコードをそのまま入力・貼り付けする
* 運用を想定しています。
*
* 【$p.siteId でサイトIDを求める理由】
* サイトIDをコードに直接書くと、サイトパッケージで別の環境に移したときに
* 書き換えが必要になります。$p.siteId('サイトのタイトル') は、リンクしている
* サイトのIDをタイトルから返すので、書き換えずに使えます。
* そのため、取引先マスタへのリンクを持つ項目(下の ClassD)を1つ用意します。
*
* 【照合のタイミングと保存の判定】
* 照合は、取引先コードの入力欄から離れたとき(change)と、編集画面を
* 開いたときに行います。$p.apiGet は非同期で結果が返るため、保存のときに
* 取得し直すのではなく、直近の照合結果(照合したコードと、見つかったか)を
* 覚えておき、保存の直前にその結果で判定します。
* コードを入力してすぐ保存ボタンを押すと、先に入力欄の change が発生して
* 照合が始まりますが、保存の判定の時点ではまだ結果が返っていません。
* そのときは保存をいったん止めて「照合しています」と表示し、照合が
* 成功したら自動でもう一度保存します(マスタに無ければ保存しません)。
* 照合はコードを変えたときに1回 API を呼ぶだけで、画面の再読み込み
* (ポストバック)は起きません。
*
* 【使い方】
* 受注管理テーブルに、次の項目を有効にしてください。
* ・ClassA:取引先コード(選択肢なし、自由入力)
* ・ClassB:取引先名(自動入力)
* ・ClassC:住所(自動入力)
* この2つは、項目の設定で「読取専用」にしないでください。読取専用の項目は
* $p.set で入れた値が画面に出ず、保存もされません。代わりにこのスクリプトが
* 入力欄を書き換えできないようにします。
* ・ClassD:取引先マスタへのリンク用。選択肢一覧に [[取引先マスタのサイトID]]
* を設定する。$p.siteId のためだけの項目なので、画面に出さなくてよい
* 取引先マスタは、Title=取引先名、ClassA=取引先コード、ClassB=住所 とします。
* スクリプトの出力先は「新規作成」と「編集」にチェックしてください。
* ================================================================
*/
// ===== 設定 =====
// 取引先マスタのタイトル($p.siteId でサイトIDを求めるのに使う)
const MASTER_SITE_TITLE = '取引先マスタ';
// 受注管理の項目
const CODE_COLUMN = 'ClassA'; // 取引先コード
const NAME_COLUMN = 'ClassB'; // 取引先名(自動入力)
const ADDRESS_COLUMN = 'ClassC'; // 住所(自動入力)
// 取引先マスタの項目
const MASTER_CODE_COLUMN = 'ClassA'; // 取引先コード
const MASTER_NAME_COLUMN = 'Title'; // 取引先名
const MASTER_ADDRESS_COLUMN = 'ClassB'; // 住所
// ===== 処理 =====
// 直近の照合結果。code が今の取引先コードと同じで、ok が true のときだけ保存できる。
// pending は照合の結果待ち
let lookupResult = { code: null, ok: false, pending: false, message: '' };
// 照合の結果待ちの間に保存ボタンが押されたか(照合が成功したら保存し直す)
let saveAfterLookup = false;
function showError(text) {
$p.clearMessage();
$p.setMessage('#Message', JSON.stringify({ Css: 'alert-error', Text: text }));
}
function currentCode() {
return String($p.getValue(CODE_COLUMN) || '').trim();
}
// 取引先コードで取引先マスタを探し、見つかれば取引先名・住所を入れる
function lookupPartner() {
const code = currentCode();
if (code === '') {
lookupResult = { code: '', ok: false, pending: false, message: '取引先コードを入力してください。' };
return;
}
// リンクしているサイトのIDを、タイトルから求める(見つからなければ 0 などの偽の値)
const masterSiteId = $p.siteId(MASTER_SITE_TITLE);
if (!masterSiteId) {
lookupResult = {
code: code,
ok: false,
pending: false,
message: `「${MASTER_SITE_TITLE}」のサイトIDを取得できません。リンクの設定を確認してください。`,
};
showError(lookupResult.message);
return;
}
// 結果が返るまでは「照合中」として、保存を止める
lookupResult = { code: code, ok: false, pending: true, message: '' };
$p.apiGet({
id: masterSiteId,
data: {
View: {
ApiDataType: 'KeyValues',
ApiColumnKeyDisplayType: 'ColumnName',
GridColumns: [MASTER_CODE_COLUMN, MASTER_NAME_COLUMN, MASTER_ADDRESS_COLUMN],
// 指定しないと部分一致になるため、完全一致(ExactMatch)を指定する
ColumnFilterHash: { [MASTER_CODE_COLUMN]: code },
ColumnFilterSearchTypes: { [MASTER_CODE_COLUMN]: 'ExactMatch' },
},
},
done: function (data) {
// 照合の途中でコードが書き換えられていたら、この結果は使わない
if (currentCode() !== code) {
return;
}
const partner = (data.Response.Data || [])[0];
if (!partner) {
lookupResult = {
code: code,
ok: false,
pending: false,
message: `取引先コード「${code}」は${MASTER_SITE_TITLE}にありません。`,
};
saveAfterLookup = false;
$p.set($p.getControl(NAME_COLUMN), '');
$p.set($p.getControl(ADDRESS_COLUMN), '');
showError(lookupResult.message);
return;
}
$p.set($p.getControl(NAME_COLUMN), partner[MASTER_NAME_COLUMN]);
$p.set($p.getControl(ADDRESS_COLUMN), partner[MASTER_ADDRESS_COLUMN]);
lookupResult = { code: code, ok: true, pending: false, message: '' };
$p.clearMessage();
if (saveAfterLookup) {
// 照合の結果待ちの間に押された保存を、もう一度行う
saveAfterLookup = false;
$('#CreateCommand, #UpdateCommand').first().click();
}
},
fail: function () {
if (currentCode() !== code) {
return;
}
lookupResult = {
code: code,
ok: false,
pending: false,
message: `${MASTER_SITE_TITLE}を照合できませんでした。時間をおいてもう一度試してください。`,
};
saveAfterLookup = false;
showError(lookupResult.message);
},
});
}
// 編集画面を開いたとき:入力済みのコードを照合しておく(既存のレコードを保存できるように)
$p.events.on_editor_load = function () {
// 自動入力する項目は、利用者が書き換えられないようにする
$p.getControl(NAME_COLUMN).prop('readonly', true);
$p.getControl(ADDRESS_COLUMN).prop('readonly', true);
// 名前空間(.lookupPartner)を付けて、二重に登録されないようにする
$p.getControl(CODE_COLUMN).off('change.lookupPartner').on('change.lookupPartner', lookupPartner);
lookupPartner();
};
// 保存の直前:直近の照合結果が今のコードのもので、見つかっていれば保存する
$p.events.before_validate_Create = $p.events.before_validate_Update = function () {
const code = currentCode();
if (code === '') {
showError('取引先コードを入力してください。');
return false;
}
if (lookupResult.code !== code || lookupResult.pending) {
// 照合の結果待ち(または、まだ照合していない)。照合が成功したら保存し直す
if (lookupResult.code !== code) {
lookupPartner();
}
saveAfterLookup = true;
showError('取引先コードを照合しています。照合が終わると自動で保存します。');
return false;
}
if (!lookupResult.ok) {
showError(lookupResult.message);
return false;
}
return true;
};
注意点¶
$p.siteId('タイトル')は、そのテーブルとリンクしているテーブルの中から、タイトルでサイトIDを探します。リンクが無いと見つからないため、手順2の分類Dでリンクを設定しています。見つからないときは、保存を止めてメッセージを表示します。- 取引先コードは完全一致で探します(
ColumnFilterSearchTypesにExactMatchを指定)。指定しないと部分一致になり、「P001」で「P0011」が見つかることがあります。 - 照合は、取引先コードの入力欄から離れたときと、編集画面を開いたときに、
$p.apiGetを1回呼ぶのみです。画面の再読み込みは起きません。 - コードを入力してすぐ保存ボタンを押した場合は、照合が終わるまで保存をいったん止め、「照合しています」と表示します。照合が成功すると自動で保存します。
