お世話になります。
クエリの集計結果によって、同じフィールドにおけるすべてのレコードの値が空白だった場合、そのフィールドに並べ替えを設定していると、正しく並べ替えができません。
クエリのデザインビューで、左からフィールド1、2、3を配置し、それらすべてに昇順の並べ替えを設定しています。
そのクエリの抽出条件による結果によって、フィールド2がすべてのレコードにおいて空白となってしまった場合、フィールド3が昇順になってくれません。
クエリのデザインビューですべてのフィールドに並べ替え条件を設定しないで、そのクエリを使用しているフォームのプロパティの並べ替えに条件を設定しても同じことが起こってしまいます。
VBAのOrderコマンドでも、SQLの書換でも同じことが起こりました。(あたりまえかもしれませんが…)
これはそもそも仕様でしょうか?それとも回避策があるのでしょうか?
回避策があれば是非ともご教授よろしくお願いいたします。
「レコードの値が空白」ということはNull値ということですか。
当方で作成したサンプルで確認しましたが、そのような症状は確認できませんでした。
症状の再現できる現状のSQLとデータ例を提示してもらえますか。
ご連絡ありがとございます。
自身でもいろいろと調べていたのですが、クエリのフィールド名【フィールド2】の隣に
【式1: IIf([フィールド2]="" Or [フィールド2]=Null,"9999","")】をいれてクエリを実行すると、
【フィールド2】がすべて空白にもかかわらず、式1のフィールドに【空白】が返ってくるものと、【9999】が返ってくるものが存在しました。
これが並べ替えできない原因な気がするのですが、式1のフィールドに【空白】が返ってくるものは、【フィールド2】に
何が入っていると認識されているのでしょうか?スペースが入っているのかと確認しましたが、入っていません。
【症状の再現できる現状のSQLとデータ例】ですが、多数のフィールドがありレコードも多いので提示できる状態にするには少し時間が掛かりそうです。申し訳ございません。上記の情報でなにかコメント頂けると幸いです。
[フィールド2]のデータ型はなんでしょうか?
テキスト型(短いテキスト)なら、
式1: IIf([フィールド2]="" Or [フィールド2] Is Null,"9999","")
です。NullはイコールではなくIs演算子で判定します。
数値型なら、
式1: IIf([フィールド2] Is Null,9999,Null)
となります。
""
はテキストなので数値型との比較には使えません。おっしゃる通り、テキスト型です。
ご指摘の式1の形に書き換え、[フィールド2]の並べ替え設定を削除し、式1を昇順に設定すると期待通りの並びになりました。
ということは、空白でも""とNullで並び替えの分別対象になる、ということになるという認識であっていますでしょうか?
Nullについて(もう一度学ぶMS-Accessさん)
""(空文字列(長さ0の文字列))とNullは画面上で見たときの見た目が同じだけでデータとしては別物です
異なるデータなので、並び替えをすれば、それぞれがひとまとまりになって並び変わります(どちらが先になるかは若干複雑でACCESSならNULLが先となります)
NULLは非常に厄介な問題(比較は
Is Null
としなければならない、「全て」を抽出したつもり(Like "*"
)でデータが抜け落ちる等々多数)を持っています。できることならテーブルのプロパティで制限がかけられると良いですね同感です。見た目が同じなのに結果が異なるのはトラブルの元です。
具体的には、テーブルのデザインビューで、フィールドプロパティを下記のように設定すれば、Nullになることはないので空文字列("")かどうかのみ考慮すればOKになります。
質問の式も下記ですみます。
式1: IIf([フィールド2]="","9999","")
Like "*"
でデータが抜け落ちることもなくなります。お二方ともありがとうございました。
式を書き換え、なんとか今回の目的は解決できました。
このサイトはいつも皆様に助けて頂き、非常に感謝しております。
日々勉強になります。