
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で質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- その他(データベース) accessについて 2 2022/05/31 16:58
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- マウス・キーボード 不良表示キー(キーボード) 3 2022/04/27 10:53
- Access(アクセス) Access2016でフォーム内にExcelの複数シートを 表示させるイメージで複数テーブルの デー 1 2022/11/25 15:30
- Excel(エクセル) Excel ドロップダウンリスト(入力規則)に関してです データの入力規則で元データ79000行のド 3 2023/07/17 10:06
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS で マクロの中でフィ...
-
Access2000 単票フォーム上の...
-
Access IF文でテーブルに存在し...
-
データベースの1要素に複数デー...
-
Access 縦(行)のデータを横(列)...
-
顧客IDを入力すると顧客名や住...
-
Access VBAでクエリーのレコー...
-
ワードで保存するファイル名の...
-
ワードでの単純作業の効率化に...
-
Access フォームのデータがテー...
-
工事管理データベースで月締め...
-
access フォーム間で情報が引...
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
Accessでテーブル名やクエリ名...
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
SQLServer2005のSQL文での別名...
-
テーブルの存在チェックについて
-
変数が選択リストにありません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAでクエリーのレコー...
-
データベースの1要素に複数デー...
-
ACCESS で マクロの中でフィ...
-
ワードでの単純作業の効率化に...
-
Access フォームのデータがテー...
-
(ACCESS)連番取得について
-
Access 既に開いているフォー...
-
Access IF文でテーブルに存在し...
-
Accessで名寄せグループの関係...
-
ADOでレコードを閉じるタイミン...
-
顧客ごとの情報を1レコードにする
-
Accessデータベースで行と列を...
-
Access クロス集計クエリについて
-
SQLの抽出方法に悩んでいます(...
-
サブフォームで自動採番
-
顧客・売上管理のツールをさが...
-
Access2013VBA 複数のテーブル...
-
ワードで保存するファイル名の...
-
Access2000 テーブルのデザイン...
-
顧客IDを入力すると顧客名や住...
おすすめ情報