iDempiere 在庫移動の使い方|在庫管理 操作マニュアル・技術仕様
在庫移動伝票は、在庫をある保管場所(ロケーター)から別の保管場所に移動する際に使用する伝票です。同一倉庫内のロケーター間移動や、異なる倉庫間の移動に対応します。
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
在庫移動でできること
Section titled “在庫移動でできること”- 倉庫内のロケーター間での品目移動
- 異なる倉庫間での品目移動
- ロット番号・シリアル番号単位での移動管理
- 移動確認プロセスの管理
🖥️ インタラクティブ画面レイアウト: AD メタデータから自動生成した 在庫移動伝票の全タブ・全フィールド レイアウト(HTML版) で、実際の画面配置をご確認いただけます。
graph TD
subgraph "在庫移動伝票ウィンドウ(Window ID: 170)"
T1["📦 在庫移動伝票<br/>M_Movement<br/>34項目"]
T2["📋 在庫移動伝票明細<br/>M_MovementLine<br/>20項目"]
T2a[" └ 品目属性<br/> M_MovementLineMA<br/> 7項目"]
end
T1 --> T2
T2 --> T2a
📌 ポイント: 在庫移動は「ヘッダー(伝票単位)→ 明細行(品目・数量・移動元先)→ 完了処理」の3ステップで完結します。ロット・シリアル番号管理を行う品目は、品目属性タブでの割当も必要です。
| タブ名 | テーブル | 役割 |
|---|---|---|
| 在庫移動伝票 | M_Movement | ヘッダー情報(日付・説明等) |
| 在庫移動伝票明細 | M_MovementLine | 品目・数量・移動元先の明細 |
| 品目属性 | M_MovementLineMA | ロット・シリアル番号の割当 |
基本操作手順
Section titled “基本操作手順”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伝票にまとめて処理できます。
アクセス方法
Section titled “アクセス方法”メニューから「在庫管理 > 在庫移動伝票」を開きます。
- 「新規」ボタンをクリック
- ヘッダー情報を入力:
- 移動日付: 移動の日付
- 説明: 移動理由・備考
- 「保存」をクリック
- 「在庫移動伝票明細」タブに移動
- 明細行を入力:
- 品目: 移動する品目を選択
- 移動数量: 移動数量
- 移動元ロケーター: 現在の保管場所
- 移動先ロケーター: 移動先の保管場所
- 「伝票アクション」ボタンで「完了」を実行
完了処理により:
- 移動元ロケーターの在庫が減少
- 移動先ロケーターの在庫が増加
項目リファレンス
Section titled “項目リファレンス”在庫移動伝票明細
Section titled “在庫移動伝票明細”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 品目 | 必須 | 検索 | 移動する品目 |
| 移動数量 | 必須 | 数量 | 移動数量 |
| 移動元ロケーター | 必須 | 選択 | 現在の保管場所 |
| 移動先ロケーター | 必須 | 選択 | 移動先の保管場所 |
| 属性セットインスタンス | - | 選択 | ロット・シリアル番号 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 在庫移動と在庫増減の違いは?
Section titled “Q. 在庫移動と在庫増減の違いは?”- 在庫移動: ロケーター間の移動。在庫総数は変わらない
- 在庫増減: 在庫の増加または減少。社内使用や調整に使用
Q. 倉庫間移動の場合の会計処理は?
Section titled “Q. 倉庫間移動の場合の会計処理は?”異なる組織間の倉庫移動の場合、組織間取引の会計仕訳が自動生成されます。同一組織内の倉庫移動では会計仕訳は発生しません。
OSS ERP導入についてのご相談
Section titled “OSS ERP導入についてのご相談”As-Link株式会社では、iDempiereの導入支援・カスタマイズ開発を承っております。
🛠 技術仕様(開発者向け)
在庫移動は Document 型の伝票で、M_Movement テーブルに格納されます。倉庫内のロケーター間移動や、異なる倉庫・組織間の在庫移動を管理します。MMovement クラス(1,230行)が中核ビジネスロジックを担い、DocAction インターフェースを実装しています。
アーキテクチャ概要
Section titled “アーキテクチャ概要”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
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MMovement.java
関連DBテーブル
Section titled “関連DBテーブル”M_Movement(在庫移動ヘッダー)
Section titled “M_Movement(在庫移動ヘッダー)”📌 ポイント: 在庫移動は明細行単位で「移動元ロケーター(
M_Locator_ID)」と「移動先ロケーター(M_LocatorTo_ID)」の両方が必須です。同一倉庫内のロケーター間移動も、倉庫をまたぐ組織間移動も、同じM_Movementテーブルで処理されます。組織間移動の場合のみ移動中倉庫(In-Transit Warehouse)が自動的に介在します。
| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_Movement_ID | ID | PK | 在庫移動ID | 主キー |
| AD_Client_ID | TableDirect | Y | クライアント | |
| AD_Org_ID | TableDirect | Y | 組織 | 移動元組織 |
| DocumentNo | String | Y | 伝票番号 | |
| C_DocType_ID | TableDirect | Y | 伝票タイプ | |
| DocStatus | List | Y | 伝票状態 | DR/IP/CO/CL/VO/RE |
| DocAction | Button | Y | 伝票アクション | |
| MovementDate | Date | Y | 移動日付 | |
| DateAcct | Date | N | 転記日付 | |
| Description | Text | N | 説明 | |
| C_BPartner_ID | Search | N | 取引先 | 取引先への直送時等 |
| C_Charge_ID | TableDirect | N | 科目 | 移動に伴う費用科目 |
| ChargeAmt | Amount | N | 費用金額 | |
| Processed | YesNo | Y | 処理済み | |
| Posted | Button | Y | 転記 |
M_MovementLine(在庫移動明細)
Section titled “M_MovementLine(在庫移動明細)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_MovementLine_ID | ID | PK | 明細ID | |
| M_Movement_ID | Search | Y | ヘッダーFK | |
| Line | Integer | Y | 行番号 | |
| M_Product_ID | Search | Y | 品目 | |
| MovementQty | Quantity | Y | 移動数量 | |
| M_Locator_ID | TableDirect | Y | 移動元ロケーター | |
| M_LocatorTo_ID | TableDirect | Y | 移動先ロケーター | |
| M_AttributeSetInstance_ID | PAttribute | N | 移動元属性セット | |
| M_AttributeSetInstanceTo_ID | PAttribute | N | 移動先属性セット | |
| Description | Text | N | 説明 |
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"
ビジネスロジック
Section titled “ビジネスロジック”prepareIt() の主要処理
Section titled “prepareIt() の主要処理”ModelValidator.TIMING_BEFORE_PREPAREイベント発火- 会計期間のオープンチェック
- 明細行の存在チェック
- 各明細行の品目・ロケーター妥当性チェック
- 移動元と移動先が同一でないことの検証
ModelValidator.TIMING_AFTER_PREPAREイベント発火
completeIt() の主要処理
Section titled “completeIt() の主要処理”ModelValidator.TIMING_BEFORE_COMPLETEイベント発火- 移動確認(Confirmation)の完了チェック
- 移動元ロケーターの在庫減少(
MStorageOnHand更新) - 移動先ロケーターの在庫増加(
MStorageOnHand更新) - マイナス在庫チェック(倉庫設定による)
- 属性セットインスタンスの移動処理
- 組織間移動の場合、会計転記用データの生成
ModelValidator.TIMING_AFTER_COMPLETEイベント発火
🔧 カスタマイズ: 移動前の在庫チェック(移動元の在庫不足チェック)を追加する場合は
TIMING_BEFORE_COMPLETEタイミングでMStorageOnHand.getQtyOnHand()を使用してください。コアの completeIt() 内でもチェックが行われますが、ユーザーへの早期フィードバックのために Validator での事前チェックが有効です。
伝票処理フロー
Section titled “伝票処理フロー”stateDiagram-v2
[*] --> Drafted : 新規作成
Drafted --> InProgress : prepareIt()
InProgress --> Completed : completeIt()
Completed --> Closed : closeIt()
Completed --> Voided : voidIt()
Completed --> Reversed : reverseCorrectIt()
組織間移動(Inter-Org Transfer)
Section titled “組織間移動(Inter-Org Transfer)”異なる組織間の在庫移動では、移動中倉庫(In-Transit Warehouse)を経由:
graph TD
A[組織A 倉庫] -->|出荷| T[移動中倉庫]
T -->|入荷| B[組織B 倉庫]
- 移動元組織のロケーターと移動先組織のロケーターが異なる場合に自動検出
- 会計転記時に組織間の内部取引仕訳が生成
- 移動中在庫は移動中倉庫の棚卸資産勘定に計上
移動確認(M_MovementConfirm)
Section titled “移動確認(M_MovementConfirm)”移動確認レコードにより、出庫担当者と入庫担当者の二段階確認が可能:
- 出庫確認: 移動元での数量確認
- 入庫確認: 移動先での数量確認
- 差異がある場合は差異数量を記録
Callout
Section titled “Callout”| Calloutクラス | メソッド | トリガーフィールド | 処理内容 |
|---|---|---|---|
| CalloutMovement | product | M_Product_ID | 品目情報の自動セット(UOM、属性セット) |
| CalloutMovement | qty | MovementQty | 数量変更時の処理 |
| CalloutMovement | locator | M_Locator_ID | ロケーター変更時の在庫確認 |
Calloutソース: org.adempiere.base.callout/src/org/compiere/model/CalloutMovement.java
💡 ヒント:
CalloutMovement.locatorは移動元ロケーター変更時に品目の現在庫量を参照しますが、移動先ロケーターの空き容量チェックは標準では行われません。独自の容量管理(パレット数・重量制限等)が必要な場合は、M_LocatorTo_IDフィールドにカスタム Callout を追加し、M_StorageOnHandを集計してチェックする実装が有効です。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”在庫移動に独自バリデーションを追加する最も安全な方法:
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; }}ロケーター間自動移動
Section titled “ロケーター間自動移動”補充ルールと連動し、在庫の自動移動(ピッキングエリアへの補充等)をプロセスとして実装可能。
⚠️ 注意: 在庫移動の
voidIt()は完了済みの移動を取り消し、在庫を元の状態に戻します。しかし属性セットインスタンス(ロット番号等)の移動が伴う場合、voidIt()後に正確な属性の戻しが行われない場合があります。ロット管理品目の移動取り消しは慎重に行い、必要に応じてreverseCorrectIt()による逆移動伝票の生成を検討してください。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 説明 |
|---|---|
| 伝票アクション (DocAction) | 伝票の完了・無効・取消等 |
| 在庫移動生成 | 補充ルールに基づく移動伝票の自動生成 |
| 移動確認 | 出庫・入庫の確認処理 |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”iDempiereの在庫移動は Model Validator や Callout で安全にカスタマイズできます。 ロケーター間移動ルール、組織間移動フロー、移動確認プロセスをコア改変なしで拡張可能です。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。