こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access 「主キーにはnull値を~」のエラー

こんにちは。閲覧ありがとうございます。
私はAccess初心者です。
勉強と実用をかねて個人用の「家計簿」をWindows7のAccess2010で作成しております。フォームを使用し、費目を記録して、ゆくゆくは集計なども行いたいと考えています。

いくつかの失敗に当たりながらどうにか形はできたのですが
『インデックスまたは主キーには、null値を使用できません。』
というエラーが出てきてしまい、これがどうしても解決できないでいます。

初心者があやふやな言葉を並べるより、現物を見ていただいた方が早いと思うので、以下に私が作成中の「家計簿rev2.accdb」をアップロードしておきました。
http://www1.axfc.net/uploader/so/2884464.zip
(稚拙で見難いことこの上ないかもしれませんが、初心者ゆえご容赦ください・・・)

仕様としましては、フォームの「Fmain家計簿DB」に、「レシートNo、購入日、種類ID、費目、値段、個数、店舗ID、その他」と入力して、最後に次のレコードに移れば、レコードが一つ記録されるといった具合(のはず)です。
各テーブルの主キー以外には「空文字列の許可を"はい"」「値要求を"いいえ"」「インデックスを"いいえ"」に設定してあります。
オートナンバー型を使用しているのはテーブルの「Tmain家計簿DB」の主キーのみです。
また、「フィールドとキーが一致しているレコードをテーブルで探すことができません」というエラーが出るのを回避するため、こちらの質問を参考にさせてもらい外部結合の設定をしてあります。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1368686318

そして、フォームに想定通りのデータを入力すると『インデックスまたは主キーには~』のエラーが出てしまいます。
せめてどこにnull値が入っててエラーが出てるのかを表示してくれたらいいのですが・・・

以上になります。長文お読みいただきありがとうございました。
こんな簡単なdbの作成でお手上げ状態になるとは情けない限りです・・・
どなたか、『インデックスまたは主キーには、null値を使用できません。』の解決策をご教示いただけるとありがたいです。
よろしくお願いいたします。

投稿日時 - 2013-04-29 17:28:30

QNo.8065083

困ってます

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

続きです


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.として
自分なりにデザインしたものを添付します。

投稿日時 - 2013-05-01 16:27:22

お礼

ご回答ありがとうございます。
詳しく解説してくれた上、改善案まで提示してくださるとは、本当にありがとうございます。デザインの方、ありがたくそっくりそのまま真似させてもらいます。

皆様それぞれ、とてもためになるご回答をくださり、ベストを選ぶのが心苦しくありますが、繰り返し疑問に答えてくれ改善案も提示してくれたchayamatiさんの回答をベストアンサーに選ばせてもらいます。皆様、この度はどうもありがとうございました。

投稿日時 - 2013-05-03 03:29:36

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

主キーの制約事項で自分が体験したことに
一つはあなたも確認済みの空白が許されない
もう一つが修正が効かない事です。

前回も記述しましたが、主キーをオートナンバーにすることにより
フォーム設計でフィールドを省略できるので入力項目も一つ減り
データの入力の効率化につながります。

投稿日時 - 2013-05-01 10:12:11

ANo.3

主キーはリレーショナルデータベースの根幹になる重要な部分です。
そのため制約が必要です。NULL値もその一つでしょう

※他のレコードをこのレコードにリレーションを設定すると主キーの内容が必要と
思われますが、テーブル設計でルックアップのコンボボックス設定することで
解消します。
またフォーム及びクエリー及びレポードにオートナンバーの主キーを配置する必要もないです。

主キーに変な意味付け(年+ナンバート)せずに全てオートナンバー型にして
全てお任せにしてしまいましょう
意味付けは「勘定科目名」のほか「勘定科目コード」等フィールドを追加します。
勘定科目コードは勘定科目毎の合計とリストの順序を一定にするため必要です。
勘定科目名、勘定科目コードは重複してはダメですね、この設定もテーブル設定で
フィールドプロパティーのインデックスで設定できます。

テーブルで設定した内容は次の、クエリー、フォーム、レポートに反映されます。

投稿日時 - 2013-04-30 11:50:42

お礼

回答ありがとうございます。
オートナンバー型の主キーと意味付けされたコードを分ける、という発想はできませんでした。そのような設計の方が障害耐性や拡張性などがあるのでしょうか?こちらもまたとても良い勉強になりました。ありがとうございます。

投稿日時 - 2013-05-01 02:36:15

ANo.2

新規レコード入力に際し、「TレシートNo」の「レシートNo」がNULLだからです。

#1さんが回答しているように、「TレシートNo」と「Tmain家計簿DB」の関係が1:nの関係であり
現状のフォームで入力したデータは「Tmain家計簿DB」をへの追加は可能ですが、
「TレシートNo」へのレコード追加ができません。

投稿日時 - 2013-04-30 09:36:14

お礼

回答ありがとうございます。
私が作ったフォームだと、確かに「レシートNo」のみ多側から1側へレコード追加しようとしています。そしてまさにココが原因だったのですね!原因が判明しとてもスッキリしました。本当にありがとうございます。

投稿日時 - 2013-05-01 02:36:11

ANo.1

データベース用語では、TレシートNO と Tmain家計簿DB は「一対多の関係」にあるといいます。
このようなデータを同時に入力する場合は、Accessでは通常は一側をメインフォームとして、多側をサブフォームとして埋め込みます。
リレーションシップを設定して、フォームウィザードで両方のテーブルからフィールドを選択すると、途中で、「サブフォームがあるフォーム」と「リンクされたフォーム」という選択肢が出てきます。これで、「サブフォームがあるフォーム」を選択すると簡単に作成することができます。それを元に自分好みのデザインに変更したらどうでしょうか。

ちなみに「リンクされたフォーム」を選択すると2つの独立したフォームになり、一側のフォームからボタンで多側のフォームを呼び出すことになります。

投稿日時 - 2013-04-29 22:21:23

お礼

お早い回答ありがとうございます。
「サブフォームがあるフォーム」を早速試してみました。なるほど、このようなやり方もあるのですね。こちらのフォームもなかなか良さそうです。勉強になりました。ありがとうございます!

投稿日時 - 2013-05-01 02:35:43

あなたにオススメの質問