2008年3月5日水曜日

Access で主キーに利用する id の数値を生成する

Access では、テーブルにおけるフィールドの型として、オートナンバー型がある。これを主キーの id フィールドでよく利用する。このオートナンバー型の挙動を見ると、同じテーブルの、別の列に対して連結しているフォームのフィールドに値が入力された後に生成され、オートナンバー型に対して連結しているフォームのフィールドに表示されるようである。

フォームが表示されたときに、 主キーとなる id フィールドに数値が既に入っていて欲しいときがある。サブフォームがあり、フォームとサブフォームを結ぶフィールドが id に依存している場合だ。このとき、親となるフォームのいずれかのフィールドに値を入力しないと、オートナンバーは生成されない。よって、フォームが表示されたときにすぐサブフォームの入力に移ることができない。

こういうときは、自分で DMax 関数を利用して、 id フィールドの値を生成すると楽。

フォームの「レコード移動時」のイベントを利用して...

Private Sub Form_Current()
    If Me.NewRecord Then
        Me.id = DMax("フィールド名", "テーブル名") + 1
    End If
End Sub

 

追記(2008.3.6): レコードが一件も存在しない場合の処理を追加した。また、親フォームに主キーのフィールドしかなく、子フォームの値を最初に入力することができるようにするために、主キーとなる値を生成したら、レコードを保存するようにした。

Private Sub Form_Current()
    Dim strTbl, strId As String
    
    strTbl = "テーブル名"
    strId = "フィールド名"
    
    ' 新規レコードであることを確認する
    If Me.NewRecord Then
        If IsNull(DMax(strId, strTbl)) Then
            Me.id = 0
        Else
            Me.id = DMax(strId, strTbl) + 1
        End If
    End If

    ' レコードを保存する
    DoCmd.RunCommand acCmdSaveRecord
End Sub