単一キーで絞込機能を応用した枝番
最終更新日: 2020年3月14日
R8 | R9
「複合キーによる枝番」を先に読んでおいてください。「枝番」を複合キーの一部として設定する方式は、このページに記載している内容よりも設定が容易です。
ここでは複合キーではなく、単一キーで枝番機能を設定する方法を説明します。「他モデルの参照 > 他項目の値で選択肢を絞り込む」機能を応用します。
ここで説明する設定は次の仕様に基づいています。
顧客モデルの新規登録を行います。最初の顧客IDは "1000" となっています。これは順序を使って割り当てています。
コピー登録機能を使います。
枝番が付与されます。以降、顧客IDが "1000" のデータに対してコピー登録を行うと、枝番が増加していきます。
主キーと枝番に関係する項目は4つあります。
顧客IDは主キーとします。この例では文字列とし、かつ順序を用います。開始番号は1000から、としています。
主キーであるため自動的に必須指定となります。また、入力時は隠し項目になります。
登録時の式を次のようにします。コピー登録の場合は枝番を付与し、新規登録の場合は標準の順序値を利用するものです。
customerseq 項目の値をベースとし、max_branch_no の値が 0 より大きい場合、"-" の後に max_branch_no の値を付与します。これが枝番部分になります。
CONCATENATE は引数の文字列を結合した文字列を返します。
顧客ID順序部は、顧客IDの順序部分だけを切り出して保存する項目として用意します。DB保存とし、入力時・出力時とも隠し項目とします。
登録時の式を次のようにします。コピー登録の場合は現在、保持している順序をそのまま使い、新規登録の場合は順序部分(数値部)を切り出します。
顧客ID値を数字に変換したものを保持します。このとき、枝番部 ("-" で始まる) があれば、それを取り除きます。
TOINT は引数の文字列を数値に変換します。
特定の「顧客ID順序部」をもったデータ群について、最大枝番の値を保持するように設定します。
自モデル(自己)参照とし、枝番の値をリストボックスで表示するとしますが、さらに「順序部で絞込み」を行い、「枝番の降順で並び替え」し、「先頭の項目のみを出力する」とすることで、現在の枝番の最大値を取得するようにします。
現在の枝番の値を保持します。
登録時の式を次のようにします。
最大枝番が空白の場合は 1 を、すでに存在する場合は +1 した値を保存するようにします。
最初の設定では、システムが内部で利用する上記項目を「隠し」ではなく「読み取り専用」とするとよいでしょう。テストによって枝番の動きが把握できます。動作確認できたところで「隠し」としてください。
枝番部をゼロ詰め3桁表記とした例を図14に示します。
顧客IDの登録時の式を次のようにTEXT関数を使うように変更します。
枝番部をアルファベット表記 ("A", "B", "C",...) かつハイフンなしとした例を図15に示します。
顧客IDの登録時の式を次のようにA1FORMAT関数を使うように変更します。
A1FORMAT はExcelの列名ルールに準拠して数値をアルファベットに置き換えます。
顧客ID順序部の登録時の式を次のように正規表現で判定するように変更します。
この説明を読む前に
仕様と例
仕様
動作
定義方法
項目名
項目ID
型
主キー
順序
DB保存
入力時隠し
出力時隠し
登録時の計算
その他
顧客ID
customerid
文字列
○
○
○
-
-
[後述]
コピー登録時は順序を使わない
顧客ID順序部
customerseq
数値
-
-
○
○
○
[後述]
-
最大枝番
max_branch_no
モデル参照
(自分自身のbranch_no)-
-
-
○
○
-
絞込 [後述]
枝番
branch_no
数値
-
-
○
○
○
[後述]
-
顧客ID
IF(EXACT(SCREENTYPE(),"copy"),
CONCATENATE(
TOSTR(${customerseq}),
IF(${max_branch_no}>0,
CONCATENATE("-",TOSTR(${max_branch_no})),
""
)
),
${customerid}
)
TOSTR は数字を文字列に変換します。
顧客ID順序部
IF(EXACT(SCREENTYPE(),"copy"),
${customerseq},
TOINT(
LEFT(${customerid},
IF(FIND("-", ${customerid})>0,
FIND("-", ${customerid})-1,
LEN(${customerid})
)
)
)
)
LEFT は引数の文字列の左から何番目までを取得します。
FIND は指定された文字が何番目に含まれているかを返します。
LEN は文字列の長さを返します。
最大枝番
枝番
IF(ISBLANK(${max_branch_no}),
1,
${max_branch_no#content}+1
)
注意
枝番をゼロ詰め3桁で表現する
画面例
顧客IDの設定
IF(EXACT(SCREENTYPE(),"copy"),
CONCATENATE(
TOSTR(${customerseq}),
IF(${max_branch_no}>0,
CONCATENATE("-",TEXT(${max_branch_no}, "000")),
""
)
),
${customerid}
)
枝番をアルファベット表記かつハイフン区切りなしとする
画面例
顧客IDの設定
IF(EXACT(SCREENTYPE(),"copy"),
CONCATENATE(
TOSTR(${customerseq}),
IF(${max_branch_no}>0,
A1FORMAT(${max_branch_no}),
""
)
),
${customerid}
)
顧客ID順序部の設定
IF(EXACT(SCREENTYPE(),"copy"),
${customerseq},
TOINT(
LEFT(${customerid},
IF(FINDRE("[A-Z]", ${customerid})>0,
FINDRE("[A-Z]", ${customerid})-1,
LEN(${customerid})
)
)
)
)