• ベストアンサー

複数のテーブルに対して・・・

過去に同様の質問があったかも知れませんが、Accessのバージョンがかなり古いので質問させて下さいね。 Access97(すみません、ホント古くて…)で、下のような顧客情報管理ファイルを作成しました。 テーブルA<→フォームA> ・顧客ID(主キー: テキスト型) ・氏名 ・情報A1, A2~ ・入力フォームB~への移動ボタン(同一IDレコードの表示) テーブルB<→フォームB> ・顧客ID(主キー: テキスト型) ・情報B1, B2~ テーブルC<→フォームC> ・顧客ID(主キー: テキスト型) ・情報C1, C2~ 最初からテーブルA~Cを結合したものを作ればよかったのですが、 それぞれのテーブルについて細かい入力項目が30~40個あるため、 分割して作成してしまいました(そして今後もテーブルは増える可能性大です)。 現在、テーブルAにだけ、20人分のデータが入っています。 今後も顧客数やテーブルが増える予定なのですが、 その都度テーブルごとに顧客IDをいれるのが面倒になってきました。 そこでお訊ねしたいのですが、テーブルA(を元にしたフォームA)に顧客IDを入れると、 テーブルBやCにも同じテキストが入力されるような設定は可能でしょうか。 最初、クエリーで連結しようとしたのですが、 既にテーブルAにいくつかデータが入っているせいか、どうも上手く反映されません。 単に私の参照方法が下手だったからかもしれませんが…。

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

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

>入力用のフォームAに、テーブルBやC用の「顧客ID」の >テキストボックスを作成する、ということでしょうか? そうです。それが簡単なやり方です。 >テキストボックスの非表示って可能なんでしょうか? テキストボックスのプロパティを開き[書式]の[可視]をいいえにするれば非表示になります。

meu350
質問者

お礼

丁寧なご回答、有難うございました(御礼が遅くなって申し訳ありません。)。 DB業務が一時中断されたため、しばらくAccessも開いていない状態が続いているのですが、今後のためにも色々勉強してみます。

meu350
質問者

補足

>可視]をいいえにするれば非表示になります。 おお!こんな裏ワザがあったとは! これなら「テーブルAの全フィールド+他のテーブルのIDだけ」の結合クエリーで済みますね。 ただ、私のリレーションの仕方(全て種類は「2」)が悪いのか、新規にレコードを追加する分には何ら問題がなかったのですが、 テーブルAに既に入力されているレコードについては、IDの編集が一部のテーブルで反映されず(空白又はエラー)、 代わりに手入力しようとしたらエラーが出て保存できなかったため、 一度全てのリレーションを解除してから改めて全て手入力することになってしまいました。 今後、新たにテーブルを作成(追加)した場合も同様なことが起こるのでしょうか?

その他の回答 (4)

回答No.5

#4です。 すでに解決済みかもしれませんが、補足を・・・ サブフォームはリレーションを設定しなくてもできますので、1対1や1対多についてあまり深く考えなくてもできます。 アクセスではVBAを使えるかどうかで格段に使い勝手が変わってきます。時間に余裕がある時に勉強されたら便利ですよ。 ご質問の場合は、例えばフォームAのフォームフッタにコマンドボタン1を配置し、そのクリックイベントに サブフォームB.visible=True サブフォームC.visible=False と入力すれば、サブフォームBが表示され、サブフォームCが非表示になります。 これと同じ要領でコマンドボタン2を配置し、クリックイベントに サブフォームB.visible=False サブフォームC.visible=True を入力すれば、コマンドボタン1とは反対に、サブフォームBが非表示になり、サブフォームCが表示されるようになります。 > ただ、顧客管理用のコードなので、どうしても支店記号などのアルファベットが入ってしまうんです。 顧客IDなので本来変更したり重複したりすることはないんで特に問題ないと思うのですが、もし変更する可能性があるんでしたら(例えば取り扱い支店の変更でIDが変更する可能性がある場合)、新規にフィールドを作ってオートナンバー型で主キーを設定したほうが後々便利かなとは思います。 人が目で見て管理する場合は顧客IDで、アクセス内部では別に追加した主キーで管理、といった風にしたら予期しないバグが発生する可能性は少ないとは思います。

meu350
質問者

お礼

>アクセスではVBAを使えるかどうかで格段に使い勝手が変わってきます。 サブフォームも今まで作ったことがないので、VBA共々勉強してみる必要がありますね。 有難うございました。

回答No.4

フォームAの中に 1. フォームB・フォームCをサブフォームとして入れる。 2. サブフォームのリンク親フィールド・リンク子フィールドを顧客IDに設定 これで、簡単にお望みのことが可能になります。 あとはフォームAのフォームヘッダーやフッターなどにサブフォームを表示・非表示できるようにVBAを書けば大量のデータ入力でもひとつの画面で出来ます。 ただ質問などを読んで思ったのですが、顧客IDがテキスト型で編集するとのことでしたが、基本的に主キーを編集してはいけません。 (上の回答でも主キーを変更してしまってはお望みのことは出来ません) テーブル間は主キーでしかつながっていないので、テーブルAの主キーを変更すると参照先のデータ位置が変わってしまったり、参照先にデータがないといったことが発生します。 主キーはオートナンバー型を使い、編集する可能性のあるものは普通のフィールドにするべきです。 そういう意味で テーブルA ・テーブルA_ID(主キー:オートナンバー型) ・顧客ID ・氏名 ・情報A1, A2~ テーブルB<→フォームB> ・テーブルB_ID(主キー:オートナンバー型) ・テーブルA_ID(テーブルAとリレーションをするフィールド) ・情報B1, B2~ テーブルC<→フォームC> ・テーブルC_ID(主キー:オートナンバー型) ・テーブルA_ID(テーブルAとリレーションをするフィールド) ・情報C1, C2~ というふうにテーブルを作り変えるべきだと思います。

meu350
質問者

補足

>あとはフォームAのフォームヘッダーやフッターなどにサブフォームを表示・非表示できるように >VBAを書けば大量のデータ入力でもひとつの画面で出来ます。 これぞ正に理想的!なんですけど、VBAに関して全くのド素人なんです(泣)。 しかもフォームごとに1対1の単票だったり1対多のテーブルだったりするので、 こんな状態でサブフォームを幾つも作るとなると、混乱してしまって…。 VBAを理解できるようになれば、この問題もクリアできるのでしょうか。 >主キーはオートナンバー型を使い、編集する可能性のあるものは普通のフィールドにするべきです。 ホント、原則はその通りなんですよね。 ただ、顧客管理用のコードなので、どうしても支店記号などのアルファベットが入ってしまうんです。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

テーブルB・Cに顧客IDを一緒に入力したいのであれば簡単なのは テーブルAとテーブルBの顧客IDを一対一のリレーションを取ります。同様にテーブルAとテーブルCの顧客IDも同様にします。 フォームAのレコードソースにテーブルB・Cの顧客IDのフィールドを追加します。 フォームA内にテーブルB・Cの顧客IDのフィールドを作りフォームAの顧客IDのフィールドのイベント更新後処理に 例えばフォームA内に作ったテーブルB・Cの顧客IDのフィールド(テキストボックス)を テーブルBの顧客IDをテーブルB.顧客IDとしテキストボックスの名前をテーブルB_顧客ID、テーブルCの顧客IDをテーブルC.顧客IDとしテキストボックスの名前をテーブルC_顧客IDとして Private Sub フォームA_顧客ID_AfterUpdate() Me!テーブルB_顧客ID = フォームA_顧客ID Me!テーブルC_顧客ID = フォームA_顧客ID End Sub このようにイベントの更新後処理に記述するとフォームAの顧客IDに入力しEnter等のキーを押すとテーブルB・Cの顧客IDに同時に同じ内容を保存できます。

meu350
質問者

補足

確認させて下さい。 入力用のフォームAに、テーブルBやC用の「顧客ID」のテキストボックスを作成する、ということでしょうか? 私の解釈があっているとすると、いくら自動入力されるとはいえ、 同じ内容のテキストボックスが幾つもできてしまうことになってしまうような気がするのですが…。 テキストボックスの非表示って可能なんでしょうか?

  • ultra7ky
  • ベストアンサー率12% (4/31)
回答No.1

Accessについて得に詳しいわけではありませんのでこれという回答はできませんが以前自分も同じようにクエリーができないことがありました。そこで meu350さんはテーブルA,B,Cのリレーションシップはどのように設定していますか多分「顧客ID」をリレーションしていると思いますがこの時リレーションシップの「結合の種類」で「1.両方のテーブルの結合フィールドが同じ行だけを含める」にしていませんか? この設定だとテーブルA,B,Cに同じ「顧客ID」がないとクエリーに表示されませんので、「3.'xxxxxxxx'の全レコードと'xxxxx'の同じ結合フィールドのレコードだけを含める」にすればクエリーで正しく結合されると思いますが。

meu350
質問者

お礼

ご回答有難うございました(御礼が遅くなって申し訳ありません)。 そもそもクエリーだのリレーションだのも「何となく」で組んでいる状態なので、改めて勉強しようと思います。

meu350
質問者

補足

早々のレス、有難うございます。台風の影響で繋がらなくて返事が遅れてしまいました。 ご指摘の通りリレーションを「1」でやってました。 そこで「3」に変えたのですが、あまり状況が変わらなかったので試しに「2」に変えたら上手く結合できました。 今はAの中身全部と、B、C~のID以外をクエリーで結合しています。 この方法だとやたらと横に長いクエリーになってしまい、 テーブルを分割して作った意味が全くないのですが、何かよい方法がないでしょうか?

関連するQ&A

専門家に質問してみよう