- ベストアンサー
複数の誕生日の検索で
現在「誕生日検索」というフォームがあり、そこのテキストボックス0に入力された日付をコマンドボタンを押すとクエリが開いて該当するものを表示させるようにしてます。 ここで、クエリで検索する項目が一つの場合はうまく抽出することができるのですが、2つ以上の項目を該当させたい場合はどのようにしたらよいのでしょうか? 具体的には複数ある世帯の「父の誕生日」「母の誕生日」「息子の誕生日」「娘の誕生日」という項目があり、フォームから検索したいのは全世帯の中で「2008/07」に誕生日の人を抽出するというものです。 検索する項目が一つのときは Like [Forms]![誕生日検索]![テキスト0] & "/*" でできるとここで教えていただいたのですが、複数の項目になった場合にはこれをコピペするとかえって動作しなくなってしまいました。 どうぞよろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.3,4です。 > 住所が一致した場合に同じ世帯とみなすようにしようと考えております。 同じ世帯かどうかは、『世帯ID』で判定するのがよいと思います。 (単身赴任や学生の下宿先などであれば、別途『個人』テーブルに記録してもいいかと思いますが、 通常の『住所』は世帯に付随するはずなので、『世帯』テーブルに記録します) 「『世帯ID』の数字では、データを見た人には何のことだかわからない」と心配されているのかも しれませんが、それについては『世帯ID』を『コンボボックス』で表示させることで解決できます。 また、コンボボックスにすることで、 > 世帯テーブルの世帯IDを覚えておいて個人テーブルを作成する といった手間も省くことができます。 ※『世帯』テーブルの検索結果から、代入する値を選択するポップアップフォームを作成する、 という手段もありますが、説明がかなり長くなるので紹介のみに留めさせていただきます。 (マクロまたはVBAが必須) 『個人』テーブルの『世帯ID』をコンボボックスで表示させる方法は以下の通りです: A)『世帯』テーブルの『苗字』の並び順を決めるクエリの作成: 1)データベースウィンドウで『クエリ』を選択し、画面上方にある『新規作成(N)』をクリック 2)『新しいクエリ』ダイアログが開くので、「デザイン ビュー」を選択して『OK』をクリック 3)『テーブルの表示』ダイアログで『テーブル』タブから「世帯」を選択して『追加(A)』をクリック後、 『閉じる(C)』ボタンで閉じる 4)デザインビューの上半分に表示された『世帯』テーブルから、「苗字」をダブルクリックするか ドラッグ&ドロップして、『苗字』フィールドを下半分の領域に追加 5)同様にして、『住所』と『世帯ID』を下半分に追加(左から、苗字・住所・世帯IDの順にする) 6)『苗字』の『並び順』を「昇順」に設定 ※苗字のふりがなを記録した『苗字かな』のようなフィールドがあれば、そのフィールドも追加 して、これに並び順を設定した方が尚可(『表示』のチェックは外します) 7)クエリに『世帯Q』と名前をつけて保存して閉じる B)『個人』テーブルの『世帯ID』をコンボボックスに切り替える: 1)『個人』テーブルをデザインビューで開く 2)『世帯ID』をクリックしてフォーカスを移動 3)画面左下の表示部分を、『標準』タブから『ルックアップ』タブに切替 4)『表示コントロール』を「コンボボックス」に変更 5)設定項目が表示されるので、以下のように変更: ・値集合ソース=「世帯Q」 ・連結列=「3」 (→「3番目のフィールドの値をこのテーブルに記録」という意味) ・列数=「3」 ・列幅=「3cm;6cm;0cm」 (→コンボボックスのリストの表示時、「1,2,3番目のフィールドを、 それぞれ3cm,6cm,0cm幅で表示」という意味(「0cm」=非表示) ・リスト幅=「9.5cm」 *「自動」のままでも可(『列幅』の合計(3cm+6cm+0cm)よりも小さい場合、横スクロール用の スクロールバーが表示されるようになります) 6)テーブルを保存して閉じる ・・・以上です。 これで、『個人』テーブルをレコードソースとするフォームを作成する際に、フィールドリストから 『世帯ID』をドロップダウンすると、フォームでも自動的にコンボボックスで表示されるようになります。 (通常は苗字しか表示されませんが、コンボボックスの『▼』をクリックすると苗字と同時に住所も 表示されるので、どこの「佐藤」さんか判断できます) なお、既にテキストボックスで作成済みの場合は、そのテキストボックスを削除してから、改めて 『世帯ID』をドロップダウンするか、フォームのデザインビューでそのテキストボックスをクリックした後、 Accessのメニューで「書式(O)→コントロールの種類の変更(H)→コンボボックス(C)」を選択します。 (後者の場合はテーブルと同様の設定を行う必要がありますが・・・:プロパティシートの「書式」タブ で「列数」と「列幅」と「リスト幅」を、「データ」タブで「値集合ソース」と「連結列」をそれぞれ設定)
その他の回答 (4)
- DexMachina
- ベストアンサー率73% (1287/1744)
No.3です。 > 一つのテーブルになるべくたくさんの情報を入力してクエリで抽出する方法よりも > テーブルを複数設けてリレーションさせたほうがよろしいのでしょうか??? 同じ意味を持つ情報(今回のご質問の例では「誕生日」)は、1つのフィールドに収めるように した方がよいとされています。 (「データベース 正規化」等のキーワードでWebを検索すると、この辺りが詳しく説明されて います) とりあえず、今回のご質問の例に即して、簡単に説明してみます。 『世帯』テーブル 世帯ID (数値型・主キー) 姓 (テキスト型) 『個人』テーブル 個人ID (数値型・主キー) 氏名 (テキスト型) 世帯ID (数値型) 誕生日 (日付/時刻型) 続柄 (テキスト型) →これも『続柄』テーブルを作成して『続柄ID』を記録した方が○ 以上のようなテーブル構成にして、世帯IDでリレーションを設定します。 この形ですと、今回のご質問のように「2008/07」の誕生日の人がいる世帯を検索する場合、 以下のように、1箇所に「Like ~」を記述するだけですみます: ┌個人 ┐ |個人ID| ┌世帯 ┐ |氏名 | |世帯ID|―|世帯ID| |姓 | |誕生日| └―――┘ |続柄 | └―――┘ フィールド: 姓 誕生日 テーブル: 世帯 個人 並べ替え: 表示: レ レ 抽出条件: Like ~ または: 上記と前回の回答に記述したものを比較していただけば、よりシンプルになっていることが わかっていただけるかと思います。 また、このような構成にしておけば、テーブルに「父」「母」「長男」「次男」・・・といったフィールドを 用意しなくても、『続柄』だけで管理ができるため、空白の多いフィールドを無駄に作る必要も なくなります。 (但し、いろいろなクエリの組み方に慣れる必要があります: 例えば、上記では世帯の姓はわかりますが、上記のクエリで単純に「氏名」を追加しただけでは 「該当世帯の家族全員」は表示できないので、別のクエリと組み合わせる、などの操作が 必要になります) ですので、データベースを扱うのでしたら、上記のような構成にすることに少しずつでも慣れていく ようにした方が、今後のためになると思います。
お礼
ご回答ありがとうございます。 また、非常にわかりやすい説明、ありがとうございます。 今作成しているのは、一つのテーブルに住所、氏名、電話番号、生年月日などの個人情報を入力しています。 そしてやりたいこととしては、まずそのデータの中から今月誕生日の人を検索すること。 次にデータ自体は個人で入力してるので、世帯ごとにまとめた表を作ること、の2点です。 誕生日につきましては、とりあえず教えていただいた方法で検索するようにできたのですが、仰るとおり空白のフィールドが非常に多いのが気になってました。 世帯ごとに表を作るというのはこれからとりかかるところでして、住所が一致した場合に同じ世帯とみなすようにしようと考えております。 そうじゃないと同じ苗字の人がまとまってしまいますので・・・。 教えていただいたように設定するとなると、まず『世帯』テーブルに世帯IDと苗字を入力し、次に『個人』テーブルに詳細を入力するということになるのでしょうか? となると最初に入力した世帯テーブルの世帯IDを覚えておいて個人テーブルを作成するということになるのでしょうか??? ACCESSを勉強中の身で初歩的なことかもしれませんが、どうぞよろしくお願い致します
- DexMachina
- ベストアンサー率73% (1287/1744)
推測ですが、現在のクエリのデザインビューでは、以下のようにされているのではないでしょうか: フィールド: 父の誕生日 母の誕生日 息子の誕生日 娘の誕生日 テーブル: 家族テーブル 家族テーブル 家族テーブル 家族テーブル 並べ替え: 表示: レ レ レ レ 抽出条件: Like ~ Like ~ Like ~ Like ~ または: 上記の推測通りだとすると、現状では「And検索」(全ての条件を満たすものの抽出)になっています。 そのため、「動作しなくなって」(=該当レコードが表示されなくなって)しまったものと思います。 (父や母の誕生日が「2008/7」という家庭は、少なくとも日本にはないはずですので) >全世帯の中で「2008/07」に誕生日の人を抽出 というのが、『「2008/07」生まれの人が一人でもいる世帯の抽出』という意味でしたら、行うべきは 「Or検索」ということになりますので、クエリのデザインビューを以下のように編集してください: フィールド: 父の誕生日 母の誕生日 息子の誕生日 娘の誕生日 テーブル: 家族テーブル 家族テーブル 家族テーブル 家族テーブル 並べ替え: 表示: レ レ レ レ 抽出条件: Like ~ または: Like ~ Like ~ Like ~ ※本当は、「佐藤家」などの『世帯』を記録するテーブルと、「佐藤 太郎」などの『個人』を記録する テーブルは分けてやった上で、両者をリレーションさせてやった方が、データベースの運用としては 望ましいと思います。 (そうしてやれば、今回のような場合、「Like ~」は『個人』テーブルの『誕生日』1箇所への記述のみで 済むことにもなります)
お礼
どうもありがとうございます。 おかげさまでうまく動くようになりました。 ちなみに、一つのテーブルになるべくたくさんの情報を入力してクエリで抽出する方法よりもテーブルを複数設けてリレーションさせたほうがよろしいのでしょうか??? 参考までに教えてください。 よろしくお願いいたします。
誕生日のデータ型は何でしょうか? データがいくつあろうと検索条件が同じであればそのまま動くはずでが、、、 テキストボックスのデータにスペースが入っていたりしませんか?
お礼
ご回答ありがとうございます。 データはクエリで答えになってますでしょうか?^^; ちなみに上のDexMachinaさんの方法でうまく動きました。 どうもありがとうございました。
- shimix
- ベストアンサー率54% (865/1590)
#言語とデータベースを書いてください。 (一般的には)条件を複数書くときは「and」や「or」で繋ぎます。
お礼
あ、すみません。 使ってるのはACCESS2003なのですが答えになってますでしょうか???
お礼
ご回答ありがとうございます。 また、お返事が遅くなり大変申し訳ございませんでした。 色々と試していたのですがどうもうまくいかなくて・・・。 実際にはもう少し細かく条件を設定しておりまして、その関係からか世帯IDを作るのがうまくいっておりませんでした。