レコードを一括更新する方法
このガイドでは、Sankaでレコードを効率的に一括更新する方法(UIからの手順と、内部で何が起きているか)を解説します。
一括更新を使う場面
- 多数のレコードをまとめて変更したい(例:ステータス、担当者、期日など)
 - 監査ログや関連付けを崩さずに大量データを修正したい
 - 選択数が多い場合に、処理をバックグラウンドにオフロードして待ち時間を減らしたい
 
UIからの手順
- 対象のオブジェクト(Contacts、Companies、Items、Orders、Invoicesなど)の一覧画面を開きます
 - 絞り込み後、更新したいレコードを選択します
 - 「Bulk Action」→「Update Value」を選択します
 - 変更するフィールドと値を入力し、実行します
選択数に応じて、Sankaは自動的にインライン処理かバックグラウンド処理かを判断します。

 
仕組み(内部動作)
Sankaは一括更新の処理を再利用可能な関数に集約しており、UIからの実行とバックグラウンド処理のどちらでも同じロジックが使われます。
- 中核関数: data/object.py:51 の _apply_update_value_bulk(...)
- オブジェクト種別ごとのフィールドマッピング(例:Contactのfirst_name→name)
- タイムゾーン考慮のうえで日付・日時をパース
- update_fieldsを指定して保存し、ログを残しつつ高速に更新
- Invoices/Orders/Estimates/Items の顧客関連付けを更新
- 選択数しきい値によるバックグラウンド化: data/object.py:1038
- BULK_UPDATE_ASYNC_THRESHOLD を超える場合はHatchetジョブにエンキュー
- UIには「一括更新ジョブを開始」のメッセージを表示
- シグナルとログ
- 請求書向けの一括更新シグナル: data/invoice/signal/invoice_trigger_workflow.py:293
- 汎用の一括更新後シグナル: data/signals.py:188
- 監査用の履歴を書き、必要に応じて再計算が走ります
例:複数の請求書の期日を変更
UI操作:
1. Invoicesの一覧で対象をフィルタ
1. すべて選択 → Bulk Action → Update Value
1. Due date に新しい日付を入力
1. 実行
内部では:
- 選択IDと変更フィールドが集約されます
- 大量更新の場合は自動でバックグラウンドにエンキュー
- _apply_update_value_bulk が入力値を適切な型に変換し、変更があったフィールドのみ保存
- 必要に応じて請求書合計や関連付けを更新
Tips
- 一括更新前にフィルタを使って対象を絞り込みましょう
 - 日付はローカライズされた形式(例:
2025年11月01日)でも入力可能 — Sankaが正規化します - Ordersで顧客を変更する場合、関連付けも自動的に同期されます
 
トラブルシューティング
- 変更されない場合は、そのオブジェクト種別で編集可能なフィールドか確認してください
 - 非常に大きな更新はバックグラウンドで実行されます。履歴でジョブ状況を確認してください
 - カスタムオブジェクト/カスタムプロパティは、更新可能な型であることを確認してください