- 締切済み
Access 別フィールドのフリガナでソートした結果表示
まだAccess初心者です。単純な質問かもしれませんがお許しください。 WindowsXP, Access2003S SP2です フォームに表示してある名前のもつフリガナフィールドでソートしてその結果をテキストで以下のように並べたいのですがやりかたがわかりません。 ------フォーム------- A 佐藤 B 田中 C 今井 --------------------- (A,B,Cはコントロールソースで名前は集合ソースから選択するプルダウンです) それぞれ漢字の名前はフリガナフィールドを持っています。 ボタンを押したときに テキストとして 今井 C 佐藤 A 田中 B と出力したいのですが、、、 スミマセン、おわかりの方ご返答お願いします。 必要事項が抜けていたり質問の仕方がまずかったらスミマセン。 先輩方宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
閑話休題: テーブル設計は Simpleis best! <会員名簿> ID_________________長整数(主キー) フルガナ_________テキスト型 氏名______________テキスト型 <予約記録簿> ID_________________数値型(主キー) 日時______________日付/時刻型 治療台___________整数 予約時間帯_____整数 会員名簿_ID____長整数 およそ、リレーショナルデータベースのテーブルならば、これで十分。 およそ、リレーショナルデータベースのテーブルならば、これが当然。 もちろん、本来は、<予約記録簿>の主キーは[日時]+[治療台]の複合キー。 仮に、治療台が100台あって予約時間帯が48と細かに分かれているする。 そして、治療台も予約時間帯も度々変動するとしたらエクセル風の表では対応不能。 テーブルは、もっと、現実のデータの表現形式を捨象し抽象的でシンプルであるべき。 上述の設計で十分、当然という理由。 <予約記録簿> ID__日時_____________治療台_____予約時間帯___会員名簿_ID 01__2007/10/23___ブルー席_______________11__佐藤 02__2007/10/23___ピンク席________________12__田中 03__2007/10/23___グリーン席_____________13__今井 さて、当然にデータの登録はこのようになる。 たしかに、エクセル風に作表されていないので判り難いと言えば判り難い。 それは、テーブルの役目はデータの格納だから当然。 見せるのはフォームとかレポートに任せればよい。 <予約状況クロス集計クエリ> 治療台________10_____11________12_______13_______ ブルー席_____[_______][佐藤___][________][_________] ピンク席______[_______][_________][田中__][_________] グリーン席___[_______][_________][________][今井___] 例えば、上述の<予約記録簿>はクロス集計クエリを利用するとエクセル風に変身する。 予約時間帯___治療台_______フリガナ___氏名 13_______________グリーン席__イマイ______今井 11_______________ブルー席____サトウ______佐藤 12_______________ピンク席_____タナカ______田中 SELECT 予約記録簿.予約時間帯, 予約記録簿.治療台, 会員名簿.フリガナ, 会員名簿.氏名 FROM 会員名簿 INNER JOIN 予約記録簿 ON 会員名簿.ID=予約記録簿.会員名簿_ID ORDER BY 会員名簿.フリガナ; このようにシンプルな設計のテーブルならば UNION とかを利用しなくても通常のクエリでOK。
先ず、真っ先にゴールに辿り付けるか否かを確認しておきます。 ゴールに辿り付けそうにもないテーブル設計で先に進んでも意味ないですからね。 <クエリ2の表示> 予約時間__フリガナ__氏名____治療台 13時________イマイ_____今井___1 12時________イマイ_____今井___1 13時________サトウ_____佐藤___2 10時________サトウ_____佐藤___1 12時________タナカ_____田中___3 11時________タナカ_____田中___3 11時________タナカ_____田中___1 10時________タナカ_____田中___2 治療台が1,2,3で表示されているのは別に問題ないです。 この<クエリ2>がゴールです。 SELECT * FROM クエリ1 ORDER BY フリガナ; このクエリ2は、このように簡単な通常のクエリです。 こういう簡略化を実現するためにクエリ1を予め作成しています。 <クエリ1の表示> 予約時間__治療台__氏名___フリガナ 10時________1_________佐藤___サトウ 10時________2_________田中___タナカ 11時________1_________田中___タナカ 11時________3_________田中___タナカ 12時________1_________今井___イマイ 12時________3_________田中___タナカ 13時________1_________今井___イマイ 13時________2_________佐藤___サトウ SELECT "10時" As 予約時間, 予約記録簿.治療台, 会員名簿.氏名, 会員名簿.フリガナ FROM 会員名簿 INNER JOIN 予約記録簿 ON 会員名簿.ID=予約記録簿.10時予約者 WHERE 日時=#2007/10/23#; UNION SELECT "11時" As 予約時間,予約記録簿.治療台, 会員名簿.氏名, 会員名簿.フリガナ FROM 会員名簿 INNER JOIN 予約記録簿 ON 会員名簿.ID=予約記録簿.11時予約者 WHERE 日時=#2007/10/23#; UNION SELECT "12時" As 予約時間,予約記録簿.治療台, 会員名簿.氏名, 会員名簿.フリガナ FROM 会員名簿 INNER JOIN 予約記録簿 ON 会員名簿.ID=予約記録簿.12時予約者 WHERE 日時=#2007/10/23#; UNION SELECT "13時" As 予約時間,予約記録簿.治療台, 会員名簿.氏名, 会員名簿.フリガナ FROM 会員名簿 INNER JOIN 予約記録簿 ON 会員名簿.ID=予約記録簿.13時予約者 WHERE 日時=#2007/10/23#; 問題なのは、クエリ1はクエリのデザインモードではサポートされていないことです。 ですから、SQLビューで自分で書かねばならないということ。 <会員名簿> ID___フリガナ___氏名 1___サトウ_______佐藤 2___タナカ_______田中 <予約記録簿> ID__日時___________治療台______10時予約者___11時予約者___12時予約者___13時予約者 1___2007/10/23_ブルー席____佐藤_____________田中_____________今井_____________今井 2___2007/10/23_ピンク席_____ 3___2007/10/23_グリーン席__ <予約記録簿> ID_________________長整数 日時______________日付・時間 治療台___________テキスト1文字(or バイト) 10時予約者____長整数 11時予約者____長整数 12時予約者____長整数 13時予約者____長整数 ************* 確認 ************* さて、ゴールに付けるのが判りましたので中途の作業に着手すればいい訳ですが・・・ <予約記録簿> ID_________________長整数 日時______________日付・時間 治療台___________テキスト1文字(or バイト) 予約時間帯_____整数 会員名簿_ID____長整数 というテーブル設計も考えられます。 この場合、入力はシンプルです。 ただ、先のサブフォームみたいに整形してユーザに予約一覧の体裁で見せる工夫が必要です。 どろらかと言うと、こちらがAccess風と言えます。 さて、どうしますか? Access風ならば、話は、振り出しに戻ります。
補足: ANo3のようなデータを 木村 ブルー▲12時 熊谷 ピンク▲11時 佐藤 グリーン▲14時 田中 ブルー▲10時 渡辺 グリーン▲10時 と並べるには、UNION クエリを利用することになるかと思います。 まだ、テストしていませんが、多分、いけるんじゃないですか? 少し、最終的なゴールも示唆しておきます。 最初の回答にUNION クエリを用いて書いたSQL文をセットすればOKというのが私の見通しです。 もちろん、そのクエリを元にレポートを作成しても構いません。
先ず、<予約簿入力フォーム>をどうするかでしょう。 例えば、エクセル風ですが、次のようなのが考えられます。 予約簿入力フォーム: ID: [_________1] 日時: [2007/10/23] ==[予約簿明細]============================ <席名>______<10時>___<11時>___<12時>___<13時> [__ブルー席][佐藤____][佐藤____][佐藤____][佐藤____] [___ピンク席][佐藤____][佐藤____][佐藤____][佐藤____] [グリーン席][佐藤____][佐藤____][佐藤____][佐藤____] ========================================= これは、実際にAccessで作成したフォームの写しです。 メインフォームとサブフォームの組み合わせです。 これですと、レコード移動釦で昨日の予約状況も見れます。 このフォーム体裁で問題がなければ、次のステップへ・・・。 まあ、一つひとつ確認しなきゃダメでしょう。 そうでなきゃー、最後まで到達しないですよ。
お礼
はい。問題ありません! ありがたいです。続き待ちます。お忙しければ明日以降でも結構です(^^ゞ ヨロシクお願いします。
Q、これはそう簡単に実現できないでしょうか? A、簡単にはいかないでしょう。 フォームをザッと眺めるということですよね。 そうして、データを配列に取り込むことに。 さて、問題は、その配列をソートすればいい訳ですが、その前にフルガナも配列に。 その後は、バブルソートででも並び替えて配列からテキスト行を生成し出力。 これは、簡単にはいかないでしょう。 担当部署、担当者_ID しかし、このようなテーブルの入力フォームにすれば、上述のようなヤヤコシイ手続きは不要。 SQL文は全く異なりますが、基本は先の回答の通りです。 ところで、データベースの入力フォームならば、必ず、かような記録をする筈じゃないですか? フォームデータを記録するよりもテーブルをテキスト出力する方が簡単です。 なぜなら、SQL言語ってもんがサポートされている訳ですから・・・。
お礼
ご回答ありがとうございます!! 私の勉強不足で文章の途中から少しわからなくなってしまいました。スミマセン。 先ほどコックさんとかレジ係などたとえのつもりで書いて余計混乱させてしまったかもしれませんが、以下のような質問だったとしても同じ事でしょうか??しつこくてスミマセン(T_T) 3つの治療台がある歯医者の予約スケジュール管理のAccessDBを作成しております。 ブルー席 ピンク席 グリーン席 という三つの部屋に既に会員登録されている50人の人たちが予約をしていきます。 10時 11時 12時 13時 ブルー席 ピンク席 グリーン席 会員名簿 ID フリガナ 氏名 1_______サトウ_____佐藤 2_______タナカ_____田中 3_______イマイ_____今井 4_______ワタナベ___渡辺 5_______クマガイ___熊谷 6_______オイカワ___及川 7_______キムラ_____木村 ・ ・ ・ ・ ・ 予約が入って以下のようになりました。 10時 11時 12時 13時 ブルー席 田中 木村 ピンク席 熊谷 グリーン席 渡辺 佐藤 カルテを探したいのですが、カルテはフリガナ五十音順になっていますので、上の例ですと 木村 ブルー▲12時 熊谷 ピンク▲11時 佐藤 グリーン▲14時 田中 ブルー▲10時 渡辺 グリーン▲10時 というテキスト(でなくてもなんでもいいのですが、プリントアウトをしたい)を出力したいわけです。 プルダウンにはそれに対応した名前を付けてあるのでcmbBoxの名前から取得なども考えたりしましたがうまく行きません・・・ 10時 11時 12時 13時 ブルー席 b10 b11 b12 b13 ピンク席 p10 p11 p12 p13 グリーン席 g10 g11 p12 p13 ながなが説明してすみません。 実現したいことはわかって頂けたかと思いますが、これをAccessで実現は難しいですか?? 再度の質問で恐縮です・・・(^_^;)
tab1: ID__区分__氏名___フリガナ 1___A_______佐藤___サトウ 2___B_______田中___タナカ 3___C_______今井___イマイ C:\Temp\Test.txt 今井 C 佐藤 A 田中 B このように出力すには、次のようなコードを書いたらいいです。 Private Sub コマンド_フリガナ昇順でテキスト出力_Click() Dim isOK As Boolean isOK = FileWrite("C:\Temp\Text.txt", DBSelect("SELECT 氏名, 区分 FROM tab1 ORDER BY フリガナ", " ")) If isOK Then MsgBox "テキスト出力に成功しました" End If End Sub 問題は、DBSelect関数に記述する SQL文が書けるか否かです。 これをクリアできるのならば、まあ、極端に言えば1行でもOK。 FileWrite "C:\Temp\Text.txt", DBSelect("SELECT 氏名, 区分 FROM tab1 ORDER BY フリガナ", " ") 出力するデータを区切るコードは、DBSelect関数の2つ目の引数で指定します。 さて、こういう書き方でOKであれば、FileWrite関数とDBSelect関数を補足します。
お礼
すごいっす!ありがとうございます!本当にここにいらっしゃる方はすごいです! でも、一つ私の説明不足がありまして・・・ 区分のA,B,Cはその氏名に属すものではなくて、コントロールソースの属性(?)です。 たとえば、 レジ係 コック ウェイター みたいなもので、レジ係は佐藤さんにしよう、コックさんは田中さんにしよう、ウェイターは今井さんにしようとプルダウンで選択したあと、ボタンを押すと、フリガナでソートしたいのです・・・ 今井 ウェイター 佐藤 レジ係 田中 コック これはそう簡単に実現できないでしょうか? 以下のような設定を自分でしませんでスミマセン。やはりmdbでもアップしないとご回答は難しいでしょうか??? tab1: ID__区分__氏名___フリガナ 1___A_______佐藤___サトウ 2___B_______田中___タナカ 3___C_______今井___イマイ
お礼
ご回答ありがとうございます!!私のDB知識からだいぶ上に行っているようで難しいところもありますが、ちょっと試してみたいと思います。 考え方が天才ですねー(^_^ 本日試して明日コメントとなりますが、お付き合いいただけますか? 少々お待ちください。