性格悪い人が優勝

Access2000を使用しています。
1対1のリレーションシップを設定したテーブル「A」とテーブル「B」を作りました。
テーブル「A」にキーを入れると、テーブル「B」からそのキーに対応したデータが表示されるクエリを作りたいと思います。
そのキーに1対1のリレーションを設定しなければ、キーを入力した瞬間に対応したデータが表示されるのですが、1対1、又は、インデックス(重複なし)を設定すると表示されません。
しかし、テーブル「A」にはデータが重複しないようにしたいと思っています。
わかりにくい説明で申し訳ありませんが、お分かりになるかたがいらっしゃいましたら、どうすればこれを回避できるか教えてください。よろしくお願いいたします。

A 回答 (10件)

すいません。

補足です。
顧客の今後10年間の累計予測で10万人以下なら、11n_kacie さんのおっしゃることで正解ではないかと思います。絶対に1売上に対して1顧客しか存在し得ないなら、テーブル内に売上の無い無駄な領域ができるとしても、無理にリレーションさせる必要も無いと思います。

1バイトでもファイル容量を節約したいというなら別ですが…
    • good
    • 0

試してみましたら、たしかに、1対1や重複ありにすると、クエリ上では、表示がされませんでした。


が、並べ替えボタンを押すと表示されるので、もしかしたらと思い・・・

・クエリをソースとするデータシートビュー形式のフォームをウィザードで作成
・顧客IDテキストボックスの更新後イベントに「Me.Requery」と書く

をやってみましたら、とりあえず、即表示されました。

ただし、1対1だと、クエリ上で任意の売上レコードを削除すると連鎖削除を設定していなくても関連データ(顧客マスタデータ)が消えてしまうみたいです。ということはフォーム上でも同じです。このようなデータベースを自分以外のユーザーに扱わせると危険なので以下のような方法を取る方がいいような気がしました。

・リレーションは1対多。連鎖削除OFF。
1対多ならクエリ上でもフォーム上でも、売上データ削除時に関連データ(顧客データ・マスタデータ)が消えることはありません。

・クエリをソースとするデータシートビュー形式のフォームをウィザードで作成

・売上の顧客IDテキストボックスの更新前イベントかフォームのレコード挿入前イベントなどに、すでに同じ顧客IDが入力されていたらデータ追加できないようなコードを書く。またはダブり追加した分を自動削除するコードなどを書く。


また、Requeryを使うと、カレントレコードが最初に戻ってしまうので通常はちゃんともとに戻れるコートも書かなくてはいけません。それも面倒くさいですので、その意味でも1対多でやって、すでに同じ顧客IDが入力されていたらレコード追加できないようなかたちにしてしまった方がよいのではないでしょうか?

こちらの方があとあと安全のような気がします。

見当違いでしたらごめんなさい。
    • good
    • 0

テーブルの設定は動作確認が取れている、「重複あり」で OKです。

    • good
    • 0

> Private Sub CustomerID_LostFocus()



Private Sub 顧客ID_LostFocus()

の間違い。
    • good
    • 0

'こっちの方が簡単かもしれません。


'単に重複していたら警告を出すだけのものですが。。

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
    • good
    • 0

直接の回答にはならないかと思いますが……。



1対1のリレーションでしたら、A・Bテーブルを合わせて
1つのテーブルにすればいいのではないかと思います。
特にテーブルを分ける必要は無いのでは?
    • good
    • 0

> RS.Open "顧客管理", CN, adOpenKeyset



RS.Open SQL, CN, adOpenKeyset

でした。

ちなみに、これらはVBAの入門書あたりにも載っているので一度、参考にされてはいかがでしょうか?

おすすめは 谷尻かおり著 のものです。検索するとすぐヒットすると思います。
    • good
    • 0

こちらの理解が浅くてすみませんでした。

おっしゃるとおり、重複不可だと表示できませんね。

おそらく、クエリー上で入力されていると思うのですが、通常、入力はフォームからやります。それも、「連結フォーム」というのでなくて、「非連結フォーム」というのでやると小回りがききます。

その手法の一つとして、、顧客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



ただ、今の路線での回答もつくかもしれないので、もうしばらく待たれてもいいと思います。
    • good
    • 0

まとめると、



テーブルA -----> 受注管理

[受注ID]-[顧客ID]-[受注製品]-[受注日]


テーブルB -----> 顧客管理

[顧客ID]-[郵便番号]-[都道府県]-[市町村]-[電話番号]

ということとかと思うのですが、


第一の問題は テーブルA の主キーは受注IDでないでしょうか?
主キーを受注IDにして、顧客IDは重複不可だけで・・・
とりあえず、それでうまく行くと思うのですが。

この回答への補足

さっそくのご回答ありがとうございます。
おっしゃる通りの内容です。
ですが、テーブルAの主キーを「受注ID」にして、「顧客ID」はプロパティでインデックス(重複なし)にするという手もやってみましたが、クエリを一度終了して再度開かないと、住所や電話番号が出てきません。
顧客IDを入力したと同時に住所や電話番号が表示されるようにしたいと思っています。
先に投稿しましたように、重複ありならばすぐに表示されるのですが。
更新のタイミングの問題でしょうか?
何か解決策はありますでしょうか?

補足日時:2003/10/07 16:54
    • good
    • 0

具体的にフィールド名を書き、どれとどれをどうして、何をどうしたいのか書きましょう。

この回答への補足

はい、すみませんでした。
まず、テーブル「A」は、フィールド「顧客ID」を主キーとするテーブルで、顧客の商品受注状況を格納するためのテーブルです。
次に、テーブル「B」は、その顧客の電話番号や住所が格納されたテーブルで、やはり「顧客ID」を主キーにしています。
商品受注データは、必ず顧客1人につき1件です。
受注データを入力していく際に、1件1件、住所や電話番号を入力していくのは面倒なので、テーブルAに顧客IDを入力したら、テーブルBから住所や電話番号が表示されるようにしたいと考えています。
そこで、テーブルAの「顧客ID」、テーブルBの「住所」「電話番号」を選択するクエリを作りました。
その際、最初に投稿しましたように、テーブルA・Bの「顧客ID」で1対1のリレーションシップを設定した場合に、住所や電話番号が表示されません。
伝わりましたでしょうか?
お手数ですがお分かりになる方がいらっしゃいましたらよろしくお願いいたします。

補足日時:2003/10/07 14:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す