Microsoft Access 掲示板

Dlookupについて

5 コメント
views
4 フォロー

初心者ながら業務で使用する実績管理DBを作成し使用しています。

しかし、処理が遅くフォームを開き、表示までに数秒かかり、早くできないかといわれています。

原因を自分なりに調べてみるとDlookup関数を多く使用すると遅くなる?とわかったのですが、
Dlookupを使わずに同じ表示をできるVBAのコード等ありましたら、おしえていただきたいです。

今は
    Me.作業名時間1 = IIf(IsNull(DLookup("時間の合計", "Q_設計_実績伝票処理_作業別時間集計", "作業名No = 1")), 0, DLookup("時間の合計", "Q_設計_実績伝票処理_作業別時間集計", "作業名No = 1")) & " H"

このようなコードをVBAで使用しています

またクエリでも
総作業時間: IIf(IsNull(DLookUp("時間の合計","Q_設計_日報入力_総時間集計","作業No='" & [作業No] & "'")),0,DLookUp("時間の合計","Q_設計_日報入力_総時間集計","作業No='" & [作業No] & "'"))

こんな感じで使用しています、どなたかご教授ください。。

また、社内サーバー上にデータを置き、複数人(7人)がアクセスし使用しています。
サーバーを経由しているせいかそのが原因で遅くなっているのかな?とも思います
早くする方法等ありますでしょうか?

かめ
作成: 2023/02/02 (木) 03:38:33
通報 ...
1
hatena 2023/02/02 (木) 11:38:17 修正

まず、

    Me.作業名時間1 = IIf(IsNull(DLookup("時間の合計", "Q_設計_実績伝票処理_作業別時間集計", "作業名No = 1")), 0, DLookup("時間の合計", "Q_設計_実績伝票処理_作業別時間集計", "作業名No = 1")) & " H"

同じDLookupの式を2回呼び出しているのは無駄ですね。Nz関数を使えば1回ですみます。

    Me.作業名時間1 = Nz(DLookup("時間の合計", "Q_設計_実績伝票処理_作業別時間集計", "作業名No = 1"), 0) & " H"

ただ、これはそれほど処理速度に影響はないですね。呼び出しが2回か1回かなので。

クエリにDLookup関数を使用すると、クエリのレコード件数分繰り返し呼び出されますので重くなります。

これはDLookup関数を使わずに、クエリのオートルックアップ機能を使うと高速化できるでしょう。下記のリンク先を参考にトライしてみてください。

Accessの「オートルックアップクエリ」とは | できるネット

ACCESSの基本技 オートルックアップクエリは超便利 | KEIYU企画

ただし、Q_設計_実績伝票処理_作業別時間集計 は集計クエリだと思いますが、そうだとしたらこのフォームではデータの更新はできないので参照だけのフォームになります。
データ編集はこのフォームから編集用の単票フォームを呼び出すというような設計にする必要がありますね。

あと、クエリ内のテーブルのフィールドのインデックスを適切に設定することで処理速度は改善する可能性があります。これも下記を参考にして設定をしてみてください。

インデックスの作成と使用によりパフォーマンスを向上させる - Microsoft サポート

Accessのテーブルの[インデックス]とは | できるネット

上記で学習したうえで、具体的にどう設定したらいいかわからないという場合は、現状の各テーブルのフィールド構成(フィールド名や主キー設定)を提示してください。

2
かめ 2023/02/04 (土) 16:57:48 5acda@57997

ありがとうございます
言われたように今回のは集計クエリです
参照だけのフォームで問題ないのですが、、
いまいち集計クエリで整合性ができなく、、、やりかたがしりたいです、、、

3
hatena 2023/02/05 (日) 11:46:03 修正

現状のクエリに「Q_設計_実績伝票処理_作業別時間集計」に追加して、「作業名No」フィールド同士で結合します。結合線をダブルクリックして結合プロパティをテーブルの全レコードが表示されるというオプションを選択します。

クエリの現状のDLookupの式を下記に変更。

総作業時間: Nz([時間の合計], 0)

以上でどうでしょう。

4
かめ 2023/02/10 (金) 05:22:49 5acda@0a7dd

できました!!
ありがとうございます。
ただ、別の担当者がNz関数をVBAで改良しているみたいで、 使用できない状況です

質問内容と同様に
総作業時間: Nz([時間の合計], 0) を IIf(IsNull・・・  にして使おうとしましたが、うまく記述できませんでした。。

おしえていただきたいです、、、、 

5

ただ、別の担当者がNz関数をVBAで改良しているみたいで、 使用できない状況です

どのような状況なのかよく分かりませんが、そのような状況自体がNGなものなので、担当者さんに改善を要求するのが筋だと思います。

IIfを使うなら、下記でいいはすです。

総作業時間: IIF(IsNull([時間の合計]), 0, [時間の合計])

または、

総作業時間: IIF([時間の合計] Is Null, 0, [時間の合計])