FC2ブログ

生徒番号の採番

  前回からの宿題。『オートフォームで作成した生徒番号を手入力するのは面倒。新規入力する時点で、自動で採番できないか。』というのがありました。

 ACCESSにはオートナンバー型というデータ型があり、自動的にユニークに連番を振ってくれる型があります。この型を使えば難なく上記の問題は解決されますが、ここでの生徒番号は『入学年度(4桁)+連番(3桁)』という仕様にしてありました。この場合はコードを書く必要があります。

 考え方は2つあります。一つは採番用のテーブルを別個設け、最終番号はそのテーブルで管理します。新規入力画面を開いた時点で次番号を取得し、同時に採番テーブルに書き込みます。新規入力画面を開いたときには採番された番号を表示します。この方式だと複数の端末で同時に画面を開いた場合でも各々の画面で連続した番号が表示されます。ただ、登録せずにキャンセルしてしまった場合でも番号は既に取得済みとなってしまっているので、空番が出来てしまいます。

 もう一つのやり方は採番テーブルを持たずに、生徒番号テーブル自身の生徒番号の最終番号を検索して次の番号を取得する方法です。しかし、この方法で画面に取得した番号を予め表示しようとした場合、複数の端末で同時に開いた時には同じ番号が表示されることになり、番号がダブることになります。なので事前に番号を表示することは出来ず、レコードを書き込む(保存する)時点で最終番号を取得する事になります。

 今回のケースでは事前に番号を画面に表示する必要はないと思われるので、後者の方法でいきたいと思います。

 最終番号を取得するタイミングとしては『更新前処理』のイベントを使います。このイベントはレコードが保存される直前に発生します。つまり、入力が完了し次のレコードの入力に移る時と、画面を閉じる時にイベントが発生します。

 入学年度はシステム日付の年月を取得し、月が4月から12月であれば取得した年を入学年度とし、1月から3月であれば前年を入学年度とします。例えば入力する時点のシステム日付が2010/12/6であれば入学年度は2010が入学年度になり、2011/03/01であれば2011-1つまり2010が入学年度になります。

 更新前処理イベントで次の生徒番号を取得するコード例を以下に示します。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim w_year As Integer
    Dim w_month As Integer
    Dim w_number As Variant
    
    '年度の計算
    w_month = Month(Date)
    If w_month >= 4 And w_month <= 12 Then
        w_year = Year(Date)
    Else
        w_year = Year(Date) - 1
    End If
    
    '最終番号の取得
    w_number = DMax("[生徒番号]", "T_生徒番号", "left([生徒番号],4)=" & w_year)
    If IsNull(w_number) Then
        Me!生徒番号 = w_year & "001"
    Else
        Me!生徒番号 = w_number + 1
    End If
End Sub

 コードの解説をします。いくつかACCESSの関数を使用していますので、まとめてみます。どれもよく使うのでここで覚えておくといいでしょう。EXCELで使用される関数と共通するものもあります。

Date:当日日付を取得する。時刻も一緒に取得する場合はNow関数を使います。
Year:引数で指定された日付の年を取得します。
Month:引数で指定された日付の月を取得します。日を取得する場合はDayを使用します。
DMax:引数で指定された条件のテーブル・フィールドの最大値を取得します。
第1引数はフィールド名、第2引数はテーブル名、第3引数は条件です。条件式の左辺と右辺を文字列連結しています。左辺はフィールド名になります。
left:引数で指定された文字列を左端から取り出すときに使います。コード例では生徒番号の左端から4桁分(つまり西暦年度)を取り出します。
Isnull:指定された引数の値がnull値かどうかを判断します。nullというのはデータがない状態を表します。

 変数のw_numberの型をVariantにしておかないとエラーになります。なぜかというとDMaxで返却された値がなかった場合(指定年度の最初のレコード)、戻り値がnullで返ってくるからです。例えばintegerやstringで宣言しておくとnullをセットできないのでエラーになります。Variantは最も汎用的な型でnullを許します。

 w_numberがnullの場合、計算しておいた年度に『001』を文字列連結します。それ以外は、最終生徒番号に1を加えた値を画面の生徒番号にセットします。

 コードに関しては以上ですが、最後に生徒番号の使用可能プロパティを『いいえ』にします。自動で採番されるので、入力できないようにする為です。又、履歴検索モードの時にキーである生徒番号を修正されるのを防ぐためでもあります。

 次回は生徒番号フォームと家族フォームの連携について考えます。
関連記事
スポンサーサイト



テーマ : データベース
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
全記事表示リンク

全ての記事を表示する

月別アーカイブ
カテゴリ
お問い合わせ
まずはこちらのフォームより御一報下さい。

名前:
メール:
件名:
本文:

検索フォーム
RSSリンクの表示
アクセスランキング
[ジャンルランキング]
コンピュータ
560位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
80位
アクセスランキングを見る>>
ブログランキング

FC2Blog Ranking