コンテンツにスキップ

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

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

属性セットインスタンス(ASI)は、品目に紐づくロット番号・シリアル番号・保証日付などの個体情報を1レコードとして表すデータです。本ウィンドウでは、生成済みの ASI を照会し、その ASI がどの入出荷・在庫移動・請求書で使われたかをタブで追跡できます。

📌 ポイント: このウィンドウはトレーサビリティの追跡画面です。「このロットはどこへ出荷されたか」「このシリアル番号はどの請求書に載ったか」を1画面で確認できます。

ASI は通常、伝票入力時の属性ダイアログや入荷処理から自動生成されます。本ウィンドウは、生成済み ASI の内容確認と使用実績の追跡を主目的としています。

属性セットインスタンスでできること

Section titled “属性セットインスタンスでできること”
  • ロット番号・シリアル番号・保証日付の確認と修正
  • 属性セット(Attribute Set)との紐付け確認
  • ロットマスタ(M_Lot)との関連確認
  • 当該 ASI を使用した入出荷明細の一覧照会
  • 当該 ASI を使用した在庫移動明細の一覧照会
  • 当該 ASI を使用した請求書明細(売上・仕入)の一覧照会
  • 説明欄による ASI の識別(未入力時は ID が自動セット)

インスタンスを親とする1親3子のタブ構成です。子タブはいずれも**ビュー(読み取り専用)**です。

タブ名テーブル項目数役割
インスタンスM_AttributeSetInstance9項目ASI 本体(属性セット・ロット・シリアルNo・保証日付)
入出荷M_InOutLineMA_v9項目この ASI が使われた入出荷明細(ビュー)
移動M_MovementLineMA_v10項目この ASI が使われた在庫移動明細(ビュー)
請求書RV_C_InvoiceLine12項目この ASI が使われた請求書明細(ビュー)

💡 ヒント: 子タブ3つはすべてデータベースビューを参照しています。伝票の修正はそれぞれの伝票ウィンドウから行ってください。本ウィンドウの子タブでは編集できません。

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

メニューから 属性セットインスタンスを開く ロット番号・シリアルNo・ 説明で対象 ASI を検索 インスタンスタブで 属性内容を確認 追跡したい対象 出荷・入荷 入出荷タブ 伝票・保管場所・数量を確認 倉庫間移動 移動タブ 移動元/移動先を確認 請求 請求書タブ 取引先・数量・単価を確認 該当伝票へドリルダウン

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

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

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

  1. ウィンドウを開き、検索条件を指定して対象 ASI を絞り込みます
    • ロット番号Lot)・シリアルNoSerNo)・説明Description)が実務上の検索キーになります
  2. インスタンス」タブで内容を確認:
    • 属性セット: どの属性セット定義に基づく ASI か(必須
    • ロット / ロット番号: ロットマスタへの参照とロット番号文字列
    • シリアルNo: シリアル番号
    • 保証日付: 保証期限
    • 説明: ASI の識別用文字列
  3. 子タブ(入出荷・移動・請求書)で使用実績を確認

ロット番号・シリアルNo・保証日付・説明は更新可能です。ただし、既に伝票で使用されている ASI の値を書き換えると過去伝票の表示内容も変わる点に注意してください。

⚠️ 注意: 属性セット(M_AttributeSet_ID)は必須項目です。ASI を新規作成する場合でも、属性セットを指定しないと保存できません。実運用では伝票側の属性ダイアログから生成する方法を推奨します。

項目名必須説明
クライアント必須選択テナント
組織必須選択組織
属性セットインスタンス必須IDASI の主キー
属性セット必須選択属性セット定義
説明-文字列識別用(1023桁・未入力なら ID が自動セット)
ロット-検索ロットマスタ(M_Lot)への参照
ロット番号-文字列ロット番号(40桁)
保証日付-日付保証期限
シリアルNo-文字列シリアル番号(40桁)

入出荷タブ(ビュー・読み取り専用)

Section titled “入出荷タブ(ビュー・読み取り専用)”
項目名説明
入荷伝票 / 入荷明細検索対象の入出荷伝票と明細
明細番号整数伝票内の明細番号
保管場所検索入出庫した保管場所
品目検索対象品目
移動数量数量入出荷数量

移動タブ(ビュー・読み取り専用)

Section titled “移動タブ(ビュー・読み取り専用)”
項目名説明
在庫移動伝票 / 在庫移動伝票明細検索対象の移動伝票と明細
保管場所 / 移動先保管場所検索移動元・移動先
品目検索対象品目
移動数量数量移動数量

請求書タブ(ビュー・読み取り専用)

Section titled “請求書タブ(ビュー・読み取り専用)”
項目名説明
仕入請求伝票 / 仕入請求伝票明細検索対象の請求書と明細
取引先検索請求先・仕入先
品目検索対象品目
請求済数量数量請求数量
単価原価・価格実売単価
ロット番号 / ロット / シリアルNo各種明細に紐づく属性情報

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

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/>使用実績を追跡"]

品目マスタ 属性セットを設定 入荷・製造時に ASI を生成 M_AttributeSetInstance ロット/シリアル/保証日付 在庫(M_StorageOnHand)に ASI 単位で計上 出荷・移動・請求で ASI を引き継ぎ 属性セットインスタンス画面で 使用実績を追跡

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つの子タブはいずれもデータベースビューで、対応する明細が存在しなければ空になります。

テーブル定義上は削除可能ですが、伝票や在庫レコードから参照されている ASI は外部キー制約により削除できません。使わなくなった ASI は「有効」チェックを外して無効化してください。

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

属性セットインスタンスはマスタ/照会型のウィンドウ(AD_Window_ID: 358)で、本体は M_AttributeSetInstance テーブル(AccessLevel = 3、削除可能)に格納されます。子タブ3つはいずれもデータベースビュー(M_InOutLineMA_v / M_MovementLineMA_v / RV_C_InvoiceLine)で、更新はできません。MAttributeSetInstance クラス(459行)がロット生成・シリアル取得・説明生成のロジックを担います。Document 型ではありません。

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

+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 <> <> > X_M_AttributeSetInstance X_M_AttributeSetInstance --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MAttributeSetInstance.java(459行)

M_AttributeSetInstance(属性セットインスタンス)

Section titled “M_AttributeSetInstance(属性セットインスタンス)”
カラム名必須説明備考
M_AttributeSetInstance_IDIDPKASI ID主キー・更新不可
AD_Client_IDTable DirectYテナント更新不可
AD_Org_IDTable DirectY組織更新不可
M_AttributeSet_IDTable DirectY属性セット更新可
DescriptionString(1023)N説明空欄時に ID を自動セット
M_Lot_IDSearchNロットロットマスタ参照
LotString(40)Nロット番号
SerNoString(40)NシリアルNo
GuaranteeDateDateN保証日付
IsActiveYes-NoY有効既定 Y
M_AttributeSetInstance_UUUUID(36)NUUID
ビュー名参照元内容
M_InOutLineMA_vM_InOutLine / M_InOutLineMAASI 単位の入出荷明細
M_MovementLineMA_vM_MovementLine / M_MovementLineMAASI 単位の在庫移動明細
RV_C_InvoiceLineC_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"

attribute values stock by ASI shipped/received attribute set

新規レコード(newRecord && success)で Description が空文字または null の場合、次の処理を行います。

  1. set_ValueNoCheck("Description", Integer.toString(getM_AttributeSetInstance_ID())) でメモリ上の値を更新
  2. UPDATE M_AttributeSetInstance SET Description = ? WHERE M_AttributeSetInstance_ID = ? を直接実行
  3. 更新件数が 0 以下なら SEVERE ログを出力して false を返却(保存失敗)

📌 ポイント: 通常の set + saveEx ではなく直接 SQL UPDATE を発行している点が特徴です。afterSave() 内で自分自身を再保存すると無限ループになるための実装であり、Model Validator の TYPE_AFTER_NEW からこの説明を上書きする場合も同様に直接 SQL または set_ValueNoCheck を使う必要があります。

属性セットに紐づく属性値(M_AttributeInstance)を走査し、属性名と値を連結した説明文字列を生成します。伝票の属性ダイアログから ASI を生成する際に呼ばれます。

メソッド動作
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) は、属性セットの除外設定に基づき「このカラム・この取引区分ではロット/シリアルを要求しない」かどうかを返します。受注系と発注系で別々に制御できます。

メソッド用途
create(ctx, MProduct, trxName)品目の属性セットに基づく ASI を生成・保存
generateLot(ctx, MProduct, trxName)ロットを自動採番した ASI を生成・保存
getWithProductAttributeKeyNamePairs(M_AttributeSet_ID, withEmptyElement)属性セットに属する ASI の選択肢リストを取得

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

Section titled “拡張ポイント(カスタマイズ箇所)”
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;
}
}

M_AttributeSetInstance の各カラムには標準の Callout は設定されていません(AD メタデータ上 Callout 列は空)。属性値の入力補助は専用の属性ダイアログ(WAttributeDialog)が担当しており、Callout ではなく UI コンポーネント側の拡張が必要です。

追跡レベル(ロットのみ/シリアルのみ/両方/なし)は M_AttributeSet 側で決まります。既に在庫や伝票が存在する状態で追跡レベルを変更すると既存 ASI との整合が崩れるため、在庫ゼロの状態で変更してください。

本ウィンドウ固有の実行プロセスはありません。ASI の生成は伝票入力時の属性ダイアログ、または MAttributeSetInstance.create() / generateLot() を呼ぶカスタムコードから行われます。


ロット・シリアル管理は、食品・医療機器・製造業などトレーサビリティ要件が厳しい業種で最重要の機能です。 ロット番号の命名規則、有効期限による引当制御、出荷先までの追跡レポートなどを OSGi プラグインで安全に追加できます。

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

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