はじめに
プリザンターでは、サーバスクリプトを利用して、レコードの作成・更新・削除前に値をチェックできます。
検証結果に応じて処理を中止したい場合は、context.Error() が便利です。
ただし、標準の一括削除を対象に、選択中のレコードをまとめて検証し、条件に該当するレコードが1件でもあれば削除全体を中止する制御は、context.Error() だけでは実現できません。
一括更新やCSVインポートでは context.Error() を使って処理を抑制できますが、一括削除では削除処理を独自に組み立てる必要があります。
この記事では、一括削除の制御方法を中心に、一括更新・インポートによる一括作成・更新との違いもあわせて紹介します。
一括削除について
一括更新やCSVインポートは、更新前または作成前のサーバスクリプトで、処理対象のレコードを model から検証できます。
条件に該当した場合に context.Error() を呼び出すと、そのレコードの処理をキャンセルできます。
一方、標準の一括削除は、サーバスクリプト条件となる通常の削除とは別の扱いになっています。
そのため、選択された複数レコードを事前に確認し、「削除禁止のレコードが含まれていれば一括削除全体を中止する」という処理を、標準の一括削除ボタンに対する context.Error() だけで構成することはできません。
一括更新を制御する
一覧画面で一括更新を行うとき、特定の値を持つレコードの更新を許可したくない場合があります。
このような場合は、サーバスクリプトの条件を更新前に設定し、対象項目を model から取得します。条件に該当したら context.Error() を呼び出すことで、レコードの更新をキャンセルできます。
例:状況項目が900(完了)の場合に更新をキャンセルする
if (context.ControlId === 'BulkUpdate' && model.Status == '900') {
context.AddMessage(
`レコードID: ${model.ResultId} は状況が完了です`,
'alert-error'
);
context.Error('');
}
context.AddMessage() は画面にメッセージを表示するための処理となっており、加えて、context.Error() を呼び出すことで、更新処理を停止しています。
なお、context.Error() を呼び出しても、サーバスクリプトの処理そのものがその行で停止するわけではありません。対象レコードの処理は最後まで実行されますが、更新処理はキャンセルされます。
詳しくは以下の公式マニュアルをご確認ください。
CSVインポートを制御する
CSVインポートは、内部的にはCSVの行ごとにレコードを作成・更新する処理として実行されます。
そのため、インポートされる各行の値は、サーバスクリプトの条件を作成前・更新前に設定することで model.Status などから取得できます。値を検証し、エラーがあれば context.Error() を呼び出します。
例:状況が900(完了)の行をエラーにする
if (context.Action === 'import' && model.Status == '900') {
context.Error('状況項目が「完了」のデータがあります。');
}
context.Action === 'import' で、CSVインポートによる操作かどうかを判定しています。
インポート中にエラーが発生すると、エラーが発生したレコードの作成・更新はキャンセルされ、以降のインポート処理も実行されません。たとえば1、2、3の順にインポートし、2でエラーになった場合は、1だけが登録され、2と3は登録されません。
CSVヘッダーそのものをサーバスクリプトから取得して検査する機能はありません。必須項目の列がCSVに含まれていることを確認したい場合は、テーブル管理のインポート設定にある入力必須項目の空白をエラーにするを利用します。
詳しくは以下の公式マニュアルをご確認ください。
一括削除を制御する
一括更新やCSVインポートと同じように、標準の一括削除に対して context.Error() を設定すれば、選択したレコード全体の削除を止められるとは限りません。
特に、「選択中のレコードに削除禁止のレコードが1件でも含まれていたら、一括削除全体を中止する」という制御は、標準の一括削除ボタンと削除前のサーバスクリプトだけでは実現できません。
この場合は、次のような独自処理を実装します。
- 一覧画面に独自の一括削除ボタンを追加する
- ボタン押下時に選択中のレコードIDを取得する
-
items.Get()で各レコードを取得し、削除禁止条件を検査する - 削除禁止レコードがあれば
items.BulkDelete()を呼び出さず処理を中止する - すべてのレコードが条件を満たす場合だけ
items.BulkDelete()を実行する
例:状況項目が完了(900)のレコードを含む場合は削除しない
ボタン追加スクリプト
テーブルの管理画面でスクリプトを追加し、条件を全てに設定します。
$p.events.on_grid_load = function () {
$('#MainCommands').append(
$('<button>', {
id: 'NewButton',
class: 'button button-icon button-positive ui-button ui-corner-all ui-widget applied',
'data-action': 'GridRows',
'data-method': 'post',
onclick: '$p.send($(this));'
}).html('<span class="ui-icon ui-icon-trash"></span>一括削除')
);
};
一括削除実行サーバスクリプト
サーバスクリプトの条件を画面表示の前に設定します。siteId は対象テーブルのサイトIDに置き換えてください。
if (context.ControlId === 'NewButton') {
const siteId = {サイトID};
const ids = Array.from(grid.SelectedIds());
const undeleteIds = [];
for (const id of ids) {
const record = items.Get(id);
if (record && record[0].Status === 900) {
undeleteIds.push(id);
}
}
if (undeleteIds.length > 0) {
context.AddMessage(
`状況項目が完了のため削除を中止しました。対象ID: ${undeleteIds.join(', ')}`,
'alert-error'
);
} else if (ids.length > 0) {
const data = {
Selected: ids
};
items.BulkDelete(siteId, JSON.stringify(data));
context.AddMessage(
'削除を実行しました。',
'alert-success'
);
}
}
この例では、状況が完了のレコードが1件でも含まれている場合、削除APIを呼び出しません。そのため、選択したレコードを確認してから一括削除を実行できます。
詳しくは以下の公式マニュアルをご確認ください。
- 開発者向け機能:サーバスクリプト:items.BulkDelete
- 開発者向け機能:サーバスクリプト:context
- 開発者向け機能:サーバスクリプト:grid.SelectedIds
- 開発者向け機能:サーバスクリプト:items.Get
まとめ
一括更新・CSVインポート・一括削除では、エラー処理の考え方を分ける必要があります。
| 処理 | サーバスクリプトの条件 | 制御方法 |
|---|---|---|
| 一括更新 | 更新前 |
model を検証し、context.Error() で更新をキャンセル |
| CSVインポート | 作成前 |
model を検証し、context.Error() でインポートを中止 |
| 一括削除 | 標準の一括削除では対応が難しい | 独自ボタンで選択レコードを検証し、問題がなければ items.BulkDelete() を実行 |
context.Error() は、作成前や更新前のレコード検証には有効です。一方、一括削除全体を事前条件で制御したい場合は、削除処理を独自ボタンに置き換え、削除APIを呼び出す前に選択レコードを検査する構成が適しています。