パソコン情報

【Access】レコードセットを使って連番を振る

レコードセットで一覧表示

ココがポイント

テーブルを直にフォームにするのは抵抗があります!

人的ミスにより簡単にデータの内容が書き換えられてしまうのは設計上避けたいと思っているので確認とかはレコードセットにしたソースをフォームで表示させるようにしています。

https://pctips.jp/pc-soft/access-recoadset/

 

https://pctips.jp/database/access-recordset-integer/

 

一覧表示に連番を振りたい!

今回の案件は、レコードセットをソースにした一覧表示に連番を振りたいという事になります。

どうやって連番をふればいいんだ!?と悩んだ末に、フィールド(TNOとしました)を追加して、そこにレコードソースにするタイミングで連番を書き込むような仕組みにしました。

レコードソースを表示するVBAは下記のようになります。

これにより、入力日で抽出して、月日で並び替えているデータが表示されるようにしています。

Private Sub reload_Click()
 Dim cn As ADODB.Connection
 Dim rs As ADODB.Recordset

'   連番振るルーチン
Call TNO_CAL 

On Error GoTo Err_Handler

    Set cn = CurrentProject.AccessConnection
    Set rs = New ADODB.Recordset

            With rs
            Set .ActiveConnection = cn
            .Source = "SELECT * FROM Clearing_data WHERE ID =" & GID & " AND 入力日 Between #" & Me!date_start & "# AND #" & Me!date_end & "#" & " ORDER BY 月日 DESC"
            .LockType = adLockOptimistic
            .CursorType = adOpenKeyset
            .Open
            End With

        Set Me.Recordset = rs
        rs.Close: Set rs = Nothing
        cn.Close: Set cn = Nothing

ExitErr_Handler:
        ユーザー名 = DLookup("社員名", "User", "ID= " & GID)
        Exit Sub

Err_Handler:
        MsgBox "エラー: " & Err.Description
        rs.Close: Set rs = Nothing
        cn.Close: Set cn = Nothing
End Sub

 

Call TNO_CAL にて、連番を振るVBAに飛ぶようにしました。

 

連番振るVBA

Sub TNO_CAL()

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String
Dim i As Integer

On Error GoTo ErrRtn

    SQL = "SELECT * FROM Clearing_data WHERE ID =" & GID & " AND 入力日 Between #" & Me!date_start & "# AND #" & Me!date_end & "#"
'    & " ORDER BY NO ASC;"
    
    Set cn = CurrentProject.Connection
    Set rs = New ADODB.Recordset
    
    cn.CursorLocation = adUseClient
    rs.Open SQL, cn, adOpenKeyset, adLockOptimistic
    rs.Sort = "NO ASC"
    
    cn.BeginTrans
    
            i = 0
        
        Do Until rs.EOF
        
            i = i + 1
        
            rs!TNO = i
            
'            Debug.Print rs!NO
           
            rs.Update
            rs.MoveNext
        
        Loop
    
    cn.CommitTrans
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing

ExitErrRtn:
    Exit Sub

ErrRtn:
    MsgBox "エラー: " & Err.Description
    cn.RollbackTrans
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing

End Sub

ここで注意しなければならないのが、

SQL = "SELECT * FROM Clearing_data WHERE ID =" & GID & " AND 入力日 Between #" & Me!date_start & "# AND #" & Me!date_end & "#"
' & " ORDER BY NO ASC;"

 

注意ポイント

「' & " ORDER BY NO ASC;"」の部分をコメントアウトしている理由は、ここで、ASCにしようが、DESCにしようが、ソートできませんでした。

その為、仕方なく、「rs.Sort = "NO ASC"」にて、並び替えをやっています。

 

それから、「cn.CursorLocation = adUseClient」を入れないと下記の様なエラーがでますので御注意ください。

 

なんで、SQLでの、ORDER BYにて並び替えが出来なかったのかは不明ですが、とにかく求める連番を振ることができたので良しとしました。