Microsoft Access 掲示板

コンボボックスのリストを昇順にしたい

16 コメント
views
4 フォロー

連投失礼致します。

複数のコンボボックスでレコードをフィルターするフォームを作成しています。

短いテキスト型で全角の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([短いテキスト型]);

結果、のような結果になりました。
画像1

どうすれば昇順で並び替えられるようになりますでしょうか?

こちらを参考に、数値型に変えて並び替えを行う方法は上手くいったのですが、数字以外をリストから選ぼうとすると式が複雑すぎて評価出来ませんとエラーが出るため、今回は使えません。

手詰まりになってしまったのでご意見・解決策を教えて頂けますと幸いです。
よろしくお願い致します。

驚天動地!前任者失踪丸
作成: 2024/04/19 (金) 19:25:45
通報 ...
1
hatena 2024/04/20 (土) 05:03:41 修正

全角数字はVal関数では数値と判断されずに0になります。
StrConv関数で半角に変換してVal関数で数値化すればいいでしょう。

SELECT T_昇順実験.短いテキスト型, Val(StrConv([短いテキスト型],8)) AS 式1
FROM T_昇順実験
ORDER BY 2;

StrConv 関数 (Visual Basic for Applications) | Microsoft Learn


そもそも論ですが、数値順にならべたいフィールドを、テキスト型で全角数字にする意味が不明です。
素直に数値型のフィールドにしておけば無駄なことをせずにすみます。
StrConvやValで囲むことで無駄な処理が増えて、かつインデックスが無効になるので重くなります。

もし、表示上、全角にしたいのなら、フィールドのデータ型は数値型にしておいて、表示するときに全角に変換すればいいでしょう。

SELECT StrConv(T_昇順実験.数値型,4) AS 数値型
FROM T_昇順実験
ORDER BY T_昇順実験.数値型;
2
驚天動地!前任者失踪丸 2024/04/20 (土) 08:33:03 23e8e@44ebd >> 1

同じフィールドにアルファベットが入る可能性があるので数値型に出来ません。

3

ならばデータ例もそうのように提示すべきですね。
全角数字のあとにアルファベットがくるのですか。
であるなら、前回の回答の最初のクエリでいいでしょう。

商品コード的なもので、数字+アルファベット という書式のものなら、
数字部分とアルファベット部分にわけて、それぞれ数値型、テキスト型フィールドにするという設計もあります。

というようなこともあるので、どのような書式になるのか、データ例もあげて、仕様を明確に提示してください。

4
驚天動地!前任者失踪丸 2024/04/20 (土) 09:58:17 23e8e@44ebd >> 3

説明不足で申し訳ありません。
ひとつ前の質問と関連するのですが、他のコンボボックスで選んだものによって選択肢が変わります。

例えば昇順に並べ替えたいコンボボックスがcmb_検索2だとすると、cmb_検索1でAを選ぶと1~20が、Bを選ぶとA~Zがリストに表示されるといったような感じです。

5
フィールド1
・・・
18
19
20
・・・

というようなテーブルデータとういことですか。
これはどのようなリストでしょうか。
データベース的な設計なら、主キー必須なので下記のような感じとかになるはずです。
で、主キーで並び替えます。

IDData
11
22
33
・・・・
1818
1919
2020
21
22
・・・・
46

質問内容をあまり省略しすぎると、その内容に最適化された回答をしますので、
実際の処理に合わないものになる可能性が大きいです。

なるべく実態に近い質問内容にしてください。

例えば、前回の質問では、下記のようにいってますが、

イメージ的には、cmb_1で都道府県を選択したら、cmb_2にはその県にある市だけが選択できるようになる

もしこの内容なら、市町村コードというものがありますので、それで並び替えるとかになります。

8
驚天動地!前任者失踪丸 2024/04/24 (水) 19:28:27 23e8e@44ebd >> 5

レスが遅くなってしまい申し訳ありません。
実際にはイベント会場の指定席管理システムを作っていまして、

ID席種席1席2
1座敷前列
2座敷前列
20座敷前列20
21パイプ椅子後列
22パイプ椅子後列
40パイプ椅子後列

このようなテーブルがあり、cmb_席種というコンボボックスから「座敷」を選択すると、cmb_席1コンボボックスの選択肢は「前列」だけになり、「前列」を選択するとcmb_席2の選択肢が1~20になり、この際数字が昇順になるように表示させたいということです。
このため、席2フィールドに全角数字と全角アルファベットがあります。

9
りんご 2024/04/24 (水) 20:34:20 935bc@0e907 >> 8
テーブル{席種}
座敷
パイプ椅子
テーブル{席種席列}
座敷   前列
座敷後列
パイプ椅子前列
パイプ椅子後列
テーブル{席種席列席番号}
座敷前列1
座敷前列
座敷前列20
座敷後列1
座敷後列
座敷後列20
パイプ椅子前列
パイプ椅子後列
10
hatena 2024/04/24 (水) 22:48:08 修正

このようなテーブルがあり、cmb_席種というコンボボックスから「座敷」を選択すると、cmb_席1コンボボックスの選択肢は「前列」だけになり、「前列」を選択するとcmb_席2の選択肢が1~20になり、この際数字が昇順になるように表示させたいということです。

そのテーブルなら、ID の昇順にすればいいだけでは。
cmb_席2 の値集合ソースに下記のSQLを設定すればいいでしょう。

SELECT 席2, ID FROM テーブル名 WHERE 席2='" & Me.cmb_席1 & "' ORDER BY ID;
11
驚天動地!前任者失踪丸 2024/04/25 (木) 09:25:36 23e8e@44ebd >> 10

コンボボックスに同じ選択肢を羅列させないために集計でグループ化しているので、IDをフィールドに入れるとマズイ場合はどうすればよいでしょうか?

12

テーブル構成がどうなっているか不明なので、とりあえずの推測ですが、
IDをフィールドを最小か最大にすればいいのでは?


通常、コンボボックスのコントロールソースにはキーフィールドを格納するという設計になると思いますが、
このような質問が出てくるのは、その辺のテーブル設計がまずいのではという予感。


後だしで情報を追加していくのではなく、最初から関係するすべての情報を提示して質問してもらった方が、お互いに手間がないかと思いますが。

13
驚天動地!前任者失踪丸 2024/04/25 (木) 10:00:01 修正 23e8e@44ebd >> 12

無事に昇順で表示させることができました。ありがとうございました。
どこまでがこの課題の必要情報か分からず、また社内情報保護の為小出しになってしまい申し訳ありません。

通常、コンボボックスのコントロールソースにはキーフィールドを格納するという設計になると思いますが

ここがよく分からないのですが、どういうことでしょうか?

ちなみに社内の既存のシステムなので、テーブル構成を変えるのが難しいです。
メインテーブルのレコードに全ての情報が集約されている感じのテーブル構成です。


T_指定席予約データ

ID席種席1席2席3座席通番予約№予約者氏名予約者〒予約者住所注文取込日時納品書発行日時出荷完了日時etc...

何度かこのサイトで教えて頂いていますが、テーブルが「正規化」されていないから扱いにくいということですかね?例えば席関連のフィールドでいえば、T_指定席予約_席 のようなテーブルを作成して、そこに席関連だけのデータを格納しリレーションでつなぐ・・・といったことをしないといけないということですよね?     

14
驚天動地!前任者失踪丸 2024/04/25 (木) 10:25:20 23e8e@44ebd >> 13

どなたか分かりませんが、スタンプでは分かりませんので文章でお願い致します。

15

テーブルでの並び順を名前の昇順ということは、通常はあまりないことです。
主キーフィールド順にするか、並び替え用のフィールドを用意するのが普通の設計です。

#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

16
hiroton 2024/04/25 (木) 12:04:32 d4e23@f966d

イベント会場の指定席管理システム

にはどのようなデータが必要でしょうか?

これも、よくある受発注データベースサンプルなんかを参考にしたらいいと思いますよ
「席」という商品を「予約毎に受け付ける」という形なので

「T_指定席予約データ」という一つのテーブルで何とかしようとするのではなく、
予約テーブルと予約席明細テーブル2つに分けて登録するとうまく正規化できます