コンテンツにスキップ

$p.siteId

概要

サイトIDを取得します。

構文

$p.siteId(siteTitle)

パラメータ

パラメータ名 型 必須 概要
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回呼ぶのみです。画面の再読み込みは起きません。
  • コードを入力してすぐ保存ボタンを押した場合は、照合が終わるまで保存をいったん止め、「照合しています」と表示します。照合が成功すると自動で保存します。