Microsoft Access 掲示板

フォームのレコードソース

3 コメント
views
4 フォロー

標題の件でご質問させていただきます。

レコード数100万件、カラム数30くらいあるテーブルのデータを複数のビューで
クロス集計クエリをしています。単にクエリを表示するのにかなりの時間がかかります。

ご相談は、このクエリがタブで5つほど、フォームのレコードソースに設定されており、
フォームを開いて表示する際に、パフォーマンスが悪いです。

クロス集計クエリではなく通常の選択クエリであれば、VBAでレコードソースを設定する際、
データが抽出されない条件を初期設定などして、必要なタイミングでコマンドボタンクリック時
のイベントプロシージャで表示させることなどできますが、クロス集計クエリではうまくいきません。

どのような方法で対処可能かご教授願えますでしょうか。

kazuki
作成: 2021/11/21 (日) 15:40:26
通報 ...
1
りんご 2021/11/21 (日) 17:18:17 c564b@0e907

パフォーマンスが悪いです。クロス集計クエリではうまくいきません。

 それはそうでしょう。詳しくないですが、Excel風に印刷したい時など、その場限りで使うものではないでしょうか。クロス集計結果をメイン画面に表示して普段使うならば、Excelでデータベースを組むでしょう。

通常の選択クエリであれば、…

 時間と労力を費やしてその場凌ぎではどうにもならないと思います。個人の意見なので、解決策が他にあるかもしれませんが。

2

レコード数100万件、カラム数30くらいあるテーブルのデータを複数のビューで
クロス集計クエリをしています。単にクエリを表示するのにかなりの時間がかかります。

テーブルに適切なインデックスは設定されているでしょうか。
列見出しに設定するフィールド、抽出条件を設定するフィールド、並べ替えを設定するフィールドにインデックスを設定してみてください。
複数のテーブルを結合しているなら結合フィールドにもインデックスを設定してみてください。

クロス集計クエリではなく通常の選択クエリであれば、VBAでレコードソースを設定する際、
データが抽出されない条件を初期設定などして、必要なタイミングでコマンドボタンクリック時
のイベントプロシージャで表示させることなどできますが、クロス集計クエリではうまくいきません。

フォームに関しては、デザインビューでは、タブの最初に表示されいるページのみにソースオブジェクトを設定しておいて、ページを変更したときにそのページのソースオブジェクトを設定するという方法が考えられます。

コード例

Private Sub タブ1_Change()
    Select Case Me.タブ1.Value 'Value=表示されいるページ番号(0から始まる)
    Case 1 '2ページ目
        With Me.サブフォームコントロール1
           If  .SourceObject = "" Then .SourceObject = "サブフォーム1"
        End With
    Case 2 '3ページ目
        With Me.サブフォームコントロール2
           If  .SourceObject = "" Then .SourceObject = "サブフォーム2"
        End With
    Case 3
 
        '略

    End Select
End Sub
3
kazuki 2021/11/22 (月) 13:11:57 修正 d73a2@c8d31

りんご様

前提をお話していませんでしたが、表示するだけではなく、60万件ほどの初期レコードに対し、
UI上に演算等をするコマンドボタンが10数個あり、レコードを追加、削除、演算をし、結果として、
集計結果(100万件)をクロス集計クエリを表示する仕様です。

hatena様

インデックスは早速試しました、体感レベルですが少なからずパフォーマンス改善したように思います。
SourceObjectを空にしておいて、タブの移動で計算させるというのは、パフォーマンス改善にかなり有効でした。

どうもありがとうございました。