• 締切済み

Access2000 更新のタイミング?

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

みんなの回答

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.10

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

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.9

試してみましたら、たしかに、1対1や重複ありにすると、クエリ上では、表示がされませんでした。 が、並べ替えボタンを押すと表示されるので、もしかしたらと思い・・・ ・クエリをソースとするデータシートビュー形式のフォームをウィザードで作成 ・顧客IDテキストボックスの更新後イベントに「Me.Requery」と書く をやってみましたら、とりあえず、即表示されました。 ただし、1対1だと、クエリ上で任意の売上レコードを削除すると連鎖削除を設定していなくても関連データ(顧客マスタデータ)が消えてしまうみたいです。ということはフォーム上でも同じです。このようなデータベースを自分以外のユーザーに扱わせると危険なので以下のような方法を取る方がいいような気がしました。 ・リレーションは1対多。連鎖削除OFF。 1対多ならクエリ上でもフォーム上でも、売上データ削除時に関連データ(顧客データ・マスタデータ)が消えることはありません。 ・クエリをソースとするデータシートビュー形式のフォームをウィザードで作成 ・売上の顧客IDテキストボックスの更新前イベントかフォームのレコード挿入前イベントなどに、すでに同じ顧客IDが入力されていたらデータ追加できないようなコードを書く。またはダブり追加した分を自動削除するコードなどを書く。 また、Requeryを使うと、カレントレコードが最初に戻ってしまうので通常はちゃんともとに戻れるコートも書かなくてはいけません。それも面倒くさいですので、その意味でも1対多でやって、すでに同じ顧客IDが入力されていたらレコード追加できないようなかたちにしてしまった方がよいのではないでしょうか? こちらの方があとあと安全のような気がします。 見当違いでしたらごめんなさい。

回答No.8

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

回答No.7

> Private Sub CustomerID_LostFocus() Private Sub 顧客ID_LostFocus() の間違い。

回答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

  • 11n_kacie
  • ベストアンサー率42% (21/50)
回答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は重複不可だけで・・・ とりあえず、それでうまく行くと思うのですが。

tago39
質問者

補足

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

回答No.1

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

tago39
質問者

補足

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

関連するQ&A

  • ACCESSのクエリで表示されるデータについて

    クエリで表示されるデータの範囲について教えてください。 <状況例> 例えばなのですが、取引先会社の管理データベースとして「テーブルA」と「テーブルB」があったとします。 「テーブルA]のフィールドは「会社ID」、「会社名」、「住所」とします。 「テーブルB]のフィールドは「連絡先ID」、「会社ID」、「担当者名」とします。 そして、「会社ID」をリレーションシップで繋いで、クエリで「テーブルA」「テーブルB」の全てのフィールドを表示したとします。 この時、「テーブルA」にデータが5つあり、「テーブルB」にはデータが2つしかなく、結果リレーションシップを通じて対をなすデータが2つしかない場合には、クエリでは2つしかデータが表示されないと思います。 <質問> クエリではリレーションシップで対をなさないデータは無効となるようですが、対をなさないデータも全てクエリで表示する方法はないのでしょうか。 上記例でいうと、「テーブルA」のデータ5件全てについて表示させたいのですが。もちろん、「テーブルA」のデータ中対をなしていないものについては、「テーブルB」のフィールド内容については「空白」での表示となりますが。

  • ACCESSのリレーションシップについての疑問

    ACCESS初心者です。 ACCESS2002 OSはWindowsXP SP2です。 基本が分かっていないせいなのかもしれませんが、私には理解できない現象が起こっています。対応方法があれば教えていただくようお願いします。 ACCESSでデータ更新のフォームを作っています。 そのフォームは2・3日前に作ったもので、たとえばテーブルAを更新するためにマスターテーブルのBとCを参照しているような形になっています。このリレーションはクエリで指定してあります。 このフォームではクエリに対して更新する形になっています。 このフォームのデザインを編集しているときに「ツール」の「リレーションシップ」をクリックすると画面にはBとCだけが表示されます。 なぜメインのテーブルのAが表示されないのか?と思いながら、しょうがないので右クリックして「すべてのリレーションシップの表示」を押すと、驚いたことにDのテーブルが表示されました。 実はこのDというテーブルは以前に作ったAを作る前に使っていたAによく似たテーブルなのです。 当然、以前にはDとB・Cのリレーションも作っていましたが、今編集中のフォームではDは関係ありません。 リレーションシップの画面は不必要に広大なもので横に3スクロール分と縦にも5スクロール分くらいあって、その右下の端っこにD・B・Cのリレーションだけが表示されていて、それ以外はただただスペースがあるだけです。 なぜ肝心のA・B・Cのリレーションが表示されずD・B・Cのリレーションが表示されるのでしょう? 試しに今では不要であるDのテーブルを削除してみましたがリレーションシップではさすがにDは消えたもののB・Cが表示されるだけで、Aは出てきません。 そもそもACCESSにおけるリレーションシップというのは個々のフォーム内で定義されるものではないのですね?(根本的なことで申し訳ないのですが、買った2冊の本を見てもインターネットで探してもその辺の説明が見当たりませんでした) SQLであれば個々のSQL文で都度JOIN等の記述をすると思うのですが、ACCESSではデータベース全体の共通事項(?)としての定義になるのでしょうか? ACCESSは初心者で見当はずれな質問かもしれませんがどうかよろしくお願いします。

  • ACCESSで質問です。

    ACCESSで質問です。 テーブルA(複数企業)とテーブルB(Aの企業に対する対応状況)があります。 選択クエリにてAとBの2つのテーブルを電話番号でリレーションをもたせ、その企業の対応状況を検索し、結果をフォームに表示できるものを作りました。 しかし、企業(テーブルA)に対して複数の対応状況(テーブルB)があるため、フォームでBの対応状況分と同じ枚数のAレコードが表示されてしまいます。 クエリのプロパティで「固有のレコード」を「はい」にしても表示されてしまいます。 イメージでは、AテーブルとBテーブルの項目どれでも検索ができ、初めに検索結果をフォーム1で企業データを表示させ、コマンドボタンをクリックするとフォーム2で、その企業の対応状況が表示されるようにしたいのです。 現在検索は出来ていますが、フォーム1で同じ企業データレコードが複数表示されないようにしたいのです。 どのようにしたら出来ますでしょうか?アドバイスお願いします。 ・使用バージョンはACCESS2000です。 ・Aテーブルの企業データは重複なしです。 ・Aテーブルの主キーは電話番号です。 ・検索条件はA・Bの項目合わせて10項目で、全てIIFを使用して検索しています。 ACCESSを始めたばかりの初心者です。質問も初心者レベルですが、よろしくお願いします。

  • Accessで重複したデータを削除したい。

    AテーブルとBテーブルがあります。AテーブルとBテーブルのフィールド名は同じですがデータはそれぞれ違います。AテーブルとBテーブルにあるデータを一つにまとめたいのですが、その際に、 「AテーブルとBテーブルの間で重複したデータがあるのでそれを削除したい。」のですが、手順としてどのような方法がスマートなのでしょうか。 (1)BテーブルをAテーブルに追加クエリで追加する。 (2)Aテーブルで重複クエリを作成し、重複しているデータを表示する。 ・・・・とここまで考えたのですが重複しているデータをどのように削除していけばいいかわかりません・・・。根本的にやり方が間違っているのでしょうか。どなたか詳しい方、いい方法を教えてください。よろしくお願い致します。

  • アクセス・選択クエリについて

    アクセス・選択クエリについて こんにちは。現在、選択クエリについて悩んでおります。 テーブルAとテーブルBからそれぞれ3つのフィールドを選び、選択クエリを作成。しかし、出来上がったクエリのデータシートには一切データが表示されていません。ならばと思い、テーブルAからだけ3つのフィールドを選びクエリを表示させると、きちんと表示します。テーブルA,テーブルBには当然主キーが設定されていますが、その事と関係するのでしょうか?ご存知の方、どうか教えてください。宜しくお願い致します。

  • Access 複数テーブルのレコード自動更新

    Access初心者です。会社で業務の進捗状況を、Access2002を使って管理しています。 フィールド数が増えたので、以下のようにテーブルを分けることになりました。 Aテーブル(メイン)   管理No.(主キー、オートナンバーではない)    カテゴリ    作業内容    : Bテーブル   管理No.(主キー、オートナンバーではない)    チェック項目B-1   チェック項目B-2    : Cテーブル   管理No.(主キー、オートナンバーではない)    チェック項目C-1   チェック項目C-2    : という形式で、AとB・Cはクエリのリレーションシップで、「管理No.」を1対1で関連づけています。 AテーブルのもとのデータはExcelからインポートしますが、 Aテーブルのレコード数は増えますが、クエリには反映されません。 Aのレコードが増えたら、BやCも同時に増やすことはできますか?

  • アクセス 数値型にするとフォームの入力ができない

    お世話になります。色々調べたり、実験してみたのですが、分からない点があります。 簡単でいいので、可能性のある原因を教えてください。 アクセス2003です。 ■パターン1  フォームC の入力ができる テーブルA(主キーがオートナンバー型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る ■パターン2  フォームC の入力ができない テーブルA(主キーが数値型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る 簡単にいうと、テーブルのデータ型によって、入力可否が変わるのです。 なぜ、パターン2は、入力できないのか分かりません。 よろしくお願いします。

  • アクセスのリレーションシップとクエリ

    私は、アクセスの初心者です。なので、難しいことはよく分からないのですが、アクセスではある1つのフィールドをキーにしてくっつけたりすることができるじゃないですか?そのキーを設定したりするのはリレーションシップでも、クエリでも同じような感じで行うと思うのですが、その2つの違いはクエリはそれをテーブルとして表示できるのに対して、リレーションシップはただ定義するしかできずテーブルとして表示はできないのでしょうか? あと、クエリとかである条件で抽出したテーブルの1つのフィールドのSUMを出したいのですがどういった条件式を書けばいいのでしょうか? なにぶん、初心者ゆえに質問が分かりにくいと思いますが、どうかよろしくお願いします。

  • 未定義になるのは主キーじゃないのが原因?

    二つのテーブルを一対多のリレーションシップで繋ぐとき、 一になる方は主キーじゃないと、一対多にならなかったり参照整合性はできないのでしょうか? 主キーではないテーブル1のフィールド(一)と、(多)のテーブル2のフィールドでリレーションを組もうと思ってるのですが、 リレーションシップの種類が未定義になってしまいます。 これは、1になる方のテーブル1が主キーじゃないのが原因なのでしょうか? テーブル1のこのフィールドは、重複することはありませんが、空白も入る為、主キーにできないし、 主キーはほかのフィールドで使っています。

  • マイクロソフト アクセス リレーションシップの扱い方について

    よろしくお願いします。アクセスで作成したテーブル、例えばAとBには共通の番号があります。それぞれは各テーブル内で番号がいくつか重複しています。この番号により、リレーションシップの関連付け(参照整合性は行わず)を行った後、クエリで抽出したところ、ところどころ同じデータが発生して、膨大な量になってしまいます。参照整合性・フィールドの連鎖更新・レコードの連座削除をチェックして再度リレーションシップを作成しましたが、主テーブルで参照されている固有のインデックスが見つからないとのエラーメッセージが出ます。このテーブルA・Bを使用してデータが重複しないようにクエリで抽出する事はできますか。