レコードセットで一覧表示
ココがポイント
テーブルを直にフォームにするのは抵抗があります!
人的ミスにより簡単にデータの内容が書き換えられてしまうのは設計上避けたいと思っているので確認とかはレコードセットにしたソースをフォームで表示させるようにしています。
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にて並び替えが出来なかったのかは不明ですが、とにかく求める連番を振ることができたので良しとしました。