単一キーで絞込機能を応用した枝番

最終更新日: 2022年2月25日
R8 | R9

この説明を読む前に

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

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

仕様と例

仕様

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

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

動作

  1. 顧客モデルの新規登録を行います。最初のIDは "1000" となっています。これは順序を使って割り当てています。
    顧客の登録
    IDに枝番は付与されていない
  2. コピー登録機能を使います。
    コピー登録
  3. 枝番が付与されます。以降、IDが "1000" のデータに対してコピー登録を行うと、枝番が増加していきます。
    IDに枝番が付与された
    さらにコピー登録を行った(枝番が増加)

定義方法

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

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

ID

  1. IDは主キーとします。この例では文字列とし、かつ順序を用います。開始番号は1000から、としています。
    IDの定義(文字列型かつ順序を用いる)

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

  2. 登録時の式を次のようにします。コピー登録の場合は枝番を付与し、新規登録の場合は標準の順序値を利用するものです。
    IF(EXACT(SCREENTYPE(),"copy"),
              CONCATENATE(
                TOSTR(${IDseq}),
                IF(${max_branchid}>0,
                  CONCATENATE("-",TOSTR(${max_branchid})),
                  ""
                )
              ),
              ${ID}
            )
            

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

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

    主キーの式
  3. ID順序部

    1. ID順序部は、IDの順序部分だけを切り出して保存する項目として用意します。
      入力時・出力時とも隠し項目とします。
      入力時に隠し項目とする
      出力時に隠し項目とする
    2. 登録時の式を次のようにします。コピー登録の場合は現在、保持している順序をそのまま使い、新規登録の場合は順序部分(数値部)を切り出します。
      IF(EXACT(SCREENTYPE(),"copy"),
                ${IDseq},
                TOINT(
                  LEFT(${ID},
                    IF(FIND("-", ${ID})>0,
                      FIND("-", ${ID})-1,
                      LEN(${ID})
                    )
                  )
                )
              )
              

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

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

      ID順序部の式

    最大枝番

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

    絞込のイメージ
    1. 参照先モデルを自モデル(顧客)とし、リストボックス形式で「枝番(非表示)」項目を参照します。
      モデル参照の設定
    2. 「データベースに値を保存する」のチェックをはずします。
      データベースに値を保存しない
    3. 入力制御の「読み込み専用」および「隠し項目」は「全画面」にチェックを入れます。
      モデル参照の設定では、「ID順序部」項目による絞込みを設定します。
      絞込の設定
    4. 「枝番の降順で並び替え」し、「先頭の項目のみを出力する」とすることで、現在の枝番の最大値を取得するようにします。
      枝番の降順で並び替え
    5. 「出力制御 > 詳細画面 > 共通 > 隠し項目にする」にチェックを入れます。
      「出力制御 > 一覧画面 > 共通 > 隠し項目にする」も同様にチェックを入れます。
      出力時に隠す

    枝番(非表示)

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

    1. 入力時、出力時ともに隠し項目とします。
      入力時に隠す
      出力時に隠す
    2. 登録時の式を次のようにします。
      IF(ISBLANK(${max_branchid}),
                1,
                ${max_branchid#content}+1
              )

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

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

      枝番の式

      注意

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

枝番をゼロ詰め3桁で表現する

枝番部をゼロ詰め3桁表記とした例です。

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

定義方法

ID項目の登録時の自動計算式を次の通りに変更します。

IF(EXACT(SCREENTYPE(),"copy"),
    CONCATENATE(
      TOSTR(${IDseq}),
      IF(${max_branchid}>0,
        CONCATENATE("-",TEXT(${max_branchid}, "000")),
        ""
      )
    ),
    ${ID}
  )
  

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

計算式の定義

枝番をアルファベット表記かつハイフン区切りなしとする

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

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

定義方法

IDの設定

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

IF(EXACT(SCREENTYPE(),"copy"),
    CONCATENATE(
      TOSTR(${IDseq}),
      IF(${max_branchid}>0,
        A1FORMAT(${max_branchid}),
        ""
      )
    ),
    ${ID}
  )
  

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

計算式の定義

ID順序部の設定

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

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

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

計算式の定義

関連するページ

式の組み合わせではなく、スクリプトで実現することもできます。[詳細...]