使いやすいように設計された Microsoft リレーショナル データベース管理システムのファミリ。
テーブルに残高フィールドを作成して、VBAで書き込むのが高速です。
下記の関数を利用すればコードもシンプルに記述できます。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
現金出納簿を作っています。
現金残高設定をクエリで下記のように設定しました。
表示順: [年月日] & Format([ID],"0000")
現金収入合計: Nz(DSum("現金収入","Q現金","表示順<='" & [表示順] & "'"))
現金支出合計: Nz(DSum("現金支出","Q現金","表示順<='" & [表示順] & "'"))
現金残高: [現金収入合計]-[現金支出合計]
ところが、レコード数が1000件近くになると、大変重くなり、
1万件になると、とても重くて使いものになりません。
「Access のパフォーマンスを向上させる」を参考にして、
各項目をチェックしてみましたが、改善されません。
残高のない現金出納簿で、トータルだけなら、問題はないのですが、
残高のない現金出納簿では、意味をもたないと思っています。
計算式に問題があるのか、良い方法があれば教えて下さい。
Accessを使って、独自の会計ソフトを完成させたいのです。
どうか、宜しくお願いします。
使いやすいように設計された Microsoft リレーショナル データベース管理システムのファミリ。
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。
(昔から言われて続けていることですが)
DSum 等の定義域集計関数は、それ自体低速な関数です。
MS サポート: [ACC2000] Access 2000 でクエリを最適化する方法
引用:
> DLookup 関数のような定義域集計関数は使わないようにして、
> クエリに含まれないテーブルのデータにアクセスすることを避けます。
> 定義域集計関数は Access に固有の機能であるため、
> これらの関数を使用するクエリは Jet で最適化できません。
> 代わりに、関数からアクセスしていたテーブルをクエリに追加するか、
> サブクエリを作成します。
特に、定義域としてリンクテーブル(を含むクエリ)を指定した場合や、
定義域に含まれるレコードの件数が膨大である場合、
関数を(1回1回)呼び出す際のパフォーマンスは著しく低下します。
何らかのフィールドの値の累計をクエリによって求めたいならば
Sum 関数を用いたサブクエリを使用した方がよいでしょうし、あるいは
最終的にその累計値をレポート上に出力なさりたいということであれば、
クエリではなくレポート側で計算するようにされた方が無難でしょう。
ありがとうございます。
ご紹介いただいた「関数」を利用したいと思います。
累計値をテーブルに入力することで、解決しそうです。
他でも、利用できそうで、大変うれしです。
ほんとうにありがとうございました。
ご回答ありがとうございます。
>関数を(1回1回)呼び出す際のパフォーマンスは著しく低下します。
よく理解できました。
残高処理は、入出金処理後に、デーブルに書き出す方法を考えて見ます。
入出金で数百件前のデーターを訂正するといったことは考えられないので、
その都度、データ化してしまえばよいのかなと、考えています。
ただ、並び替えや抽出したときの、残高処理には、対応しないので、
もう少し、考えを巡らさなければ、ならないですね。
ご回答、本当にありがとうございました。