- ベストアンサー
ACCESS2つのテーブルの情報を表形式Fにしたい
中古車販売店です。 ・顧客テーブル・・お客様の情報 ・車両情報テーブル・・次回車検日と車名など 顧客IDでリレーションを設定しています。 車検を控えたお客さんにDM発送するため、 ダイアログボックスで指定した車検日(例:2011年3月)のお客さんを一覧表で表示したいと思っています。 いきなりフォームを作成しようとすると、どちらかがサブフォームという形になり、 思うような一覧表にできません。 表形式で、1名が1行に表示されるようなフォームを作成したいと考えています。 手順・方法をご教授ください。 よろしくお願いいたします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
No6の追加です。 フォームのレコードソースはフォームを 開くときだけでなく、ボタンクリックなどで 変更できます。 たとえば、 Private Sub コマンド1_Click() Me.RecordSource = "Q期間限定" Me.Requery End Sub このようにも、できます。
その他の回答 (8)
- piroin654
- ベストアンサー率75% (692/917)
>DoCmd.OpenQueryを記述するとデータシートビュー >でクエリが開いてしまいます。この結果をフォーム >で表示したいのですが、どのタイミングで何をさせ >れば良いですか? クエリの実行して得られるデータを別の言い方を すると、結果セットと言うこともあります。 テーブルは実体としてHDDに記憶されていますが、 選択クエリのようなものの実行結果は、メモリに 一時的に保管されます。Accessではこのクエリの データをテーブルとほぼ同様の扱いができます。 したがって、 >期間の設定を、2011/01/01~2011/01/31という >ふうに、クエリの中でBetweenを使用しました。 のように設定したクエリをフォームに表示 したい、ということであれば、フォームを 開くときに、 フォームのレコードソースを設定したクエリに 置き換えれば、いいのです。 設定したクエリの名前を、「Q期間設定」 という名前にします。フォームを開くときの イベントで、 Private Sub Form_Open(Cancel As Integer) Me.RecordSource = "Q期間設定" End Sub これだけで、期間を設定したデータがフォームに 表示されます。 要するに、これだけのことです。 【付録として・・フォームのレコードソースについて】 フォームにレコードソースを設定する場合、 テーブルやクエリの名前で設定する方法と、 プロパティのレコードソースの右端を クリックして、クエリビルダを起動し、 そこに普通にクエリを作成するように 設定することもできます。設定し終わったら 保存せずに変更のみをOKとして閉じます。 つまり、クエリを設定したようなものなのですが、 実際にはSQL文を登録しただけで、 クエリが作成されたわけではありません。 したがって、フォームを開くたびに AccessでこのSQL文を解読してデータを かき集め、フォームに表示します。 クエリも実際にはSQL文ですから、Accessが これを解読してそのつどデータを取りまとめ ますが、Accessのシステムに事前に登録されている だけ、データが多い場合には表示速度が 速くなります。 ただ、フォームのレコードソースにSQL文を 設定したほうがいい場合はたくさんあります。 今回の質問でもフォームのレコードソースに SQL文を設定し、抽出条件にフォームの テキストボックスを指定して期間を挟み込んで データを抽出することも同様に、できます。 今回の回答ではFIlterを使う方法をとって 回答をしています。
- layy
- ベストアンサー率23% (292/1222)
クエリの抽出条件にフォームでの入力値を使うのは基本的な操作。再クエリを学習。 フォーム開く時、には書かない。いったん表示したがレコードソース結果が変わったから再度リフレッシュ表示しますイメージ。 再クエリはコード書かなくてもマクロにあります。 検索で一覧表示、 また検索する繰り返し、 1レコード選び単票、 印刷押してレポート、 典型的な処理方法をまず覚える。 コード記載はまだ早いのでは?。
お礼
再度、ご回答ありがとうございます!そう・・典型的な処理方法が頭に入ってません(><) VBAは、エクセルで結構使っていたので同じ感覚でやろうとすると・・??ACCESSの勉強不足です。がんばります。おかげさまで、ひとつの処理でも色々な方法を知ることができ、大変助かっています。無謀にも今回はかなり複雑な設計をしているので先はまだまだ長く・・また質問してしまうと思います。ぜひ、よろしくお願いしますm(__)m
- layy
- ベストアンサー率23% (292/1222)
クエリ、まずはこれを学習。 テーブルの内容をフォームに、でなくクエリの内容をフォームに。 フォームの抽出条件によって制御出来る。 すべての項目がクエリ結果で1つに揃えばいろいろな場面で使える。
補足
いつも、ありがとうございます。とても参考になります!クエリを作成してみました!今回、期間の設定を、2011/01/01~2011/01/31というふうに、クエリの中でBetweenを使用しました。期間指定専用の入力フォームで期間を設定すると見事!!・・なのですが、結果一覧フォームを開く時にDoCmd.OpenQueryを記述するとデータシートビューでクエリが開いてしまいます。この結果をフォームで表示したいのですが、どのタイミングで何をさせれば良いですか?
- piroin654
- ベストアンサー率75% (692/917)
すみません。訂正です。No4の 【ついで、と言っては何ですが・・こちらが主かも】 の項で、 >Private Sub cmd検索_Click() となっていますが、正しくは、 Private Sub cmd期間検索_Click() です。
- piroin654
- ベストアンサー率75% (692/917)
No3です。 No3について、補足と修正をします。 (1) (2)の車両情報テーブルについて 次回車検日 はフィールドの型が日付/時刻型 という設定にしています。 (2)cmd検索のクリック時のイベントの修正 テキストボックスに期日が入力されていない 場合や、入力した期日が日付として確認 できるかを判定する処理をいれます。 Private Sub cmd検索_Click() 'テキストボックスにデータが入っているいる場合 If Not IsNull(Me!tx車検日) Then 'データが日付である場合 If IsDate(Me!tx車検日) Then Me.Filter = "次回車検日=#" & Me!tx車検日 & "#" Me.FilterOn = True End If End If End Sub 【ついで、と言っては何ですが・・こちらが主かも】 No6での最後に述べて任意の期間のデータの抽出 について、方法を述べます。質問で、車検日(例:2011年3月) とあったので一定の期間抽出が必要みたいなので、 二つの期日の間のデータの抽出の方法です。 なお、コードの中で、 Me.Filter = "次回車検日=#1000/01/01#" というのがありますが、これはあり得ない 日付を設定してデータの表示を無くしています。 データが日付でなかったり、入力の 条件をみたしていない場合に表示を ご破算にする方法の一つです。 (1) 二つの期日の間のデータの抽出 No6のフォームにテキストボックス二つとボタンを設定します。 テキストボックス 名前 tx期日A 名前 tx期日B ボタン 名前 cmd期間検索 Private Sub cmd検索_Click() 'テキストボックスにデータが入っているいる場合 If Not IsNull(Me!tx期日A) Then 'データが日付である場合 If IsDate(Me!tx期日A) = True Then If Not IsNull(Me!tx期日B) Then If IsDate(Me!tx期日B) = True Then Me.Filter = "次回車検日 Between #" & Me!tx期日A & "# AND #" & Me!tx期日B & "#" Me.FilterOn = True Else Me.Filter = "次回車検日=#1000/01/01#" Me.FilterOn = True End If Else Me.Filter = "次回車検日=#" & Me!tx期日A & "#" Me.FilterOn = True End If End If Else Me.Filter = "次回車検日=#1000/01/01#" Me.FilterOn = True End If End Sub tx期日Aとtx期日Bに入力した期日の間のデータを表示。 tx期日Aのみ入力したときは、入力した当日のデータの表示。 tx期日Aにデータが無いときは表示しない。 (2) フォームオープン時 フォームを開くときはデータを表示しない ようにしておきます。 Private Sub Form_Open(Cancel As Integer) Me.Filter = "次回車検日=#1000/01/01#" Me.FilterOn = True End Sub
お礼
バッチリできました!!時間がかかり・・すみません。。 条件入力専用フォームを作ることばかりが頭から離れず・・一覧表の中にテキストボックスを配置してしまうということに気が付きませんでしたぁ。。。とてもご丁寧な回答で大変わかりやすく、とっても参考になります。ありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
作成手順の説明の前に、テーブルの設定を 以下のフィールドで確認しておきます。 なお、車両情報テーブルの顧客IDは主キー とはしていません。なぜならば、当然ながら 顧客によっては、2台、3台、あるいは 法人顧客ならば数十単位の車の登録が あるだろうということを想定しています。 (1)顧客テーブル 顧客ID(主キー) 顧客名 (2)車両情報テーブル 顧客ID 次回車検日 車名 【作成手順】 (1) クエリの作成 上記の二つのテーブルでクエリQ情報を作成します。 このクエリで表示する顧客IDは車両情報テーブル の顧客IDであることに気をつけておいてください。 Q情報 SELECT 車両情報テーブル.顧客ID, 顧客テーブル.名前, 車両情報テーブル.次回車検日, 車両情報テーブル.車名 FROM 顧客テーブル INNER JOIN 車両情報テーブル ON 顧客テーブル.顧客ID = 車両情報テーブル.顧客ID; (2)フォームの作成 フォームの新規作成を選択し、 「基になるテーブルまたはクエリの選択」で上記の クエリ「Q情報」を選択し、「オートフォーム表形式」を 選択し、OKとします。出来たフォームを適当な名前で 保存します。 (3)フォームの修正 (2)で出来たフォームをデザインビューで開き、詳細の上部に マウスのカーソルを当て、十字になったら、下の方に適度に 2~3cm押し下げます。ラベルも詳細の上部までまとめて 押し下げます。 (4)テキストボックスの設定 (3)で空いたところにテキストボックスを一つ置き、 名前を「tx車検日」とします。 なお、このtx車検日」に日付を入力する場合は、 2011/03/01の形式であると、しています。 (5)ボタンの設定 名前 cmd検索 標題 検索 のボタンを一つ、空いたところに設定します。 そのボタンのクリック時のイベントに以下を 設定します。 Private Sub cmd検索_Click() Me.Filter = "次回車検日=#" & Me!tx車検日 & "#" Me.FilterOn = True End Sub 以上で、フォームに指定したデータが表示されます。 なお、車検日の設定にはテキストボックスを二つ 用意して一定の期間を指定することもできます。 たとえば、2011/03/01~2010/03/31の期間の 対象データを取り出す、こともできます。 2011/03/01~2011/03/01にすれば同じ日だけが 取り出せます。 そのあたりはどうですか。
- nicotinism
- ベストアンサー率70% (1019/1452)
・顧客テーブル・・お客様の情報 ・車両情報テーブル・・次回車検日と車名など が1:1の関係にあるなら クエリで、両方のID 同士を結合し それを元にフォームを作成してください。 1:多 の関係なら、車両情報テーブルの内容をもっと詳しく 説明されたほうがよろしいかと? もう寝ます。
- layy
- ベストアンサー率23% (292/1222)
顧客テーブルと車両情報テーブルが1つのテーブルになったもの、 顧客車両情報テーブルは作ってませんか?。 それから、 顧客テーブルの顧客IDより、 該当する車両情報テーブルの1項目を取得できます。 DLOOKUP関数です。 顧客テーブルをレコードソースとしたフォームを作って、 非連結の項目「次回車検日」も用意、そこに=DLOOKUP関数で次回車検日取得し表示 (DLOOKUPはクエリ上でも良いです。) レポート(DM)にも出すならクエリ、かと。
お礼
一発で単純解決です。単純なことのはず・・と思いつつ、何冊も本を見て、ネットで散々検索して・・なかなか思うものが見つからない。。おかげさまで、あきらめかけていた設計も、がんばって最後まで作りあげるぞ!って気合いが入りました!今回は、中古車販売店で使用するプログラムを作っていて、すべての機能(請求書や整備履歴の登録、車販売履歴や顧客管理、売掛金管理など)をすべて盛り込むつもりでいます。まだまだ先は長いですが、がんばって仕上げます!何度も質問してしまうと思います。また、見かけられましたら、どうぞよろしくお願いいたします。