コンテンツにスキップ

iDempiere 属性セットの使い方|在庫管理 操作マニュアル・技術仕様

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

属性セットは、品目に追加の属性(サイズ・色など)と、ロット番号・シリアル番号・保証日付といったトレーサビリティ情報を持たせるための定義マスタです。品目マスタの「属性セット」に紐づけることで、入出庫時に属性セットインスタンスが作成されます。

📌 ポイント: ロット追跡・シリアル番号追跡を有効にしたい場合は、必ず属性セットの定義が必要です。「必須タイプ」を設定すると、出荷前に品目インスタンスの選択・作成が強制されます。

  • 品目へ追加属性(サイズ・色など)を割り当てる定義
  • ロット番号による追跡の有効化(必須化も可能)
  • シリアル番号による追跡の有効化(必須化も可能)
  • 保証日付・保証日数(製造後の品質保持期間)の管理
  • ロット番号・シリアル番号の自動採番ルールの紐づけ
  • ロット/シリアルの表示用開始・終了文字の上書き(既定は « » および #
  • 属性セット入力の必須タイプ(常時/出荷時など)の指定
  • 特定テーブル・取引区分での属性セット入力の除外
  • 保証日付を在庫移動方針に使用する設定

属性セットは 3 タブ構成です。

タブ名テーブル項目数役割
属性セットM_AttributeSet22項目ロット・シリアル・保証日付の追跡設定
属性使用M_AttributeUse8項目この属性セットで使用する属性の割当
除外M_AttributeSetExclude6項目属性セット入力を除外するテーブル・取引区分

💡 ヒント: 「属性」(M_Attribute)そのものの定義は品目属性画面で行い、属性セットの「属性使用」タブでは既存の属性を割り当てるだけです。

graph TD
    A["🚀 メニューから開く<br/>在庫管理 > 品目属性管理 > 属性セット"] --> B["➕ 新規で名称を入力"]
    B --> C{追跡したい情報は?}
    C -->|ロット| D["🏷 ロットにチェック<br/>必要ならロット管理を紐づけ"]
    C -->|シリアル番号| E["🔢 シリアルNoにチェック<br/>必要ならシリアルNo管理を紐づけ"]
    C -->|有効期限| F["📅 保証日付にチェック<br/>保証日数を入力"]
    C -->|サイズ・色など| G["🎨 属性使用タブで<br/>属性を割当"]
    D --> H["⚙ 必須タイプを設定"]
    E --> H
    F --> H
    G --> H
    H --> I["💾 保存<br/>→ インスタンス属性フラグを自動制御"]
    I --> J["🔗 品目マスタの<br/>属性セットに設定"]

メニューから開く 在庫管理 > 品目属性管理 > 属性セット 新規で名称を入力 ロットにチェック 必要ならロット管理を紐づけ シリアルNoにチェック 必要ならシリアルNo管理を紐づけ 保証日付にチェック 保証日数を入力 属性使用タブで 属性を割当 必須タイプを設定 保存 → インスタンス属性フラグを自動制御 品目マスタの 属性セットに設定 追跡したい情報は? ロット シリアル番号 有効期限 サイズ・色など

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

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

メニューから「在庫管理 > 品目属性管理 > 属性セット」を開きます。

  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 名称: 属性セット名(60文字以内)
    • 必須タイプ: 属性セットインスタンスの指定を必須とするタイミング
    • AttributeSet Type: 属性セットの種別(既定値 MMS
  3. トレーサビリティ設定を選択:
    • ロット / 必須ロット: ロット番号による追跡
    • シリアルNo / 必須シリアルNo: シリアル番号による追跡
    • 保証日付 / 必須保証日付 / 保証日数: 有効期限管理
  4. 採番ルールを紐づけ(任意):
  5. 保存」をクリック
  1. 属性使用」タブに移動
  2. 新規」をクリックし、属性を選択(M_Attribute
  3. シーケンスNo は既存最大値 +10 が自動設定されます(画面表示順の制御)
  4. 必要に応じて Default Logic に既定値ロジックを入力
  5. 保存」をクリック
  1. 除外」タブに移動
  2. テーブル販売(ON) / 購買(OFF) を指定して登録
  3. 設定はキャッシュされるため、再ログインまたはキャッシュリセットを実施

⚠️ 注意: 保証日数(GuaranteeDays)は「製造後の品質保持期間(シェルフライフ)」を意味します。品目マスタ側の保証日数は「販売後の顧客サービス日付」を決めるもので、意味が異なります。

項目名必須説明
名称必須文字列(60)属性セット名
説明-文字列(255)補足説明
インスタンス属性必須チェックインスタンス固有の属性か(自動制御)
ロット必須チェックロット番号を持つ
必須ロット必須チェックインスタンス作成時にロット入力必須
ロット管理-選択ロット自動採番ルール(M_LotCtl
シリアルNo必須チェックシリアル番号を持つ
必須シリアルNo必須チェックインスタンス作成時にシリアル入力必須
シリアルNo管理-選択シリアル自動採番ルール(M_SerNoCtl
保証日付必須チェック保証・有効期限を持つ
必須保証日付必須チェックインスタンス作成時に保証日付必須
保証日数-整数製造後の品質保持日数
必須タイプ必須リスト属性セット指定を必須とするタイミング
AttributeSet Type必須リスト(3)属性セット種別(既定値 MMS)
接頭辞の前追加文字-文字列(1)ロット開始文字の上書き(既定 «
接尾辞の後ろ追加文字-文字列(1)ロット終了文字の上書き(既定 »
Use Guarantee Date for Material Policy-チェック保証日付を在庫移動方針に使用(既定値 N)
IsAutoGenerateLot-チェックロットの自動生成(既定値 N)
項目名必須説明
属性セット必須選択親レコードへの参照
属性必須選択割り当てる属性(M_Attribute
シーケンスNo必須整数表示順(既定値は最大値+10)
Default Logic-文字列(2000)既定値の階層ロジック(; 区切り)
有効必須チェックレコードが有効か

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

Q. 「インスタンス属性」チェックは手動で操作すべきですか?

Section titled “Q. 「インスタンス属性」チェックは手動で操作すべきですか?”

原則として自動制御に任せてください。MAttributeSet.beforeSave() は、シリアルNo・ロット・保証日付のいずれかが有効なのに「インスタンス属性」が未チェックの場合、自動で true に設定します。さらに afterSave() が、割り当てられた属性の IsInstanceAttribute も含めて条件を再判定し、SQL でフラグを Y / N に補正します。

Q. 属性セットを保存しても「インスタンス属性」が勝手に外れます

Section titled “Q. 属性セットを保存しても「インスタンス属性」が勝手に外れます”

シリアルNo・ロット・保証日付がすべて未チェックで、かつ「属性使用」タブに割り当てた属性にもインスタンス属性が 1 つも無い場合、afterSave() がフラグを N にリセットします。インスタンス属性として扱いたい属性がある場合は、品目属性側で当該属性の「インスタンス属性」を有効にしてください。

Q. 属性使用タブで属性を追加しようとすると「この場所では許可されていません」と出ます

Section titled “Q. 属性使用タブで属性を追加しようとすると「この場所では許可されていません」と出ます”

属性値タイプが「参照(Reference)」の属性は、上級ロールMRole.isAccessAdvanced())でなければ割り当てられません。MAttributeUse.beforeSave() でこの制御が行われています。ロール設定を見直すか、参照型以外の属性を使用してください。

Q. 「属性名が重複しています」というエラーが出ます

Section titled “Q. 「属性名が重複しています」というエラーが出ます”

属性セット種別が「テーブル属性(Table Attribute)」の場合、同一クライアント内で同じ属性名が別の属性セットで使われていないかが検証されます(MAttributeUse.beforeSave() の重複チェック)。属性名を一意にするか、割り当て先の属性セットを見直してください。

Q. 除外設定を変更したのに反映されません

Section titled “Q. 除外設定を変更したのに反映されません”

属性セットの情報はキャッシュされます。M_AttributeSetExclude(およびロット管理の除外)を変更した後は、再ログインするかキャッシュをリセットしてください。

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

属性セットはマスタデータ型のウィンドウ(AD_Window_ID: 256)で、M_AttributeSet テーブル(アクセスレベル 7 = システム+クライアント+組織)に格納されます。MAttributeSet クラス(550行)がインスタンス属性フラグの自動制御と除外判定を担い、MAttributeUse(159行)が属性割当、MAttributeSetExclude(99行)が除外定義を担当します。MAttributeSetmarkImmutable() を実装し、キャッシュ経由の不変オブジェクト参照に対応しています。Document 型ではありません。

classDiagram
    class MAttributeSet {
        +get(M_AttributeSet_ID) MAttributeSet
        +getMAttributes(instanceAttributes) MAttribute[]
        +isMandatory() boolean
        +isMandatoryAlways() boolean
        +isMandatoryShipping() boolean
        +excludeEntry(AD_Column_ID, isSOTrx) boolean
        +excludeTableEntry(AD_Table_ID, isSOTrx) boolean
        +isExcludeLot(AD_Column_ID, isSOTrx) boolean
        +isExcludeSerNo(AD_Column_ID, isSOTrx) boolean
        +getLotCharStart() String
        +beforeSave(newRecord) boolean
        +afterSave(newRecord, success) boolean
    }
    class MAttributeUse {
        +beforeSave(newRecord) boolean
        +afterSave(newRecord, success) boolean
        +afterDelete(success) boolean
    }
    class X_M_AttributeSet {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    MAttributeSet --|> X_M_AttributeSet
    X_M_AttributeSet --|> PO
    MAttributeSet --> MAttributeUse : has many
    MAttributeSet --> MAttributeSetExclude : has many
    MAttributeSet --> MLotCtl : lot numbering
    MAttributeUse --> MAttribute : assigns

+get(M_AttributeSet_ID) MAttributeSet +getMAttributes(instanceAttributes) MAttribute[] +isMandatory() boolean +isMandatoryAlways() boolean +isMandatoryShipping() boolean +excludeEntry(AD_Column_ID, isSOTrx) boolean +excludeTableEntry(AD_Table_ID, isSOTrx) boolean +isExcludeLot(AD_Column_ID, isSOTrx) boolean +isExcludeSerNo(AD_Column_ID, isSOTrx) boolean +getLotCharStart() String +beforeSave(newRecord) boolean +afterSave(newRecord, success) boolean +beforeSave(newRecord) boolean +afterSave(newRecord, success) boolean +afterDelete(success) boolean <> <> > X_M_AttributeSet X_M_AttributeSet --

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

カラム名必須説明備考
M_AttributeSet_IDIDPK属性セットID主キー
AD_Client_IDTable DirectYクライアント既定値 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定値 @#AD_Org_ID@
NameString(60)Y名称識別子カラム
DescriptionString(255)N説明
IsInstanceAttributeYes-NoYインスタンス属性beforeSave/afterSave で自動制御
IsLotYes-NoYロット
IsLotMandatoryYes-NoY必須ロット
M_LotCtl_IDTable DirectNロット管理採番ルール
IsSerNoYes-NoYシリアルNo
IsSerNoMandatoryYes-NoY必須シリアルNo
M_SerNoCtl_IDTable DirectNシリアルNo管理採番ルール
IsGuaranteeDateYes-NoY保証日付
IsGuaranteeDateMandatoryYes-NoY必須保証日付
GuaranteeDaysIntegerN保証日数製造後のシェルフライフ
MandatoryTypeList(1)Y必須タイプ
M_AttributeSet_TypeList(3)Y属性セット種別既定値 MMS
UseGuaranteeDateForMPolicyYes-NoN保証日付を在庫移動方針に使用既定値 N
IsAutoGenerateLotYes-NoNロット自動生成既定値 N
LotCharSOverwriteString(1)Nロット開始文字上書き既定 «
LotCharEOverwriteString(1)Nロット終了文字上書き既定 »
SerNoCharSOverwriteString(1)Nシリアル開始文字上書き既定 #
SerNoCharEOverwriteString(1)Nシリアル終了文字上書き既定は空
EntityTypeTable(40)NEntity Type既定値は DEFAULT_ENTITYTYPE システム設定
カラム名必須説明備考
M_AttributeSet_IDTable DirectPK属性セットFKIsParent=Y・識別子
M_Attribute_IDTable DirectPK属性FKIsParent=Y・識別子
SeqNoIntegerYシーケンスNo既定値 MAX(SeqNo)+10
DefaultValueString(2000)NDefault Logic; 区切りの既定値階層
EntityTypeTable(40)NEntity Type
IsActiveYes-NoY有効既定値 Y
カラム名必須説明
M_AttributeSetExclude_IDIDPK除外ID
M_AttributeSet_IDTable DirectY属性セットFK
AD_Table_IDTable DirectY除外対象テーブル
IsSOTrxYes-NoY販売=Y / 購買=N
erDiagram
    M_AttributeSet ||--o{ M_AttributeUse : "uses attributes"
    M_AttributeSet ||--o{ M_AttributeSetExclude : "exclusions"
    M_AttributeSet }o--o| M_LotCtl : "lot numbering"
    M_AttributeSet }o--o| M_SerNoCtl : "serial numbering"
    M_AttributeUse }o--|| M_Attribute : "attribute"
    M_Product }o--o| M_AttributeSet : "attribute set"
    M_AttributeSet ||--o{ M_AttributeSetInstance : "instances"

uses attributes lot numbering serial numbering attribute set

beforeSave() — インスタンス属性の強制セット

Section titled “beforeSave() — インスタンス属性の強制セット”
if (!isInstanceAttribute() && (isSerNo() || isLot() || isGuaranteeDate()))
setIsInstanceAttribute(true);

シリアルNo・ロット・保証日付のいずれかが有効なら、IsInstanceAttribute を強制的に Y にします。

afterSave() — インスタンス属性フラグの双方向補正

Section titled “afterSave() — インスタンス属性フラグの双方向補正”

afterSave() は SQL による一括更新で、フラグを双方向に補正します。

flowchart TD
    A["afterSave"] --> B{IsInstanceAttribute = N ?}
    B -->|Yes| C["UPDATE ... SET IsInstanceAttribute='Y'<br/>条件: IsSerNo/IsLot/IsGuaranteeDate のいずれかが Y<br/>または 有効な M_AttributeUse 経由で<br/>IsInstanceAttribute='Y' の属性が存在"]
    B -->|No| D{IsInstanceAttribute = Y かつ<br/>SerNo/Lot/GuaranteeDate すべて N ?}
    C --> D
    D -->|Yes| E["UPDATE ... SET IsInstanceAttribute='N'<br/>条件: インスタンス属性を持つ<br/>有効な属性が 1 件も無い"]
    D -->|No| F["変更なし"]
    E --> F

UPDATE ... SET IsInstanceAttribute='Y' 条件: IsSerNo/IsLot/IsGuaranteeDate のいずれかが Y または 有効な M_AttributeUse 経由で IsInstanceAttribute='Y' の属性が存在 UPDATE ... SET IsInstanceAttribute='N' 条件: インスタンス属性を持つ 有効な属性が 1 件も無い 変更なし IsInstanceAttribute = N ? IsInstanceAttribute = Y かつ SerNo/Lot/GuaranteeDate すべて N ?

更新が実際に行われた場合(no != 0)は、メモリ上のオブジェクトにも setIsInstanceAttribute() を反映します。

MAttributeUse 側の afterSave() / afterDelete() にも同じ 2 本の SQL が実装されており、属性の割当・解除のたびに親属性セットのフラグが再計算されます(afterDelete() は内部で afterSave(false, success) を呼び出す実装)。

メソッド説明
isMandatory()属性セットインスタンスの指定が必須か
isMandatoryAlways()常時必須か
isMandatoryShipping()出荷時のみ必須か
メソッド説明
excludeEntry(AD_Column_ID, isSOTrx)列単位の属性セット入力除外
excludeTableEntry(AD_Table_ID, isSOTrx)テーブル単位の属性セット入力除外
isExcludeLot(AD_Column_ID, isSOTrx)ロット入力・生成の除外
isExcludeSerNo(AD_Column_ID, isSOTrx)シリアル番号入力・生成の除外

getLotCharStart() / getLotCharEnd() / getSerNoCharStart() / getSerNoCharEnd() は、上書き列(LotCharSOverwrite 等)が設定されていればその値を、未設定なら既定文字(« » #)を返します。属性セットインスタンスの表示名生成に使われます。

MAttributeUse.beforeSave() の主要チェック

Section titled “MAttributeUse.beforeSave() の主要チェック”
  1. 参照型属性の権限チェック: 新規または属性変更時、属性値タイプが Reference なら MRole.getDefault().isAccessAdvanced() が必要。満たさない場合は ActionNotAllowedHere で保存中止
  2. シーケンス自動採番: SeqNo が 0 なら SELECT COALESCE(MAX(SeqNo),0)+10 FROM M_AttributeUse WHERE M_AttributeSet_ID=? で自動設定
  3. テーブル属性の名称重複チェック: 属性セット種別が TableAttribute の場合、SQL_GET_TA_DUPLICATE_ATTRIBUTE で同一クライアント内の属性名重複を検出し、UniqueAttribute メッセージで保存中止

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

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

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

public class CustomAttributeSetValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MAttributeSet && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
MAttributeSet as = (MAttributeSet) po;
// 例: 保証日付を使う場合は保証日数の入力を必須にする
if (as.isGuaranteeDate() && as.getGuaranteeDays() <= 0) {
throw new AdempiereException("保証日付を使用する場合は保証日数を入力してください");
}
}
return null;
}
}

⚠️ 注意: IsInstanceAttribute はコアが beforeSave() / afterSave() で自動制御します。Model Validator から同フラグを直接書き換えると、afterSave() の SQL 補正と競合して意図しない値に戻ることがあります。

UseGuaranteeDateForMPolicy を有効にすると、保証日付が在庫移動方針(FIFO / LIFO)の並び順に使用されます。有効期限順の引き当て(FEFO 相当)を要件とする場合は、この設定と品目カテゴリの在庫移動方針を組み合わせて検討してください。

リファレンスページ・メニューに、このウィンドウ固有の標準プロセス(ボタン起動プロセス)は登録されていません。


ロット追跡・シリアル追跡・有効期限管理は、食品・医薬品・製造業の品質保証要件に直結します。iDempiere の属性セットは標準機能だけでも広くカバーでき、不足分は Model Validator で安全に補えます。

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

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