• ベストアンサー

ACCESS2つのテーブルの情報を表形式Fにしたい

中古車販売店です。 ・顧客テーブル・・お客様の情報 ・車両情報テーブル・・次回車検日と車名など 顧客IDでリレーションを設定しています。 車検を控えたお客さんにDM発送するため、 ダイアログボックスで指定した車検日(例:2011年3月)のお客さんを一覧表で表示したいと思っています。 いきなりフォームを作成しようとすると、どちらかがサブフォームという形になり、 思うような一覧表にできません。 表形式で、1名が1行に表示されるようなフォームを作成したいと考えています。 手順・方法をご教授ください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

No6の追加です。 フォームのレコードソースはフォームを 開くときだけでなく、ボタンクリックなどで 変更できます。 たとえば、 Private Sub コマンド1_Click() Me.RecordSource = "Q期間限定" Me.Requery End Sub このようにも、できます。

saraichi
質問者

お礼

一発で単純解決です。単純なことのはず・・と思いつつ、何冊も本を見て、ネットで散々検索して・・なかなか思うものが見つからない。。おかげさまで、あきらめかけていた設計も、がんばって最後まで作りあげるぞ!って気合いが入りました!今回は、中古車販売店で使用するプログラムを作っていて、すべての機能(請求書や整備履歴の登録、車販売履歴や顧客管理、売掛金管理など)をすべて盛り込むつもりでいます。まだまだ先は長いですが、がんばって仕上げます!何度も質問してしまうと思います。また、見かけられましたら、どうぞよろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.8

>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)
回答No.7

クエリの抽出条件にフォームでの入力値を使うのは基本的な操作。再クエリを学習。 フォーム開く時、には書かない。いったん表示したがレコードソース結果が変わったから再度リフレッシュ表示しますイメージ。 再クエリはコード書かなくてもマクロにあります。 検索で一覧表示、 また検索する繰り返し、 1レコード選び単票、 印刷押してレポート、 典型的な処理方法をまず覚える。 コード記載はまだ早いのでは?。

saraichi
質問者

お礼

再度、ご回答ありがとうございます!そう・・典型的な処理方法が頭に入ってません(><) VBAは、エクセルで結構使っていたので同じ感覚でやろうとすると・・??ACCESSの勉強不足です。がんばります。おかげさまで、ひとつの処理でも色々な方法を知ることができ、大変助かっています。無謀にも今回はかなり複雑な設計をしているので先はまだまだ長く・・また質問してしまうと思います。ぜひ、よろしくお願いしますm(__)m

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.6

クエリ、まずはこれを学習。 テーブルの内容をフォームに、でなくクエリの内容をフォームに。 フォームの抽出条件によって制御出来る。 すべての項目がクエリ結果で1つに揃えばいろいろな場面で使える。

saraichi
質問者

補足

いつも、ありがとうございます。とても参考になります!クエリを作成してみました!今回、期間の設定を、2011/01/01~2011/01/31というふうに、クエリの中でBetweenを使用しました。期間指定専用の入力フォームで期間を設定すると見事!!・・なのですが、結果一覧フォームを開く時にDoCmd.OpenQueryを記述するとデータシートビューでクエリが開いてしまいます。この結果をフォームで表示したいのですが、どのタイミングで何をさせれば良いですか?

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

すみません。訂正です。No4の 【ついで、と言っては何ですが・・こちらが主かも】 の項で、 >Private Sub cmd検索_Click() となっていますが、正しくは、 Private Sub cmd期間検索_Click() です。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

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

saraichi
質問者

お礼

バッチリできました!!時間がかかり・・すみません。。 条件入力専用フォームを作ることばかりが頭から離れず・・一覧表の中にテキストボックスを配置してしまうということに気が付きませんでしたぁ。。。とてもご丁寧な回答で大変わかりやすく、とっても参考になります。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

作成手順の説明の前に、テーブルの設定を 以下のフィールドで確認しておきます。 なお、車両情報テーブルの顧客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)
回答No.2

・顧客テーブル・・お客様の情報 ・車両情報テーブル・・次回車検日と車名など が1:1の関係にあるなら クエリで、両方のID 同士を結合し それを元にフォームを作成してください。 1:多 の関係なら、車両情報テーブルの内容をもっと詳しく 説明されたほうがよろしいかと? もう寝ます。

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

顧客テーブルと車両情報テーブルが1つのテーブルになったもの、 顧客車両情報テーブルは作ってませんか?。 それから、 顧客テーブルの顧客IDより、 該当する車両情報テーブルの1項目を取得できます。 DLOOKUP関数です。 顧客テーブルをレコードソースとしたフォームを作って、 非連結の項目「次回車検日」も用意、そこに=DLOOKUP関数で次回車検日取得し表示 (DLOOKUPはクエリ上でも良いです。) レポート(DM)にも出すならクエリ、かと。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Access2000フォームにリレーションしたテーブル内容を入れたい

    Access2000フォームにリレーションしたテーブル内容を入れたい Access2000を利用していますが、フォームにリレーションしたテーブル内容を表示したいです。 具体的には 顧客情報テーブルのフォームに履歴テーブルの情報や、入金テーブルなどを表示したいです。 サブシートでは見づらく入力ミスとかが発生してしまうので・・ よろしくお願いします。

  • Access フォームのデータがテーブルに反映されない

    こんにちは。 現在、アクセスを使って簡単なデータベースを 作っていたのですが、ひとつわからないことがございます。 テーブルを二つリレーションを組んで、 フォームを作ったのですが、 うまく二つのテーブルにデータが 保存できません。 フォーム:顧客ID、名前、電話番号 サブフォーム:商品ID、商品名、納期、など。。。 こういった二つのテーブルで、サブフォームの方のテーブルに 顧客のデータも保存したいんですが、できるものなのでしょうか? 初心者でわかりづらくて、 大変申し訳ございませんが、よろしくお願い致します。

  • Accessについて教えて下さい。

    Access初心者です。 フォームのクリック時のイベントで開いた別のフォームを、サブフォームのリンクフィールドように、リレーションの項目を入力しなくてもテーブルに反映させるにはどうしたらいいのでしょうか? 今現在の状況は テーブルは顧客リスト、送付物、問合せがあり顧客IDでリレーションになっています。フォームはそれぞれ作りました。 メインフォームは顧客フォームで問合せのサブフォームが組み込まれています。送付物フォームはボタンでクリック時開くようマクロで作成しました。where条件は[顧客ID]=[Forms]![顧客リスト]![顧客ID]となっています。 例えば手紙を送ることになり、顧客フォームで該当者を選択→ボタンをクリックし送付物フォームを開く →顧客IDを入力→その他必要事項を入力というかんじです。 顧客IDを入力しないと『フィールド顧客IDとキーが一致しているレコードをテーブル顧客リストで探すことはできません』とエラーになります。 問合せのサブフォームは顧客IDでリンクフィールドとなっています。 ID表示が必要ないので顧客IDは消してあります。 こちらは顧客フォームで該当者を選択し、顧客IDを選択しなくても入力すると問合せテーブルに顧客IDも反映されています。 問合せのように送付物にも顧客IDを選択しなくても反映させるようにするにはどうしたらよいでしょうか? 説明がわかりづらいとは思いますが、お分かりになる方よろしくお願い致します。

  • ACCESS テーブルの扱い方

    環境: WINDOWS XP PRO ACCESS 2000 Oracle 9i [現状] フォームの作成時にて、「サブフォーム/サブレポート」を使ってOracleで作成したデータシート形式の(購入履歴)テーブルを表示しています。 [質問内容] 購入履歴テーブルには次のような情報が入っているのですが、 特定の顧客コードの購入履歴のみを動的に変化させて表示させる事は可能でしょうか? (動的にとは、フォーム側(プログラム側)で入力した顧客コードに対応した購入履歴を表示させるという意味で使用しています。) 宜しくお願い致します。 [購入履歴テーブル] 顧客コード 商品名 購入日付 ━━━━━━━━━━━━━━ 00001   みかん  01/11/11 00001   リンゴ  01/12/22 00002   バナナ  01/08/24 00003   リンゴ  01/09/09 ・ ・ ・

  • Accessのチェックボックスでチェックしたデータのみ更新するには。

     Access2000で顧客管理のDBを作っています。年齢などの条件をフォームから入力し、抽出結果をレポートで出力しています。この度、顧客情報のテーブルに「最終DM発送日」というフィールドを追加したいと考えています。  顧客の抽出は主に、DM発送の顧客の絞込みのため行っています。抽出した顧客一覧をフォームで表示し、顧客毎にチェックボックスを設け、実際DMを送ったかどうかのチェックを行いたいのです。が、チェックボックスで得た結果の使い方がよくわかりません。どのように、テーブルに反映したらよいのでしょうか?  どうかよろしくお願い致します。

  • テーブルをひとつにまとめられる?[ACCESS2000]

    各取引先への請求書をアクセスで作成しております。 これまではエクセルで作成しておりました。 エクセルのファイルの様子を書きますと、 1.シートで月ごとにわけています。 2.1行に1社の明細と請求額を記録します。 3.シートをクリックするだけで過去の請求も見られます。 4.取り引き先は月ごとに多少変動します。 上記のことをアクセスひとつでやりたいのです。 もっとも困っている点は、アクセスでシートのようなことができない感じがしていることです。できるはずですが・・・。私の感覚ではテーブルを月数分作らなきゃいけない感じがしています。 現在、アクセスで作成できているのは、 親フォームには、顧客が記載され、子フォームに1レコード=1月で各月の請求額と明細が記載されています。 でも、これだとエクセルのように一覧で見られないのです。 顧客テーブルと請求書テーブルを作り、リレーションでつなぐと、過去の請求額がレコードでわかれません。 それが一覧したり、クリックひとつで月移動できない原因のようです。 うまく文章で伝えられず申し訳ありませんが、別と補足致します。ご教授よろしくお願いします。

  • Access97:サブフォームを切り替え表示したい

    アクセスで仕事で用いられる専門用語の和英辞書データベースを作っております。 その辞書は用語の持つ意味や使われ方などから分類をしています。 分類一覧テーブルは分類ID,分類からなり、用語一覧テーブルは用語IDと用語からなります。 これらをつなぐのが和英辞書テーブルで、辞書ID,分類ID,用語IDからなり、 分類ID,用語IDはそれぞれ分類一覧テーブル,用語一覧テーブルのそれとリレーションシップを 組んでいます。 メインフォーム(既定のビュー=単票フォーム)には分類フィールドを作り、コンボボックスにします。 分類を選択したときまたはその横に「表示」ボタンを設置しておいてそのボタンをクリックしたときに 選択された分類に属する用語一覧がサブフォーム(既定のビュー=帳票フォーム)にリロードされてるように切り替えて表示させたいと考えています。 メインフォーム元:分類一覧テーブル,サブフォーム元:用語一覧テーブルにしたフォームは作成できました。 メインフォームのレコードを切りかえるとサブフォームも切り替わりますが、 コンボボックスの選択でサブフォームを切りかえ(たように見せ)る上記のようなフォームに このフォームから編集することはできるでしょうか? 無理なら新規にフォームを作りなおすとしてできるでしょうか? 自分の発想で2通りやってみましたが、いずれも失敗でした。 (詳しく書いたら文字数が800を超えたので省略します) テーブルの構成やリレーションを多少変えてもいいしフォームのレコードソースにクエリービルダを使ったりVBを組んでもいいので、メインフォームのコンボボックスの選択値によってサブフォームの表示を切り替える方法について教えて下さい。

  • Accessで表をRequeryすると…

    こんにちは。 Accessでサブフォームを持っているフォームがあり、サブフォーム側では Aというテーブルがレコードソースになっていて帳票形式で表示しています。 メインフォームで単票形式で表示してます。 サブフォームで表示された表の中から1レコードを選ぶと、メインのフォーム にコピーし編集が出来るようにしています。 そしてメインフォームで変更された内容をAテーブルに書き出し、サブフォーム の内容も最新の内容に書き換わっている、という事をしているのですが、 サブフォームをRequeryすると、表示順序やレコードセレクタの位置が変わって しまうのです。 サブフォームを、レコードを選択した時の位置のままで、内容は最新の状態で 表示できるようにするにはどうしたらいいのでしょうか? よろしくお願いします。

  • アクセスでサブフォーム使って一覧表示をしたい。

    タイトルの通りなのですが、1つのフォームにメイン画面があります。そこには取引先の基本データ(会社名、住所、電話番号等)がきて、サブフォームには、そこの取引先との案件情報が来るように表示したいのです。発注者番号でリレーションを結んでいます。サブフォームには案件情報と社内での管理表との2つのテーブルをクエリで1つにしたものをフォームで表示しています。○○(株)との案件が10個とかになると、サブフォームで10件の内容が上下のスクロールによって表示されるようにしたいのです。説明下手でしたら補足します。すみません。よろしくお願いします。

  • access フォーム間で情報が引き継がれない

    初心者です、よろしくお願いします。 仕様環境 WinXP Access2002 請求管理のシステムを作っています。 テーブルには 顧客マスタ(主キーは顧客番号でテキスト型 例:0001等) 請求マスタ(主キーは請求番号でテキスト型 例:A0001等) 明細マスタ(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客マスタ(1)→(多)請求マスタ(1)→(多)明細マスタになっています。 顧客マスタを元にしたフォーム(顧客入力フォーム)に顧客情報を入れて、 「請求書作成ボタン」を作り、そのボタンを押すと別のフォーム(請求書作成フォーム)に 飛ぶようにしているのですが、その際に顧客入力フォームに入力した情報を 引っ張っていくようにしたいのですが、うまくいきません。 ちなみに顧客マスタと請求マスタのリレーションは”顧客番号”でつなげています。 請求書作成フォームは請求書作成クエリから成り、 その中で顧客番号(テーブル:顧客マスタ)の抽出条件に[Forms]![顧客入力フォーム]![顧客番号]と 入れて”顧客番号つながり”で飛ぶようにしているのですが、 請求書作成フォームは開くのですけど、項目はすべて空白です。 またいろいろレコードを追加している内に、請求番号が既にあるものに対しては顧客情報も引き継がれることが判明しました。 構文が間違っているのでしょうか? 混乱しています、お助けください。

このQ&Aのポイント
  • Windows10のパソコンであらかじめ指定した複数のフォルダを自動的に作成する方法について教えてください。
  • また、特定のフォルダ内にさらに子フォルダを作成する方法も知りたいです。
  • 既存の方法ではうまくフォルダが作成できないので、他の手段があれば教えてください。
回答を見る