コンテンツにスキップ

iDempiere 倉庫・ロケーターの使い方|在庫管理 操作マニュアル・技術仕様

倉庫はiDempiereの在庫管理の基本単位です。各倉庫にはロケーター(保管場所)を定義でき、品目がどの倉庫のどの棚に保管されているかを管理します。受注・発注・出荷・入荷のすべての伝票で倉庫の指定が必要です。

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

倉庫・ロケーターでできること

Section titled “倉庫・ロケーターでできること”
  • 倉庫(物理的な保管施設)の定義
  • ロケーター(棚・エリア等の保管場所)の階層管理
  • 倉庫ごとの会計パラメータ設定
  • 品目別の在庫補充ルール設定(発注点方式、安全在庫等)
  • 倉庫単位の在庫照会
graph TD
    subgraph "倉庫・保管場所設定ウィンドウ(Window ID: 139)"
        T1["🏢 倉庫設定<br/>M_Warehouse<br/>14項目"]
        T2["📍 保管場所設定<br/>M_Locator<br/>11項目"]
        T2a["&nbsp;&nbsp;└ 現在庫数量管理台帳<br/>&nbsp;&nbsp;&nbsp;&nbsp;M_Storage<br/>&nbsp;&nbsp;&nbsp;&nbsp;11項目"]
        T3["🔄 在庫補充設定<br/>M_Replenish<br/>10項目"]
        T4["📒 会計<br/>M_Warehouse_Acct<br/>6項目"]
    end
    T1 --> T2
    T2 --> T2a
    T1 --> T3
    T1 --> T4

倉庫・保管場所設定ウィンドウ(Window ID: 139) 倉庫設定 M_Warehouse 14項目 保管場所設定 M_Locator 11項目   └ 現在庫数量管理台帳     M_Storage     11項目 在庫補充設定 M_Replenish 10項目 会計 M_Warehouse_Acct 6項目

📌 ポイント: 倉庫を作成すると「デフォルトロケーター」が自動生成されます。本番運用前に実際の棚割に合わせたロケーターを定義しておくと、入出荷・棚卸の精度が向上します。

タブ名テーブル役割
倉庫設定M_Warehouse倉庫の基本情報
保管場所設定M_Locatorロケーター(棚番号等)
現在庫数量管理台帳M_Storageロケーター別の在庫数量
在庫補充設定M_Replenish品目別の補充ルール
会計M_Warehouse_Acct倉庫の会計パラメータ
graph TD
    A["① 倉庫設定タブで<br/>倉庫コード・名称<br/>・住所を登録"] --> B["② 保管場所設定タブで<br/>ロケーターを追加<br/>(通路・棚・段)"]
    B --> C["③ 在庫補充設定タブで<br/>品目別の補充ルール<br/>(発注点・最大在庫)を設定"]
    C --> D["④ 会計タブで<br/>倉庫の会計パラメータ<br/>を確認・設定"]
    D --> E["⑤ 品目マスタの<br/>補充ルールタブと<br/>連携して補充処理を自動化"]

① 倉庫設定タブで 倉庫コード・名称 ・住所を登録 ② 保管場所設定タブで ロケーターを追加 (通路・棚・段) ③ 在庫補充設定タブで 品目別の補充ルール (発注点・最大在庫)を設定 ④ 会計タブで 倉庫の会計パラメータ を確認・設定 ⑤ 品目マスタの 補充ルールタブと 連携して補充処理を自動化

💡 ヒント: ロケーターの検索キーは「A-01-03」のように「通路-棚-段」の形式で命名すると、入出荷時の場所特定が容易になります。iDempiere は通路・棚・段を個別フィールドで管理するため、検索キーは自動生成も可能です。

⚠️ 注意: 倉庫は組織(Organization)に紐付きます。複数組織で同一倉庫を共有するケースはサポートされていません。組織設計と倉庫構成は導入前に合わせて検討してください。

メニューから「在庫管理 > 倉庫と保管場所の設定」を開きます。

  1. 新規」ボタンをクリック
  2. 倉庫情報を入力:
    • 検索キー: 倉庫コード
    • 名称: 倉庫名
    • 住所: 倉庫の所在地
  3. 保存」をクリック
  1. 保管場所設定」タブに移動
  2. 新規」ボタンでロケーターを追加:
    • 検索キー: ロケーターコード(例: A-01-01)
    • 通路(Aisle): 通路番号
    • 棚(Bin): 棚番号
    • 段(Level): 段番号
    • デフォルト: デフォルトの保管場所にする場合にチェック
  1. 在庫補充設定」タブに移動
  2. 品目ごとに補充ルールを設定:
    • 品目: 対象品目
    • 補充タイプ: 発注点方式、最小-最大方式 等
    • 最小在庫: 発注点(この数量を下回ったら補充)
    • 最大在庫: 補充後の目標在庫数量
    • 仕入先倉庫: 補充元の倉庫(拠点間移動の場合)

一般的な命名例: 通路-棚-段(例: A-01-03 = A通路1番棚3段目)。iDempiereでは通路・棚・段を個別フィールドで管理し、検索キーを自動生成できます。

Q. 複数倉庫間で在庫を移動するには?

Section titled “Q. 複数倉庫間で在庫を移動するには?”

メニュー「在庫管理 > 在庫移動伝票」で倉庫間の在庫移動を記録します。移動元と移動先のロケーターを指定します。

Q. 在庫補充レポートはどこですか?

Section titled “Q. 在庫補充レポートはどこですか?”

メニュー「在庫管理 > 補充レポート」で、発注点を下回った品目の一覧と推奨発注数量を確認できます。


As-Link株式会社では、iDempiereの導入支援・カスタマイズ開発を承っております。

OSS ERP導入サービスの詳細はこちら


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

倉庫はマスタデータ型のウィンドウで、M_Warehouse テーブルおよび M_Locator テーブルで管理されます。倉庫は在庫管理の最上位単位であり、ロケーター(保管場所)の階層構造を持ちます。MWarehouse クラス(348行)と MLocator クラス(401行)はともに ImmutablePOSupport を実装しています。Document 型ではありません。

classDiagram
    class MWarehouse {
        +getDefaultLocator() MLocator
        +getLocators(reload) MLocator[]
        +get(ctx, M_Warehouse_ID) MWarehouse
    }
    class MLocator {
        +getDefault(M_Warehouse_ID) MLocator
        +get(ctx, M_Locator_ID) MLocator
        +isDefault() boolean
    }
    class X_M_Warehouse {
        <<generated>>
    }
    class X_M_Locator {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    class ImmutablePOSupport {
        <<interface>>
    }
    MWarehouse --|> X_M_Warehouse
    X_M_Warehouse --|> PO
    MWarehouse ..|> ImmutablePOSupport
    MLocator --|> X_M_Locator
    X_M_Locator --|> PO
    MLocator ..|> ImmutablePOSupport
    MWarehouse --> MLocator : has many

+getDefaultLocator() MLocator +getLocators(reload) MLocator[] +get(ctx, M_Warehouse_ID) MWarehouse +getDefault(M_Warehouse_ID) MLocator +get(ctx, M_Locator_ID) MLocator +isDefault() boolean <> <> <> > X_M_Warehouse X_M_Warehouse -- > ImmutablePOSupport MLocator -- > PO MLocator ..

パッケージ: org.compiere.model ソースファイル:

  • org.adempiere.base/src/org/compiere/model/MWarehouse.java
  • org.adempiere.base/src/org/compiere/model/MLocator.java

📌 ポイント: MWarehouseMLocator はどちらも ImmutablePOSupport を実装し、MWarehouse.get() / MLocator.get() でキャッシュ参照が可能です。倉庫・ロケーター情報は頻繁に参照されるマスタデータのため、必ずキャッシュメソッドを使用し、DB クエリの重複実行を避けてください。

カラム名必須説明備考
M_Warehouse_IDIDPK倉庫ID主キー
AD_Client_IDTableDirectYクライアント
AD_Org_IDTableDirectY組織
ValueStringY検索キー
NameStringY倉庫名
DescriptionTextN説明
C_Location_IDLocationY住所倉庫の物理的住所
SeparatorStringY区切り文字ロケーターキーの区切り(デフォルト: *)
IsDisallowNegativeInvYesNoYマイナス在庫禁止
IsInTransitYesNoY移動中倉庫組織間移動用
M_WarehouseSource_IDTableDirectN補充元倉庫
IsActiveYesNoYアクティブ

M_Locator(ロケーター / 保管場所)

Section titled “M_Locator(ロケーター / 保管場所)”
カラム名必須説明備考
M_Locator_IDIDPKロケーターID主キー
M_Warehouse_IDTableDirectY倉庫FK
ValueStringY検索キー倉庫通路棚*段 形式
XStringN通路(Aisle)
YStringN棚(Bin)
ZStringN段(Level)
PriorityNoIntegerY優先順位ロケーター選択時の優先度
IsDefaultYesNoYデフォルト倉庫の既定ロケーター
IsActiveYesNoYアクティブ
カラム名必須説明
M_Warehouse_IDTableDirectPK倉庫FK
C_AcctSchema_IDTableDirectPK会計スキーマFK
W_InvActual_AcctAccountY棚卸資産勘定
W_Differences_AcctAccountY棚卸差異勘定
W_Revaluation_AcctAccountY再評価勘定
W_InvActualAdj_AcctAccountN棚卸資産調整勘定
erDiagram
    M_Warehouse ||--o{ M_Locator : "has"
    M_Warehouse ||--o{ M_Warehouse_Acct : "accounting"
    M_Warehouse }o--|| AD_Org : "belongs to"
    M_Warehouse }o--|| C_Location : "located at"
    M_Locator ||--o{ M_StorageOnHand : "inventory"
    M_Locator ||--o{ M_InOutLine : "shipment/receipt"
    M_Locator ||--o{ M_MovementLine : "movement"
    M_Locator ||--o{ M_InventoryLine : "inventory count"
    M_Warehouse ||--o{ M_Replenish : "replenishment rules"
    M_Warehouse ||--o{ C_Order : "referenced by"
    M_Warehouse ||--o{ M_InOut : "referenced by"

belongs to located at shipment/receipt inventory count replenishment rules referenced by

ロケーターは倉庫内の保管場所を3次元で管理:

倉庫
└── 通路(X: Aisle)
└── 棚(Y: Bin)
└── 段(Z: Level)

ロケーターキーは 倉庫コード*通路*棚*段 の形式(例: WH01*A01*B03*L02)。 区切り文字は M_Warehouse.Separator で定義(デフォルト: *)。

  • M_StorageOnHand: ロケーター単位の現在庫数量を管理
  • M_StorageReservation: 倉庫単位の引当数量を管理
  • マイナス在庫禁止(IsDisallowNegativeInv=Y)設定時、出荷完了時にマイナスチェック

⚠️ 注意: M_StorageOnHand は在庫の実数量を管理しますが、M_StorageReservation は引当数量(出荷予定)を別管理します。「理論在庫 = OnHand - Reserved」です。カスタムレポートで「出荷可能な有効在庫」を算出する場合は両テーブルを結合してください。OnHand のみを参照した在庫チェックは誤った結果になります。

M_Replenish テーブルで品目ごとの補充ルールを定義:

補充タイプ説明
最小/最大在庫在庫が最小値を下回ったら最大値まで補充
発注点在庫が発注点を下回ったら発注数量を発注
カスタムカスタムロジックで補充計算

補充元の選択肢:

  • 購買発注: 仕入先から直接発注
  • 在庫移動: 補充元倉庫(M_WarehouseSource_ID)から移動

IsInTransit=Y の倉庫は組織間の在庫移動時に使用:

  • 出荷元組織から移動中倉庫へ出荷
  • 移動中倉庫から入荷先組織へ入荷
  • 移動期間中の在庫を正確に追跡

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

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

倉庫・ロケーターに独自バリデーションを追加する最も安全な方法:

public class CustomWarehouseValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MLocator) {
MLocator locator = (MLocator) po;
if (type == TYPE_BEFORE_NEW) {
// 例: ロケーターコードの命名規則チェック
String value = locator.getValue();
if (value != null && !value.matches(".*\\*[A-Z]\\d{2}\\*[A-Z]\\d{2}\\*L\\d{2}")) {
throw new AdempiereException("ロケーターコードは「倉庫*A01*B01*L01」形式で入力してください");
}
}
}
return null;
}
}

入荷時や在庫移動時のロケーター自動割当ロジックを ILocatorStrategy インターフェースで実装可能。品目属性(温度帯、危険物区分等)に基づく保管場所の自動決定に活用。

🔧 カスタマイズ: ILocatorStrategy の実装クラスを OSGi @Component として登録するだけで、入荷時のロケーター自動割当に組み込まれます。複数の実装を登録した場合は OSGi Service Ranking(@Component(property = "service.ranking:Integer=100"))で優先度を制御できます。

💡 ヒント: 倉庫のロケーター構造(通路 X / 棚 Y / 段 Z)を変更する場合、M_Locator.Value(検索キー)も 倉庫コード*X*Y*Z 形式で再設定が必要です。M_Warehouse.Separator のデフォルト値 * を変更すると既存ロケーターキーが無効になるため、稼働後の変更は避けてください。

プロセス名説明
補充レポート補充対象品目の一覧と発注/移動提案
在庫評価レポート倉庫別の在庫金額評価

iDempiereの倉庫管理は Model Validator や Callout で安全にカスタマイズできます。 ロケーター体系設計、補充ルール最適化、マルチ倉庫運用をコア改変なしで実現可能です。

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

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