- ベストアンサー
Access「主キーにはnull値を~」のエラー
- Access初心者が作成した「家計簿」で『インデックスまたは主キーには、null値を使用できません。』のエラーが発生しています。
- フォームの入力時に『インデックスまたは主キーには~』のエラーが表示され、原因が分からず困っています。
- エラーメッセージが表示され、どこにnull値が入っているかが分からず困っています。解決策を教えていただけると助かります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
続きです (http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1368686318) このサイトのベストアンサーはテーブル間の結合に 1、完全一致 2、一方のテーブルの全てと他のテーブルに一致するレコードが無ければその項目が空白 仮にAテーブルとBテーブルとして 2-1.Aテーブルの全てとBテーブルに一致するレコード 2-2.Bテーブルの全てとAテーブルに一致するレコード この3通りの結合があるという事ですね フォームに想定通りのデータを入力すると『インデックスまたは主キーには~』のエラーが出てしまいます。 せめてどこにnull値が入っててエラーが出てるのかを表示してくれたらいいのですが・・・ --------------------------------------- こちらで再現出来ません。 何度も修正なさっているうちに変なデータが残ってしまったのでは おそらく主テーブルがAテーブルで複テーブルがBテーブルとして Bテーブルに無い項目がAテーブルの主キーにリレーションが設定しているものと思われます。 2-2の設定でクエリーを作成してクエリーを開くとAテーブルの項目が空白のレコードが表示されると思われます。 リレーションシップの編集は、クエリーをデザインビューで開き 【リレーションシップのラインを右クリック】⇒【結合のプロパティー】⇒【結合の種類選択】⇒【OK】 ----------------------------------------- レシートNo、購入日、種類ID、費目、値段、個数、店舗ID、その他 は1つのレコードの項目ですか 種類ID、店舗IDはそれぞれ種類テーブル、店舗テーブルが有りますね 種類テーブルには食材費、教養費等費用項目のほか給料、受取利息等収入項目 預金等財産項目、借入金等負債項目を想定されてますか? 目的は家計簿ですね、少なくとも現金出納帳の項目は必要です。 金額項目が値段の一項目だけではどうかと思います。 レシートNo.はどうかと思います。伝票No.として 自分なりにデザインしたものを添付します。
その他の回答 (4)
- chayamati
- ベストアンサー率41% (260/624)
主キーの制約事項で自分が体験したことに 一つはあなたも確認済みの空白が許されない もう一つが修正が効かない事です。 前回も記述しましたが、主キーをオートナンバーにすることにより フォーム設計でフィールドを省略できるので入力項目も一つ減り データの入力の効率化につながります。
- chayamati
- ベストアンサー率41% (260/624)
主キーはリレーショナルデータベースの根幹になる重要な部分です。 そのため制約が必要です。NULL値もその一つでしょう ※他のレコードをこのレコードにリレーションを設定すると主キーの内容が必要と 思われますが、テーブル設計でルックアップのコンボボックス設定することで 解消します。 またフォーム及びクエリー及びレポードにオートナンバーの主キーを配置する必要もないです。 主キーに変な意味付け(年+ナンバート)せずに全てオートナンバー型にして 全てお任せにしてしまいましょう 意味付けは「勘定科目名」のほか「勘定科目コード」等フィールドを追加します。 勘定科目コードは勘定科目毎の合計とリストの順序を一定にするため必要です。 勘定科目名、勘定科目コードは重複してはダメですね、この設定もテーブル設定で フィールドプロパティーのインデックスで設定できます。 テーブルで設定した内容は次の、クエリー、フォーム、レポートに反映されます。
お礼
回答ありがとうございます。 オートナンバー型の主キーと意味付けされたコードを分ける、という発想はできませんでした。そのような設計の方が障害耐性や拡張性などがあるのでしょうか?こちらもまたとても良い勉強になりました。ありがとうございます。
- x0000x
- ベストアンサー率52% (67/127)
新規レコード入力に際し、「TレシートNo」の「レシートNo」がNULLだからです。 #1さんが回答しているように、「TレシートNo」と「Tmain家計簿DB」の関係が1:nの関係であり 現状のフォームで入力したデータは「Tmain家計簿DB」をへの追加は可能ですが、 「TレシートNo」へのレコード追加ができません。
お礼
回答ありがとうございます。 私が作ったフォームだと、確かに「レシートNo」のみ多側から1側へレコード追加しようとしています。そしてまさにココが原因だったのですね!原因が判明しとてもスッキリしました。本当にありがとうございます。
- hatena1989
- ベストアンサー率87% (378/433)
データベース用語では、TレシートNO と Tmain家計簿DB は「一対多の関係」にあるといいます。 このようなデータを同時に入力する場合は、Accessでは通常は一側をメインフォームとして、多側をサブフォームとして埋め込みます。 リレーションシップを設定して、フォームウィザードで両方のテーブルからフィールドを選択すると、途中で、「サブフォームがあるフォーム」と「リンクされたフォーム」という選択肢が出てきます。これで、「サブフォームがあるフォーム」を選択すると簡単に作成することができます。それを元に自分好みのデザインに変更したらどうでしょうか。 ちなみに「リンクされたフォーム」を選択すると2つの独立したフォームになり、一側のフォームからボタンで多側のフォームを呼び出すことになります。
お礼
お早い回答ありがとうございます。 「サブフォームがあるフォーム」を早速試してみました。なるほど、このようなやり方もあるのですね。こちらのフォームもなかなか良さそうです。勉強になりました。ありがとうございます!
お礼
ご回答ありがとうございます。 詳しく解説してくれた上、改善案まで提示してくださるとは、本当にありがとうございます。デザインの方、ありがたくそっくりそのまま真似させてもらいます。 皆様それぞれ、とてもためになるご回答をくださり、ベストを選ぶのが心苦しくありますが、繰り返し疑問に答えてくれ改善案も提示してくれたchayamatiさんの回答をベストアンサーに選ばせてもらいます。皆様、この度はどうもありがとうございました。