Access2007でレコードを追加できないエラーが発生する理由と解決方法

このQ&Aのポイント
  • Access2007でデータ入力時に「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」というエラーメッセージが表示される場合、アルバムIDとアルバム名の入力ができない可能性があります。
  • このエラーメッセージが表示される原因は、テーブル’T_アルバム’の結合キーがレコードセットに存在しないためです。
  • この問題を解決するためには、フォームウィザードから作成したフォームの設定を確認し、アルバムIDとアルバム名の入力ができるようにする必要があります。
回答を見る
  • ベストアンサー

Access2007 「レコードを追加できません」

Access2007で困っております。 フォーム上からテキスト型のデータを入力しようとしても 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されうまく入りません。 【テーブル構成】 ★が主キー (1)T_アルバム ★アルバムID テキスト型 アルバム名 テキスト型 ジャンルID テキスト型 ソースID テキスト型 アーティストID テキスト型 (2)T_曲目 ★曲ID テキスト型 曲名 テキスト型 トラックNo テキスト型 アルバムID テキスト型 (3)MT_アーティスト ★アーティストID テキスト型 アーティスト名 テキスト型 (4)MT_ジャンル ★ジャンルID テキスト型 ジャンル名 テキスト型 (5)MT_ソース ★ソースID テキスト型 ソース名 テキスト型 【リレーション】 ※いずれも参照整合性付き (1)T_アルバム アルバムID --- (2)T_曲目 アルバムID (1)T_アルバム アーティストID --- (3)MT_アーティスト アーティストID (1)T_アルバム ジャンルID --- (4)MT_ジャンル ジャンルID (1)T_アルバム ソースID --- (5)MT_ソース ソースID フォーム作成のために「Q_アルバム情報入力」をつくりました。 アルバムID T_アルバム アルバム名 T_アルバム アーティストID MT_アーティスト アーティスト名 MT_アーティスト ジャンルID MT_ジャンル ジャンル名 MT_ジャンル ソースID MT_ソース ソース名 MT_ソース この「Q_アルバム情報入力」を使って、フォームウィザードからフォームを作成し、 アルバムIDやアルバム名を入力しようとすると 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されます。 他のフィールドは値が入力できますが、これら2つのフィールドのみ入力できません。 なお、各テーブルのフィールドには予めデータが入っている状態です。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

SQL文は、下記のようにすべきです。 SELECT T_アルバム.アルバムID, T_アルバム.アルバム名, T_アルバム.ジャンルID, T_アルバム.ソースID, T_アルバム.アーティストID, MT_アーティスト.アーティスト名 FROM MT_アーティスト INNER JOIN T_アルバム ON MT_アーティスト.アーティストID = T_アルバム.アーティストID; アーティストID は T_アルバム の方を表示させる。 アーティスト名のテキストボックスは編集ロックをかけておいて、更新できないようにしておく。 > アーティストの新規入力は、フォームを別個独立させるべきかもしれませんね。 そうしたほうがいいと思います。 コンボボックスを使えば、リストにないアーティスト(新規アーティスト)を入力したときは、リスト外入力のイベントで、自動的に新規入力用フォームを呼び出すVBAを割り当てるなどの設計にすることができます。 ちょっと古いですが、下記が参考になると思います。 [AC95] コンボボックスのリストに新しいデータを追加する方法 http://support.microsoft.com/kb/404896

mintbreeze
質問者

お礼

ありがとうございます。 上記の方法で解決しました。

その他の回答 (6)

回答No.6

> SQL文は以下の通りです。 SQL文は、下記のようにすべきです。 SELECT T_アルバム.アルバムID, T_アルバム.アルバム名, T_アルバム.ジャンルID, T_アルバム.ソースID, T_アルバム.アーティストID, MT_アーティスト.アーティスト名 FROM MT_アーティスト INNER JOIN T_アルバム ON MT_アーティスト.アーティストID = T_アルバム.アーティストID; アーティストID は T_アルバム の方を表示させる。 アーティスト名のテキストボックスは編集ロックをかけておいて、更新できないようにしておく。 > アーティストの新規入力は、フォームを別個独立させるべきかもしれませんね。 そうしたほうがいいと思います。 コンボボックスを使えば、リストにないアーティスト(新規アーティスト)を入力したときは、リスト外入力のイベントで、自動的に新規入力用フォームを呼び出すVBAを割り当てるなどの設計にすることができます。 ちょっと古いですが、下記が参考になると思います。 [AC95] コンボボックスのリストに新しいデータを追加する方法 http://support.microsoft.com/kb/404896

mintbreeze
質問者

お礼

ありがとうございます。 上記の方法で解決しました。

回答No.5

> T_アルバムだけ(これを(1)とする)でフォームを作成 ⇒ ○ これでエラー無しに入力出来るなら、下記のようにコンボボックスを利用すればどうでしょうか。 フォームのレコードソースは、 T_アルバム。 コンボボックスを配置して、下記のように設定。 コントロールソース アーティストID 値集合ソース MT_アーティスト 連結列 1 自動拡張 はい 列数 2 列幅 0cm;3cm 3cmの部分は、適宜変更してください。 これで、アーティスト名をリストから選択して入力することができます。 直接ボックスに入力することも可能。 ソースやジャンルも同様に設定します。 コンボボックスにするメリットは、マスターテーブルにない値を入力することを自動ではじいてくれることです。

mintbreeze
質問者

お礼

ジャンルとソースは最終的にはコンボボックスにしようと考えていました。 アーティストは・・・、何らかの形で新規入力もできたらと考えていたので保留中ですが・・・。 アーティストの新規入力は、フォームを別個独立させるべきかもしれませんね。 そうすれば、アーティストもコンボボックスにできそうです。

回答No.4

> (1)にMT_アーティストを追加し、リレーションシップ→クエリ→フォームを作成 ⇒ ×(エラー発生) クエリをフォームのレコードソースにしたのですね。 どのようなクエリを作成しましたか。 クエリのSQL文をコピーして貼り付けてもらえますか。

mintbreeze
質問者

お礼

SQL文は以下の通りです。 SELECT T_アルバム.アルバムID, T_アルバム.アルバム名, T_アルバム.ジャンルID, T_アルバム.ソースID, MT_アーティスト.アーティストID, MT_アーティスト.アーティスト名 FROM MT_アーティスト INNER JOIN T_アルバム ON MT_アーティスト.アーティストID = T_アルバム.アーティストID;

回答No.3

当方の Win7 AC2007 の環境で T_アルバム ★アルバムID テキスト型 アルバム名 テキスト型 ジャンルID テキスト型 ソースID テキスト型 アーティストID テキスト型 というテーブルを作成して、ウィザードで単票フォームを作成して、 データを入力してみましたが、症状を再現できませんでした。 新規のデータベースを作成して、上記のように単純なもので試しても再現できますか。 もし、エラーで出ないなら、 MT_アーティスト、MT_ジャンル、MT_ソース、T_曲目 等を一つずつ追加してリレーションシップを設定して、入力していってエラーが出るかどうか確認してみてください。 もし、エラーがで出たなら、そのエラーで出るまでの手順をご提示ください。 こちらでそのエラーが再現できたら、原因を追及することができるかも知れません。

mintbreeze
質問者

お礼

調べて頂きましてありがとうございます。 当方で確認してみました。 T_アルバムだけ(これを(1)とする)でフォームを作成 ⇒ ○ (1)にMT_アーティストを追加し、リレーションシップ→クエリ→フォームを作成 ⇒ ×(エラー発生) (1)にMT_ジャンルを追加し、リレーションシップ→クエリ→フォームを作成 ⇒ × (1)にMT_ソースを追加し、リレーションシップ→クエリ→フォームを作成 ⇒ × (1)にT_曲目を追加し、リレーションシップ→クエリ→フォームを作成 ⇒ ○ という結果になりました。 MT_アーティスト、MT_ジャンル、MT_ソースいすれもNGというのが引っかかるのですが・・・

回答No.2

> その前段階として、T_アルバムで単票フォームを作ろうとして、質問の状態に至りました。 レコードソースは T_アルバム ですか。 それで、 > アルバムIDやアルバム名を入力しようとすると > 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 > と表示されます。 という状況ですか? もう少し詳細な状況を説明してもらえますか。 とりあえず、 T_アルバム の ジャンルID に MT_ジャンル に存在しない値を入力してませんか。 あるいは ソースID に MT_ソース に存在しない値、アーティストID に MT_アーティスト に存在しない値を入力してませんか。

mintbreeze
質問者

お礼

度々の回答ありがとうございます。 >T_アルバム の ジャンルID に MT_ジャンル に存在しない値を入力してませんか。 >あるいは ソースID に MT_ソース に存在しない値、アーティストID に MT_アーティスト に存在しない値を入力してませんか。 T_アルバムのデータを一通り確認してみましたが、そのような入力はありませんでした。 (T_アルバムのデータは動作確認用の単純なもので、確認は容易です)

回答No.1

T_アルバム と T_曲目 は一対多の関係になります。 この場合、一側(T_アルバム)のデータを先に入力しておかないと、そのようなエラーが表示されます。 このような関係のデータをクエリで一つにまとめて入力しようとするとうまく行かない場合が多いです。 Accessではこのような場合、メイン/サブフォーム形式の入力フォームを利用します。 クエリは使わずに、ウィザードで両方のテーブルから直接、必要なフィールドを選択すると自動でメイン/サブフォーム形式の入力フォームを作成してくれます。(リレーションシップが正しく設定されている場合) あるいは、T_アルバム から単票フォームを作成、T_曲目 から帳票フォームを作成して、T_アルバムのフォームのデザインビューに、T_曲目のフォームをドラッグ&ドロップしても作成することができます。 下記は、学生 と 成績 という一対多の関係のデータをメイン/サブフォームにしている例です。 Access2007入門部屋 練習1:成績管理データベース(2) http://www.mahoutsukaino.com/ac/access2007/04_db3/02.htm 下記は、メイン/サブフォーム形式についての総括的な解説です。 サブフォームを含むフォーム (一対多のフォーム) を作成する - Access - Office.com http://office.microsoft.com/ja-jp/access-help/HA010098674.aspx

mintbreeze
質問者

お礼

回答ありがとうございます。 実は目指しているのは、そのようなメイン/サブフォームです。 その前段階として、T_アルバムで単票フォームを作ろうとして、質問の状態に至りました。 質問における説明が不足していたことは大変申し訳ありません。

mintbreeze
質問者

補足

続報です。 お礼投稿後に、T_曲目からサブフォームを作成してメインフォームと結合してみましたが、同じエラーが表示されました。 どうすれば良いのでしょうねぇ・・・

関連するQ&A

  • Access2000 / 「レコードを追加できません」

    こんにちは Access2000で困っております。 簡単にいいますと、フォーム上から日付/時刻型のデータを入力しようとしても 「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されうまく入りません。 テーブルの構成ですが、 ★が主キー (1)T現場台帳 ★NO(オートナンバー型) 現場記号(テキスト型) ・ ・ 省略 (2)T外部集計警備 ★NO(オートナンバー型) 現場記号(テキスト型) 警備依頼日付(日付/時刻型) 警備会社ID(数値型) 集計人数(数値型) (3)T警備会社 ★警備会社ID 警備会社名(テキスト型) ・ ・ 省略 上記テーブルはリレーションがかかっており、 (1)T現場台帳.現場記号(テキスト型)----(2)T外部集計警備.現場記号(テキスト型) (2)T外部集計警備.警備会社ID(数値型)---(3)T警備会社.★警備会社ID それぞれ、参照整合性のついたリレーションです。 更にこれらをまとめるために、Q警備会社集計クエリ(選択クエリ)をつくりフォームに利用しています。 Q警備会社集計クエリの構成 T現場台帳.担当者ID T外部集計警備.警備依頼日付 T外部集計経緯日.警備会社ID T警備会社.警備会社名 T外部集計警備.集計人数 (並べ替えや絞込みは、なし) この「Q警備会社集計クエリ」を使って フォームからウイザードを使用してフォームを作成し、警備依頼日付を入力しようとすると「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されます。 どなたか、Accessの痒いところまで手の届く方、お助けください。

  • Access アクセス VBA レコード追加

    Access フォームからのレコードの追加方法を教えてください。 テーブル1 ・ID(主キー) ・窓口 ・コストセンター ---------- テーブル2 ・コストセンター(主キー) ・目的 ---------- リレーションシップ テーブル1のコストセンターとテーブル2のコストセンターを一対多 ---------- メインのフォームに”ID”を入力したときにテーブル1に一致するレコードがない場合、新規登録用のフォームが表示されるようになっています。 新規登録用のフォームにレコードを入力してもテーブルに反映されません。 新規登録用のフォームは下記のように作成しています。 また、フォームに”コストセンター”を入力したときに入力したレコードがテーブル2にあっても自動で”目的”が表示されません。 メインフォームにはサブフォームで各テーブルが表示されています。 フォーム ・ID(初期値•••メインで入力したID) ・窓口 ・コストセンター ・目的 ・コストセンター(非表示) 上から順に ・テーブル1 ・テーブル1 ・テーブル2 ・テーブル2 ・テーブル1

  • Access VBAで自動連番を振るには

    【テーブル名】T_株券管理 【フォーム名】F_株主入力 【フィールド名】株主ID(テキスト型)(主キー) フォームに入力する際にオートナンバーを使用せずに、 レコードが切り替わると「株主ID」が「00001」「00002」「00003」・・・・というように1づつ発番されるようにしたく、AccessVBAの本を読んだり、ネットでDmax等調べているのですが、必要な情報が探せずに困っています。 本当はオートナンバーでIDを振っても良いのですが、レコードの削除等行った時に歯抜けになってしまうので、うる覚えで申し訳ないのですが・・・確か、フォームのテキストボックスのプロパティ、コードビルダでVBを「レコードが移動した際に」→「株主IDが0の場合に”00001”を、0でない場合には既存の数値に+1した数値をテーブルT_株券管理の”株主ID”に入力する。」といった感じの記述がしてあったと思います。VB初心者なので、説明が上手くできずにすみません。 このような記述方法はありますでしょうか?

  • フォームのレコードソース(Access2000)

    質問させていただきます。 フォームの「レコードソース」でテーブルとクエリーのほかに、「SELECT テーブル名、フィールド名・・・」というのがあります。これもクエリーなのでしょうか? ちなみに、レコードソースの右にある「---」をクリックすると「SQLステートメント:クエリビルダ」というものが開きます(クエリー画面と同じ?)。 また、フォームのレコードソースはテーブル、クエリー、SOLステートメントのどれにすれば良いのでしょうか?

  • Accessのフォームについて教えて下さい

    Access 2010のフォームについてお教え下さい。 テーブルにはテーブル名T1、フィールド「ID」、「Price」というテキストボックス。2フィールドがあります。 テーブルの各データは、 ID,Price 001,100 002,200 003,300 フォームにはにフォーム名F1、「cmb」というコンボボックスと、「price」というテキストボックスが配置されています。 「cmb」のデータは値集合ソースで、「SELECT T1.ID FROM T1;」と指定しています。 「cmb」で選択したデータのプライスを「Price」テキストボックスに表示したいと思います。 例えば、「001」を選択したら、「100」と表示されるようにしたいと思います。 色々調べているのですが、どうやってやるのかわかりません。どのように実現したらよろしいでしょうか? よろしくお願いいたします。

  • Access VBAで自動連番を振るには

    Access2000で株主管理DBを作成中です。 【テーブル名】T_株券管理 【フォーム名】F_株主入力 【フィールド名】株主ID(テキスト型)(主キー) フォームに入力する際にオートナンバーを使用せずに、 レコードが切り替わると「株主ID」が「00001」「00002」「00003」・・・・というように1づつ発番されるようにしたく、AccessVBAの本を読んだり、ネットでDmax等調べているのですが、必要な情報が探せずに困っています。お手数ですが教えて頂けますでしょうか。よろしくお願い致します。

  • Accessフォームのコントロールソースについて

    こんにちは。お世話になります。 分からないので押していただけると助かります。 Accessのフォームでテキストボックスに表示するデータについて何ですが、 テーブルT1の項目名[住所]が、Nullの時に、[電話番号]を表示する形にしたいのですが、 コントロールソースに =IIF([ID]is null ,[仮ID],[住所] =Nz([ID],[仮ID]) のどちらを入力しても、#エラーになります。 そこで、そのようなことってできるのかどうかを教えていただきたいのです。 また、できたとして、新規入力する時には、T1のテーブルの[ID]欄に入力するようにしたいのですができますか? レコードソース=T1 です。 すみませんがよろしくお願いいたします。

  • アクセス フォームの設定

    テーブル【T-1】 フィールドA,主キー,数値型 フィールドB,テキスト型 フィールドC,テキスト型 フィールドD,テキスト型 フィールドE,テキスト型 フォーム【F-1】 テーブル【T-1】に入力用のフォーム,単票型 があります。 F-1でそれぞれのフィールドに対して入力スペースがあり(もちろんですが) A,B,C,D,Eと順番に入力していきます。 ここでエンターキーを押すと、次のレコードへ移るわけですが、 カーソルがEの位置にあるため、わざわざマウスでAの位置へ移動させないといけません。 同様に、入力項目がなく、A,B,Cと入力して次のレコードへ行くと、Cの位置にカーソルがあります。 これを、Aをホームポジションとして、次のレコードへ移ったときに 自動的にカーソルをAの位置にもってくるようにしたいのですが、 一体どうすればよろしいでしょうか?

  • ACCESSでコピーしたレコードのフィールド置換作業の繰返しを簡素化したいです

    ACCESS2000を使っています。テーブルには必ず「Nenndo」というフィールド名(数値型十新型)で西暦4桁が入力されています。(このフィールドはキーにもインデックスにもなってません)たとえば、 T_M001テーブルのNendoフィールドに2007が入力されたレコードが340件 T_M002テーブルのNendoフィールドに2004が入力されたレコードが823件 こんな感じでNendoフィールドがあるテーブルが沢山あります。 これらのテーブルのNendoフィールドに格納されているレコードをコピー置換作業して2004から2008までのデータを作成したいです。 T_M001であれば2007が入力されてるレコードをコピーして、貼付たレコードNendoフィールドの2007を2004へ置換、また2007のレコードをコピーして2005へを繰り返の作業してます。レコード数は340件が1360件増えて1700件。 テーブルが沢山あって作業に苦慮してます。 ACCESSのモジュールでもマクロでも構いませんので対応策等ご教授願います。

  • アクセス メモ型 255文字以上入れられない

    アクセスでテーブルデザインでメモ型にしています。 そのフィールドには何文字でも入力できるようですが、 そのフィールドをフォームのテキストボックスのコントロールソースにすると なぜか255文字以上入力できません。 テーブルは一度クエリにして、フォームのレコードソースとしています。 ダイレクトにテーブルを開いて、そのメモ型のフィールドに情報を入れることは出来ますが フォームからは255文字以上は入力できません。 これを回避する方法をご教授ください。