Skip to content

iDempiere ロット管理の使い方|在庫管理 操作マニュアル・技術仕様

This content is not available in your language yet.

📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。

ロット管理は、品目のロット番号を自動採番するためのルールを定義するマスタです。開始番号・増加数・接頭辞・接尾辞を設定しておくと、属性セットインスタンス作成時に 接頭辞 + 番号 + 接尾辞 の形式でロットが自動生成されます。

📌 ポイント: ロット管理は単体では動作しません。属性セットの「ロット管理」フィールドにこのマスタを設定して初めて自動採番が有効になります。

  • ロット番号の自動採番ルールの定義(開始番号・増加数・次の番号)
  • 接頭辞・接尾辞によるロット番号の書式指定(各10文字以内)
  • 採番の現在値(次の番号)の確認・手動調整
  • 除外タブによる、特定テーブル・特定取引区分でのロット生成の抑止
  • 複数の採番ルールを用途別(製品群別・工場別など)に併存管理

ロット管理は 2 タブ構成です。

タブ名テーブル項目数役割
ロット管理M_LotCtl10項目採番ルール本体(番号・接頭辞・接尾辞)
除外M_LotCtlExclude6項目ロット生成を除外するテーブル・取引区分

💡 ヒント: 「除外」タブの内容はキャッシュされます。設定を変更しても即座に反映されない場合は、再ログインするかキャッシュをリセットしてください(リファレンスページの記載どおりの仕様です)。

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

メニューから開く 在庫管理 > 品目属性管理 > ロット管理 新規ボタンをクリック 名称を入力 (必須) 採番設定を入力 開始番号 / 増加数 / 次の番号 必要なら接頭辞・接尾辞を設定 (各10文字以内) 保存 属性セットの 「ロット管理」に設定 除外タブで テーブル + 販売/購買区分を登録 設定完了 再ログイン or キャッシュリセット 特定画面で ロット生成を抑止する? する しない

アクセス方法(メニューパス)

Section titled “アクセス方法(メニューパス)”

メニューから「在庫管理 > 品目属性管理 > ロット管理」を開きます。

  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 名称: 採番ルールの名称(60文字以内)
    • 開始番号: 採番の開始値(既定値 100
    • 増加数: 1 回の採番で加算する値(既定値 1
    • 次の番号: 次に払い出される番号(既定値 100
  3. 必要に応じて任意項目を入力:
    • 接頭辞: 番号の前に付ける文字列(10文字以内、例: LOT-
    • 接尾辞: 番号の後に付ける文字列(10文字以内、例: -A
    • 説明: 補足説明
  4. 保存」をクリック
  5. 属性セットを開き、「ロット」を有効にしたうえで「ロット管理」に本レコードを設定

除外設定(ロット生成の抑止)

Section titled “除外設定(ロット生成の抑止)”
  1. 除外」タブに移動
  2. 新規」をクリックして以下を登録:
    • テーブル: 除外対象のテーブル(例: 受注明細・出荷明細など)
    • 販売(ON) / 購買(OFF): 対象とする取引区分
  3. 保存」をクリック
  4. 設定はキャッシュされるため、再ログインまたはキャッシュリセットを実施

⚠️ 注意: 「次の番号」(CurrentNext)を手動で小さい値に戻すと、既存ロットと同じ番号が再度払い出される可能性があります。運用開始後は原則として変更しないでください。

項目名必須説明
クライアント必須選択テナント(既定値 @#AD_Client_ID@
組織必須選択組織(既定値 @#AD_Org_ID@
名称必須文字列(60)採番ルールの名称
説明-文字列(255)補足説明
開始番号必須整数採番の開始値(既定値 100)
増加数必須整数加算値(既定値 1)
次の番号必須整数次に払い出す番号(既定値 100)
接頭辞-文字列(10)番号の前に付ける文字列
接尾辞-文字列(10)番号の後に付ける文字列
有効-チェックレコードが有効か(既定値 Y)
項目名必須説明
ロット管理必須選択親レコードへの参照
テーブル必須選択ロット生成を除外するテーブル
販売(ON) / 購買(OFF)必須チェック対象とする取引区分
有効必須チェックレコードが有効か

全項目一覧はリファレンス参照

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 型ではありません。

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

+createLot(M_Product_ID) MLot <> <> <> > X_M_LotCtl X_M_LotCtl --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MLotCtl.javaorg.adempiere.base/src/org/compiere/model/MLotCtlExclude.java

カラム名必須説明備考
M_LotCtl_IDIDPKロット管理ID主キー
AD_Client_IDTable DirectYクライアント既定値 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定値 @#AD_Org_ID@
NameString(60)Y名称識別子カラム
DescriptionString(255)N説明
StartNoIntegerY開始番号既定値 100
IncrementNoIntegerY増加数既定値 1
CurrentNextIntegerY次の番号既定値 100・楽観的ロック対象
PrefixString(10)N接頭辞
SuffixString(10)N接尾辞
IsActiveYes-NoY有効既定値 Y
カラム名必須説明備考
M_LotCtlExclude_IDIDPK除外ID主キー
M_LotCtl_IDTable DirectYロット管理親(IsParent=Y
AD_Table_IDTable DirectYテーブル除外対象テーブル
IsSOTrxYes-NoY販売取引販売=Y / 購買=N
IsActiveYes-NoY有効
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"

lot numbering excluded table

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

createLot(M_Product_ID) CurrentNext を楽観的ロック対象に設定 最大3回のリトライループ開始 load() で最新値を再読込 トランザクションが有れば セーブポイントを設定 名称を組立 Prefix + CurrentNext + Suffix CurrentNext += IncrementNo saveEx() MLot を生成して saveEx() → 返却 セーブポイントまで rollback → 再試行 保存成功? No(競合)

処理の要点:

  1. set_OptimisticLockingColumns(new String[]{COLUMNNAME_CurrentNext})CurrentNext を競合検知の対象に指定
  2. ループ内で毎回 this.load(get_TrxName()) を実行し、他トランザクションの更新を取り込む
  3. Prefix / Suffix は null 許容で、設定されている場合のみ連結
  4. 採番後に MLot(this, M_Product_ID, name) を生成し saveEx()
  5. 競合(RuntimeException)時はセーブポイントへロールバックして再試行

除外の判定は MAttributeSet 側のメソッドで行われます。

メソッド説明
MAttributeSet.isExcludeLot(AD_Column_ID, isSOTrx)ロット入力・生成の除外判定
MAttributeSet.excludeTableEntry(AD_Table_ID, isSOTrx)属性セット自体の入力除外判定

⚠️ 注意: 除外定義は属性セットのキャッシュ経由で参照されます。M_LotCtlExclude を変更した後は、再ログインまたはキャッシュリセットを行わないと旧設定のまま動作します。

拡張ポイント(カスタマイズ箇所)

Section titled “拡張ポイント(カスタマイズ箇所)”

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;
}
}

年月・工場コード等を含む複雑なロット番号が必要な場合、createLot() をそのまま使うのではなく、独自プロセスで MLot を直接生成し、M_LotCtl は採番カウンタとしてのみ使用する方式が実装しやすくなります。その際も CurrentNext の更新は MLotCtl 経由で行い、楽観的ロックの恩恵を維持してください。

リファレンスページ・メニューに、このウィンドウ固有の標準プロセス(ボタン起動プロセス)は登録されていません。


ロット番号の採番規則は、製造業・食品・医薬品など業種ごとにトレーサビリティ要件が異なります。iDempiere ではコアの採番機構を活かしたまま、Model Validator で自社ルールを安全に追加できます。

As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。

OSS ERP導入・カスタマイズサービスの詳細はこちら