iDempiere 属性セットインスタンスの使い方|在庫管理 操作マニュアル・技術仕様
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
属性セットインスタンス(ASI)は、品目に紐づくロット番号・シリアル番号・保証日付などの個体情報を1レコードとして表すデータです。本ウィンドウでは、生成済みの ASI を照会し、その ASI がどの入出荷・在庫移動・請求書で使われたかをタブで追跡できます。
📌 ポイント: このウィンドウはトレーサビリティの追跡画面です。「このロットはどこへ出荷されたか」「このシリアル番号はどの請求書に載ったか」を1画面で確認できます。
ASI は通常、伝票入力時の属性ダイアログや入荷処理から自動生成されます。本ウィンドウは、生成済み ASI の内容確認と使用実績の追跡を主目的としています。
属性セットインスタンスでできること
Section titled “属性セットインスタンスでできること”- ロット番号・シリアル番号・保証日付の確認と修正
- 属性セット(Attribute Set)との紐付け確認
- ロットマスタ(M_Lot)との関連確認
- 当該 ASI を使用した入出荷明細の一覧照会
- 当該 ASI を使用した在庫移動明細の一覧照会
- 当該 ASI を使用した請求書明細(売上・仕入)の一覧照会
- 説明欄による ASI の識別(未入力時は ID が自動セット)
インスタンスを親とする1親3子のタブ構成です。子タブはいずれも**ビュー(読み取り専用)**です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| インスタンス | M_AttributeSetInstance | 9項目 | ASI 本体(属性セット・ロット・シリアルNo・保証日付) |
| 入出荷 | M_InOutLineMA_v | 9項目 | この ASI が使われた入出荷明細(ビュー) |
| 移動 | M_MovementLineMA_v | 10項目 | この ASI が使われた在庫移動明細(ビュー) |
| 請求書 | RV_C_InvoiceLine | 12項目 | この ASI が使われた請求書明細(ビュー) |
💡 ヒント: 子タブ3つはすべてデータベースビューを参照しています。伝票の修正はそれぞれの伝票ウィンドウから行ってください。本ウィンドウの子タブでは編集できません。
基本操作手順
Section titled “基本操作手順”graph TD
A["📂 メニューから<br/>属性セットインスタンスを開く"] --> B["🔍 ロット番号・シリアルNo・<br/>説明で対象 ASI を検索"]
B --> C["📋 インスタンスタブで<br/>属性内容を確認"]
C --> D{"追跡したい対象"}
D -->|"出荷・入荷"| E["📦 入出荷タブ<br/>伝票・保管場所・数量を確認"]
D -->|"倉庫間移動"| F["🚚 移動タブ<br/>移動元/移動先を確認"]
D -->|"請求"| G["🧾 請求書タブ<br/>取引先・数量・単価を確認"]
E --> H["🔗 該当伝票へドリルダウン"]
F --> H
G --> H
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「在庫管理 > 品目属性管理 > 属性セットインスタンス」を開きます。
ASI の照会
Section titled “ASI の照会”- ウィンドウを開き、検索条件を指定して対象 ASI を絞り込みます
- ロット番号(
Lot)・シリアルNo(SerNo)・説明(Description)が実務上の検索キーになります
- ロット番号(
- 「インスタンス」タブで内容を確認:
- 属性セット: どの属性セット定義に基づく ASI か(必須)
- ロット / ロット番号: ロットマスタへの参照とロット番号文字列
- シリアルNo: シリアル番号
- 保証日付: 保証期限
- 説明: ASI の識別用文字列
- 子タブ(入出荷・移動・請求書)で使用実績を確認
属性値の修正
Section titled “属性値の修正”ロット番号・シリアルNo・保証日付・説明は更新可能です。ただし、既に伝票で使用されている ASI の値を書き換えると過去伝票の表示内容も変わる点に注意してください。
⚠️ 注意: 属性セット(
M_AttributeSet_ID)は必須項目です。ASI を新規作成する場合でも、属性セットを指定しないと保存できません。実運用では伝票側の属性ダイアログから生成する方法を推奨します。
項目リファレンス
Section titled “項目リファレンス”インスタンスタブ
Section titled “インスタンスタブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント |
| 組織 | 必須 | 選択 | 組織 |
| 属性セットインスタンス | 必須 | ID | ASI の主キー |
| 属性セット | 必須 | 選択 | 属性セット定義 |
| 説明 | - | 文字列 | 識別用(1023桁・未入力なら ID が自動セット) |
| ロット | - | 検索 | ロットマスタ(M_Lot)への参照 |
| ロット番号 | - | 文字列 | ロット番号(40桁) |
| 保証日付 | - | 日付 | 保証期限 |
| シリアルNo | - | 文字列 | シリアル番号(40桁) |
入出荷タブ(ビュー・読み取り専用)
Section titled “入出荷タブ(ビュー・読み取り専用)”| 項目名 | 型 | 説明 |
|---|---|---|
| 入荷伝票 / 入荷明細 | 検索 | 対象の入出荷伝票と明細 |
| 明細番号 | 整数 | 伝票内の明細番号 |
| 保管場所 | 検索 | 入出庫した保管場所 |
| 品目 | 検索 | 対象品目 |
| 移動数量 | 数量 | 入出荷数量 |
移動タブ(ビュー・読み取り専用)
Section titled “移動タブ(ビュー・読み取り専用)”| 項目名 | 型 | 説明 |
|---|---|---|
| 在庫移動伝票 / 在庫移動伝票明細 | 検索 | 対象の移動伝票と明細 |
| 保管場所 / 移動先保管場所 | 検索 | 移動元・移動先 |
| 品目 | 検索 | 対象品目 |
| 移動数量 | 数量 | 移動数量 |
請求書タブ(ビュー・読み取り専用)
Section titled “請求書タブ(ビュー・読み取り専用)”| 項目名 | 型 | 説明 |
|---|---|---|
| 仕入請求伝票 / 仕入請求伝票明細 | 検索 | 対象の請求書と明細 |
| 取引先 | 検索 | 請求先・仕入先 |
| 品目 | 検索 | 対象品目 |
| 請求済数量 | 数量 | 請求数量 |
| 単価 | 原価・価格 | 実売単価 |
| ロット番号 / ロット / シリアルNo | 各種 | 明細に紐づく属性情報 |
トレーサビリティの流れ
Section titled “トレーサビリティの流れ”graph TD
A["品目マスタ<br/>属性セットを設定"] --> B["入荷・製造時に<br/>ASI を生成"]
B --> C["M_AttributeSetInstance<br/>ロット/シリアル/保証日付"]
C --> D["在庫(M_StorageOnHand)に<br/>ASI 単位で計上"]
D --> E["出荷・移動・請求で<br/>ASI を引き継ぎ"]
E --> F["属性セットインスタンス画面で<br/>使用実績を追跡"]
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 説明欄が数字だけになっているレコードがあります。
Section titled “Q. 説明欄が数字だけになっているレコードがあります。”仕様です。ASI を新規作成したときに説明が空欄だった場合、afterSave() が属性セットインスタンス ID の文字列を説明欄に自動セットします。属性値から生成した説明を使いたい場合は、伝票側の属性ダイアログ経由で ASI を作成してください。
Q. ロット番号を自動採番できますか?
Section titled “Q. ロット番号を自動採番できますか?”はい。属性セットにロット管理の設定があれば、ロット採番定義に基づいてロットを自動生成できます(createLot() / generateLot())。生成されたロットは M_Lot マスタに登録され、ASI の「ロット」フィールドから参照されます。
Q. 特定の伝票ではロット/シリアル入力を省きたい。
Section titled “Q. 特定の伝票ではロット/シリアル入力を省きたい。”属性セットには除外設定があり、対象カラム(AD_Column_ID)と受注/発注の区分(isSOTrx)ごとにロット・シリアルの入力を除外できます。isExcludeLot() / isExcludeSerNo() がこの判定を行います。除外設定は属性セット側のタブで管理します。
Q. 子タブに何も表示されません。
Section titled “Q. 子タブに何も表示されません。”その ASI がまだどの伝票にも使われていないためです。3つの子タブはいずれもデータベースビューで、対応する明細が存在しなければ空になります。
Q. ASI を削除できますか?
Section titled “Q. ASI を削除できますか?”テーブル定義上は削除可能ですが、伝票や在庫レコードから参照されている ASI は外部キー制約により削除できません。使わなくなった ASI は「有効」チェックを外して無効化してください。
🛠 技術仕様(開発者向け)
属性セットインスタンスはマスタ/照会型のウィンドウ(AD_Window_ID: 358)で、本体は M_AttributeSetInstance テーブル(AccessLevel = 3、削除可能)に格納されます。子タブ3つはいずれもデータベースビュー(M_InOutLineMA_v / M_MovementLineMA_v / RV_C_InvoiceLine)で、更新はできません。MAttributeSetInstance クラス(459行)がロット生成・シリアル取得・説明生成のロジックを担います。Document 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MAttributeSetInstance {
+get(ctx, ...)$ MAttributeSetInstance
+create(ctx, MProduct, trxName)$ MAttributeSetInstance
+generateLot(ctx, MProduct, trxName)$ MAttributeSetInstance
+getWithProductAttributeKeyNamePairs(int, boolean)$ KeyNamePair[]
+setDescription() void
+getGuaranteeDate(boolean) Timestamp
+getLot(boolean, int) String
+createLot(int) KeyNamePair
+getSerNo(boolean) String
+isExcludeLot(int, boolean) boolean
+isExcludeSerNo(int, boolean) boolean
#afterSave(boolean, boolean) boolean
}
class X_M_AttributeSetInstance {
<<generated>>
}
class PO {
<<abstract>>
}
MAttributeSetInstance --|> X_M_AttributeSetInstance
X_M_AttributeSetInstance --|> PO
MAttributeSetInstance --> MAttributeSet : belongs to
MAttributeSetInstance --> MLot : lot
MAttributeSetInstance --> MAttributeInstance : attribute values
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MAttributeSetInstance.java(459行)
関連DBテーブル
Section titled “関連DBテーブル”M_AttributeSetInstance(属性セットインスタンス)
Section titled “M_AttributeSetInstance(属性セットインスタンス)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_AttributeSetInstance_ID | ID | PK | ASI ID | 主キー・更新不可 |
| AD_Client_ID | Table Direct | Y | テナント | 更新不可 |
| AD_Org_ID | Table Direct | Y | 組織 | 更新不可 |
| M_AttributeSet_ID | Table Direct | Y | 属性セット | 更新可 |
| Description | String(1023) | N | 説明 | 空欄時に ID を自動セット |
| M_Lot_ID | Search | N | ロット | ロットマスタ参照 |
| Lot | String(40) | N | ロット番号 | |
| SerNo | String(40) | N | シリアルNo | |
| GuaranteeDate | Date | N | 保証日付 | |
| IsActive | Yes-No | Y | 有効 | 既定 Y |
| M_AttributeSetInstance_UU | UUID(36) | N | UUID |
子タブのビュー
Section titled “子タブのビュー”| ビュー名 | 参照元 | 内容 |
|---|---|---|
| M_InOutLineMA_v | M_InOutLine / M_InOutLineMA | ASI 単位の入出荷明細 |
| M_MovementLineMA_v | M_MovementLine / M_MovementLineMA | ASI 単位の在庫移動明細 |
| RV_C_InvoiceLine | C_InvoiceLine | 請求書明細(売上・仕入) |
erDiagram
M_AttributeSet ||--o{ M_AttributeSetInstance : "defines"
M_AttributeSetInstance ||--o{ M_AttributeInstance : "attribute values"
M_Lot ||--o{ M_AttributeSetInstance : "lot"
M_AttributeSetInstance ||--o{ M_StorageOnHand : "stock by ASI"
M_AttributeSetInstance ||--o{ M_InOutLine : "shipped/received"
M_AttributeSetInstance ||--o{ M_MovementLine : "moved"
M_AttributeSetInstance ||--o{ C_InvoiceLine : "invoiced"
M_Product }o--o| M_AttributeSet : "attribute set"
ビジネスロジック
Section titled “ビジネスロジック”afterSave() — 説明の自動設定
Section titled “afterSave() — 説明の自動設定”新規レコード(newRecord && success)で Description が空文字または null の場合、次の処理を行います。
set_ValueNoCheck("Description", Integer.toString(getM_AttributeSetInstance_ID()))でメモリ上の値を更新UPDATE M_AttributeSetInstance SET Description = ? WHERE M_AttributeSetInstance_ID = ?を直接実行- 更新件数が 0 以下なら
SEVEREログを出力してfalseを返却(保存失敗)
📌 ポイント: 通常の
set+saveExではなく直接 SQL UPDATE を発行している点が特徴です。afterSave()内で自分自身を再保存すると無限ループになるための実装であり、Model Validator のTYPE_AFTER_NEWからこの説明を上書きする場合も同様に直接 SQL またはset_ValueNoCheckを使う必要があります。
setDescription()
Section titled “setDescription()”属性セットに紐づく属性値(M_AttributeInstance)を走査し、属性名と値を連結した説明文字列を生成します。伝票の属性ダイアログから ASI を生成する際に呼ばれます。
ロット・シリアル番号の取得
Section titled “ロット・シリアル番号の取得”| メソッド | 動作 |
|---|---|
getLot(boolean getNew, int M_Product_ID) | ロット番号を取得。getNew=true なら未設定時に新規採番 |
createLot(int M_Product_ID) | 品目の属性セットのロット採番定義に従い M_Lot を作成 |
setLot(String Lot, int M_Product_ID) | ロット番号を明示的に設定 |
getSerNo(boolean getNew) | シリアル番号を取得。getNew=true なら未設定時に新規採番 |
getGuaranteeDate(boolean getNew) | 保証日付を取得。getNew=true なら属性セットの保証日数から算出 |
isExcludeLot(int AD_Column_ID, boolean isSOTrx) / isExcludeSerNo(int AD_Column_ID, boolean isSOTrx) は、属性セットの除外設定に基づき「このカラム・この取引区分ではロット/シリアルを要求しない」かどうかを返します。受注系と発注系で別々に制御できます。
静的ファクトリ
Section titled “静的ファクトリ”| メソッド | 用途 |
|---|---|
create(ctx, MProduct, trxName) | 品目の属性セットに基づく ASI を生成・保存 |
generateLot(ctx, MProduct, trxName) | ロットを自動採番した ASI を生成・保存 |
getWithProductAttributeKeyNamePairs(M_AttributeSet_ID, withEmptyElement) | 属性セットに属する ASI の選択肢リストを取得 |
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”public class CustomASIValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MAttributeSetInstance && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) { MAttributeSetInstance asi = (MAttributeSetInstance) po; // 例: ロット番号の命名規則を強制する if (asi.getLot() != null && !asi.getLot().matches("\\d{8}-\\d{3}")) { throw new AdempiereException("ロット番号は「YYYYMMDD-NNN」形式で入力してください"); } } return null; }}Callout
Section titled “Callout”M_AttributeSetInstance の各カラムには標準の Callout は設定されていません(AD メタデータ上 Callout 列は空)。属性値の入力補助は専用の属性ダイアログ(WAttributeDialog)が担当しており、Callout ではなく UI コンポーネント側の拡張が必要です。
属性セット設計上の注意
Section titled “属性セット設計上の注意”追跡レベル(ロットのみ/シリアルのみ/両方/なし)は M_AttributeSet 側で決まります。既に在庫や伝票が存在する状態で追跡レベルを変更すると既存 ASI との整合が崩れるため、在庫ゼロの状態で変更してください。
関連プロセス
Section titled “関連プロセス”本ウィンドウ固有の実行プロセスはありません。ASI の生成は伝票入力時の属性ダイアログ、または MAttributeSetInstance.create() / generateLot() を呼ぶカスタムコードから行われます。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”ロット・シリアル管理は、食品・医療機器・製造業などトレーサビリティ要件が厳しい業種で最重要の機能です。 ロット番号の命名規則、有効期限による引当制御、出荷先までの追跡レポートなどを OSGi プラグインで安全に追加できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。