コンテンツにスキップ

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

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

ロットは、品目ごとに個々のロット(製造単位・入荷単位)を定義するマスタです。属性セットでロット管理を有効にした品目に対して、ロット番号を一覧として保持し、在庫の入出庫時に選択できるようにします。

📌 ポイント: ロットは「品目」に紐づくマスタです。ロット番号を手入力で管理する場合はこの画面で登録し、自動採番したい場合はロット管理で採番ルールを定義してください。

  • 品目ごとのロット番号(名称)の登録・一覧管理
  • ロット管理(採番ルール)マスタとの紐づけ
  • ロットの有効期間(開始日付・終了日付)の設定
  • ロットごとの説明・コメントの記録
  • 使用しなくなったロットの無効化(有効チェックを外す)

ロットは 1 タブのシンプルなマスタ画面です。

タブ名テーブル項目数役割
ロットM_Lot10項目品目ごとのロット定義(名称・期間・ロット管理)

💡 ヒント: ロットは属性セット(M_AttributeSet)で「ロット」を有効にした品目で使用します。属性セット側の設定がない品目にロットを登録しても、伝票入力時のロット選択には現れません。

graph TD
    A["🚀 メニューから開く<br/>在庫管理 > 品目属性管理 > ロット"] --> B["➕ 新規ボタンをクリック"]
    B --> C["📦 品目を選択<br/>(必須)"]
    C --> D["🏷 名称にロット番号を入力<br/>(必須・60文字以内)"]
    D --> E{採番ルールを使う?}
    E -->|使う| F["🔢 ロット管理を選択<br/>(M_LotCtl)"]
    E -->|使わない| G["✍ 名称を手入力のまま"]
    F --> H["📅 必要に応じて<br/>開始日付・終了日付を設定"]
    G --> H
    H --> I["💾 保存"]
    I --> J["📥 入出庫伝票の属性セットインスタンスで<br/>ロットとして選択可能に"]

メニューから開く 在庫管理 > 品目属性管理 > ロット 新規ボタンをクリック 品目を選択 (必須) 名称にロット番号を入力 (必須・60文字以内) ロット管理を選択 (M_LotCtl) 名称を手入力のまま 必要に応じて 開始日付・終了日付を設定 保存 入出庫伝票の属性セットインスタンスで ロットとして選択可能に 採番ルールを使う? 使う 使わない

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

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

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

  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 品目: ロットを管理する対象の品目(検索フィールド)
    • 名称: ロット番号(識別子。60文字以内)
  3. 必要に応じて任意項目を入力:
    • ロット管理: 採番ルール(M_LotCtl)を紐づける場合に選択
    • 説明 / コメント: 補足情報
    • 開始日付 / 終了日付: ロットの有効期間
  4. 保存」をクリック

⚠️ 注意: 「品目」と「名称」の 2 つが必須です。名称はロット番号そのものとして表示され、toString() でもロット名が返るため、伝票上の識別に直結します。

項目名必須説明
クライアント必須選択テナント(既定値 @#AD_Client_ID@
組織必須選択組織(既定値 @#AD_Org_ID@
品目必須検索ロットの対象品目
名称必須文字列(60)ロット番号・ロット名
ロット管理-選択採番ルール(M_LotCtl)への参照
説明-テキスト(255)補足説明
コメント-テキスト(2000)ヒント・注記
開始日付-日付ロット有効期間の開始日
終了日付-日付ロット有効期間の終了日
有効-チェックレコードが有効か(既定値 Y)

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

Q. ロットは手入力で登録する必要がありますか?

Section titled “Q. ロットは手入力で登録する必要がありますか?”

いいえ。ロット管理M_LotCtl)に採番ルールを定義し、属性セットの「ロット管理」に設定しておくと、MLotCtl.createLot() により 接頭辞 + 次の番号 + 接尾辞 の形式でロットが自動生成されます。この画面は、自動生成されたロットの確認や、手動でロットを追加する場合に使用します。

Q. 同じロット番号を複数の品目に登録できますか?

Section titled “Q. 同じロット番号を複数の品目に登録できますか?”

できます。M_Lot は品目ごとにロットを保持する構造で、MLot.getProductLot(ctx, M_Product_ID, lot, trxName) のように品目 ID とロット名の組み合わせで検索されます。品目が異なれば同名のロットが併存しても問題ありません。

Q. 開始日付・終了日付は在庫の引き当てに影響しますか?

Section titled “Q. 開始日付・終了日付は在庫の引き当てに影響しますか?”

M_Lot の開始日付・終了日付はロットの有効期間を記録する項目です。賞味期限・保証期限による在庫引き当ての制御は、属性セット側の「保証日付」(IsGuaranteeDate / GuaranteeDays)と在庫移動方針(Material Policy)で行います。期限管理を厳密に行う場合は属性セットの保証日付設定を併用してください。

M_Lot テーブルは削除可能(IsDeleteable=Y)です。ただし、既に在庫や伝票の属性セットインスタンスから参照されているロットは削除せず、「有効」のチェックを外して無効化する運用を推奨します。

🛠 技術仕様(開発者向け)

ロットはマスタデータ型のウィンドウ(AD_Window_ID: 257)で、M_Lot テーブルに格納されます。MLot クラス(176行)が品目単位のロット取得ユーティリティと、MLotCtl からの生成コンストラクタを提供します。Document 型ではないため DocAction / DocStatus は持ちません。テーブルのアクセスレベルは 3(クライアント+組織)、削除可能(IsDeleteable=Y)です。

classDiagram
    class MLot {
        +getProductLots(ctx, M_Product_ID, trxName) MLot[]
        +getProductLot(ctx, M_Product_ID, lot, trxName) MLot
        +getProductLotPairs(M_Product_ID, trxName) KeyNamePair[]
        +MLot(MLotCtl ctl, M_Product_ID, Name)
        +toString() String
    }
    class X_M_Lot {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    MLot --|> X_M_Lot
    X_M_Lot --|> PO
    MLotCtl --> MLot : creates
    MLot --> MProduct : belongs to

+getProductLots(ctx, M_Product_ID, trxName) MLot[] +getProductLot(ctx, M_Product_ID, lot, trxName) MLot +getProductLotPairs(M_Product_ID, trxName) KeyNamePair[] +MLot(MLotCtl ctl, M_Product_ID, Name) +toString() String <> <> > X_M_Lot X_M_Lot --

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

カラム名必須説明備考
M_Lot_IDIDPKロットID主キー
AD_Client_IDTable DirectYクライアント既定値 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定値 @#AD_Org_ID@
M_Product_IDSearchY品目識別子カラム
NameString(60)Yロット名識別子カラム
M_LotCtl_IDTable DirectNロット管理採番ルールへの参照
DescriptionText(255)N説明
HelpText(2000)Nコメント
DateFromDateN開始日付
DateToDateN終了日付
IsActiveYes-NoY有効既定値 Y
M_Lot_UUUUID(36)NUUID
erDiagram
    M_Product ||--o{ M_Lot : "has lots"
    M_LotCtl ||--o{ M_Lot : "generates"
    M_AttributeSet }o--o| M_LotCtl : "lot numbering"
    M_AttributeSetInstance }o--o| M_Lot : "lot reference"
    M_Product }o--o| M_AttributeSet : "attribute set"

has lots lot numbering lot reference attribute set

MLot には beforeSave() / afterSave() のオーバーライドはありません。制約は AD 定義上の必須項目(M_Product_ID, Name)で担保されます。

メソッド戻り値用途
getProductLots(ctx, M_Product_ID, trxName)MLot[]指定品目の全ロットを取得
getProductLot(ctx, M_Product_ID, lot, trxName)MLot品目+ロット名で 1 件取得
getProductLotPairs(M_Product_ID, trxName)KeyNamePair[]UI 選択肢用のキー・名称ペア

MLot(MLotCtl ctl, int M_Product_ID, String Name) コンストラクタは、採番ルール(MLotCtl)からロットを生成する際に使用されます。処理内容は次のとおりです。

  1. setClientOrg(ctl) で採番ルールのクライアント・組織を継承
  2. setM_LotCtl_ID(ctl.getM_LotCtl_ID()) でロット管理への参照をセット
  3. setM_Product_ID(M_Product_ID) / setName(Name) をセット

呼び出し元の MLotCtl.createLot(M_Product_ID)CurrentNext に対して楽観的ロックset_UseOptimisticLocking(true)、最大 3 回リトライ)を掛けたうえで、接頭辞 + CurrentNext + 接尾辞 の名称を組み立て、CurrentNextIncrementNo 分だけ進めてから MLot を保存します。

⚠️ 注意: 採番の競合はトランザクションのセーブポイント+リトライで解決されます。カスタムコードから直接 M_Lot を INSERT すると CurrentNext との整合が崩れるため、自動採番を使う場合は必ず MLotCtl.createLot() を経由してください。

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

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

M_Lot には標準の Callout が定義されていません(gw_column.tsv の callout 列が全カラムで未設定)。ロット番号の書式チェック等を追加する場合は Model Validator を使用します。

public class CustomLotValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MLot && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
MLot lot = (MLot) po;
// 例: ロット番号は「YYYYMM-連番」形式のみ許可
if (lot.getName() != null && !lot.getName().matches("\\d{6}-\\d{3}")) {
throw new AdempiereException("ロット番号は「YYYYMM-000」形式で入力してください");
}
}
return null;
}
}

ロット名の組み立て(接頭辞・番号・接尾辞)は MLotCtl.createLot() に実装されています。年月をロット名に含める等の要件は、Model Validator の TYPE_BEFORE_NEWName を書き換えるか、独自プロセスから MLot を生成する方式が安全です。

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


ロット番号の書式や採番ルールは業種ごとに要件が大きく異なりますが、iDempiere では Model Validator と MLotCtl の組み合わせでコア改変なしに対応できます。

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

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