iDempiere 属性セットの使い方|在庫管理 操作マニュアル・技術仕様
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
属性セットは、品目に追加の属性(サイズ・色など)と、ロット番号・シリアル番号・保証日付といったトレーサビリティ情報を持たせるための定義マスタです。品目マスタの「属性セット」に紐づけることで、入出庫時に属性セットインスタンスが作成されます。
📌 ポイント: ロット追跡・シリアル番号追跡を有効にしたい場合は、必ず属性セットの定義が必要です。「必須タイプ」を設定すると、出荷前に品目インスタンスの選択・作成が強制されます。
属性セットでできること
Section titled “属性セットでできること”- 品目へ追加属性(サイズ・色など)を割り当てる定義
- ロット番号による追跡の有効化(必須化も可能)
- シリアル番号による追跡の有効化(必須化も可能)
- 保証日付・保証日数(製造後の品質保持期間)の管理
- ロット番号・シリアル番号の自動採番ルールの紐づけ
- ロット/シリアルの表示用開始・終了文字の上書き(既定は
«»および#) - 属性セット入力の必須タイプ(常時/出荷時など)の指定
- 特定テーブル・取引区分での属性セット入力の除外
- 保証日付を在庫移動方針に使用する設定
属性セットは 3 タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 属性セット | M_AttributeSet | 22項目 | ロット・シリアル・保証日付の追跡設定 |
| 属性使用 | M_AttributeUse | 8項目 | この属性セットで使用する属性の割当 |
| 除外 | M_AttributeSetExclude | 6項目 | 属性セット入力を除外するテーブル・取引区分 |
💡 ヒント: 「属性」(
M_Attribute)そのものの定義は品目属性画面で行い、属性セットの「属性使用」タブでは既存の属性を割り当てるだけです。
基本操作手順
Section titled “基本操作手順”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/>属性セットに設定"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「在庫管理 > 品目属性管理 > 属性セット」を開きます。
- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 名称: 属性セット名(60文字以内)
- 必須タイプ: 属性セットインスタンスの指定を必須とするタイミング
- AttributeSet Type: 属性セットの種別(既定値
MMS)
- トレーサビリティ設定を選択:
- ロット / 必須ロット: ロット番号による追跡
- シリアルNo / 必須シリアルNo: シリアル番号による追跡
- 保証日付 / 必須保証日付 / 保証日数: 有効期限管理
- 採番ルールを紐づけ(任意):
- 「保存」をクリック
属性の割当(属性使用タブ)
Section titled “属性の割当(属性使用タブ)”- 「属性使用」タブに移動
- 「新規」をクリックし、属性を選択(
M_Attribute) - シーケンスNo は既存最大値 +10 が自動設定されます(画面表示順の制御)
- 必要に応じて Default Logic に既定値ロジックを入力
- 「保存」をクリック
- 「除外」タブに移動
- テーブルと 販売(ON) / 購買(OFF) を指定して登録
- 設定はキャッシュされるため、再ログインまたはキャッシュリセットを実施
⚠️ 注意: 保証日数(
GuaranteeDays)は「製造後の品質保持期間(シェルフライフ)」を意味します。品目マスタ側の保証日数は「販売後の顧客サービス日付」を決めるもので、意味が異なります。
項目リファレンス
Section titled “項目リファレンス”属性セットタブ(主要項目)
Section titled “属性セットタブ(主要項目)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 名称 | 必須 | 文字列(60) | 属性セット名 |
| 説明 | - | 文字列(255) | 補足説明 |
| インスタンス属性 | 必須 | チェック | インスタンス固有の属性か(自動制御) |
| ロット | 必須 | チェック | ロット番号を持つ |
| 必須ロット | 必須 | チェック | インスタンス作成時にロット入力必須 |
| ロット管理 | - | 選択 | ロット自動採番ルール(M_LotCtl) |
| シリアルNo | 必須 | チェック | シリアル番号を持つ |
| 必須シリアルNo | 必須 | チェック | インスタンス作成時にシリアル入力必須 |
| シリアルNo管理 | - | 選択 | シリアル自動採番ルール(M_SerNoCtl) |
| 保証日付 | 必須 | チェック | 保証・有効期限を持つ |
| 必須保証日付 | 必須 | チェック | インスタンス作成時に保証日付必須 |
| 保証日数 | - | 整数 | 製造後の品質保持日数 |
| 必須タイプ | 必須 | リスト | 属性セット指定を必須とするタイミング |
| AttributeSet Type | 必須 | リスト(3) | 属性セット種別(既定値 MMS) |
| 接頭辞の前追加文字 | - | 文字列(1) | ロット開始文字の上書き(既定 «) |
| 接尾辞の後ろ追加文字 | - | 文字列(1) | ロット終了文字の上書き(既定 ») |
| Use Guarantee Date for Material Policy | - | チェック | 保証日付を在庫移動方針に使用(既定値 N) |
| IsAutoGenerateLot | - | チェック | ロットの自動生成(既定値 N) |
属性使用タブ
Section titled “属性使用タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 属性セット | 必須 | 選択 | 親レコードへの参照 |
| 属性 | 必須 | 選択 | 割り当てる属性(M_Attribute) |
| シーケンスNo | 必須 | 整数 | 表示順(既定値は最大値+10) |
| Default Logic | - | 文字列(2000) | 既定値の階層ロジック(; 区切り) |
| 有効 | 必須 | チェック | レコードが有効か |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”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行)が除外定義を担当します。MAttributeSet は markImmutable() を実装し、キャッシュ経由の不変オブジェクト参照に対応しています。Document 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”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
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MAttributeSet.java、MAttributeUse.java、MAttributeSetExclude.java
関連DBテーブル
Section titled “関連DBテーブル”M_AttributeSet(属性セット)
Section titled “M_AttributeSet(属性セット)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_AttributeSet_ID | ID | PK | 属性セットID | 主キー |
| AD_Client_ID | Table Direct | Y | クライアント | 既定値 @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | 既定値 @#AD_Org_ID@ |
| Name | String(60) | Y | 名称 | 識別子カラム |
| Description | String(255) | N | 説明 | |
| IsInstanceAttribute | Yes-No | Y | インスタンス属性 | beforeSave/afterSave で自動制御 |
| IsLot | Yes-No | Y | ロット | |
| IsLotMandatory | Yes-No | Y | 必須ロット | |
| M_LotCtl_ID | Table Direct | N | ロット管理 | 採番ルール |
| IsSerNo | Yes-No | Y | シリアルNo | |
| IsSerNoMandatory | Yes-No | Y | 必須シリアルNo | |
| M_SerNoCtl_ID | Table Direct | N | シリアルNo管理 | 採番ルール |
| IsGuaranteeDate | Yes-No | Y | 保証日付 | |
| IsGuaranteeDateMandatory | Yes-No | Y | 必須保証日付 | |
| GuaranteeDays | Integer | N | 保証日数 | 製造後のシェルフライフ |
| MandatoryType | List(1) | Y | 必須タイプ | |
| M_AttributeSet_Type | List(3) | Y | 属性セット種別 | 既定値 MMS |
| UseGuaranteeDateForMPolicy | Yes-No | N | 保証日付を在庫移動方針に使用 | 既定値 N |
| IsAutoGenerateLot | Yes-No | N | ロット自動生成 | 既定値 N |
| LotCharSOverwrite | String(1) | N | ロット開始文字上書き | 既定 « |
| LotCharEOverwrite | String(1) | N | ロット終了文字上書き | 既定 » |
| SerNoCharSOverwrite | String(1) | N | シリアル開始文字上書き | 既定 # |
| SerNoCharEOverwrite | String(1) | N | シリアル終了文字上書き | 既定は空 |
| EntityType | Table(40) | N | Entity Type | 既定値は DEFAULT_ENTITYTYPE システム設定 |
M_AttributeUse(属性使用)
Section titled “M_AttributeUse(属性使用)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_AttributeSet_ID | Table Direct | PK | 属性セットFK | IsParent=Y・識別子 |
| M_Attribute_ID | Table Direct | PK | 属性FK | IsParent=Y・識別子 |
| SeqNo | Integer | Y | シーケンスNo | 既定値 MAX(SeqNo)+10 |
| DefaultValue | String(2000) | N | Default Logic | ; 区切りの既定値階層 |
| EntityType | Table(40) | N | Entity Type | |
| IsActive | Yes-No | Y | 有効 | 既定値 Y |
M_AttributeSetExclude(除外)
Section titled “M_AttributeSetExclude(除外)”| カラム名 | 型 | 必須 | 説明 |
|---|---|---|---|
| M_AttributeSetExclude_ID | ID | PK | 除外ID |
| M_AttributeSet_ID | Table Direct | Y | 属性セットFK |
| AD_Table_ID | Table Direct | Y | 除外対象テーブル |
| IsSOTrx | Yes-No | Y | 販売=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"
ビジネスロジック
Section titled “ビジネスロジック”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
更新が実際に行われた場合(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) | シリアル番号入力・生成の除外 |
表示文字の取得
Section titled “表示文字の取得”getLotCharStart() / getLotCharEnd() / getSerNoCharStart() / getSerNoCharEnd() は、上書き列(LotCharSOverwrite 等)が設定されていればその値を、未設定なら既定文字(« » #)を返します。属性セットインスタンスの表示名生成に使われます。
MAttributeUse.beforeSave() の主要チェック
Section titled “MAttributeUse.beforeSave() の主要チェック”- 参照型属性の権限チェック: 新規または属性変更時、属性値タイプが
ReferenceならMRole.getDefault().isAccessAdvanced()が必要。満たさない場合はActionNotAllowedHereで保存中止 - シーケンス自動採番:
SeqNoが 0 ならSELECT COALESCE(MAX(SeqNo),0)+10 FROM M_AttributeUse WHERE M_AttributeSet_ID=?で自動設定 - テーブル属性の名称重複チェック: 属性セット種別が
TableAttributeの場合、SQL_GET_TA_DUPLICATE_ATTRIBUTEで同一クライアント内の属性名重複を検出し、UniqueAttributeメッセージで保存中止
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”既存 Callout
Section titled “既存 Callout”M_AttributeSet / M_AttributeUse / M_AttributeSetExclude の各カラムには、標準の Callout は定義されていません(gw_column.tsv の callout 列がすべて未設定)。
OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”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 補正と競合して意図しない値に戻ることがあります。
在庫引き当てへの反映
Section titled “在庫引き当てへの反映”UseGuaranteeDateForMPolicy を有効にすると、保証日付が在庫移動方針(FIFO / LIFO)の並び順に使用されます。有効期限順の引き当て(FEFO 相当)を要件とする場合は、この設定と品目カテゴリの在庫移動方針を組み合わせて検討してください。
関連プロセス
Section titled “関連プロセス”リファレンスページ・メニューに、このウィンドウ固有の標準プロセス(ボタン起動プロセス)は登録されていません。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”ロット追跡・シリアル追跡・有効期限管理は、食品・医薬品・製造業の品質保証要件に直結します。iDempiere の属性セットは標準機能だけでも広くカバーでき、不足分は Model Validator で安全に補えます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。