iDempiere 属性検索の使い方|在庫管理 操作マニュアル・技術仕様
This content is not available in your language yet.
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
属性検索は、内容の似た複数の品目属性を 1 つの「共通検索属性」にまとめ、属性値をまたいだ検索を可能にする定義です。例えば「ドレスシャツのサイズ(XL/L/M/S/XS)」と「T シャツのサイズ(S/M/L)」を 1 つの「サイズ」検索属性に束ねると、個々の属性を意識せずに全サイズ値から選択できるようになります。
⚠️ 注意: この画面は iDempiere 13 標準では無効化されています(旧バージョンからの互換用)。標準メニューにも登録されていないため、新規の業務設計での利用は推奨されません。属性による絞り込みは品目属性と属性セットで設計してください。
属性検索でできること
Section titled “属性検索でできること”- 共通検索属性(名称・説明)の定義
- 複数の品目属性を 1 つの検索属性へ束ねる紐づけ
- 束ねた属性の一覧確認(アサイン済み属性タブ)
- 個々の属性メンテナンスの負担軽減(属性値をまたいだ選択肢の提供)
属性検索は 2 タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 属性検索 | M_AttributeSearch | 5項目 | 共通検索属性の定義 |
| アサイン済み属性 | M_Attribute | 7項目 | この検索属性に束ねた品目属性 |
💡 ヒント: 子タブのテーブルは
M_Attributeそのものです。つまり属性検索は、既存の属性レコードにM_AttributeSearch_IDを設定して束ねる仕組みで、専用の中間テーブルは持ちません。
基本操作手順
Section titled “基本操作手順”graph TD
A["⚠ 標準メニュー未登録<br/>(iDempiere 13 では無効化)"] --> B["🔧 利用する場合は AD で<br/>ウィンドウを有効化 + メニュー登録"]
B --> C["➕ 新規で共通検索属性の<br/>名称を入力"]
C --> D["💾 保存"]
D --> E["🔗 アサイン済み属性タブで<br/>束ねる属性を登録"]
E --> F["🏷 属性ごとに<br/>属性値タイプを確認"]
F --> G["✅ 共通属性として<br/>値の横断選択が可能に"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”iDempiere 13 標準ではメニューに登録されていません(AD_Window_ID: 261)。利用する場合はアプリケーション辞書でウィンドウを有効化し、メニュー項目を追加する必要があります。
- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 名称: 共通検索属性の名称(60文字以内)
- 任意で 説明 を入力
- 「保存」をクリック
属性の紐づけ
Section titled “属性の紐づけ”- 「アサイン済み属性」タブに移動
- 束ねたい属性のレコードで 属性検索 に本レコードを設定
- 各属性の 属性値タイプ を確認(既定値は
S) - 「保存」をクリック
⚠️ 注意: 属性のレコード自体を編集するため、属性値タイプが「参照(Reference)」の属性は上級ロールでないと編集できません(
MAttribute.beforeSave()の権限チェック)。
項目リファレンス
Section titled “項目リファレンス”属性検索タブ
Section titled “属性検索タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント(既定値 @#AD_Client_ID@) |
| 組織 | 必須 | 選択 | 組織(既定値 @#AD_Org_ID@) |
| 名称 | 必須 | 文字列(60) | 共通検索属性の名称 |
| 説明 | - | 文字列(255) | 補足説明 |
| 有効 | - | チェック | レコードが有効か(既定値 Y) |
アサイン済み属性タブ
Section titled “アサイン済み属性タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 属性検索 | - | 選択 | 束ねる先の共通検索属性 |
| 属性 | 必須 | ID | 品目属性(M_Attribute) |
| 名称 | 必須 | 文字列(60) | 属性名 |
| 説明 | - | 文字列(255) | 補足説明 |
| 属性値タイプ | 必須 | リスト(1) | 属性値の型(既定値 S) |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”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_Attribute の M_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 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”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
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/X_M_AttributeSearch.java、org.adempiere.base/src/org/compiere/model/MAttribute.java
関連DBテーブル
Section titled “関連DBテーブル”M_AttributeSearch(属性検索)
Section titled “M_AttributeSearch(属性検索)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_AttributeSearch_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 | 説明 | |
| IsActive | Yes-No | Y | 有効 | 既定値 Y |
| M_AttributeSearch_UU | UUID(36) | N | UUID |
M_Attribute(品目属性・子タブ側の主要カラム)
Section titled “M_Attribute(品目属性・子タブ側の主要カラム)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_Attribute_ID | ID | PK | 属性ID | 主キー |
| M_AttributeSearch_ID | Table Direct | N | 属性検索 | 束ねる先への参照 |
| Name | String(60) | Y | 名称 | 識別子カラム |
| AttributeValueType | List(1) | Y | 属性値タイプ | 既定値 S |
| IsInstanceAttribute | Yes-No | Y | インスタンス属性 | |
| IsMandatory | Yes-No | Y | 必須 | |
| AD_Reference_ID | Table | N | 参照 | 参照型属性用 |
| AD_Reference_Value_ID | Table | N | 参照キー | 参照型属性用 |
| AD_Val_Rule_ID | Table Direct | N | 動的検証 | |
| DefaultValue | String(2000) | N | Default Logic | |
| DateFormat | String(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"
ビジネスロジック
Section titled “ビジネスロジック”M_AttributeSearch には M クラスが存在しないため、このテーブル固有の beforeSave() / afterSave() ロジックはありません。振る舞いは AD 定義(必須項目・既定値)のみで規定されます。
子タブ側の MAttribute には以下のロジックがあります。
MAttribute.beforeSave()
Section titled “MAttribute.beforeSave()”- 参照型属性の権限チェック: 新規、または属性値タイプが
Referenceの場合、MRole.getDefault().isAccessAdvanced()が必要。満たさない場合はActionNotAllowedHereで保存中止 - 属性名の重複チェック: 既存レコードで
Nameが変更された場合、MAttributeUse.SQL_GET_TA_DUPLICATE_ATTRIBUTEにより同一クライアント内のテーブル属性で同名が使われていないかを検証。重複時はUniqueAttributeメッセージで保存中止
MAttribute.afterSave()
Section titled “MAttribute.afterSave()”既存レコードで 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 “拡張ポイント(カスタマイズ箇所)”既存 Callout
Section titled “既存 Callout”M_AttributeSearch / M_Attribute の各カラムには標準の Callout は定義されていません。
独自 M クラスの追加
Section titled “独自 M クラスの追加”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; }}OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”独自クラスを作らずに制約だけ追加する場合は 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; }}関連プロセス
Section titled “関連プロセス”このウィンドウは標準メニューに登録されておらず、固有の標準プロセス(ボタン起動プロセス)もありません。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”属性による横断検索は、アパレル・部品商社など SKU が多い業種で効果を発揮します。旧機能に頼らず、属性セットと検索インデックスを組み合わせた現行アーキテクチャでの設計をご提案できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。