
テーブルをそのままフォームのレコードソースにしてもいいなら問題ないのですが、SqlServerとの接続の問題やらアクセスの動作が鈍い問題やらとあるので、いろいろと考えなければならない時があります。
SqlServerなどを使っている場合は、パススルークエリを使えば、ネットワーク経路に余計なデータが流れずにスピードアップが期待できると聞いています。
Me.RecordSource = "SELECT * FROM Vew_order WHERE arrange_date ='" & arrange_date_no & "'"
上のコードは、arrenge_date_noが文字列の場合です。
arrenge_dateは、数字なのですが、データ型が文字列なので文字列として抽出しています。
ちなみに、Vew_orderテーブルは、パススルークエリを使ってます。
SQLserverとAccess接続の動作が遅い原因
たった1行で、フォームを「開く時」とか、「読み込み時」あたりに突っ込んんで置けばレコードセットとしてフォームで使えます。
今回のタイトルにあるように、
ココがポイント
レコードセットにしてレコードソースとして使ったらどうなのか
を検証してみたいと思います。
コードだけの説明でわかりずらいかと思いますが、下記のようになります。
Private Sub Form_Load()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
arrange_data_view = arrange_date_no
' Debug.Print arrange_date_no
On Error GoTo Err_Handler
Set cn = CurrentProject.AccessConnection
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Source = "SELECT * FROM Vew_order WHERE arrange_date ='" & arrange_date_no & "'"
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
End With
Set Me.Recordset = rs
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
' Me.RecordSource = "SELECT * FROM Vew_order WHERE arrange_date ='" & arrange_date_no & "'"
ExitErr_Handler:
Exit Sub
Err_Handler:
MsgBox "エラー: " & Err.description
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub
この2種類のスピードの違いは、全く同等でした。考えれば当たり前と言えば当たり前。
結局は、パススルークエリのテーブルデータを引っ張ってきていますから、速度的には変わらないと思います。
体感的にも変わりません。
レコードセットにした時は、そのレコードセットで何か処理をさせた時は、メモリ上のデータで処理するのと、パススルークエリでいちいち引っ張ってきたデータで処理するのとは違いがでるかと推測します。
今回のように、ただ単にフォームで見る為のレコードソースとして使う場合は、どちらでもスピード的には変わらないかと思います。