iDempiere ロット管理の使い方|在庫管理 操作マニュアル・技術仕様
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
ロット管理は、品目のロット番号を自動採番するためのルールを定義するマスタです。開始番号・増加数・接頭辞・接尾辞を設定しておくと、属性セットインスタンス作成時に 接頭辞 + 番号 + 接尾辞 の形式でロットが自動生成されます。
📌 ポイント: ロット管理は単体では動作しません。属性セットの「ロット管理」フィールドにこのマスタを設定して初めて自動採番が有効になります。
ロット管理でできること
Section titled “ロット管理でできること”- ロット番号の自動採番ルールの定義(開始番号・増加数・次の番号)
- 接頭辞・接尾辞によるロット番号の書式指定(各10文字以内)
- 採番の現在値(次の番号)の確認・手動調整
- 除外タブによる、特定テーブル・特定取引区分でのロット生成の抑止
- 複数の採番ルールを用途別(製品群別・工場別など)に併存管理
ロット管理は 2 タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| ロット管理 | M_LotCtl | 10項目 | 採番ルール本体(番号・接頭辞・接尾辞) |
| 除外 | M_LotCtlExclude | 6項目 | ロット生成を除外するテーブル・取引区分 |
💡 ヒント: 「除外」タブの内容はキャッシュされます。設定を変更しても即座に反映されない場合は、再ログインするかキャッシュをリセットしてください(リファレンスページの記載どおりの仕様です)。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚀 メニューから開く<br/>在庫管理 > 品目属性管理 > ロット管理"] --> B["➕ 新規ボタンをクリック"]
B --> C["🏷 名称を入力<br/>(必須)"]
C --> D["🔢 採番設定を入力<br/>開始番号 / 増加数 / 次の番号"]
D --> E["✍ 必要なら接頭辞・接尾辞を設定<br/>(各10文字以内)"]
E --> F["💾 保存"]
F --> G["🔗 属性セットの<br/>「ロット管理」に設定"]
G --> H{特定画面で<br/>ロット生成を抑止する?}
H -->|する| I["🚫 除外タブで<br/>テーブル + 販売/購買区分を登録"]
H -->|しない| J["✅ 設定完了"]
I --> K["🔄 再ログイン or キャッシュリセット"]
K --> J
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「在庫管理 > 品目属性管理 > ロット管理」を開きます。
- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 名称: 採番ルールの名称(60文字以内)
- 開始番号: 採番の開始値(既定値
100) - 増加数: 1 回の採番で加算する値(既定値
1) - 次の番号: 次に払い出される番号(既定値
100)
- 必要に応じて任意項目を入力:
- 接頭辞: 番号の前に付ける文字列(10文字以内、例:
LOT-) - 接尾辞: 番号の後に付ける文字列(10文字以内、例:
-A) - 説明: 補足説明
- 接頭辞: 番号の前に付ける文字列(10文字以内、例:
- 「保存」をクリック
- 属性セットを開き、「ロット」を有効にしたうえで「ロット管理」に本レコードを設定
除外設定(ロット生成の抑止)
Section titled “除外設定(ロット生成の抑止)”- 「除外」タブに移動
- 「新規」をクリックして以下を登録:
- テーブル: 除外対象のテーブル(例: 受注明細・出荷明細など)
- 販売(ON) / 購買(OFF): 対象とする取引区分
- 「保存」をクリック
- 設定はキャッシュされるため、再ログインまたはキャッシュリセットを実施
⚠️ 注意: 「次の番号」(
CurrentNext)を手動で小さい値に戻すと、既存ロットと同じ番号が再度払い出される可能性があります。運用開始後は原則として変更しないでください。
項目リファレンス
Section titled “項目リファレンス”ロット管理タブ
Section titled “ロット管理タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント(既定値 @#AD_Client_ID@) |
| 組織 | 必須 | 選択 | 組織(既定値 @#AD_Org_ID@) |
| 名称 | 必須 | 文字列(60) | 採番ルールの名称 |
| 説明 | - | 文字列(255) | 補足説明 |
| 開始番号 | 必須 | 整数 | 採番の開始値(既定値 100) |
| 増加数 | 必須 | 整数 | 加算値(既定値 1) |
| 次の番号 | 必須 | 整数 | 次に払い出す番号(既定値 100) |
| 接頭辞 | - | 文字列(10) | 番号の前に付ける文字列 |
| 接尾辞 | - | 文字列(10) | 番号の後に付ける文字列 |
| 有効 | - | チェック | レコードが有効か(既定値 Y) |
| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| ロット管理 | 必須 | 選択 | 親レコードへの参照 |
| テーブル | 必須 | 選択 | ロット生成を除外するテーブル |
| 販売(ON) / 購買(OFF) | 必須 | チェック | 対象とする取引区分 |
| 有効 | 必須 | チェック | レコードが有効か |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. ロット番号はどのような形式で生成されますか?
Section titled “Q. ロット番号はどのような形式で生成されますか?”MLotCtl.createLot() が 接頭辞 + 次の番号(CurrentNext) + 接尾辞 の順に文字列を連結します。接頭辞・接尾辞が未設定の場合は数値のみになります。例えば接頭辞 LOT-、次の番号 100、接尾辞なしなら LOT-100 が生成され、CurrentNext は増加数だけ進みます。
Q. 同時に複数のユーザーがロットを生成しても番号が重複しませんか?
Section titled “Q. 同時に複数のユーザーがロットを生成しても番号が重複しませんか?”重複しません。MLotCtl.createLot() は CurrentNext カラムに対して楽観的ロック(set_OptimisticLockingColumns + set_UseOptimisticLocking(true))を設定し、競合時はトランザクションのセーブポイントまでロールバックして最大 3 回リトライします。
Q. 「除外」タブは何のために使いますか?
Section titled “Q. 「除外」タブは何のために使いますか?”ロット管理が設定された属性セットであっても、特定のテーブル(画面)・特定の取引区分ではロットを作成させたくない場合に登録します。判定は MAttributeSet.isExcludeLot(AD_Column_ID, isSOTrx) で行われ、除外対象と一致する場合はロット入力・生成が抑止されます。
Q. 採番ルールを複数作る必要はありますか?
Section titled “Q. 採番ルールを複数作る必要はありますか?”必須ではありません。製品群ごと・工場ごとに接頭辞を分けたい場合など、書式を分けたい単位でレコードを作成し、それぞれを別の属性セットに紐づけてください。1 つの属性セットに設定できるロット管理は 1 件です。
🛠 技術仕様(開発者向け)
ロット管理はマスタデータ型のウィンドウ(AD_Window_ID: 258)で、親テーブル M_LotCtl(アクセスレベル 3)と子テーブル M_LotCtlExclude(アクセスレベル 2)で構成されます。MLotCtl クラス(156行)が採番処理 createLot() を、MLotCtlExclude クラス(99行)が除外定義を担当します。Document 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MLotCtl {
+createLot(M_Product_ID) MLot
}
class MLotCtlExclude {
<<exclude rule>>
}
class X_M_LotCtl {
<<generated>>
}
class PO {
<<abstract>>
}
MLotCtl --|> X_M_LotCtl
X_M_LotCtl --|> PO
MLotCtl --> MLot : creates
MLotCtl --> MLotCtlExclude : has many
MAttributeSet --> MLotCtl : uses
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MLotCtl.java、org.adempiere.base/src/org/compiere/model/MLotCtlExclude.java
関連DBテーブル
Section titled “関連DBテーブル”M_LotCtl(ロット管理)
Section titled “M_LotCtl(ロット管理)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_LotCtl_ID | ID | PK | ロット管理ID | 主キー |
| AD_Client_ID | Table Direct | Y | クライアント | 既定値 @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | 既定値 @#AD_Org_ID@ |
| Name | String(60) | Y | 名称 | 識別子カラム |
| Description | String(255) | N | 説明 | |
| StartNo | Integer | Y | 開始番号 | 既定値 100 |
| IncrementNo | Integer | Y | 増加数 | 既定値 1 |
| CurrentNext | Integer | Y | 次の番号 | 既定値 100・楽観的ロック対象 |
| Prefix | String(10) | N | 接頭辞 | |
| Suffix | String(10) | N | 接尾辞 | |
| IsActive | Yes-No | Y | 有効 | 既定値 Y |
M_LotCtlExclude(除外)
Section titled “M_LotCtlExclude(除外)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_LotCtlExclude_ID | ID | PK | 除外ID | 主キー |
| M_LotCtl_ID | Table Direct | Y | ロット管理 | 親(IsParent=Y) |
| AD_Table_ID | Table Direct | Y | テーブル | 除外対象テーブル |
| IsSOTrx | Yes-No | Y | 販売取引 | 販売=Y / 購買=N |
| IsActive | Yes-No | Y | 有効 |
erDiagram
M_LotCtl ||--o{ M_LotCtlExclude : "exclusions"
M_LotCtl ||--o{ M_Lot : "generates"
M_AttributeSet }o--o| M_LotCtl : "lot numbering"
M_LotCtlExclude }o--|| AD_Table : "excluded table"
ビジネスロジック
Section titled “ビジネスロジック”createLot(int M_Product_ID)
Section titled “createLot(int M_Product_ID)”MLotCtl.createLot() はロットの自動採番と M_Lot レコード生成を 1 メソッドで行います。
flowchart TD
A["createLot(M_Product_ID)"] --> B["CurrentNext を楽観的ロック対象に設定"]
B --> C["最大3回のリトライループ開始"]
C --> D["load() で最新値を再読込"]
D --> E["トランザクションが有れば<br/>セーブポイントを設定"]
E --> F["名称を組立<br/>Prefix + CurrentNext + Suffix"]
F --> G["CurrentNext += IncrementNo<br/>saveEx()"]
G --> H{保存成功?}
H -->|Yes| I["MLot を生成して saveEx()<br/>→ 返却"]
H -->|No(競合)| J["セーブポイントまで rollback<br/>→ 再試行"]
J --> C
処理の要点:
set_OptimisticLockingColumns(new String[]{COLUMNNAME_CurrentNext})でCurrentNextを競合検知の対象に指定- ループ内で毎回
this.load(get_TrxName())を実行し、他トランザクションの更新を取り込む Prefix/Suffixは null 許容で、設定されている場合のみ連結- 採番後に
MLot(this, M_Product_ID, name)を生成しsaveEx() - 競合(
RuntimeException)時はセーブポイントへロールバックして再試行
除外の判定は MAttributeSet 側のメソッドで行われます。
| メソッド | 説明 |
|---|---|
MAttributeSet.isExcludeLot(AD_Column_ID, isSOTrx) | ロット入力・生成の除外判定 |
MAttributeSet.excludeTableEntry(AD_Table_ID, isSOTrx) | 属性セット自体の入力除外判定 |
⚠️ 注意: 除外定義は属性セットのキャッシュ経由で参照されます。
M_LotCtlExcludeを変更した後は、再ログインまたはキャッシュリセットを行わないと旧設定のまま動作します。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”M_LotCtl / M_LotCtlExclude には標準の Callout が定義されていません。採番設定の妥当性チェックを追加する場合は Model Validator を使用します。
public class CustomLotCtlValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MLotCtl && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) { MLotCtl ctl = (MLotCtl) po; // 例: 次の番号を過去に戻す変更を禁止 if (po.is_ValueChanged(MLotCtl.COLUMNNAME_CurrentNext)) { int oldNo = (Integer) po.get_ValueOld(MLotCtl.COLUMNNAME_CurrentNext); if (ctl.getCurrentNext() < oldNo) { throw new AdempiereException("次の番号を過去の値へ戻すことはできません"); } } } return null; }}採番書式のカスタマイズ
Section titled “採番書式のカスタマイズ”年月・工場コード等を含む複雑なロット番号が必要な場合、createLot() をそのまま使うのではなく、独自プロセスで MLot を直接生成し、M_LotCtl は採番カウンタとしてのみ使用する方式が実装しやすくなります。その際も CurrentNext の更新は MLotCtl 経由で行い、楽観的ロックの恩恵を維持してください。
関連プロセス
Section titled “関連プロセス”リファレンスページ・メニューに、このウィンドウ固有の標準プロセス(ボタン起動プロセス)は登録されていません。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”ロット番号の採番規則は、製造業・食品・医薬品など業種ごとにトレーサビリティ要件が異なります。iDempiere ではコアの採番機構を活かしたまま、Model Validator で自社ルールを安全に追加できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。