テーブルをそのままフォームのレコードソースにしてもいいなら問題ないのですが、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種類のスピードの違いは、全く同等でした。考えれば当たり前と言えば当たり前。
結局は、パススルークエリのテーブルデータを引っ張ってきていますから、速度的には変わらないと思います。
体感的にも変わりません。
レコードセットにした時は、そのレコードセットで何か処理をさせた時は、メモリ上のデータで処理するのと、パススルークエリでいちいち引っ張ってきたデータで処理するのとは違いがでるかと推測します。
今回のように、ただ単にフォームで見る為のレコードソースとして使う場合は、どちらでもスピード的には変わらないかと思います。