Skip to content

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

This content is not available in your language yet.

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

在庫需要は、予測(Forecast)・購買依頼(Requisition)・未処理の受注をもとに、期間ごとの資材所要量を集計・管理する仕組みです。ヘッダーで会計カレンダーと年を指定し、明細で品目・期間ごとの数量を保持、さらに詳細タブで需要の発生元(予測明細・購買依頼明細・受注明細)を紐づけます。

⚠️ 注意: この画面は iDempiere 13 標準では無効化されています(旧バージョンからの互換用)。標準メニューにも登録されていないため、新規の業務設計での利用は推奨されません。所要量計算は製造モジュール(MRP)や在庫補充機能での設計をご検討ください。

  • 会計カレンダー・年を軸とした需要ヘッダーの定義
  • 品目 × 期間ごとの需要数量の登録(数量・計算数量)
  • 需要発生元の紐づけ(予測明細・購買依頼明細・受注明細)
  • 「処理中」ボタンによる需要の生成・再計算処理の起動
  • 既定の需要計画(デフォルトフラグ)の指定

在庫需要は 3 階層のタブ構成です。

タブ名テーブル階層項目数役割
在庫需要M_Demand010項目ヘッダー(カレンダー・年・名称)
詳細(明細)M_DemandLine18項目品目 × 期間の需要数量
詳細(発生元)M_DemandDetail27項目需要の発生元となる明細への参照

💡 ヒント: 明細(M_DemandLine)は「品目」と「期間」の組み合わせで需要を保持します。期間は会計カレンダー(C_Period)を参照するため、需要計画の粒度は会計期間と一致します。

graph TD
    A["⚠ 標準メニュー未登録<br/>(iDempiere 13 では無効化)"] --> B["🔧 利用する場合は AD で<br/>ウィンドウを有効化 + メニュー登録"]
    B --> C["➕ 新規で需要ヘッダーを作成<br/>名称 / カレンダー / 年(すべて必須)"]
    C --> D["💾 保存"]
    D --> E["📋 明細タブで需要を登録<br/>品目 / 期間 / 数量 / 計算数量"]
    E --> F{発生元を<br/>紐づける?}
    F -->|する| G["🔗 詳細タブで<br/>予測明細 / 購買依頼明細 / 受注明細を参照"]
    F -->|しない| H["▶ 処理中ボタンを実行"]
    G --> H
    H --> I["📊 期間別の所要量として集計"]

標準メニュー未登録 (iDempiere 13 では無効化) 利用する場合は AD で ウィンドウを有効化 + メニュー登録 新規で需要ヘッダーを作成 名称 / カレンダー / 年(すべて必須) 保存 明細タブで需要を登録 品目 / 期間 / 数量 / 計算数量 詳細タブで 予測明細 / 購買依頼明細 / 受注明細を参照 ▶ 処理中ボタンを実行 期間別の所要量として集計 発生元を 紐づける? する しない

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

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

iDempiere 13 標準ではメニューに登録されていません(AD_Window_ID: 329)。利用する場合はアプリケーション辞書でウィンドウを有効化し、メニュー項目を追加する必要があります。

  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 名称: 需要計画の名称(60文字以内)
    • カレンダー: 会計カレンダー(C_Calendar
    • : 対象年(C_Year
  3. 任意項目:
    • 説明 / コメント: 補足情報
    • デフォルト: 既定の需要計画として使う場合にチェック
  4. 保存」をクリック
  1. 詳細」(M_DemandLine)タブに移動
  2. 必須項目を入力:
    • 品目: 需要対象の品目
    • 期間: 対象期間(C_Period
    • 数量: 需要数量
    • 計算数量: 計算された需要数量
  3. 保存」をクリック
  1. 明細を選択した状態で「詳細」(M_DemandDetail)タブに移動
  2. 発生元のいずれかを指定:
    • 予測明細M_ForecastLine_ID
    • 購買依頼伝票明細M_RequisitionLine_ID
    • 受注明細C_OrderLine_ID
  3. 保存」をクリック

⚠️ 注意: M_DemandDetail の 3 つの参照はいずれも任意項目です。どれを設定するかによって需要の出所(予測ベース/依頼ベース/受注ベース)が区別されます。

項目名必須説明
クライアント必須選択テナント(既定値 @#AD_Client_ID@
組織必須選択組織(既定値 @#AD_Org_ID@
名称必須文字列(60)需要計画の名称
説明-文字列(255)補足説明
コメント-文字列(2000)ヒント・注記
カレンダー必須選択会計カレンダー
必須選択対象年
デフォルト必須チェック既定の需要計画として使用
処理中-ボタン需要処理の起動
有効-チェックレコードが有効か(既定値 Y)
項目名必須説明
在庫需要必須選択親ヘッダーへの参照
品目必須検索需要対象の品目(識別子)
期間必須選択対象期間(識別子)
数量必須数量需要数量
計算数量必須数量計算された需要数量
有効必須チェックレコードが有効か(既定値 Y)
項目名必須説明
在庫需要明細行必須選択親明細への参照
予測明細-検索需要の発生元(予測)
購買依頼伝票明細-検索需要の発生元(購買依頼)
受注明細-検索需要の発生元(受注)
有効必須チェックレコードが有効か

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

Q. この画面は使うべきですか?

Section titled “Q. この画面は使うべきですか?”

新規導入では推奨されません。iDempiere 13 標準ではウィンドウが無効化され、標準メニューにも登録されていない旧互換機能です。所要量計画は製造モジュール(部品構成表・製造指図)や在庫補充ルールでの設計をご検討ください。

Q. 「数量」と「計算数量」の違いは何ですか?

Section titled “Q. 「数量」と「計算数量」の違いは何ですか?”

Qty(数量)は手入力・確定された需要数量、QtyCalculated(計算数量)は集計処理によって算出された数量を保持する列です。どちらも必須項目で、AD 上は数量型として定義されています。

Q. 在庫需要専用の M クラスはありますか?

Section titled “Q. 在庫需要専用の M クラスはありますか?”

ありません。M_Demand / M_DemandLine / M_DemandDetail はいずれも生成クラスのみX_M_Demand 314行、X_M_DemandLine 294行、X_M_DemandDetail 267行)で、ビジネスロジックを持つ MDemand 系クラスはコードベースに存在しません。したがって beforeSave() / afterSave() によるコア側の検証も行われません。

Q. 「処理中」ボタンは何をしますか?

Section titled “Q. 「処理中」ボタンは何をしますか?”

M_DemandProcessing はボタン型のカラムで、需要の生成・再計算プロセスを起動するために用意されています。M クラスが存在せず、標準メニューからも無効化されているため、実運用で使う場合は起動対象プロセスの実装状況を AD 上で確認してください(要確認)。

Q. 需要の粒度を週次にできますか?

Section titled “Q. 需要の粒度を週次にできますか?”

できません。明細の期間は会計カレンダーの期間(C_Period)を参照するため、需要計画の粒度は会計期間(通常は月次)に一致します。より細かい粒度が必要な場合は、独自テーブルまたは製造モジュールの計画機能での実装が必要です。

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

在庫需要は 3 階層のトランザクション型ウィンドウ(AD_Window_ID: 329)で、M_Demand(ヘッダー)・M_DemandLine(明細)・M_DemandDetail(発生元詳細)の 3 テーブルで構成されます。いずれもアクセスレベル 2(クライアントのみ)で、削除可能(IsDeleteable=Y)です。

M クラスは存在せず、生成クラス(X_M_Demand / X_M_DemandLine / X_M_DemandDetail)とインタフェース(I_M_Demand ほか)のみが提供されます。DocAction / DocStatus カラムを持たないため Document 型ではなく、伝票処理(完成・取消等)のワークフローもありません。

classDiagram
    class X_M_Demand {
        <<generated>>
        +getC_Calendar_ID() int
        +getC_Year_ID() int
        +isProcessing() boolean
    }
    class X_M_DemandLine {
        <<generated>>
        +getM_Product_ID() int
        +getC_Period_ID() int
        +getQty() BigDecimal
        +getQtyCalculated() BigDecimal
    }
    class X_M_DemandDetail {
        <<generated>>
        +getM_ForecastLine_ID() int
        +getM_RequisitionLine_ID() int
        +getC_OrderLine_ID() int
    }
    class PO {
        <<abstract>>
    }
    X_M_Demand --|> PO
    X_M_DemandLine --|> PO
    X_M_DemandDetail --|> PO
    X_M_Demand --> X_M_DemandLine : has many
    X_M_DemandLine --> X_M_DemandDetail : has many

<> +getC_Calendar_ID() int +getC_Year_ID() int +isProcessing() boolean <> +getM_Product_ID() int +getC_Period_ID() int +getQty() BigDecimal +getQtyCalculated() BigDecimal <> +getM_ForecastLine_ID() int +getM_RequisitionLine_ID() int +getC_OrderLine_ID() int <> > PO X_M_DemandLine --

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

カラム名必須説明備考
M_Demand_IDIDPK需要ID主キー
AD_Client_IDTable DirectYクライアント既定値 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定値 @#AD_Org_ID@
NameString(60)Y名称識別子カラム
DescriptionString(255)N説明
HelpString(2000)Nコメント
C_Calendar_IDTable DirectYカレンダー
C_Year_IDTable DirectY
IsDefaultYes-NoYデフォルト
ProcessingButtonN処理中ボタン型
IsActiveYes-NoY有効既定値 Y
カラム名必須説明備考
M_DemandLine_IDIDPK明細ID主キー
M_Demand_IDTable DirectY在庫需要IsParent=Y
M_Product_IDSearchY品目識別子カラム
C_Period_IDTable DirectY期間識別子カラム
QtyQuantityY数量
QtyCalculatedQuantityY計算数量
IsActiveYes-NoY有効既定値 Y
カラム名必須説明備考
M_DemandDetail_IDIDPK詳細ID主キー・識別子
M_DemandLine_IDTable DirectY在庫需要明細行IsParent=Y
M_ForecastLine_IDSearchN予測明細発生元(予測)
M_RequisitionLine_IDSearchN購買依頼伝票明細発生元(購買依頼)
C_OrderLine_IDSearchN受注明細発生元(受注)
IsActiveYes-NoY有効既定値 Y
erDiagram
    M_Demand ||--o{ M_DemandLine : "lines"
    M_DemandLine ||--o{ M_DemandDetail : "source details"
    M_Demand }o--|| C_Calendar : "calendar"
    M_Demand }o--|| C_Year : "year"
    M_DemandLine }o--|| M_Product : "product"
    M_DemandLine }o--|| C_Period : "period"
    M_DemandDetail }o--o| M_ForecastLine : "forecast source"
    M_DemandDetail }o--o| M_RequisitionLine : "requisition source"
    M_DemandDetail }o--o| C_OrderLine : "order source"

source details forecast source requisition source order source

3 テーブルとも M クラスを持たないため、コア側の beforeSave() / afterSave() / DocAction ロジックは存在しません。制約は AD 定義(必須項目・親子関係・既定値)のみで担保されます。

親子関係は次のとおり定義されています。

テーブル親カラム(IsParent=Y
M_DemandLineM_Demand_ID
M_DemandDetailM_DemandLine_ID

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

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

M_Demand / M_DemandLine / M_DemandDetail の各カラムには標準の Callout は定義されていません(gw_column.tsv の callout 列がすべて未設定)。

需要の集計ロジックを実装する場合は、X_M_Demand を継承した独自クラスを OSGi プラグインで作成し、IModelFactory サービスとして登録します。

public class MyDemand extends X_M_Demand {
public MyDemand(Properties ctx, int M_Demand_ID, String trxName) {
super(ctx, M_Demand_ID, trxName);
}
@Override
protected boolean beforeSave(boolean newRecord) {
// 例: 同一カレンダー・年でデフォルトが重複しないよう検証
return true;
}
}

クラスを追加せず制約のみを加える場合は Model Validator が簡便です。

public class CustomDemandValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (I_M_DemandLine.Table_Name.equals(po.get_TableName())
&& (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
BigDecimal qty = (BigDecimal) po.get_Value(I_M_DemandLine.COLUMNNAME_Qty);
if (qty != null && qty.signum() < 0) {
throw new AdempiereException("需要数量にマイナスは指定できません");
}
}
return null;
}
}

M_Demand.Processing はボタン型カラムとして用意されていますが、対応するプロセスの実装・割当は AD 上で確認が必要です(要確認)。予測・購買依頼・受注から需要を自動生成したい場合は、独自プロセス(SvrProcess 継承)を実装し、このボタンに割り当てる方式が実現しやすい構成です。

プロセス名起動場所説明
処理中(Process Now)在庫需要タブの Processing ボタン需要処理の起動用ボタン。割当プロセスは要確認

需要予測と所要量計画は、在庫水準と欠品リスクのバランスを決める重要な業務です。旧互換画面に依存せず、現行の製造・補充機能をベースにした計画基盤の設計をご提案できます。

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

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