連投失礼致します。
複数のコンボボックスでレコードをフィルターするフォームを作成しています。
短いテキスト型で全角の1~20の数字に昇順をかけると、
1、11、12、13、14、15、16、17、18、19、2、20、3、4、、、という並びになってしまいました。
Accessのクエリでレコードを数値順に並べる方法を試してみましたが、やはり昇順になりませんでした。
実験的に、T_昇順実験(テーブル)を作成し、短いテキスト型(フィールド)に1~20までのレコードを作り、Q_昇順実験1(クエリ)をで並べ替えを行いました。
SELECT T_昇順実験.短いテキスト型, Val([短いテキスト型]) AS 式1
FROM T_昇順実験
ORDER BY Val([短いテキスト型]);
どうすれば昇順で並び替えられるようになりますでしょうか?
こちらを参考に、数値型に変えて並び替えを行う方法は上手くいったのですが、数字以外をリストから選ぼうとすると式が複雑すぎて評価出来ませんとエラーが出るため、今回は使えません。
手詰まりになってしまったのでご意見・解決策を教えて頂けますと幸いです。
よろしくお願い致します。
全角数字はVal関数では数値と判断されずに0になります。
StrConv関数で半角に変換してVal関数で数値化すればいいでしょう。
StrConv 関数 (Visual Basic for Applications) | Microsoft Learn
そもそも論ですが、数値順にならべたいフィールドを、テキスト型で全角数字にする意味が不明です。
素直に数値型のフィールドにしておけば無駄なことをせずにすみます。
StrConvやValで囲むことで無駄な処理が増えて、かつインデックスが無効になるので重くなります。
もし、表示上、全角にしたいのなら、フィールドのデータ型は数値型にしておいて、表示するときに全角に変換すればいいでしょう。
同じフィールドにアルファベットが入る可能性があるので数値型に出来ません。
ならばデータ例もそうのように提示すべきですね。
全角数字のあとにアルファベットがくるのですか。
であるなら、前回の回答の最初のクエリでいいでしょう。
商品コード的なもので、数字+アルファベット という書式のものなら、
数字部分とアルファベット部分にわけて、それぞれ数値型、テキスト型フィールドにするという設計もあります。
というようなこともあるので、どのような書式になるのか、データ例もあげて、仕様を明確に提示してください。
説明不足で申し訳ありません。
ひとつ前の質問と関連するのですが、他のコンボボックスで選んだものによって選択肢が変わります。
例えば昇順に並べ替えたいコンボボックスがcmb_検索2だとすると、cmb_検索1でAを選ぶと1~20が、Bを選ぶとA~Zがリストに表示されるといったような感じです。
というようなテーブルデータとういことですか。
これはどのようなリストでしょうか。
データベース的な設計なら、主キー必須なので下記のような感じとかになるはずです。
で、主キーで並び替えます。
質問内容をあまり省略しすぎると、その内容に最適化された回答をしますので、
実際の処理に合わないものになる可能性が大きいです。
なるべく実態に近い質問内容にしてください。
例えば、前回の質問では、下記のようにいってますが、
もしこの内容なら、市町村コードというものがありますので、それで並び替えるとかになります。
レスが遅くなってしまい申し訳ありません。
実際にはイベント会場の指定席管理システムを作っていまして、
このようなテーブルがあり、cmb_席種というコンボボックスから「座敷」を選択すると、cmb_席1コンボボックスの選択肢は「前列」だけになり、「前列」を選択するとcmb_席2の選択肢が1~20になり、この際数字が昇順になるように表示させたいということです。
このため、席2フィールドに全角数字と全角アルファベットがあります。
そのテーブルなら、ID の昇順にすればいいだけでは。
cmb_席2 の値集合ソースに下記のSQLを設定すればいいでしょう。
コンボボックスに同じ選択肢を羅列させないために集計でグループ化しているので、IDをフィールドに入れるとマズイ場合はどうすればよいでしょうか?
テーブル構成がどうなっているか不明なので、とりあえずの推測ですが、
IDをフィールドを最小か最大にすればいいのでは?
通常、コンボボックスのコントロールソースにはキーフィールドを格納するという設計になると思いますが、
このような質問が出てくるのは、その辺のテーブル設計がまずいのではという予感。
後だしで情報を追加していくのではなく、最初から関係するすべての情報を提示して質問してもらった方が、お互いに手間がないかと思いますが。
無事に昇順で表示させることができました。ありがとうございました。
どこまでがこの課題の必要情報か分からず、また社内情報保護の為小出しになってしまい申し訳ありません。
ここがよく分からないのですが、どういうことでしょうか?
ちなみに社内の既存のシステムなので、テーブル構成を変えるのが難しいです。
メインテーブルのレコードに全ての情報が集約されている感じのテーブル構成です。
T_指定席予約データ
何度かこのサイトで教えて頂いていますが、テーブルが「正規化」されていないから扱いにくいということですかね?例えば席関連のフィールドでいえば、T_指定席予約_席 のようなテーブルを作成して、そこに席関連だけのデータを格納しリレーションでつなぐ・・・といったことをしないといけないということですよね?
どなたか分かりませんが、スタンプでは分かりませんので文章でお願い致します。
テーブルでの並び順を名前の昇順ということは、通常はあまりないことです。
主キーフィールド順にするか、並び替え用のフィールドを用意するのが普通の設計です。
#8の投稿のテーブルなら、正規化すると、
席種マスターテーブルと席列マスターテーブルを作成することになります。
正規化例
席種マスター
席種ID 席種
1 座席
2 パイプ椅子
席列マスター
席列ID 席列
1 前列
2 後列
ID 席種ID 席列ID 席番
1 1 1 1
2 1 1 2
3 1 1 3
・・・
20 2 2 T
にはどのようなデータが必要でしょうか?
これも、よくある受発注データベースサンプルなんかを参考にしたらいいと思いますよ
「席」という商品を「予約毎に受け付ける」という形なので
「T_指定席予約データ」という一つのテーブルで何とかしようとするのではなく、
予約テーブルと予約席明細テーブル2つに分けて登録するとうまく正規化できます