Skip to content

iDempiere POS キーレイアウトの使い方|販売管理 操作マニュアル・技術仕様

This content is not available in your language yet.

📖 販売管理の全体像: 販売管理の全体図 も合わせてご覧ください。

POS キーレイアウト(POS Key Layout)は、店頭販売フォームに表示されるボタン(キー)の並びを定義するマスタです。よく売れる品目をワンタッチで登録できる商品キーのほか、タッチパネル用のソフトウェアキーボード・テンキーのレイアウトもこの画面で定義します。

📌 ポイント: キーは**「シーケンスNo」の昇順に、レイアウトの列数で折り返して**配置されます。並び順を直したいときはキーを作り直すのではなく、シーケンスNo を振り直すのが正しい方法です。

POS キーレイアウトでできること

Section titled “POS キーレイアウトでできること”
  • 商品キー(Product)・キーボード(Keyboard)・テンキー(Numberpad)の3タイプのレイアウト定義
  • 列数(Columns)の指定によるボタンの折り返し制御
  • キーごとの品目・数量の割り当て(ワンタッチ登録)
  • キーの表示色・印刷フォント・画像(アイコン)の指定
  • セル結合(Column span / Row Span)による大きさの異なるボタン配置
  • サブレイアウトの割り当てによる階層メニュー(カテゴリ→商品)の構成
  • 有効/無効の切り替えによるキーの一時的な非表示

POS キーレイアウトはヘッダー+キーの構成です。iDempiere 13 標準ではキー側のタブが2つ(Key Sequenceキー)定義されており、どちらも同じ C_POSKey テーブルを編集します。

graph TD
    subgraph "POS キーレイアウトウィンドウ(Window ID: 339)"
        T1["⌨️ キーレイアウト<br/>C_POSKeyLayout<br/>10項目"]
        T2["🔢 Key Sequence<br/>C_POSKey"]
        T3["🔘 キー<br/>C_POSKey<br/>16項目"]
    end
    T1 --> T2
    T1 --> T3

POS キーレイアウトウィンドウ(Window ID: 339) ⌨ キーレイアウト C_POSKeyLayout 10項目 Key Sequence C_POSKey キー C_POSKey 16項目

タブ名テーブル階層役割
キーレイアウトC_POSKeyLayout0レイアウト本体(タイプ・列数・配色)
Key SequenceC_POSKey1キーの並び順を編集するためのタブ
キーC_POSKey1各キーの詳細設定(品目・数量・見た目)

💡 ヒント: 並び替えだけを行いたいときは「Key Sequence」タブ、品目や見た目を細かく設定したいときは「キー」タブを使う、という使い分けが想定されています。

graph TD
    A["🚀 メニューから開く<br/>販売管理 > 見積受注管理 > POS キーレイアウト"] --> B["➕ 新規ボタンをクリック"]
    B --> C["✏️ 名称を入力"]
    C --> D["🎛 レイアウトタイプを選択<br/>商品 / キーボード / テンキー"]
    D --> E["🔢 列数(Columns)を入力"]
    E --> F["💾 保存"]
    F --> G["🔘 キータブでキーを追加<br/>(シーケンスNo は自動採番)"]
    G --> H{"キーの役割"}
    H -->|品目登録| I["📦 品目と数量を設定"]
    H -->|階層メニュー| J["📂 サブレイアウトを設定"]
    I --> K["🎨 色・フォント・画像・<br/>セル結合を調整"]
    J --> K
    K --> L["🖥 POS 端末のキーレイアウトに<br/>割り当てて利用開始"]

メニューから開く 販売管理 > 見積受注管理 > POS キーレイアウト 新規ボタンをクリック 名称を入力 レイアウトタイプを選択 商品 / キーボード / テンキー 列数(Columns)を入力 保存 キータブでキーを追加 (シーケンスNo は自動採番) キーの役割 品目と数量を設定 サブレイアウトを設定 色・フォント・画像・ セル結合を調整 POS 端末のキーレイアウトに 割り当てて利用開始 品目登録 階層メニュー

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

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

メニューから「販売管理 > 見積受注管理 > POS キーレイアウト」を開きます。

  1. ツールバーの「新規」ボタンをクリック
  2. 基本情報を入力:
    • 名称(必須): レイアウト名(例: 本店 商品キー
    • 説明 / コメント: 補足説明・運用メモ
    • POS Key Layout Type: 商品キーボードテンキー から選択
    • Columns: 1行あたりのキー数(列数)
    • カラー / 印刷フォント: 既定の表示色・フォント
  3. 保存」をクリック
  1. キー」タブに移動
  2. 新規」ボタンをクリック
  3. キー情報を入力:
    • シーケンスNo(必須): 並び順。同一レイアウト内の最大値+10 が自動セットされます
    • 名称(必須): キーに表示される文字
    • 品目: ワンタッチで登録する品目
    • 数量: 1タップで加算される数量
    • Key Layout(サブレイアウト): このキーを押したときに表示する別レイアウト
    • Column span / Row Span: 横・縦のセル結合数
    • カラー / 印刷フォント / 画像: 見た目の設定
  4. 保存」をクリック

📌 ポイント: シーケンスNo の既定値は SQL 式(SELECT NVL(MAX(SeqNo),0)+10 FROM C_POSKey WHERE C_POSKeyLayout_ID=...)で計算されるため、追加するたびに 10、20、30… と自動で採番されます。間に挿入したい場合は 15 のような中間値を手入力してください。

  1. 下位レイアウト(例: 飲料)を先に作成してキーを登録
  2. 上位レイアウト(例: カテゴリ)にキーを追加し、「Key Layout」で下位レイアウトを選択
  3. POS フォームで上位キーを押すと、下位レイアウトのキーが表示されます

不要になったキーは「有効」チェックを外します。レイアウトのキー取得処理は IsActive='Y' のキーのみを対象とするため、チェックを外すだけで画面から消えます。

項目名カラム必須説明
クライアントAD_Client_ID必須選択テナント
組織AD_Org_ID必須選択組織
名称Name必須文字列(60)レイアウト名
説明Description-文字列(255)補足説明
コメントHelp-テキスト(2000)運用メモ
POS Key Layout TypePOSKeyLayoutType-リストK=キーボード、N=テンキー、P=商品
ColumnsColumns-整数1行あたりの列数
カラーAD_PrintColor_ID-選択表示・印刷色
印刷フォントAD_PrintFont_ID-選択フォント
有効IsActive必須チェックレコードが有効か(既定: Y)
項目名カラム必須説明
POSキーレイアウトC_POSKeyLayout_ID必須選択親レイアウト(更新不可)
シーケンスNoSeqNo必須整数並び順(既定: 最大値+10)
名称Name必須文字列(60)キーの表示名
説明Description-文字列(255)補足説明
DescriptionText-文字列(22)キー上の補助テキスト
Key LayoutSubKeyLayout_ID-選択押下時に開くサブレイアウト
品目M_Product_ID-検索ワンタッチ登録する品目
数量Qty-数量1タップで加算する数量
Column spanSpanX-整数横方向のセル結合数
Row SpanSpanY-整数縦方向のセル結合数
カラーAD_PrintColor_ID-選択表示色(既定: -1)
印刷フォントAD_PrintFont_ID-選択フォント(既定: -1)
画像AD_Image_ID-画像キーに表示するアイコン
有効IsActive必須チェック表示するか(既定: Y)

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

表示コード用途
キーボードK文字入力欄用のソフトウェアキーボード
テンキーN数値入力欄用のオンスクリーンテンキー
商品P品目をワンタッチ登録する商品キー

Q. キーの並び順はどう決まりますか?

Section titled “Q. キーの並び順はどう決まりますか?”

有効なキーをシーケンスNo(SeqNo)の昇順で取得します(MPOSKeyLayout.getKeys() の SQL: WHERE C_POSKeyLayout_ID=? AND IsActive='Y' ORDER BY SeqNo)。並べ替えたいときはシーケンスNo を変更してください。

Q. 無効化したキーはどう扱われますか?

Section titled “Q. 無効化したキーはどう扱われますか?”

getKeys()IsActive='Y' のキーだけを返すため、無効化したキーは POS フォームに表示されず、キー数(getNoOfKeys())にも含まれません。データは残るため、あとで再度有効化できます。

Q. キーを削除すると、設定した画像も消えますか?

Section titled “Q. キーを削除すると、設定した画像も消えますか?”

消えます。MPOSKey.postDelete() が、キーに紐づく画像(AD_Image_ID)のレコードを削除します。画像の削除に失敗した場合は警告ログが出力され、キーの削除自体も失敗します。同じ画像を複数キーで共有している場合は削除に注意してください。

Q. 「Key Sequence」タブと「キー」タブの違いは何ですか?

Section titled “Q. 「Key Sequence」タブと「キー」タブの違いは何ですか?”

どちらも同じ C_POSKey テーブルを編集するタブです。テーブルもレコードも共通で、表示されるフィールドの構成だけが異なります。片方で行った変更はもう一方にもそのまま反映されます。

Q. 1レイアウトに登録できるキー数に上限はありますか?

Section titled “Q. 1レイアウトに登録できるキー数に上限はありますか?”

AD 上の制約はありません。ただしレイアウトのキャッシュ(ImmutableIntPOCache)は容量3と小さいため、多数のレイアウトを切り替える運用ではキャッシュミスが発生しやすくなります。

Q. 列数(Columns)を設定しないとどうなりますか?

Section titled “Q. 列数(Columns)を設定しないとどうなりますか?”

Columns は任意項目で既定値もありません。折り返し位置を明示したい場合は必ず入力してください。

graph TD
    A["📦 品目マスタ"] --> B["🔘 POS キー<br/>C_POSKey"]
    C["⌨️ POS キーレイアウト<br/>C_POSKeyLayout"] --> B
    B -->|サブレイアウト| C
    C --> D["🖥 POS 端末<br/>C_POS"]
    D --> E["🛒 POS フォーム"]
    E --> F["📋 受注伝票"]

品目マスタ POS キー C_POSKey ⌨ POS キーレイアウト C_POSKeyLayout POS 端末 C_POS POS フォーム 受注伝票 サブレイアウト


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

POS キーレイアウトはマスタデータ型のウィンドウ(AD_Window_ID: 339)で、C_POSKeyLayout(レイアウト)と C_POSKey(キー)の2テーブルで構成されます。MPOSKeyLayout クラス(207行)がキーの取得とキャッシュを、MPOSKey クラス(122行)が削除時の画像クリーンアップを担当します。どちらも ImmutablePOSupport に対応した不変化(markImmutable())をサポートします。Document 型ではありません。

classDiagram
    class MPOSKeyLayout {
        +get(int C_POSKeyLayout_ID)$ MPOSKeyLayout
        +get(Properties, int)$ MPOSKeyLayout
        +getKeys(boolean requery) MPOSKey[]
        +getNoOfKeys() int
        +markImmutable() MPOSKeyLayout
    }
    class MPOSKey {
        #postDelete() boolean
        +markImmutable() MPOSKey
    }
    class X_C_POSKeyLayout {
        <<generated>>
    }
    class X_C_POSKey {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    MPOSKeyLayout --|> X_C_POSKeyLayout
    MPOSKey --|> X_C_POSKey
    X_C_POSKeyLayout --|> PO
    X_C_POSKey --|> PO
    MPOSKeyLayout --> MPOSKey : has many
    MPOSKey --> MPOSKeyLayout : sub layout
    MPOS --> MPOSKeyLayout : uses

+get(int C_POSKeyLayout_ID)$ MPOSKeyLayout +get(Properties, int)$ MPOSKeyLayout +getKeys(boolean requery) MPOSKey[] +getNoOfKeys() int +markImmutable() MPOSKeyLayout #postDelete() boolean +markImmutable() MPOSKey <> <> > X_C_POSKeyLayout MPOSKey -- > PO X_C_POSKey --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MPOSKeyLayout.java(207行)、MPOSKey.java(122行)

C_POSKeyLayout(POS キーレイアウト)

Section titled “C_POSKeyLayout(POS キーレイアウト)”

テーブル属性: 削除可(IsDeleteable=Y)/大量データ扱いなし/アクセスレベル=クライアント/ビューではない。

カラム名必須説明備考
C_POSKeyLayout_IDIDPKキーレイアウトID主キー
C_POSKeyLayout_UUUUID(36)NUUIDキー
AD_Client_IDTable DirectYクライアント既定 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @#AD_Org_ID@
NameString(60)Y名称識別子カラム
DescriptionString(255)N説明
HelpText(2000)Nコメント
POSKeyLayoutTypeList(1)NレイアウトタイプK=Keyboard, N=Numberpad, P=Product(AD_Reference_ID=53351)
ColumnsIntegerN列数既定値なし
AD_PrintColor_IDTable DirectNカラー
AD_PrintFont_IDTable DirectN印刷フォント
IsActiveYes-NoY有効既定 Y

テーブル属性: 削除可/アクセスレベル=クライアント。

カラム名必須説明備考
C_POSKey_IDIDPKキーID主キー
C_POSKey_UUUUID(36)NUUIDキー
C_POSKeyLayout_IDTable DirectY親レイアウトFK更新不可
SeqNoIntegerYシーケンスNo既定 @SQL=SELECT NVL(MAX(SeqNo),0)+10 ... WHERE C_POSKeyLayout_ID=@C_POSKeyLayout_ID@
NameString(60)Y名称識別子カラム
DescriptionString(255)N説明
TextString(22)N補助テキスト画面ラベルは「Description」
SubKeyLayout_IDTableNサブレイアウト階層メニュー用
M_Product_IDSearchN品目
QtyQuantityN数量
SpanXIntegerN横セル結合数
SpanYIntegerN縦セル結合数
AD_PrintColor_IDTable DirectNカラー既定 -1
AD_PrintFont_IDTable DirectN印刷フォント既定 -1
AD_Image_IDImageN画像削除時に連動削除
IsActiveYes-NoY有効既定 Y
erDiagram
    C_POSKeyLayout ||--o{ C_POSKey : "keys"
    C_POSKey }o--o| C_POSKeyLayout : "sub layout"
    C_POSKey }o--o| M_Product : "product key"
    C_POSKey }o--o| AD_Image : "icon"
    C_POS }o--o| C_POSKeyLayout : "product keys"
    C_POS }o--o| C_POSKeyLayout : "OSK / OSNP layout"

sub layout product key product keys OSK / OSNP layout

C_POSKeyLayout_IDC_POS から3つのカラム(C_POSKeyLayout_IDOSK_KeyLayout_IDOSNP_KeyLayout_ID)で参照され、C_POSKey.SubKeyLayout_ID からも自己参照されます。

SELECT * FROM C_POSKey
WHERE C_POSKeyLayout_ID=? AND IsActive = 'Y'
ORDER BY SeqNo

getKeys(boolean requery) は上記 SQL で有効なキーのみを取得し、結果を内部フィールド m_keys にキャッシュします。requery=false かつキャッシュ済みの場合は再クエリしません。レイアウトが immutable の場合、取得した全キーも markImmutable() されます。getNoOfKeys()getKeys(false).length を返します。

MPOSKey.postDelete() は、キーに AD_Image_ID が設定されている場合に該当画像レコードを削除します(MImage.delete(true))。削除に失敗した場合は警告ログを出力し false を返すため、キーの削除自体もロールバックされます

flowchart TD
    A["キーを削除"] --> B{"AD_Image_ID > 0?"}
    B -->|No| C["✅ 削除完了"]
    B -->|Yes| D["MImage.delete(true)"]
    D --> E{"削除成功?"}
    E -->|Yes| C
    E -->|No| F["⚠️ 警告ログ<br/>削除を中止"]

キーを削除 AD_Image_ID > 0? 削除完了 MImage.delete(true) 削除成功? 警告ログ 削除を中止

MPOSKeyLayoutImmutableIntPOCache<Integer, MPOSKeyLayout>(テーブル名キー、容量3)を持ち、get(C_POSKeyLayout_ID) / get(ctx, C_POSKeyLayout_ID) でキャッシュ参照します。markImmutable() は自身と保持している全キーを不変化します。

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

Section titled “拡張ポイント(カスタマイズ箇所)”
public class CustomPOSKeyValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MPOSKey
&& (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
MPOSKey key = (MPOSKey) po;
// 例: 商品キーには品目とサブレイアウトのどちらか一方だけを許可
if (key.getM_Product_ID() > 0 && key.getSubKeyLayout_ID() > 0) {
throw new AdempiereException("品目とサブレイアウトは同時に指定できません");
}
}
return null;
}
}

C_POSKeyLayout / C_POSKey のカラムには AD 上の callout 定義がありません。品目選択時にキー名称を自動補完するなどの挙動が必要な場合は、独自 callout を追加してください。

レイアウト描画のカスタマイズ

Section titled “レイアウト描画のカスタマイズ”

キーの配置(列数・セル結合)の解釈は POS フォームの描画側で行われます。独自の並びルールやテーマを適用する場合は、getKeys() の結果を利用する独自フォームを OSGi プラグインとして提供する構成が安全です。コアの MPOSKeyLayout を継承・改変する必要はありません。

このウィンドウには専用のプロセスボタンは定義されていません。


POS キーレイアウトはサブレイアウトによる階層メニューやセル結合に対応しており、店舗ごとのタッチ UI を柔軟に設計できます。 独自の商品分類ボタンやレシート連携、タブレット向けの描画も OSGi プラグインでコア改変なしに追加できます。

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

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