このエントリーをはてなブックマークに追加

明細番号の最大値を取得して自動採番する。(Access)

Accessを使って、入力用フォームの明細番号を自動的に連番で振っていけるようにしていきます。明細番号を振っていく方法としては、大きく分けて次の2つがあります。

  1. オートナンバー型で自動採番
  2. 数値型で任意の番号を振る

オートナンバー型のメリット

  1. レコードごとに、Accessが自動的に1番から連番を振ってくれる。

オートナンバー型のデメリット

  1. レコードを削除したとき、そのとき付けられたナンバーも無くなってしまい、次のレコードにはその次のナンバーが振られるため、欠番ができてしまう。
  2. Accessで番号が決められるため、任意の番号を付けることができない。

数値型のメリット

  1. プログラムを組んでおけば、自動で連番を振ってくれる。
  2. レコードを削除しても、欠番ができないようにすることができる。
  3. 任意の好きな番号を付けることができる。(例えば明細番号は6桁にして、”170001″から始めるなど)

ということで、今回は「数値型」のフィールド使って、フォーム上の明細番号に自動連番を振っていく機能を加えていきたいと思います。

作成の流れ

  1. 「DMax関数」で明細番号の最大値を取得する。
  2. 次のレコードに移ったとき、「日付」にカーソルをセットする
  3. 「日付」からカーソルが離れたとき、「DMax関数で取得した値+1」を「明細番号」に入れる
  4. 「明細番号」に「txt明細番号L」+1を入れるのは、「txt明細番号」の値がNullの時だけ。

DMax関数で明細番号の最大値を取得する

こちらのサンプル「売上フォーム」のレコードソースには、テーブル「T_売上main」を設定しています。一番最初のレコードだけは、任意の明細番号を入力しておきます(ここでは「170001」を入力)。まずは、フォームにテキストボックスをひとつ追加します。ここに式ビルダーを使って、「DMax関数」を記入します。引数はテーブル「T_売上main」の「明細番号」フィールドです。

accessフォーム

この「売上フォーム」をデザインビューで開きます。この非連結のテキストボックス「txt明細番号L」にカーソルを合わせて、プロパティシートの「コントロールソース」の一番右端にある、「ビルドボタン」をクリックします。

デザインフォーム

「式ビルダー」ボックスが出ますので、関数を記入していきます。式ビルダーでは入力支援機能をうまく使いながら、記述していきます。

Access式ビルダー

DMax(“[明細番号]”,”[T_売上main]”)

式ビルダーに記述します。ここでのポイントは、引数の[明細番号]と[T_売上main]は、それぞれ“ダブルコーテーション”で括ることです。記述ができたら、「OK」ボタンを押します。

Access式ビルダー

売上フォームを「フォームビュー」で開けます。テキストボックスに「明細番号の最大値」が表示されています。

Accessフォーム

テキストボックス「日付」にカーソルをセットする

「売上入力」データのひとつのレコードの入力が済んで次のレコード(次の明細番号)に移るために、「Next」ボタンにVBAでイベントプロシージャを記述します。

Accessフォーム

Nextボタンを押すと次のレコードに移動します。更に、次のレコードに移動したあとに、テキストボックス「日付」にカーソルを合わせるようにします。

Nextボタン「btnNext」のクリック時イベント

Private Sub btnNext_Click()

DoCmd.GoToRecord , , acNext
Me.txt日付.SetFocus

End Sub

「日付」からカーソルが離れたときに、「DMax関数で取得した値+1」を「明細番号」に入れる

売上フォームをデザインビューで開いて、「txt日付」にカーソルを合わせます。プロパティシートの「イベント」タブを選択して、「フォーカス喪失後イベント」にVBAを記述します。

フォームデザインビュー

「txt日付」のフォーカス喪失後イベント

Private Sub txt日付_LostFocus()

Me.txt明細番号 = Me.txt明細番号L + 1

End Sub

これで、テキストボックス「日付」に日付を入力して、そのあとカーソルが離れたときに、テキストボックス「明細番号」に前のレコードの明細番号に「1」をプラスした番号が自動的に入るようになります。

売上フォーム

「txt明細番号」に「txt明細番号L」+1の値を入れるのは、「txt明細番号」の値がNullの時だけ

では、最後にもう一度「txt日付」の「フォーカス喪失後イベント」のVBEを開いて、If~End If 文で「txt明細番号」がNull値のときのみプロシージャが実行されるようにVBA記述します。そうすることで、もし前のレコードのページを見に行ったときに、すでに入っている明細番号が上書きされてしまうのを防ぐようにします。

Private Sub txt日付_LostFocus()

If IsNull(Me.txt明細番号) Then
    Me.txt明細番号 = Me.txt明細番号L + 1
End If

End Sub

最後の最後に「txt明細番号L」のほうは、フォームを普通に開けたときは、見えなくするように設定しておきます。フォームをデザインビューで開けて、「txt明細番号L」の「書式」タブの「可視」プロパティを「いいえ」に設定します。

フォームデザインビュー

これで、入力時には「txt明細番号L」が見えなくなりました。

売上フォーム

このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントフィード

トラックバックURL : http://gyoumuka.work/wp-trackback.php?p=970

PAGE TOPへ戻る