サポート > リポジトリ > 主キーオプション > 単一キーで絞込機能を応用した枝番
ja | en

自モデルを絞込対象とし、最大枝番を計算によって求める方法を説明します。

複合キーによる枝番」に目を通しておいてください。「枝番」を複合キーの一部として設定する方式は、このページに記載している内容よりも設定が容易です。

ここでは複合キーではなく、単一キーで枝番機能を設定する方法を説明します。「他モデルの参照 > 他項目の値で選択肢を絞り込む」機能を応用します。

仕様

ここで説明する設定は次の仕様に基づいています。

  • 顧客モデルの「顧客ID」は文字列型で、かつ順序を利用します。
  • 通常の新規登録処理では、顧客IDは "1000", "1001", "1002",... と増加します。
  • コピー登録機能では順序を利用しない設定とします。このためコピー登録ではキーが重複します。そこで枝番を割り当てます。
  • 枝番は "1000-1" と、末尾にハイフンと数字を付与して表現します。
  • 同じデータを何度もコピー登録すると、その都度 "1000-2", "1000-3",... と枝番が増加します。
  • 枝番は主キーの一部には含めません。

動作

顧客モデルの新規登録を行います。最初の顧客IDは "1000" となっています。これは順序を使って割り当てています。

図1 顧客の登録
図2 顧客IDに枝番は付与されていない

コピー登録機能を使います。

図3 コピー登録

枝番が付与されます。以降、顧客IDが "1000" のデータに対してコピー登録を行うと、枝番が増加していきます。

図4 顧客IDに枝番が付与された
図5 さらにコピー登録を行った(枝番が増加)

主キーと枝番に関係する項目は4つあります。

図6 顧客モデルの定義
項目名 項目ID 主キー 順序 DB保存 入力時隠し 出力時隠し 登録時の計算 その他
顧客ID customerid 文字列 - - [後述] コピー登録時は順序を使わない
顧客ID順序部 customerseq 数値 - - [後述] -
最大枝番 max_branch_no モデル参照
(自分自身のbranch_no)
- - - - 絞込 [後述]
枝番 branch_no 数値 - - [後述] -

顧客ID

顧客IDは主キーとします。この例では文字列とし、かつ順序を用います。開始番号は1000から、としています。

主キーであるため自動的に必須指定となります。また、入力時は隠し項目になります。

図6 顧客IDの定義(文字列型かつ順序を用いる)

登録時の式を次のようにします。コピー登録の場合は枝番を付与し、新規登録の場合は標準の順序値を利用するものです。

IF(EXACT(SCREENTYPE(),"copy"),
  CONCATENATE(
    TOSTR(${customerseq}),
    IF(${max_branch_no}>0,
      CONCATENATE("-",TOSTR(${max_branch_no})),
      ""
    )
  ),
  ${customerid}
)

customerseq 項目の値をベースとし、max_branch_no の値が 0 より大きい場合、"-" の後に max_branch_no の値を付与します。これが枝番部分になります。

CONCATENATE は引数の文字列を結合した文字列を返します。
TOSTR は数字を文字列に変換します。

図7 主キーの式

顧客ID順序部

顧客ID順序部は、顧客IDの順序部分だけを切り出して保存する項目として用意します。DB保存とし、入力時・出力時とも隠し項目とします。

登録時の式を次のようにします。コピー登録の場合は現在、保持している順序をそのまま使い、新規登録の場合は順序部分(数値部)を切り出します。

IF(EXACT(SCREENTYPE(),"copy"),
  ${customerseq},
  TOINT(
    LEFT(${customerid},
      IF(FIND("-", ${customerid})>0,
        FIND("-", ${customerid})-1,
        LEN(${customerid})
      )
    )
  )
)

顧客ID値を数字に変換したものを保持します。このとき、枝番部 ("-" で始まる) があれば、それを取り除きます。

TOINT は引数の文字列を数値に変換します。
LEFT は引数の文字列の左から何番目までを取得します。
FIND は指定された文字が何番目に含まれているかを返します。
LEN は文字列の長さを返します。

図8 顧客ID順序部の式

最大枝番

特定の「顧客ID順序部」をもったデータ群について、最大枝番の値を保持するように設定します。

図9 絞込のイメージ

自モデル(自己)参照とし、枝番の値をリストボックスで表示するとしますが、さらに「順序部で絞込み」を行い、「枝番の降順で並び替え」し、「先頭の項目のみを出力する」とすることで、現在の枝番の最大値を取得するようにします。

図10 モデル参照の設定
図11 絞込の設定
図12 枝番の降順で並び替え

枝番

現在の枝番の値を保持します。

登録時の式を次のようにします。

IF(ISBLANK(${max_branch_no}),
  1,
  ${max_branch_no#content}+1
)

最大枝番が空白の場合は 1 を、すでに存在する場合は +1 した値を保存するようにします。

ISBLANK は引数が空白かどうかを判定します。

図13 枝番の式
最初の設定では、システムが内部で利用する上記項目を「隠し」ではなく「読み取り専用」とするとよいでしょう。テストによって枝番の動きが把握できます。動作確認できたところで「隠し」としてください。

画面例

枝番部をゼロ詰め3桁表記とした例を図14に示します。

図14 枝番部がゼロ詰め3桁表記となっている

顧客IDの設定

顧客IDの登録時の式を次のようにTEXT関数を使うように変更します。

IF(EXACT(SCREENTYPE(),"copy"),
  CONCATENATE(
    TOSTR(${customerseq}),
    IF(${max_branch_no}>0,
      CONCATENATE("-",TEXT(${max_branch_no}, "000")),
      ""
    )
  ),
  ${customerid}
)

TEXT は書式付きの変換を行います。

画面例

枝番部をアルファベット表記 ("A", "B", "C",...) かつハイフンなしとした例を図15に示します。

図15 枝番部がアルファベット表記かつハイフンなしとなっている

顧客IDの設定

顧客IDの登録時の式を次のようにA1FORMAT関数を使うように変更します。

IF(EXACT(SCREENTYPE(),"copy"),
  CONCATENATE(
    TOSTR(${customerseq}),
    IF(${max_branch_no}>0,
      A1FORMAT(${max_branch_no}),
      ""
    )
  ),
  ${customerid}
)

A1FORMAT はExcelの列名ルールに準拠して数値をアルファベットに置き換えます。

顧客ID順序部の設定

顧客ID順序部の登録時の式を次のように正規表現で判定するように変更します。

IF(EXACT(SCREENTYPE(),"copy"),
  ${customerseq},
  TOINT(
    LEFT(${customerid},
      IF(FINDRE("[A-Z]", ${customerid})>0,
        FINDRE("[A-Z]", ${customerid})-1,
        LEN(${customerid})
      )
    )
  )
)

FINDRE は正規表現にマッチした文字が含まれていた場合、その位置を返します。