コンテンツにスキップ

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

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

属性検索は、内容の似た複数の品目属性を 1 つの「共通検索属性」にまとめ、属性値をまたいだ検索を可能にする定義です。例えば「ドレスシャツのサイズ(XL/L/M/S/XS)」と「T シャツのサイズ(S/M/L)」を 1 つの「サイズ」検索属性に束ねると、個々の属性を意識せずに全サイズ値から選択できるようになります。

⚠️ 注意: この画面は iDempiere 13 標準では無効化されています(旧バージョンからの互換用)。標準メニューにも登録されていないため、新規の業務設計での利用は推奨されません。属性による絞り込みは品目属性属性セットで設計してください。

  • 共通検索属性(名称・説明)の定義
  • 複数の品目属性を 1 つの検索属性へ束ねる紐づけ
  • 束ねた属性の一覧確認(アサイン済み属性タブ)
  • 個々の属性メンテナンスの負担軽減(属性値をまたいだ選択肢の提供)

属性検索は 2 タブ構成です。

タブ名テーブル項目数役割
属性検索M_AttributeSearch5項目共通検索属性の定義
アサイン済み属性M_Attribute7項目この検索属性に束ねた品目属性

💡 ヒント: 子タブのテーブルは M_Attribute そのものです。つまり属性検索は、既存の属性レコードに M_AttributeSearch_ID を設定して束ねる仕組みで、専用の中間テーブルは持ちません。

graph TD
    A["⚠ 標準メニュー未登録<br/>(iDempiere 13 では無効化)"] --> B["🔧 利用する場合は AD で<br/>ウィンドウを有効化 + メニュー登録"]
    B --> C["➕ 新規で共通検索属性の<br/>名称を入力"]
    C --> D["💾 保存"]
    D --> E["🔗 アサイン済み属性タブで<br/>束ねる属性を登録"]
    E --> F["🏷 属性ごとに<br/>属性値タイプを確認"]
    F --> G["✅ 共通属性として<br/>値の横断選択が可能に"]

標準メニュー未登録 (iDempiere 13 では無効化) 利用する場合は AD で ウィンドウを有効化 + メニュー登録 新規で共通検索属性の 名称を入力 保存 アサイン済み属性タブで 束ねる属性を登録 属性ごとに 属性値タイプを確認 共通属性として 値の横断選択が可能に

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

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

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

  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 名称: 共通検索属性の名称(60文字以内)
  3. 任意で 説明 を入力
  4. 保存」をクリック
  1. アサイン済み属性」タブに移動
  2. 束ねたい属性のレコードで 属性検索 に本レコードを設定
  3. 各属性の 属性値タイプ を確認(既定値は S
  4. 保存」をクリック

⚠️ 注意: 属性のレコード自体を編集するため、属性値タイプが「参照(Reference)」の属性は上級ロールでないと編集できません(MAttribute.beforeSave() の権限チェック)。

項目名必須説明
クライアント必須選択テナント(既定値 @#AD_Client_ID@
組織必須選択組織(既定値 @#AD_Org_ID@
名称必須文字列(60)共通検索属性の名称
説明-文字列(255)補足説明
有効-チェックレコードが有効か(既定値 Y)
項目名必須説明
属性検索-選択束ねる先の共通検索属性
属性必須ID品目属性(M_Attribute
名称必須文字列(60)属性名
説明-文字列(255)補足説明
属性値タイプ必須リスト(1)属性値の型(既定値 S

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

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

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

新規導入では推奨されません。iDempiere 13 標準ではウィンドウが無効化され、標準メニューにも登録されていない旧互換機能です。属性による分類・検索は品目属性属性セットで設計するのが標準的なアプローチです。

Q. M_AttributeSearch テーブルはどこから参照されていますか?

Section titled “Q. M_AttributeSearch テーブルはどこから参照されていますか?”

M_Attribute テーブルの M_AttributeSearch_ID カラム(Table Direct・任意)から参照されます。つまり「属性 → 検索属性」の 1 対多の関係で、属性側に束ねる先を持たせる構造です。

Q. 属性検索専用の M クラスはありますか?

Section titled “Q. 属性検索専用の M クラスはありますか?”

ありません。M_AttributeSearch は生成クラスのみ(X_M_AttributeSearch、183行)で、ビジネスロジックを持つ MAttributeSearch クラスは存在しません。ロジックが必要な場合は X_ クラスを継承した独自クラスを OSGi プラグインで実装することになります。

Q. 属性を検索属性に束ねると、既存の属性セットに影響しますか?

Section titled “Q. 属性を検索属性に束ねると、既存の属性セットに影響しますか?”

M_AttributeM_AttributeSearch_ID を設定するだけの変更であり、属性セット(M_AttributeSet)や属性使用(M_AttributeUse)の構成は変わりません。ただし属性名を変更した場合は MAttribute.beforeSave() の重複チェックが働くため、テーブル属性として使われている属性名との衝突に注意してください。

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

属性検索はマスタデータ型のウィンドウ(AD_Window_ID: 261)で、M_AttributeSearch テーブル(アクセスレベル 7 = システム+クライアント+組織)に格納されます。M クラスは存在せず、生成クラス X_M_AttributeSearch(183行)とインタフェース I_M_AttributeSearch のみが提供されます。子タブは M_Attribute テーブルを直接編集する構成で、こちらは MAttribute クラス(442行)が担当します。Document 型ではありません。

classDiagram
    class X_M_AttributeSearch {
        <<generated>>
        +getName() String
        +getDescription() String
    }
    class I_M_AttributeSearch {
        <<interface>>
    }
    class MAttribute {
        +getMAttributeValues() MAttributeValue[]
        +beforeSave(newRecord) boolean
        +afterSave(newRecord, success) boolean
        +isAttributeValueTypeReference() boolean
    }
    class PO {
        <<abstract>>
    }
    X_M_AttributeSearch --|> PO
    X_M_AttributeSearch ..|> I_M_AttributeSearch
    MAttribute --> X_M_AttributeSearch : M_AttributeSearch_ID
    MAttribute --> MAttributeValue : has values

<> +getName() String +getDescription() String <> +getMAttributeValues() MAttributeValue[] +beforeSave(newRecord) boolean +afterSave(newRecord, success) boolean +isAttributeValueTypeReference() boolean <> > PO X_M_AttributeSearch ..

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

カラム名必須説明備考
M_AttributeSearch_IDIDPK属性検索ID主キー
AD_Client_IDTable DirectYクライアント既定値 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定値 @#AD_Org_ID@
NameString(60)Y名称識別子カラム
DescriptionString(255)N説明
IsActiveYes-NoY有効既定値 Y
M_AttributeSearch_UUUUID(36)NUUID

M_Attribute(品目属性・子タブ側の主要カラム)

Section titled “M_Attribute(品目属性・子タブ側の主要カラム)”
カラム名必須説明備考
M_Attribute_IDIDPK属性ID主キー
M_AttributeSearch_IDTable DirectN属性検索束ねる先への参照
NameString(60)Y名称識別子カラム
AttributeValueTypeList(1)Y属性値タイプ既定値 S
IsInstanceAttributeYes-NoYインスタンス属性
IsMandatoryYes-NoY必須
AD_Reference_IDTableN参照参照型属性用
AD_Reference_Value_IDTableN参照キー参照型属性用
AD_Val_Rule_IDTable DirectN動的検証
DefaultValueString(2000)NDefault Logic
DateFormatString(20)N日付書式
erDiagram
    M_AttributeSearch ||--o{ M_Attribute : "groups attributes"
    M_Attribute ||--o{ M_AttributeValue : "values"
    M_Attribute ||--o{ M_AttributeUse : "used by sets"
    M_AttributeUse }o--|| M_AttributeSet : "attribute set"
    M_Attribute ||--o{ M_AttributeInstance : "instances"

groups attributes used by sets attribute set

M_AttributeSearch には M クラスが存在しないため、このテーブル固有の beforeSave() / afterSave() ロジックはありません。振る舞いは AD 定義(必須項目・既定値)のみで規定されます。

子タブ側の MAttribute には以下のロジックがあります。

  1. 参照型属性の権限チェック: 新規、または属性値タイプが Reference の場合、MRole.getDefault().isAccessAdvanced() が必要。満たさない場合は ActionNotAllowedHere で保存中止
  2. 属性名の重複チェック: 既存レコードで Name が変更された場合、MAttributeUse.SQL_GET_TA_DUPLICATE_ATTRIBUTE により同一クライアント内のテーブル属性で同名が使われていないかを検証。重複時は UniqueAttribute メッセージで保存中止

既存レコードで IsInstanceAttribute が N → Y に変更された場合、この属性を使用している属性セットの IsInstanceAttribute を SQL で一括して Y に更新します。

UPDATE M_AttributeSet mas SET IsInstanceAttribute='Y'
WHERE IsInstanceAttribute='N'
AND EXISTS (SELECT * FROM M_AttributeUse mau
WHERE mas.M_AttributeSet_ID=mau.M_AttributeSet_ID
AND mau.M_Attribute_ID=?)

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

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

M_AttributeSearch / M_Attribute の各カラムには標準の Callout は定義されていません。

M_AttributeSearch にビジネスロジックを持たせたい場合は、X_M_AttributeSearch を継承したクラスを OSGi プラグインで実装し、IModelFactory サービスとして登録します。コアの生成クラスを直接編集する必要はありません。

public class MyAttributeSearch extends X_M_AttributeSearch {
public MyAttributeSearch(Properties ctx, int id, String trxName) {
super(ctx, id, trxName);
}
@Override
protected boolean beforeSave(boolean newRecord) {
// 例: 名称の重複を禁止
return true;
}
}

独自クラスを作らずに制約だけ追加する場合は Model Validator が簡便です。

public class CustomAttributeSearchValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (I_M_AttributeSearch.Table_Name.equals(po.get_TableName())
&& (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
// 例: 名称の必須書式チェック
}
return null;
}
}

このウィンドウは標準メニューに登録されておらず、固有の標準プロセス(ボタン起動プロセス)もありません。


属性による横断検索は、アパレル・部品商社など SKU が多い業種で効果を発揮します。旧機能に頼らず、属性セットと検索インデックスを組み合わせた現行アーキテクチャでの設計をご提案できます。

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

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