既定値により欠番を埋めながら自動で連番をふる

 既定値プロパティを使ってフォーム上で連番を自動的に採番する方法について別途紹介しています(こちら)が、ここではさらに連番に空き番がある場合にその空きを小さい順に埋めていく方法について紹介します。

※以下の設定は単票フォームで機能します。帳票フォームでは正しく機能しませんのでご注意ください。

f:id:accs2014:20161127220114p:plain:right:w400

 例として右のようなテーブルをレコードソースとします。
 自動的に採番しようとするフィールドは「会員番号」ですが、3,6,7が空き番となっていることがわかります。 


f:id:accs2014:20161127220112p:plain:right:w600

 フォームに会員番号のテキストボックスを置き、「既定値」プロパティを次のように設定します。



Nz(DMin("[会員番号]+1","会員テーブル","[会員番号]+1 not in (select 会員番号 from 会員テーブル)"),1)

 DMin関数を使い「会員番号に1を加えた値で、もとの会員テーブルに存在しない値のうち、最も小さいもの」を求めています。
 DMin関数が可能とする記述を柔軟に活用すること、特にWhere条件内のIn句でSQLを利用することがポイントです(はじめからSQL集合関数のみで求められれば話は早いのですが、そうするとエラーとなります)。

 Nz関数を用いているのは、レコードがない状態だとDMin関数の戻り値及び既定値全体の値がNullとなってしまうためです。Nz関数によりレコードがない状態では1から採番されます。


f:id:accs2014:20161127220111p:plain:right:w400

 フォームビューでの新規レコードの様子です。
 上記テーブルで空き番となっていた3が採番されていきます。このレコードに入力してさらに新規レコードに進むと6,7,10,11…と採番されていきます。

※繰り返しになりますが、帳票フォームでは採番が重複してしまうなどの不具合が生じ、意図通りに機能しません。帳票フォームの場合はVBAにより適当なタイミングで値を付与するなどの対応が必要です。