コンテンツにスキップ

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

在庫移動伝票は、在庫をある保管場所(ロケーター)から別の保管場所に移動する際に使用する伝票です。同一倉庫内のロケーター間移動や、異なる倉庫間の移動に対応します。

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

  • 倉庫内のロケーター間での品目移動
  • 異なる倉庫間での品目移動
  • ロット番号・シリアル番号単位での移動管理
  • 移動確認プロセスの管理

🖥️ インタラクティブ画面レイアウト: AD メタデータから自動生成した 在庫移動伝票の全タブ・全フィールド レイアウト(HTML版) で、実際の画面配置をご確認いただけます。

graph TD
    subgraph "在庫移動伝票ウィンドウ(Window ID: 170)"
        T1["📦 在庫移動伝票<br/>M_Movement<br/>34項目"]
        T2["📋 在庫移動伝票明細<br/>M_MovementLine<br/>20項目"]
        T2a["&nbsp;&nbsp;└ 品目属性<br/>&nbsp;&nbsp;&nbsp;&nbsp;M_MovementLineMA<br/>&nbsp;&nbsp;&nbsp;&nbsp;7項目"]
    end
    T1 --> T2
    T2 --> T2a

在庫移動伝票ウィンドウ(Window ID: 170) 在庫移動伝票 M_Movement 34項目 在庫移動伝票明細 M_MovementLine 20項目   └ 品目属性     M_MovementLineMA     7項目

📌 ポイント: 在庫移動は「ヘッダー(伝票単位)→ 明細行(品目・数量・移動元先)→ 完了処理」の3ステップで完結します。ロット・シリアル番号管理を行う品目は、品目属性タブでの割当も必要です。

タブ名テーブル役割
在庫移動伝票M_Movementヘッダー情報(日付・説明等)
在庫移動伝票明細M_MovementLine品目・数量・移動元先の明細
品目属性M_MovementLineMAロット・シリアル番号の割当
graph TD
    A["① メニューから<br/>在庫移動伝票を開く"] --> B["② 新規ボタンで<br/>移動日付・説明を<br/>入力して保存"]
    B --> C["③ 在庫移動伝票明細タブで<br/>品目・数量・移動元<br/>ロケーター・移動先ロケーターを入力"]
    C --> D{"ロット/シリアル<br/>管理品目?"}
    D -->|"はい"| E["④ 品目属性タブで<br/>ロット/シリアル番号<br/>を割当"]
    D -->|"いいえ"| F["⑤ 伝票アクション<br/>→ 完了を実行"]
    E --> F
    F --> G["在庫が移動先に<br/>反映される"]

① メニューから 在庫移動伝票を開く ② 新規ボタンで 移動日付・説明を 入力して保存 ③ 在庫移動伝票明細タブで 品目・数量・移動元 ロケーター・移動先ロケーターを入力 ロット/シリアル 管理品目? はい ④ 品目属性タブで ロット/シリアル番号 を割当 いいえ ⑤ 伝票アクション → 完了を実行 在庫が移動先に 反映される

⚠️ 注意: 「完了」処理を実行すると在庫が即座に更新され、元に戻すには「取消」処理が必要になります。明細の入力内容(特に移動元・移動先ロケーター)を完了前に必ず確認してください。

💡 ヒント: 同一品目を複数のロケーター間で移動する場合、明細行を複数行追加することで1伝票にまとめて処理できます。

メニューから「在庫管理 > 在庫移動伝票」を開きます。

  1. 新規」ボタンをクリック
  2. ヘッダー情報を入力:
    • 移動日付: 移動の日付
    • 説明: 移動理由・備考
  3. 保存」をクリック
  4. 在庫移動伝票明細」タブに移動
  5. 明細行を入力:
    • 品目: 移動する品目を選択
    • 移動数量: 移動数量
    • 移動元ロケーター: 現在の保管場所
    • 移動先ロケーター: 移動先の保管場所
  6. 伝票アクション」ボタンで「完了」を実行

完了処理により:

  • 移動元ロケーターの在庫が減少
  • 移動先ロケーターの在庫が増加
項目名必須説明
品目必須検索移動する品目
移動数量必須数量移動数量
移動元ロケーター必須選択現在の保管場所
移動先ロケーター必須選択移動先の保管場所
属性セットインスタンス-選択ロット・シリアル番号

Q. 在庫移動と在庫増減の違いは?

Section titled “Q. 在庫移動と在庫増減の違いは?”
  • 在庫移動: ロケーター間の移動。在庫総数は変わらない
  • 在庫増減: 在庫の増加または減少。社内使用や調整に使用

Q. 倉庫間移動の場合の会計処理は?

Section titled “Q. 倉庫間移動の場合の会計処理は?”

異なる組織間の倉庫移動の場合、組織間取引の会計仕訳が自動生成されます。同一組織内の倉庫移動では会計仕訳は発生しません。


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

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


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

在庫移動は Document 型の伝票で、M_Movement テーブルに格納されます。倉庫内のロケーター間移動や、異なる倉庫・組織間の在庫移動を管理します。MMovement クラス(1,230行)が中核ビジネスロジックを担い、DocAction インターフェースを実装しています。

classDiagram
    class MMovement {
        +prepareIt() String
        +completeIt() String
        +voidIt() boolean
        +closeIt() boolean
        +reverseCorrectIt() boolean
        +getLines(requery) MMovementLine[]
    }
    class X_M_Movement {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    class DocAction {
        <<interface>>
    }
    MMovement --|> X_M_Movement
    X_M_Movement --|> PO
    MMovement ..|> DocAction
    MMovement --> MMovementLine : has many

+prepareIt() String +completeIt() String +voidIt() boolean +closeIt() boolean +reverseCorrectIt() boolean +getLines(requery) MMovementLine[] <> <> <> > X_M_Movement X_M_Movement --

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

📌 ポイント: 在庫移動は明細行単位で「移動元ロケーター(M_Locator_ID)」と「移動先ロケーター(M_LocatorTo_ID)」の両方が必須です。同一倉庫内のロケーター間移動も、倉庫をまたぐ組織間移動も、同じ M_Movement テーブルで処理されます。組織間移動の場合のみ移動中倉庫(In-Transit Warehouse)が自動的に介在します。

カラム名必須説明備考
M_Movement_IDIDPK在庫移動ID主キー
AD_Client_IDTableDirectYクライアント
AD_Org_IDTableDirectY組織移動元組織
DocumentNoStringY伝票番号
C_DocType_IDTableDirectY伝票タイプ
DocStatusListY伝票状態DR/IP/CO/CL/VO/RE
DocActionButtonY伝票アクション
MovementDateDateY移動日付
DateAcctDateN転記日付
DescriptionTextN説明
C_BPartner_IDSearchN取引先取引先への直送時等
C_Charge_IDTableDirectN科目移動に伴う費用科目
ChargeAmtAmountN費用金額
ProcessedYesNoY処理済み
PostedButtonY転記
カラム名必須説明備考
M_MovementLine_IDIDPK明細ID
M_Movement_IDSearchYヘッダーFK
LineIntegerY行番号
M_Product_IDSearchY品目
MovementQtyQuantityY移動数量
M_Locator_IDTableDirectY移動元ロケーター
M_LocatorTo_IDTableDirectY移動先ロケーター
M_AttributeSetInstance_IDPAttributeN移動元属性セット
M_AttributeSetInstanceTo_IDPAttributeN移動先属性セット
DescriptionTextN説明
erDiagram
    M_Movement ||--o{ M_MovementLine : "has"
    M_Movement }o--|| C_DocType : "references"
    M_Movement }o--o| C_BPartner : "references"
    M_MovementLine }o--|| M_Product : "references"
    M_MovementLine }o--|| M_Locator : "move from"
    M_MovementLine }o--|| M_Locator : "move to"
    M_Locator }o--|| M_Warehouse : "belongs to"
    M_Movement ||--o{ M_MovementConfirm : "confirmations"
    M_Movement ||--o{ Fact_Acct : "posted"

move from move to belongs to

  1. ModelValidator.TIMING_BEFORE_PREPARE イベント発火
  2. 会計期間のオープンチェック
  3. 明細行の存在チェック
  4. 各明細行の品目・ロケーター妥当性チェック
  5. 移動元と移動先が同一でないことの検証
  6. ModelValidator.TIMING_AFTER_PREPARE イベント発火
  1. ModelValidator.TIMING_BEFORE_COMPLETE イベント発火
  2. 移動確認(Confirmation)の完了チェック
  3. 移動元ロケーターの在庫減少MStorageOnHand 更新)
  4. 移動先ロケーターの在庫増加MStorageOnHand 更新)
  5. マイナス在庫チェック(倉庫設定による)
  6. 属性セットインスタンスの移動処理
  7. 組織間移動の場合、会計転記用データの生成
  8. ModelValidator.TIMING_AFTER_COMPLETE イベント発火

🔧 カスタマイズ: 移動前の在庫チェック(移動元の在庫不足チェック)を追加する場合は TIMING_BEFORE_COMPLETE タイミングで MStorageOnHand.getQtyOnHand() を使用してください。コアの completeIt() 内でもチェックが行われますが、ユーザーへの早期フィードバックのために Validator での事前チェックが有効です。

stateDiagram-v2
    [*] --> Drafted : 新規作成
    Drafted --> InProgress : prepareIt()
    InProgress --> Completed : completeIt()
    Completed --> Closed : closeIt()
    Completed --> Voided : voidIt()
    Completed --> Reversed : reverseCorrectIt()

*

異なる組織間の在庫移動では、移動中倉庫(In-Transit Warehouse)を経由:

graph TD
    A[組織A 倉庫] -->|出荷| T[移動中倉庫]
    T -->|入荷| B[組織B 倉庫]

出荷 入荷 組織A 倉庫 移動中倉庫 組織B 倉庫

  • 移動元組織のロケーターと移動先組織のロケーターが異なる場合に自動検出
  • 会計転記時に組織間の内部取引仕訳が生成
  • 移動中在庫は移動中倉庫の棚卸資産勘定に計上

移動確認レコードにより、出庫担当者と入庫担当者の二段階確認が可能:

  • 出庫確認: 移動元での数量確認
  • 入庫確認: 移動先での数量確認
  • 差異がある場合は差異数量を記録
Calloutクラスメソッドトリガーフィールド処理内容
CalloutMovementproductM_Product_ID品目情報の自動セット(UOM、属性セット)
CalloutMovementqtyMovementQty数量変更時の処理
CalloutMovementlocatorM_Locator_IDロケーター変更時の在庫確認

Calloutソース: org.adempiere.base.callout/src/org/compiere/model/CalloutMovement.java

💡 ヒント: CalloutMovement.locator は移動元ロケーター変更時に品目の現在庫量を参照しますが、移動先ロケーターの空き容量チェックは標準では行われません。独自の容量管理(パレット数・重量制限等)が必要な場合は、M_LocatorTo_ID フィールドにカスタム Callout を追加し、M_StorageOnHand を集計してチェックする実装が有効です。

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

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

在庫移動に独自バリデーションを追加する最も安全な方法:

public class CustomMovementValidator implements ModelValidator {
@Override
public String docValidate(PO po, int timing) {
if (po instanceof MMovement) {
MMovement movement = (MMovement) po;
if (timing == TIMING_BEFORE_COMPLETE) {
// 例: 移動数量の上限チェック
MMovementLine[] lines = movement.getLines(false);
for (MMovementLine line : lines) {
// 移動元の在庫チェック
BigDecimal onHand = MStorageOnHand.getQtyOnHand(
line.getM_Product_ID(),
line.getM_Locator_ID(),
line.getM_AttributeSetInstance_ID(),
null);
if (onHand.compareTo(line.getMovementQty()) < 0) {
return "移動元の在庫が不足しています: " + line.getLine();
}
}
}
}
return null;
}
}

補充ルールと連動し、在庫の自動移動(ピッキングエリアへの補充等)をプロセスとして実装可能。

⚠️ 注意: 在庫移動の voidIt() は完了済みの移動を取り消し、在庫を元の状態に戻します。しかし属性セットインスタンス(ロット番号等)の移動が伴う場合、voidIt() 後に正確な属性の戻しが行われない場合があります。ロット管理品目の移動取り消しは慎重に行い、必要に応じて reverseCorrectIt() による逆移動伝票の生成を検討してください。

プロセス名説明
伝票アクション (DocAction)伝票の完了・無効・取消等
在庫移動生成補充ルールに基づく移動伝票の自動生成
移動確認出庫・入庫の確認処理

iDempiereの在庫移動は Model Validator や Callout で安全にカスタマイズできます。 ロケーター間移動ルール、組織間移動フロー、移動確認プロセスをコア改変なしで拡張可能です。

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

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