コンテンツにスキップ

iDempiere 品目カテゴリの使い方|在庫管理 操作マニュアル・技術仕様

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

品目カテゴリは、品目マスタを分類するグルーピングのマスタです。単なる分類にとどまらず、会計スキーマごとの勘定科目テンプレート在庫移動方針(FIFO / LIFO)・在庫評価方法を保持しており、新規品目登録時の会計設定の初期値を決定します。

📌 ポイント: 品目を登録する前に品目カテゴリを整備してください。品目の会計設定(M_Product_Acct)はカテゴリの会計タブからコピーされるため、後からカテゴリを直しても既存品目には自動反映されません。

  • 品目の分類グループの定義(検索キー・名称)
  • 親品目カテゴリによる階層(ツリー)構造の構築
  • 在庫移動方針(FIFO / LIFO)の指定
  • 会計スキーマごとの在庫評価方法・在庫評価レベルの設定
  • 品目資産・売上原価・品目売上など 15 種類以上の勘定科目テンプレートの設定
  • 所属品目タブでのカテゴリ配下品目の一覧確認
  • 「所属品目勘定科目上書き」ボタンによる配下品目への会計設定一括反映
  • 価格表・割引スキーマの条件としてのカテゴリ利用
  • 計画マージン % の設定、資産グループ・カラーの紐づけ
  • 多言語対応(翻訳タブ)

品目カテゴリは 4 タブ構成です。

タブ名テーブル項目数役割
品目カテゴリM_Product_Category13項目基本情報・階層・在庫移動方針
会計M_Product_Category_Acct21項目会計スキーマ別の勘定科目・在庫評価方法
所属品目M_Product12項目このカテゴリに属する品目の一覧
翻訳M_Product_Category_Trl8項目多言語対応の翻訳

💡 ヒント: 「所属品目」タブは参照・軽微な編集用のビューです。品目の詳細設定は品目マスタから行ってください。

graph TD
    A["🚀 メニューから開く<br/>在庫管理 > 品目マスタ管理 > 品目カテゴリ"] --> B["➕ 新規ボタンをクリック"]
    B --> C["🏷 検索キー・名称を入力<br/>(必須)"]
    C --> D{階層構造にする?}
    D -->|する| E["🌳 親品目カテゴリを選択<br/>(ループは Callout が検知)"]
    D -->|しない| F["📦 在庫移動方針を選択<br/>FIFO / LIFO"]
    E --> F
    F --> G["💾 保存<br/>→ 会計レコードが自動生成"]
    G --> H["📒 会計タブで<br/>在庫評価方法・勘定科目を設定"]
    H --> I{既存品目にも<br/>反映する?}
    I -->|する| J["🔁 所属品目勘定科目上書き<br/>ボタンを実行"]
    I -->|しない| K["✅ 以降の新規品目に適用"]
    J --> K

メニューから開く 在庫管理 > 品目マスタ管理 > 品目カテゴリ 新規ボタンをクリック 検索キー・名称を入力 (必須) 親品目カテゴリを選択 (ループは Callout が検知) 在庫移動方針を選択 FIFO / LIFO 保存 → 会計レコードが自動生成 会計タブで 在庫評価方法・勘定科目を設定 所属品目勘定科目上書き ボタンを実行 以降の新規品目に適用 階層構造にする? 既存品目にも 反映する? する しない

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

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

メニューから「在庫管理 > 品目マスタ管理 > 品目カテゴリ」を開きます。

  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 検索キー: カテゴリコード(40文字以内・一意)
    • 名称: カテゴリ名(60文字以内)
    • 在庫移動方針: FIFO(先入先出)または LIFO(後入先出)。既定値は F(FIFO)
    • 計画マージン %: プロジェクトの計画マージン率
  3. 必要に応じて任意項目を入力:
    • 親品目カテゴリ: 上位カテゴリ(階層化する場合)
    • 説明: 補足説明
    • デフォルト: 既定カテゴリとして使う場合にチェック
    • セルフサービス: セルフサービスからの参照・変更を許可する場合(既定値 Y)
    • 資産グループ / カラー: 資産計上・印刷色の指定
  4. 保存」をクリック(保存時に会計レコードが自動生成されます)
  1. 会計」タブに移動(会計スキーマごとに 1 行が自動生成済み)
  2. 在庫評価の設定:
    • 在庫評価方法: 標準原価・平均原価・先入先出等(未設定時は会計スキーマの既定値を使用)
    • 在庫評価レベル: 原価を集計する最小レベル
  3. 必須の勘定科目を設定:
    • 品目資産勘定 / 品目費用勘定 / 原価調整勘定 / 仕入仮勘定
    • 売上原価勘定 / 品目売上勘定
    • 発注入荷差異勘定(PPV)/ 入荷請求差異勘定(IPV)
    • 仕入値引勘定 / 売上値引勘定 / 賃率差異勘定
  4. 保存」をクリック

⚠️ 注意: 「在庫評価レベル」を運用開始後に変更すると原価計算の集計単位が変わります。MProductCategoryAcct.beforeSave() で変更検証が行われますが、既存の原価データへの影響が大きいため、変更は在庫・原価がクリアな時点で行ってください。

会計タブの「所属品目勘定科目上書き」ボタンを実行すると、選択した品目カテゴリに所属する品目マスタの自動仕訳設定を、カテゴリの設定と同じ内容で上書きします。

項目名必須説明
検索キー必須文字列(40)カテゴリコード(一意)
名称必須文字列(60)カテゴリ名
説明-文字列(255)補足説明
親品目カテゴリ-選択上位カテゴリ(ループ検出 Callout あり)
在庫移動方針必須リストF=FIFO / L=LIFO(既定値 F)
デフォルト必須チェック既定カテゴリとして使用
セルフサービス必須チェックセルフサービス対象(既定値 Y)
計画マージン %必須数値プロジェクトの計画マージン率
資産グループ-選択資産計上時の資産グループ
カラー-選択印刷・表示用のカラー
有効-チェックレコードが有効か(既定値 Y)
項目名必須説明
会計スキーマ必須選択対象の会計スキーマ
在庫評価方法-リスト原価計算方法(未設定時はスキーマ既定)
在庫評価レベル-リスト原価を集計する最小レベル
品目資産勘定必須勘定科目在庫資産の勘定
品目費用勘定必須勘定科目品目費用の勘定
売上原価勘定必須勘定科目売上原価(COGS)
品目売上勘定必須勘定科目品目売上
仕入仮勘定必須勘定科目入荷時の仮勘定
発注入荷差異勘定必須勘定科目標準原価と発注価格の差異(PPV)
入荷請求差異勘定必須勘定科目原価と請求価格の差異(IPV)

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

Q. 親品目カテゴリを設定したら「ループを検出しました」というエラーになります

Section titled “Q. 親品目カテゴリを設定したら「ループを検出しました」というエラーになります”

品目カテゴリの階層に循環参照(A の親が B、B の親が A など)が生じています。MProductCategory.beforeSave()hasLoopInTree() でツリー全体を走査し、ループを検出すると ProductCategoryLoopDetected メッセージを出力して保存を中止します。親カテゴリの指定を見直してください。

Q. 会計タブの行はどのタイミングで作られますか?

Section titled “Q. 会計タブの行はどのタイミングで作られますか?”

新規保存時です。MProductCategory.afterSave()insert_Accounting("M_Product_Category_Acct", "C_AcctSchema_Default", null) を実行し、既定の会計スキーマ設定をコピーした会計レコードを自動生成します。

Q. カテゴリの会計設定を変更したら、既存品目にも反映されますか?

Section titled “Q. カテゴリの会計設定を変更したら、既存品目にも反映されますか?”

自動では反映されません。品目の会計設定(M_Product_Acct)は品目作成時にカテゴリからコピーされる仕組みです。既存品目にも適用したい場合は、会計タブの「所属品目勘定科目上書き」ボタンを実行してください。

Q. 在庫移動方針(FIFO / LIFO)は何に使われますか?

Section titled “Q. 在庫移動方針(FIFO / LIFO)は何に使われますか?”

在庫の払い出し順序を決める方針です。MProductCategory.isFiFo()MMPolicy の値を判定し、出荷・在庫引き当て処理での消費順序に用いられます。既定値は F(FIFO)です。

Q. 在庫評価方法を空欄にするとどうなりますか?

Section titled “Q. 在庫評価方法を空欄にするとどうなりますか?”

会計スキーマに設定された既定の在庫評価方法が使用されます。カテゴリ側で明示的に設定した場合のみ、その方法が優先されます。値を設定すると MProductCategoryAcct.checkCosting() が対応する原価要素(MCostElement)を自動生成します。

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

品目カテゴリはマスタデータ型のウィンドウ(AD_Window_ID: 144)で、M_Product_Category テーブル(アクセスレベル 3)に格納されます。MProductCategory クラス(346行)が階層のループ検出と会計レコードの自動生成を担い、MProductCategoryAcct クラス(247行)が会計スキーマ別の勘定科目・原価設定を保持します。両クラスとも markImmutable() を実装しており、キャッシュ経由の不変オブジェクト参照に対応しています。Document 型ではありません。

classDiagram
    class MProductCategory {
        +get(M_Product_Category_ID) MProductCategory
        +isCategory(categoryId, productId) boolean
        +beforeSave(newRecord) boolean
        +afterSave(newRecord, success) boolean
        +isFiFo() boolean
        +hasLoopInTree() boolean
        +markImmutable() MProductCategory
    }
    class MProductCategoryAcct {
        +get(categoryId, acctSchemaId) MProductCategoryAcct
        +checkCosting() void
        +beforeSave(newRecord) boolean
        +afterSave(newRecord, success) boolean
    }
    class X_M_Product_Category {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    class ImmutablePOSupport {
        <<interface>>
    }
    MProductCategory --|> X_M_Product_Category
    X_M_Product_Category --|> PO
    MProductCategory ..|> ImmutablePOSupport
    MProductCategory --> MProductCategoryAcct : has many
    MProductCategory --> MProduct : classifies
    MProductCategoryAcct --> MCostElement : creates

+get(M_Product_Category_ID) MProductCategory +isCategory(categoryId, productId) boolean +beforeSave(newRecord) boolean +afterSave(newRecord, success) boolean +isFiFo() boolean +hasLoopInTree() boolean +markImmutable() MProductCategory +get(categoryId, acctSchemaId) MProductCategoryAcct +checkCosting() void +beforeSave(newRecord) boolean +afterSave(newRecord, success) boolean <> <> <> > X_M_Product_Category X_M_Product_Category --

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

M_Product_Category(品目カテゴリ)

Section titled “M_Product_Category(品目カテゴリ)”
カラム名必須説明備考
M_Product_Category_IDIDPK品目カテゴリID主キー
AD_Client_IDTable DirectYクライアント既定値 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定値 @#AD_Org_ID@
ValueString(40)Y検索キー一意
NameString(60)Y名称識別子カラム
DescriptionString(255)N説明
M_Product_Category_Parent_IDTableN親品目カテゴリCallout: CalloutProductCategory.testForLoop
MMPolicyList(1)Y在庫移動方針既定値 F(FIFO)
IsDefaultYes-NoYデフォルト
IsSelfServiceYes-NoYセルフサービス既定値 Y
PlannedMarginNumberY計画マージン %
A_Asset_Group_IDTable DirectN資産グループ
AD_PrintColor_IDTable DirectNカラー
IsActiveYes-NoY有効既定値 Y

M_Product_Category_Acct(品目カテゴリ会計)

Section titled “M_Product_Category_Acct(品目カテゴリ会計)”

会計スキーマ(C_AcctSchema_ID)ごとに 1 レコード。主要カラムは在庫評価設定と勘定科目です。

カラム名必須説明
M_Product_Category_IDTable DirectPK品目カテゴリFK
C_AcctSchema_IDTable DirectPK会計スキーマFK
CostingMethodListN在庫評価方法
CostingLevelListN在庫評価レベル
P_Asset_AcctAccountY品目資産勘定
P_Expense_AcctAccountY品目費用勘定
P_COGS_AcctAccountY売上原価勘定
P_Revenue_AcctAccountY品目売上勘定
P_InventoryClearing_AcctAccountY仕入仮勘定
P_CostAdjustment_AcctAccountY原価調整勘定
P_PurchasePriceVariance_AcctAccountY発注入荷差異勘定(PPV)
P_InvoicePriceVariance_AcctAccountY入荷請求差異勘定(IPV)
P_TradeDiscountRec_AcctAccountY仕入値引勘定
P_TradeDiscountGrant_AcctAccountY売上値引勘定
P_RateVariance_AcctAccountY賃率差異勘定
P_AverageCostVariance_AcctAccountN平均原価差異勘定
P_LandedCostClearing_AcctAccountN荷揚コスト勘定
erDiagram
    M_Product_Category ||--o{ M_Product_Category_Acct : "accounting by schema"
    M_Product_Category ||--o{ M_Product_Category_Trl : "translations"
    M_Product_Category ||--o{ M_Product : "classifies"
    M_Product_Category ||--o{ M_Product_Category : "parent-child"
    M_Product_Category ||--o{ M_DiscountSchemaBreak : "discount condition"
    M_Product_Category_Acct }o--|| C_AcctSchema : "schema"

accounting by schema discount condition

MProductCategory.beforeSave() の処理は 1 点に集約されています。

  1. hasLoopInTree() を呼び出す
  2. ループが検出されたら Msg.getMsg(getCtx(), "ProductCategoryLoopDetected")saveError に記録し false を返却(保存中止)

hasLoopInTree()SELECT M_Product_Category_ID, M_Product_Category_Parent_ID FROM M_Product_Category で全カテゴリを読み込み、自レコードについては変更後の親 ID を使ってノード集合を構築します。その後 hasLoop() が親を再帰的にたどり、開始ノードに戻ってきたらループと判定します。SQL 例外時も安全側に倒して true(ループあり)を返します。

💡 ヒント: 親カテゴリの入力時点でも CalloutProductCategory.testForLoop Callout が動作し、UI 上で即座に警告されます。beforeSave() はその最終防衛線です。

afterSave() — 会計レコードの自動生成

Section titled “afterSave() — 会計レコードの自動生成”
if (newRecord && success)
insert_Accounting("M_Product_Category_Acct", "C_AcctSchema_Default", null);

新規レコードの保存成功時のみ、既定会計スキーマ(C_AcctSchema_Default)の設定を雛形として M_Product_Category_Acct を生成します。

isFiFo()MMPOLICY_FiFo.equals(getMMPolicy()) を返すだけの単純な判定です。MMPolicy の既定値は F のため、明示的に設定しない限り FIFO として扱われます。

MProductCategoryAcct の検証と原価要素生成

Section titled “MProductCategoryAcct の検証と原価要素生成”
メソッド処理
beforeSave()CostingLevel の変更時に検証。null の場合は会計スキーマ(MAcctSchema)の既定レベルで補完して比較
afterSave()checkCosting() を呼び出す
checkCosting()CostingMethod が設定されていれば MCostElement.getMaterialCostElement(this, getCostingMethod()) で原価要素を取得・生成

MProductCategory.isCategory(int M_Product_Category_ID, int M_Product_ID) は、指定品目が指定カテゴリに属するかを判定します。割引スキーマMDiscountSchemaBreak.applies() から、品目カテゴリ条件の照合に利用されています。

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

Section titled “拡張ポイント(カスタマイズ箇所)”
カラムCallout クラス・メソッド用途
M_Product_Category_Parent_IDorg.compiere.model.CalloutProductCategory.testForLoop親カテゴリ指定時のループ検出
public class CustomProductCategoryValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MProductCategory && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
MProductCategory pc = (MProductCategory) po;
// 例: カテゴリコードの命名規則を強制
if (pc.getValue() != null && !pc.getValue().matches("[A-Z]{3}-\\d{2}")) {
throw new AdempiereException("カテゴリコードは「ABC-01」形式で入力してください");
}
}
return null;
}
}

カテゴリ会計の変更を配下品目へ展開する処理は、標準では会計タブの「所属品目勘定科目上書き」ボタン(Processing カラム)から実行します。展開条件を業務要件に合わせて絞りたい場合は、M_Product_Acct を操作する独自プロセスを OSGi プラグインとして追加し、メニューまたはボタンに割り当てる方式が安全です。

プロセス名起動場所説明
所属品目勘定科目上書き会計タブの Processing ボタン選択した品目カテゴリに所属する品目マスタの自動仕訳設定を、品目カテゴリの設定と同じになるよう上書き修正

品目カテゴリは会計設定・原価計算・価格戦略が交差する要のマスタです。カテゴリ体系の設計と勘定科目テンプレートの整備は、導入初期に固めておくほど後工程が楽になります。

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

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