Access2000を使用しています。
1対1のリレーションシップを設定したテーブル「A」とテーブル「B」を作りました。
テーブル「A」にキーを入れると、テーブル「B」からそのキーに対応したデータが表示されるクエリを作りたいと思います。
そのキーに1対1のリレーションを設定しなければ、キーを入力した瞬間に対応したデータが表示されるのですが、1対1、又は、インデックス(重複なし)を設定すると表示されません。
しかし、テーブル「A」にはデータが重複しないようにしたいと思っています。
わかりにくい説明で申し訳ありませんが、お分かりになるかたがいらっしゃいましたら、どうすればこれを回避できるか教えてください。よろしくお願いいたします。
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
すいません。
補足です。顧客の今後10年間の累計予測で10万人以下なら、11n_kacie さんのおっしゃることで正解ではないかと思います。絶対に1売上に対して1顧客しか存在し得ないなら、テーブル内に売上の無い無駄な領域ができるとしても、無理にリレーションさせる必要も無いと思います。
1バイトでもファイル容量を節約したいというなら別ですが…
No.9
- 回答日時:
試してみましたら、たしかに、1対1や重複ありにすると、クエリ上では、表示がされませんでした。
が、並べ替えボタンを押すと表示されるので、もしかしたらと思い・・・
・クエリをソースとするデータシートビュー形式のフォームをウィザードで作成
・顧客IDテキストボックスの更新後イベントに「Me.Requery」と書く
をやってみましたら、とりあえず、即表示されました。
ただし、1対1だと、クエリ上で任意の売上レコードを削除すると連鎖削除を設定していなくても関連データ(顧客マスタデータ)が消えてしまうみたいです。ということはフォーム上でも同じです。このようなデータベースを自分以外のユーザーに扱わせると危険なので以下のような方法を取る方がいいような気がしました。
・リレーションは1対多。連鎖削除OFF。
1対多ならクエリ上でもフォーム上でも、売上データ削除時に関連データ(顧客データ・マスタデータ)が消えることはありません。
・クエリをソースとするデータシートビュー形式のフォームをウィザードで作成
・売上の顧客IDテキストボックスの更新前イベントかフォームのレコード挿入前イベントなどに、すでに同じ顧客IDが入力されていたらデータ追加できないようなコードを書く。またはダブり追加した分を自動削除するコードなどを書く。
また、Requeryを使うと、カレントレコードが最初に戻ってしまうので通常はちゃんともとに戻れるコートも書かなくてはいけません。それも面倒くさいですので、その意味でも1対多でやって、すでに同じ顧客IDが入力されていたらレコード追加できないようなかたちにしてしまった方がよいのではないでしょうか?
こちらの方があとあと安全のような気がします。
見当違いでしたらごめんなさい。
No.6
- 回答日時:
'こっちの方が簡単かもしれません。
'単に重複していたら警告を出すだけのものですが。。
Private Sub CustomerID_LostFocus()
'テーブルは「顧客管理」でその中に 「顧客ID」というフィールドが存在するします。
'フォームに「顧客ID」というTextBoxが存在し、Me!顧客IDでVBAからアクセスします。
Dim CN As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim SQL As String
SQL = "SELECT * FROM 顧客管理 WHERE 顧客ID = " & Me!顧客ID
Set CN = CurrentProject.Connection
RS.Open SQL, CN, adOpenKeyset
If RS.RecordCount > 0 Then
MsgBox "そのIDはすでに使われています。"
End If
RS.Close: Set RS = Nothing
CN.Close: Set CN = Nothing
End Sub
No.5
- 回答日時:
直接の回答にはならないかと思いますが……。
1対1のリレーションでしたら、A・Bテーブルを合わせて
1つのテーブルにすればいいのではないかと思います。
特にテーブルを分ける必要は無いのでは?
No.4
- 回答日時:
> RS.Open "顧客管理", CN, adOpenKeyset
RS.Open SQL, CN, adOpenKeyset
でした。
ちなみに、これらはVBAの入門書あたりにも載っているので一度、参考にされてはいかがでしょうか?
おすすめは 谷尻かおり著 のものです。検索するとすぐヒットすると思います。
No.3
- 回答日時:
こちらの理解が浅くてすみませんでした。
おっしゃるとおり、重複不可だと表示できませんね。おそらく、クエリー上で入力されていると思うのですが、通常、入力はフォームからやります。それも、「連結フォーム」というのでなくて、「非連結フォーム」というのでやると小回りがききます。
その手法の一つとして、、顧客IDにIDを入れて次のTextBox(例:顧客名)に移動した瞬間に顧客名と電話番号を自動取得する方法をお知らせします。(連結でやってみたのですが、おかしな動作をしてうまくいきませんでした。)
今後のことを考えると、この手法をマスターされた方が、Access特有のしがらみから解放され自由な設計ができるようになります。
「連結フォーム」というのはフォームとテーブルが連動しているフォーム。
「非連結フォーム」は連動していないので、フォームの値が変わってもテーブルにはその内容が反映されない、「登録」とかいうイベントを発生さえ、意図的にテーブルに書き込む必要があるというものです。
Private Sub 顧客ID_LostFocus()
'Me とは 作業するフォームです。
'Me.顧客名 とは 作業フォーム上の顧客名というTextBoxです。
Dim CN As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim SQL As String
SQL = "SELECT * FROM 顧客管理 WHERE 顧客ID = " & Me.顧客ID
Set CN = CurrentProject.Connection
RS.Open "顧客管理", CN, adOpenKeyset
If RS.RecordCount > 0 Then
Me.顧客名 = RS!顧客名
Me.顧客電話番号 = RS!顧客電話番号
End If
RS.Close: Set RS = Nothing
CN.Close: Set CN = Nothing
End Sub
ただ、今の路線での回答もつくかもしれないので、もうしばらく待たれてもいいと思います。
No.2
- 回答日時:
まとめると、
テーブルA -----> 受注管理
[受注ID]-[顧客ID]-[受注製品]-[受注日]
テーブルB -----> 顧客管理
[顧客ID]-[郵便番号]-[都道府県]-[市町村]-[電話番号]
ということとかと思うのですが、
第一の問題は テーブルA の主キーは受注IDでないでしょうか?
主キーを受注IDにして、顧客IDは重複不可だけで・・・
とりあえず、それでうまく行くと思うのですが。
この回答への補足
さっそくのご回答ありがとうございます。
おっしゃる通りの内容です。
ですが、テーブルAの主キーを「受注ID」にして、「顧客ID」はプロパティでインデックス(重複なし)にするという手もやってみましたが、クエリを一度終了して再度開かないと、住所や電話番号が出てきません。
顧客IDを入力したと同時に住所や電話番号が表示されるようにしたいと思っています。
先に投稿しましたように、重複ありならばすぐに表示されるのですが。
更新のタイミングの問題でしょうか?
何か解決策はありますでしょうか?
No.1
- 回答日時:
具体的にフィールド名を書き、どれとどれをどうして、何をどうしたいのか書きましょう。
この回答への補足
はい、すみませんでした。
まず、テーブル「A」は、フィールド「顧客ID」を主キーとするテーブルで、顧客の商品受注状況を格納するためのテーブルです。
次に、テーブル「B」は、その顧客の電話番号や住所が格納されたテーブルで、やはり「顧客ID」を主キーにしています。
商品受注データは、必ず顧客1人につき1件です。
受注データを入力していく際に、1件1件、住所や電話番号を入力していくのは面倒なので、テーブルAに顧客IDを入力したら、テーブルBから住所や電話番号が表示されるようにしたいと考えています。
そこで、テーブルAの「顧客ID」、テーブルBの「住所」「電話番号」を選択するクエリを作りました。
その際、最初に投稿しましたように、テーブルA・Bの「顧客ID」で1対1のリレーションシップを設定した場合に、住所や電話番号が表示されません。
伝わりましたでしょうか?
お手数ですがお分かりになる方がいらっしゃいましたらよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access フォームのデータがテー...
-
Access IF文でテーブルに存在し...
-
Accessデータベースで行と列を...
-
ワードでの単純作業の効率化に...
-
データベースの1要素に複数デー...
-
シングルクォーテーションとダ...
-
別のDBからテーブルをコピーす...
-
Access 既に開いているフォー...
-
ADOでレコードを閉じるタイミン...
-
ACCESS で マクロの中でフィ...
-
Access 新規入力画面にするコー...
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
変数が選択リストにありません
-
Access テキスト型に対する指定...
-
エクセルVBAで5行目からオート...
-
エクセルグラフの凡例スペース
-
Oracle 2つのDate型の値の差を...
-
Accessでテーブル名やクエリ名...
-
セルの右クリックで出る項目を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access IF文でテーブルに存在し...
-
データベースの1要素に複数デー...
-
Access VBAでクエリーのレコー...
-
ACCESS で マクロの中でフィ...
-
Access フォームのデータがテー...
-
Access 既に開いているフォー...
-
ワードでの単純作業の効率化に...
-
シングルクォーテーションとダ...
-
別のDBからテーブルをコピーす...
-
顧客IDを入力すると顧客名や住...
-
ADOでレコードを閉じるタイミン...
-
Access2013VBA 複数のテーブル...
-
Accessデータベースで行と列を...
-
ACCESS2003 Aアクロバットを介...
-
Accessで名寄せグループの関係...
-
Access レコードロックについて...
-
ワードで保存するファイル名の...
-
Access 縦(行)のデータを横(列)...
-
テーブル1 2 3 の結合
-
Access2000 単票フォーム上の...
おすすめ情報