- ベストアンサー
アクセスのメインフォームとサブフォームの関連付けについて教えてください
アクセス初心者です。会社で会員管理に使っているアクセスのデータがこわれてしまいました。入力だけに携わっていたのですが、急きょ勉強して修復に努めています。現在データベースが3つあり、メインフォームにサブフォームを2つ作り、その3つのデータを反映させています。壊れる前はこの3つをリレーションしてありましたが、現在リレーションができていません。それなのにフォームでは3つのデータが関連付けられた状態で表示されます。3つのデータには会員番号という同じフィールドがありますがリレーション以外に何か関連付ける方法があり、それがどこかではたらいているのでしょうか?また、リレーションしようとすると主テーブルににデータがないため参照整合性の規則に違反していると出てしまい処理ができません。本当に超初心者で申し訳ありませんがとても困っていますのでよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> リレーション以外に何か関連付ける方法があり、 > それがどこかではたらいているのでしょうか? フォームをデザインビューで開いてサブフォームを選択し、メニューの 「表示(V)→プロパティ(P)」などでプロパティシートを開いて下さい。 その「データ」タブで、「リンク子フィールド」「リンク親フィールド」に 同じデータ型のフィールドを設定した場合、フォーム-サブフォームの レコードが連動表示(→「親」側と同じ値の「子」に表示を限定)されます。 > リレーションしようとすると主テーブルにデータがないため > 参照整合性の規則に違反していると出てしまい 「一対多」型の参照整合性リレーションシップを設定するのでしたら、 「多」側にしかないデータを「一」側に追加してやるしかないと思います。 「多」側にしかないデータの抽出は、例えば「一」側をテーブル1、 「多」側をテーブル2とすると、 Select テーブル2.ID From テーブル2 Left Join テーブル1 On テーブル2.ID=テーブル1.ID Where テーブル1.ID Is Null; というクエリで行えます。 (新規クエリの作成時に、「不一致クエリ」を選択すると楽に作成できると 思います)
その他の回答 (2)
(1)スキャンディスクを完全で行いディスクエラーに起因するトラブルを回復する。 (2)データベースメニューで<修復>を行って結果を確認する。 これで復旧しなければ、バックアップの出番です。 バックアップ時点に遡ってデータ入力を行う。 これが基本。 さて、バックアップしていないのでしょうね。 そうすると、ここでの質疑応答で解決しようとしても無理ではと思います。 そう思いつつも少し復旧要領を示しておきます。 先ず、関連テーブルの全レコードが表示されることが前提です。 この前提がクリアされていれば以下を参考にされて下さい。 <会員名簿> 会員番号 氏名 入会年月日 1001 鈴木 一郎 2006/10/10 1002 中村 太郎 2006/11/11 <会員別注文履歴> ID 会員番号 注文日 品目 1 1001 2006/12/01 A 2 1001 2006/12/02 B 3 1002 2006/12/03 C というテーブル構造を例に話を進めます。 <リレーションシップ> 会員別注文履歴.会員番号---->会員名簿.会員番号 参照整合性のレ点を外す! まずは、リレーションシップをこのように修正します。 次にテスト用選択クエリを作成します。 <選択クエリ> SELECT 会員別注文履歴.ID, 会員別注文履歴.会員番号, 会員別注文履歴.注文日, 会員別注文履歴.品目, * FROM 会員名簿 RIGHT JOIN 会員別注文履歴 ON 会員名簿.会員番号 = 会員別注文履歴.会員番号; ID 会員別注文履歴.会員番号 注文日 品目 会員名簿.会員番号 氏名 入会年月日 1 101 2006/12/01 A 101 鈴木 一郎 2006/10/10 2 101 2006/12/02 B 101 鈴木 一郎 2006/10/10 3 102 2006/12/03 C 102 中村 太郎 2006/11/11 ID 会員別注文履歴.会員番号 注文日 品目 会員名簿.会員番号 氏名 入会年月日 1 101 2006/12/01 A 101 鈴木 一郎 2006/10/10 2 101 2006/12/02 B 101 鈴木 一郎 2006/10/10 3 102 2006/12/03 C 上述のようなリレーションであれば、仮に会員名簿の[102]が参照できなくてもエラーは発生しません。 このように、当該のデータが空文になるだけです。 この空文になる<会員別注文履歴>をゼロにすることが復旧の目的です。 方法は2つ。 <会員別注文履歴>を削除するか、対応する<会員名簿>を作り上げるかです。 この修復が完了したら、参照整合性にレ点を付けても構いません。 この修復が完了したら、リレーションシップを元に戻します。 <リレーションシップを元に>は、既存のクエリを調査すれば判ると思います。
お礼
詳しいご回答ありがとうございました。 突然アクセスの画面に「~エラーを修復しますか?」と出たので「はい」を選んだら、参照すべきアクセスが消えていました。 以前にもあったので、外部メモリーに入れてあった前日のバックアップを戻し開いたら、検索をかけるたび「ブックマークが~」と出てアクセスが動かなくなりました。(2)<修復>を試みたのですが出来ませんでした。 とりあえず、エクスポートできたデータをもとにテーブルを作り直したので、対応しないものができてしまったのだと思います。教えていただいたように選択クエリを作って空白の部分を調べ、完全なものにしてからもう一度リレーションシップをしようと思います。
- fake-tang
- ベストアンサー率24% (186/772)
クエリーとか。 私もアクセスを触っていますが、自分で組んでテーブルを増やすうちに 煩雑化し、整理できなくなった状態で使い続けています。 なので、きちんとした回答はできそうにありませんが、クエリーで テーブルから必要な情報を取り出したり、それぞれのテーブル(もしくはクエリー)の 「コレとコレは同じもの」と教えたりしているうちに、リレーションシップは 勝手に出来上がっていました。 自分でどうにかしたことはありません。
お礼
早速ご回答ありがとうございます。クエリーについての本を借りてきたのでもう一度調べてみます。
お礼
なるほど、フォームとサブフォームはそんなところで、関係付けられていたんですね。リレーションについては教えていただいた方法でやってみます。会社が休みに入ってしまい、今データに触れないのですが、年が明けたら早速確認してみます。