コンテンツにスキップ

$p.selectedIds

概要

一覧画面でチェックを入れた対象レコードのIDの配列を取得するメソッドに関する説明です。

構文

JavaScript
$p.selectedIds();

使用例

  1. テーブルの管理画面のスクリプトタブより出力先を一覧として以下を設定します。
JavaScript
$p.events.before_send_OpenExportSelectorDialogCommand = function (args) {
    console.log($p.selectedIds());
}
  1. 一覧画面で任意のレコードにチェックを入れます。
  2. エクスポートボタンを押下します。
結果

一覧画面でチェックを入れた対象レコードのIDの配列が取得されます。

[
    11111,
    33333,
    55555
]

サンプルコード

1. 一覧で選んだ受注から、出荷指示をまとめて作成する

受注管理の一覧画面に「まとめて出荷指示」ボタンを追加します。受注を選んでボタンを押すと、$p.selectedIds()で選んだレコードのIDを取得し、出荷管理のテーブルへ出荷指示を1件ずつ作成します。出荷指示を作成できた受注は、状況を「出荷指示済み」に変えます。最後に、作成できた件数・できなかった件数を表示します。

実務での使いどころ

受注から出荷指示、入庫予定から検収、製造指示から工程のように、選んだ複数のレコードから、別のテーブルに関連するレコードをまとめて作りたい場面に使えます。一覧画面の一括更新は、選んだレコード自身の項目を書き換える機能で、別のテーブルにレコードを作ることはできません。作成先のテーブルのタイトルと、写す項目を変えれば、ほかの「選んで、まとめて作る」場面に使えます。

事前準備

1:「出荷管理」テーブル(記録テーブル)を作成し、以下の項目を有効化してください。

項目コード 内容
分類A(ClassA) 元の受注のID
数値A(NumA) 数量
日付A(DateA) 出荷予定日

2:「受注管理」テーブル(記録テーブル)で、以下の項目を有効化してください。

項目コード 内容
数値A(NumA) 数量
日付A(DateA) 納期
状況(Status) 選択肢一覧に「300,出荷指示済み」を追加
分類B(ClassB) 出荷管理へのリンク用。選択肢一覧に[[出荷管理のサイトID]]を設定。$p.siteId('出荷管理')でサイトIDを求めるために使う

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

3-1:「受注管理」テーブルの「テーブルの管理 > スクリプト」タブで「新規作成」を選択する。
 3-2:タイトル: 任意の名前(例:まとめて出荷指示)
 3-3:スクリプト: 下記サンプルコードを貼り付け
 3-4:出力先:「すべて」のチェックを外し、「一覧」にチェック

JavaScript
/**
 * ================================================================
 * サンプル  一覧で選んだ受注から、出荷指示をまとめて作成する
 * ================================================================
 *
 * 【概要】
 *   受注管理の一覧画面に「まとめて出荷指示」ボタンを追加します。受注を選んで
 *   ボタンを押すと、$p.selectedIds() で選んだレコードのIDを取得し、出荷管理の
 *   テーブルへ出荷指示を1件ずつ作成します。作成できた受注は、状況を
 *   「出荷指示済み」に変えます。最後に、作成できた件数・できなかった件数を
 *   表示します。
 *
 * 【使い方】
 *   出力先:一覧
 *   出荷管理のテーブルへのリンク(選択肢一覧に [[出荷管理のサイトID]])を
 *   受注管理の分類項目に設定しておくと、$p.siteId('出荷管理') でサイトIDを
 *   求められます。
 * ================================================================
 */

// 出荷指示を作成するテーブルのタイトル
const SHIPMENT_SITE_TITLE = '出荷管理';
// 出荷指示を作成した受注の状況(状況の選択肢に「300,出荷指示済み」を用意する)
const SHIPPED_STATUS = 300;

// 前のメッセージを消してから表示する
function showMessage(css, text) {
    $p.clearMessage();
    $p.setMessage('#Message', JSON.stringify({ Css: css, Text: text }));
}

// 一覧画面のコマンドボタンの並びに「まとめて出荷指示」を追加する
$p.events.on_grid_load = function () {
    if ($('#CreateShipmentsCommand').length > 0) {
        return;
    }
    $('#MainCommands').append(
        $('<button type="button" id="CreateShipmentsCommand" class="button button-icon ui-button ui-corner-all ui-widget applied">')
            .html('<span class="ui-button-icon ui-icon ui-icon-arrowreturnthick-1-e"></span>まとめて出荷指示')
            .on('click', createShipments)
    );
};

function createShipments() {
    // ボタンを押した時点で選ばれているレコードのID
    const selectedIds = $p.selectedIds();
    if (!selectedIds || selectedIds.length === 0) {
        showMessage('alert-warning', '出荷指示を作成する受注を選んでください。');
        return;
    }
    const shipmentSiteId = $p.siteId(SHIPMENT_SITE_TITLE);
    if (!shipmentSiteId) {
        showMessage('alert-error', `「${SHIPMENT_SITE_TITLE}」のサイトIDを取得できません。リンクの設定を確認してください。`);
        return;
    }
    // 選んだ受注を、IDの配列で1回にまとめて取得する(1件ずつ取得しない)
    $p.apiGet({
        id: $p.siteId(),
        data: {
            View: {
                ColumnFilterHash: { ResultId: JSON.stringify(selectedIds.map(String)) },
            },
        },
        done: function (data) {
            createForEach(shipmentSiteId, data.Response.Data);
        },
        fail: function () {
            showMessage('alert-error', '選んだ受注を取得できませんでした。');
        },
    });
}

// 受注1件ごとに出荷指示を作成する。作成は並行して進み、終わる順は決まっていないため、
// 終わった件数を数えて、全件終わってから受注の状況をまとめて変える
function createForEach(shipmentSiteId, orders) {
    const created = [];
    let finished = 0;
    const onFinished = function () {
        finished++;
        if (finished === orders.length) {
            updateOrders(created, orders.length);
        }
    };
    orders.forEach(function (order) {
        $p.apiCreate({
            id: shipmentSiteId,
            data: {
                Title: `${order.Title} の出荷指示`,
                ClassHash: { ClassA: String(order.ResultId) },
                NumHash: { NumA: order.NumHash.NumA },
                DateHash: { DateA: order.DateHash.DateA },
            },
            done: function () {
                created.push(order.ResultId);
                onFinished();
            },
            fail: onFinished,
        });
    });
}

// 出荷指示を作成できた受注のみ、状況を「出荷指示済み」に変える
function updateOrders(createdIds, total) {
    const failedCount = total - createdIds.length;
    if (createdIds.length === 0) {
        showMessage('alert-error', `出荷指示を作成できませんでした(${failedCount}件)。`);
        return;
    }
    let finished = 0;
    createdIds.forEach(function (id) {
        $p.apiUpdate({
            id: id,
            data: { Status: SHIPPED_STATUS },
            always: function () {
                finished++;
                if (finished === createdIds.length) {
                    const css = failedCount === 0 ? 'alert-success' : 'alert-warning';
                    showMessage(css, `出荷指示を${createdIds.length}件作成しました(作成できなかった受注:${failedCount}件)。画面を再読み込みすると、状況が反映されます。`);
                }
            },
        });
    });
}

注記

  • 出荷指示の作成は並行して進み、終わる順は決まっていません。終わった件数を数え、全件終わってから受注の状況を変えています。
  • 出荷指示を作成できなかった受注の状況は変えません。
  • 選んだ受注は1回にまとめて取得します。1回に取得できる件数(既定は200件)を超えて選んだ場合、超えた分は処理されません。
  • 処理のあと、受注の状況は画面を再読み込みすると表示に反映されます。

対応バージョン

対応バージョン 内容
1.2.14.0 以降 機能追加

関連情報