|
アクセスは、連番を振るというのは得意ではありません。
でも、方法がないわけではありません。
しばしば言及されるのは、DCount 関数を使う方法です。
今回の場合は、グループ化を行うという点がワンランク難しくしています。
後から考えていきます。
御希望の選択クエリを作るためには、
日付 連番
2015/06/06 1
2015/06/07 2
2015/06/08 3
というレコードを持つクエリ(Q連番)を作ることが必要です。
このクエリとT_部品とを日付フィールドで結合させれば、
御希望の選択クエリになります。
Q連番を作るためには、
日付
2015/06/06
2015/06/07
2015/06/08
というクエリ(Q日付まとめ)が必要です。
このクエリは、T_部品から簡単に作れます。
その方法ですが、日付をグループ化したクエリとするか、
又は、クエリのデザインビューでマウスを右クリックして、
クエリのプロパティシートを出し、
そこにおいて、「UniqueValues/固有の値」プロパティに 「Yes/はい」 を設定します。
次に、Q連番に戻ります。
Q連番において、連番フィールドをどのように求めるかです。
「Q連番」クエリにおいて、例えば、日付フィールドの値が2015/06/08であるレコードについて考えてみます。
このレコードについては、連番フィールドの値を3としたいわけですが、
「Q日付まとめ」において、日付が「2015/06/08」以下であるレコードの個数を
得られれば、3という結果を得られます。
一定の条件に合致するレコードの個数を求めるには、DCount関数を使います。
DCount関数の詳しい説明は、ヘルプを見てもらうとして、ヘルプではわかりにくいところを指摘しておきます。
DCount関数では、第3引数の書き方が難しいんです。
第3引数の書き方ですが、基本形は「フィールド名 = 値」という形の文字列を指定します。
ただし、値の書き方にはクセがあります。
フィールド名のデータ型が数値型の場合は値は何も囲みません
(例「数量 = 200」)。
日付型の場合は#で値を囲みます(例「生年月日 = #2000/05/01#」)。
なお、日付は、本来は、米国での記載の仕方に従い、「月/日/年」の順で記載すべきもののようです。
しかし、Windowsの日付設定を年/月/日の順にしておけば、年/月/日でも大丈夫のようです。
テキスト型の場合はダブルコーテーションで値を囲みます
(例「市町村 = "札幌市"」)。
なお、第3引数は文字列を指定するので、
文字列であることを示すため、第3引数全体をダブルコーテーションで囲みます。
そうすると、第3引数全体を囲うダブルコーテーションと、
値を囲うダブルコーテーションとを区別できなくなってしまいます。
そのため、値を囲うダブルコーテーションはシングルコーテーションにします。
結局、テキスト型の場合は、例えば、「市町村 = '札幌市'」のようにします。
なお、この場合、内側のダブルコーテーションは、二重使いとする、
例えば「"市町村 = ""札幌市"""」のようにするのが正式みたいです。
でも、シングルコーテーションを使った方が見易いので、
ダブルコーテーションの二重使いはあまり使われないようです。
次の問題ですが、上記の「フィールド名 = 値」における「値」は、
Q連番においてレコードごとに異なるため、これをどう表現するかです。
私は、ヘルプを熟読しても、ここのところがさっぱりわかりませんでした。
Q連番において、第3引数は、
1番目のレコードでは「"日付 = #2015/06/06#"」と
2番目のレコードでは「"日付 = #2015/06/07#"」と
3番目のレコードでは「"日付 = #2015/06/08#"」と
したいわけです。
この、例えば「2015/06/06」の部分は、
Q連番の日付フィールドの値であるわけなので、
「2015/06/06」の部分は「日付」と置き換えます。
単純に置き換えると、「"日付 = #日付#"」となるわけですが、
しかし、#はあくまで日付を囲うものであり、
これだと#は日付ではなく「日付」という文字列を囲っていることになってしまうので、この書き方だとエラーになってしまいます。
そこで、「"日付 = #" & 日付 & "#"」とします。
「日付」が2つ出てきますが、
左辺の「日付」は、T_部品テーブルの日付フィールドという意味であり、
右辺の、&で囲まれた「日付」は、Q連番の日付フィールドという意味です。
ここでは、&で囲まれた方の「日付」が
ダブルコーテーションで囲われた中に入っていない
というところが重要なところです。
つまり、Q連番において、1番目のレコードでは、日付は2015/06/06でしたが、
&で囲われた日付は、ダブルコーテーションの外にいるため、
Q連番の日付フィールドの値と同値、
すなわち、2015/06/06と同じということになります。
これに「日付 = #」とか「#」とかの文字列を連結させると、
結果、「日付 = #2015/06/06#」という文字列が完成します。
「2015/06/06」の部分はQ連番においてレコードごとに異なる値となりますので、
1番目のレコードでは「"日付 = #2015/06/06#"」と
2番目のレコードでは「"日付 = #2015/06/07#"」と
3番目のレコードでは「"日付 = #2015/06/08#"」と
することができます。
以上のとおり、御希望の選択クエリとするためには、
選択クエリを3つ作ることが必要になります。
これを1つのクエリで一挙にやってしまおうということは、
多くの場合、できません。
クエリは、一つ一つ順を追って組み立てていくことが必要です。
標語風に言えば、「1クエリ1処理」といったところです。
DCount関数を使う方法は以上ですが、DCount関数などのいわゆるD系関数を
クエリで使うと、クエリが重くなる、ないし遅くなります。
パソコンの性能にもよりますが、
以前は、「DCount関数をクエリで使うと、遅過ぎて実用に堪えない」
と言われていました。
ここを速くするためには、上記でいうQ連番をクエリではなく、
テーブルにしてしまうという方法があります。
この方法は、クエリを開く都度、テーブルを書き替えて、
当該テーブルにQ連番のようなレコードを格納します。
しかし、この方法は、第1に、VBA必須となります。
第2に、クエリを開くという操作では
VBAのコードを実行させるきっかけにはできず、
フォームやレポートからでないと使えません。
そのため、クエリで実現したいという希望には合いませんね。
でも、D系関数を使うより断然速いです。
なお、参考ページを示しておきます。
Recordset_連続番号の振り方:SampleFile071
ht tp://www.accessclub.jp/samplefile/samplefile_71.htm
|
|