• 締切済み

自動採番

自動採番を、access vbaでしたいのですが、その方法がわかりません。 誰か、ご教授できるかた、お願いします。

みんなの回答

noname#140971
noname#140971
回答No.2

【id管理表】 id_name     char(32) 主キー final_value   long Private Sub Form_BeforeInsert(Cancel As Integer)    Me.ID = NewID("perform_id")    Cancel = CBool(Me.ID = -1)    If Cancel Then      StopMsg "ID番号が取得できませんでした。" & _                   "システム管理者に報告して下さい。(Form_BeforeInsert)"    End If End Sub [id管理表]には、初期値が用意されていなければなりません。そうでないと、NewID関数は、-1を戻します。 初期値さえ設定して「おけば、NewID関数で、テーブル[Perform]の主キー列[ID]の値はシーケンシャルに発生させることが可。 私は、このような採番テーブル【id管理表】と値を取得し更新する関数NewID()を利用しています。 つまり、例でも判るようにテーブル[Perform]とは別に専用の採番テーブルを用意しているということです。 Public Function NewID(ByVal strIDName As String) As Long On Error GoTo Err_NewID    Dim N   As Long    Dim strSQL As String    Dim cnn  As ADODB.Connection    Dim rst  As ADODB.Recordset       Set cnn = CurrentProject.Connection    Set rst = New ADODB.Recordset    strSQL = "SELECT final_value FROM id管理表 WHERE id_name='" & strIDName & "'"    cnn.Errors.Clear    cnn.BeginTrans    With rst      .Open strSQL, _         cnn, _         adOpenDynamic, _         adLockOptimistic      If Not .BOF Then        N = .Fields(0) + 1        .Fields(0) = N        .Update      End If    End With    cnn.CommitTrans Exit_NewID: On Error Resume Next    rst.Close    cnn.Close    Set rst = Nothing    Set cnn = Nothing    NewID = N    Exit Function Err_NewID:    N = -1    If cnn.Errors.Count > 0 Then      ErrMessage cnn.Errors(0), strSQL      cnn.RollbackTrans    Else      MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(NewID)", _         vbExclamation, " 関数エラーメッセージ"    End If    Resume Exit_NewID End Function Public Sub ErrMessage(ByVal CnnErrors As adodb.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub

回答No.1

これだけじゃ答えようがないかな… どこから自動採番かを書かないと。 たとえばフォームのテキストボックスの値だとか DBの最大値+1だとか 日付からだとか。

関連するQ&A