MS Access Tips/Sample and VBA and Blog customize etc...

連番フィールドの最小空き番号を取得する関数

主キー等の自動採番で DMaxで次番号を取得するというのはよくありますが、削除などして空き番号がある場合それを再利用したいという要望もけっこうあるようです。

hatena の Microsoft Access 掲示板|ナンバー自動入力について

で、私の主催する掲示板で同様の質問がありましたので、回答用に作成しました。

回答後、ちょっと検討しなおして高速化もしてみました。

最小空き番号取得関数タイトル

難易度:

最小空き番号取得関数

下記が回答用に作成した関数です。

対象フィールドのデータ型は数値型の前提です。

使用例

やっていることは、単純です。連番フィールドで並べ替えを指定してレコードセットを開き、レコードの先頭から調べていき、連番が跳んでいるところの位置を返します。

ロジックから件数が多くて、空き番が後ろになるほど遅くなります。まあ、現在の標準のPCパワーなら実用にならないというこはないでしょう。

速度改良版

上記の関数はSQLで並び替えを指定してレコードセットを開いてましたが、テーブルタイプのレコードセットを開き、Indexプロパティで並び替える方法に変更してみました。

連番フィールドは主キーで、インデックス名が"PrimaryKey"であるとの前提です。

劇的に改善されました。件数が多く空き番が後ろだと、明らかに体感できます。

さらに、先頭からサーチするのではなく、二分探索のアルゴリズムを利用して作成してみました。

使用例
フィールドは位置で指定するように変更しました。

逐次探索の場合は、探索値が後ろほど遅くなりますが、二分探索は前後位置は関係ありません。探索回数も大幅に減らせるので高速化できます。これでかなり高速化されますが、実用上は2番目のでも十分だと思われます。

と、ここまで作成して、WEB検索してみたら、雅さんのHPで同様のことをしてましたorz。しかももっと細かく検証しています。

雅のプログラム研究所 - 技術情報 - Access No.30 - 連番の空番を取得する方法


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/379-92022604
該当の記事は見つかりませんでした。