|
冒頭から余談で恐縮ですが、
社員テーブルと案件テーブルは、多対多結合ですかね。
そのため、両者の結合テーブルとして関与テーブルを設けたということなんでしょうね。
で、社員テーブルと関与テーブルと案件テーブルは、一対多対一になるので、
この3つのテーブルを使って作ったクエリは、更新不可のクエリになると思うんですよね。
更新不可のクエリになると、レコードの新規入力やレコードの訂正を行えなくなってしまいます。
本題とは全く関係ありませんが、ちょっと気になったので、書いてみました。
さて、本題のDCount関数についてです。
DCount関数の第3引数(抽出条件)の書き方って難しいですね。
私の初心者のころ散々悩まされました。ヘルプを見ても全く分からないんですね。
でも、この第3引数の書き方なんですが、
アクセスを利用する際は、いろいろなところで使うことになります。
かなり重要度が高いです。
是非マスターしてほしいと思います。
で、第3引数の書き方ですが、その典型は、
フィールド名 = 値
です。
これを文字列として第3引数に指定します。
ただ、値の書き方にはクセがあります。
フィールド名のフィールドのデータ型がテキスト型の場合、
値はダブルコーテーションで囲います。例えば、
氏名 = "かるびの"
です。
ただ、第3引数全体が文字列となるため、
第3引数全体をダブルコーテーションで囲うことになります。
そうすると、第3引数全体を囲うダブルコーテーションと、
値を囲うダブルコーテーションとを区別できなくなってしまいます。
そこで、このような場合、
値を囲う方は、シングルコーテーションにします。例えば、
氏名 = 'かるびの'
です。
フィールド名のフィールドのデータ型が日付型の場合、
値はシャープで囲います。例えば、
生年月日 = #2016/01/01#
です。
フィールド名のフィールドのデータ型が数値型の場合、値は何も囲いません。
例えば、
数量 = 123
です。
なお、複数の条件を指定する場合は、複数の「フィールド名 = 値」を AND や OR でつないだ文字列を第3引数に指定します。例えば、
"氏名 = 'かるびの' AND 数量 = 123"
です。
ANDをダブルコーテーションの外に出してしまう奴が後を絶ちませんが、
ANDをダブルコーテーションの外に出してしまうのは間違いです。
次の問題は、DCount関数をクエリで使う場合、クエリのフィールドの値を使って
第3引数を設定することになるのが多いわけですが、それをどう表現するかですね。
ヘルプでは、これがわかりにくいんです。
少しはそちらでも考えてほしいので、御希望のこととはちょっと異なる例を使います。
例えば、案件テーブルをベースとして、
案件に関わっている社員のうち、最大の社員IDを得るクエリを作るとします。
この場合、最大の社員IDを得るための演算フィールドに設定する式は、
DSum("社員ID","関与テーブル","案件ID = " & 案件ID)
となります。
これをSQL文で書くと、
SELECT 案件ID
,案件名
,DSum("社員ID","関与テーブル","案件ID = " & 案件ID) AS 最大社員ID
FROM 案件テーブル
となります。
で、DSum関数の第3引数ですが、
「"案件ID = " & 案件ID」における左側の「案件ID」は、
関与テーブル中の案件IDフィールドという意味です。
左側の「案件ID」は、ダブルコーテーションの内側に入っているので、
DSum関数の第2引数に指定された「関与テーブル」のフィールドだということになります。
一方、右側の「案件ID」は、案件テーブル中の案件IDフィールドの値という意味です。
というのは、右側の「案件ID」は、ダブルコーテーションの中に入っていません。
案件テーブルをベースにしたクエリの中で、ダブルコーテーションの外にいるわけですから、
右側の「案件ID」は、案件テーブルのフィールドです。
そして、案件テーブルのフィールドであるということは、クエリにおいては、
レコードごとに異なる値をとるということです。
したがって、右側の「案件ID」は、
案件テーブル中の案件IDフィールドの値を意味することになります。
そこで、例えば、クエリで案件IDフィールドの値が456であるレコードにおいて、
DSum関数がどうなるかというと、
案件テーブル中の案件IDフィールドは456なのですから、
"案件ID = " & 案件ID
という文字列式は、
"案件ID = " & 456
ということになり、この式が計算されて
"案件ID = 456"
ということになります。
そして、当該レコードの「最大社員ID」フィールドには、
DSum("社員ID","関与テーブル","案件ID = 456")
が返す値が表示されるということになります。
敢えて、そのものズバリの回答とはせず、少し回り道をした回答にしてみましたが、
以上のことを踏まえて、自分で考えてみてください。
|
|