たすけて
SELECT 結果に項番を降りたいだけなのに、めっさシンドイ。
仕様を聞く限りレコードを一意に特定する条件が無い時点で破綻している訳ですが、出力するときにカウントアップすれば良いベーと思ったけど帳票フォームの使い方がいまいちピンと来ない。
で、「Access 行番号」とかでググると DCount なる関数を使うようなアドバイスが多数見つけられる。
こいつは構文が
DCount ( "カウントしたいモノ" , "カウント対象のテーブル" , "カウントアップする条件")
となっている。
つまり、以下のようなスイーツ(笑)テーブルを想定する場合、
ID | 甘いもの | 色 |
---|---|---|
1 | リンゴ | 赤 |
2 | チョコ | 茶 |
3 | ミカン | 橙 |
4 | バナナ | 黄 |
5 | いちご | 赤 |
茶色くないスイーツ(笑)を一覧する表に行番号をつける。
SELECT DCount("*", "スイーツ(笑)", "[甘いもの]='" & [甘いもの] & "' AND ID <=" [ID]) AS 行番号 甘いもの, 色 FROM スイーツ(笑) WHERE 色 != '茶'
結果は多分こう。試す環境は今無いけどね。
行番号 | 甘いもの | 色 |
---|---|---|
1 | リンゴ | 赤 |
2 | ミカン | 橙 |
3 | バナナ | 黄 |
4 | いちご | 赤 |
ここまではよく理解してます。
カレントレコードの ID より小さい物が何件あるのかをカレントレコードの 行番号 カラムに突っ込んでいる。
プランナ的に考えると、これ何回SELECT発行することになるんですか、正気ですかって感じなんですが…
でここで問題。
「ID 列が無い場合、どうすれば行番号がふれるか」
上の例なら答えは簡単、ユニークになる「甘いもの」列をソートかけて文字列比較してやれば良い。
SELECT DCount("*", "スイーツ(笑)", "[甘いもの]<='" & [甘いもの] & "' " ) AS 行番号 甘いもの, 色 FROM スイーツ(笑) WHERE 色 != '茶'
試す環境が無いのでほんとに正しいかはしらん。
そして更なる問題。
「ユニークになる条件がない場合」
ここで破綻。DCount は「条件が異なるもの」を別でカウントしていく関数に過ぎないので、同じ条件のモノが2レコードある場合は行番号が
1、ほげ
2、ほげ
とならずに
2、ほげ
2、ほげ
となる。
まぁそりゃそうだってことですが…
Windows なんて大嫌いだ!
という結論に達したいところですが、ぢゃ他の DBMS ならどうよ?と言われるとモゴモゴ…
単純にやるならSELECT 結果を吐き出すときにカウントアップするプログラムを書いてあげれば良いだけだろうけど…