電子書籍の厳選無料作品が豊富!

Access2007の更新クエリーで標準モジュールの関数を利用して更新をかけたい。然し、標
準モジュールで提供されるグローバル変数の値は、1回更新をかけると最初の初期値に戻
すのは面倒だ。

だから、標準モジュールの関数でクラスモジュールの関数を使いたい。クラスモジュール
の関数ではフォームを開いた時のイベントで変数を初期化する事が出来る。然し、標準モ
ジュールの変数は普通には再度Access2007のファイルを開かない限りは更新されたままに
なる。

なので、ここではクラスモジュールの関数を使いたいが。残念な事に更新クエリーではク
ラスモジュールの関数を使う事は出来ない。なので、ここでは標準モジュールの関数でク
ラスモジュールの関数を使う事で機能を実現させたい。

やろうとしたい事は例えば下記のテーブルが有った場合に
日付 入金 合計
10/01 100
10/02 100
10/03 100

上記の時に合計の欄を更新クエリーで下記の様に更新をかけたい
日付 入金 合計
10/01 100 100
10/02 100 200
10/03 100 300

本来は、直接クラスモジュールの関数をここで指定が出来れば良いが。指定は出来ない。
なので、標準モジュールの関数を使う。例えば、この例では更新クエリーでfieldの所に
合計:count1([入金])

ここでは、標準モジュールの関数では累計の為の変数を用意しておかなければならない。
だから、ここでは予め使える様にその変数の値をゼロにして初期化をしておかないといけ
ない。

確かに、この方法でも使えない事は無いが。然し、これが上手く行くのは最初の1回のみ
です。2回目以降は標準モジュール内で累積された合計の値を保持していますので。もう
これは使えません。

なので、ここでこの変数をクラスモジュールの変数を使う事に依って。このクラスモ
ジュールの変数を毎回にそのクラスのフォームが開いた時に自動的に変数をゼロにしての
初期化を行ない。この事に依ってその変数が前の影響で累積される事を防止したいと思っ
ています。

では、どうやってこの標準モジュールからクラスモジュールの変数を使うのかと言う所が
分かりません。別に、直接クラスモジュールの変数を使うのでなくても。標準モジュール
の関数からクラスモジュールの関数を呼んでも良いですが。今度は、その標準モジュール
からクラスモジュールを呼び出す方法が分かりません。

この標準モジュールからクラスモジュールを使う方法が分かりませんのでその使い方を説
明願います。宜しくお願いします。

質問者からの補足コメント

  • どう思う?

    質問の件に関しては、最初に指摘した様に更新クエリーでのfieldの欄
    に標準モジュールの関数でtotal1([入金])と言う事で解決しています。

    但しこの件に関しては再度同一のクエリーを実行した場合には内容が壊
    れてしまいます。この件に関しては、もうこの更新クエリー単独での解
    決は断念して。他の方法で解決を図ります。

    その方法はマクロで内部の標準モジュールのグローバル変数の値をゼロ
    にリセットする方法です。

    マクロの流れとしては、
    1. メッセージの設定
    2. 標準モジュールのグローバル変数の値をゼロにリセットする
    3. 更新クエリーの実行
    4. 更新されたテーブルを開く

    と言う事で諦めてこれで解決とします。どうも有難う御座いました。他
    に良いのが有るのかも知れませんが。これで、一応は閉めたいと思いま
    す。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/11/03 21:06

A 回答 (1件)

Access組み込みのDsum関数で間に合いそうな気がしますけど?


クエリのSQLビューに
SELECT 日付, 入金, 合計, CLng(Nz(DSum("入金","元テーブル","日付<=#" & 日付& "#"),0)) AS 合計計算
FROM 元テーブル;
※入金は長整数型と仮定しています。CLng、CDbl、CCur ・・・。

計算で求められるのは基本的にテーブルに保存することはあまりありませんが、
更新クエリなら
UPDATE 元テーブル SET 元テーブル.合計 = DSum("入金","元テーブル","元テーブル.日付<=#" & [元テーブル.日付] & "#")
WHERE (((元テーブル.合計) Is Null));

では。

PS.
フォームのデータシートは、
デザインビューに切り替え、
プロパティシートから既定のビューをデータシートにして保存すれば
次回からはデータシートビューになっているハズ。
この回答への補足あり
    • good
    • 1
この回答へのお礼

有難う御座います。
データとしては、必ずしも日付が一意になっていない場合もありますの
で。今回の例の場合は確かに上手く行きましたが。
今回の例です。
日付 入金 合計
10/01 100
10/02 100
10/03 100

然し、下記の例の場合は上手く行きません。
日付 入金 合計
15-10-01 100
15-10-01 100
15-10-02 100
15-10-02 100
15-10-03 100

この場合の実行結果は下記です。
日付 入金 合計
15-10-01 100 200
15-10-01 100 200
15-10-02 100 400
15-10-02 100 400
15-10-03 100 500

上記の場合も、下記の様に結果を表示をしたいのですが。
日付 入金 合計
15-10-01 100 100
15-10-01 100 200
15-10-02 100 300
15-10-02 100 400
15-10-03 100 500

違いは、
15-10-01 <--一番目のレコード
15-10-02 <--三番目のレコード

済みません、私の例示の仕方が悪かったです。
再度の質問ですが、宜しくお願いします。

お礼日時:2015/11/03 15:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!