dポイントプレゼントキャンペーン実施中!

お世話になります。色々調べたり、実験してみたのですが、分からない点があります。
簡単でいいので、可能性のある原因を教えてください。

アクセス2003です。

■パターン1  フォームC の入力ができる
テーブルA(主キーがオートナンバー型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ)
→それらを元にクエリBを作る→クエリBを元にフォームC を作る

■パターン2  フォームC の入力ができない
テーブルA(主キーが数値型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ)
→それらを元にクエリBを作る→クエリBを元にフォームC を作る

簡単にいうと、テーブルのデータ型によって、入力可否が変わるのです。
なぜ、パターン2は、入力できないのか分かりません。

よろしくお願いします。

A 回答 (3件)

「主キー制約」は、実は、正しい表現じゃないです。


ここでは、「主キーは重複出来ないという制限」と表現すべきでした。
そういうことで誤解を与えたようです。
お詫びして表現を訂正させていただきます。
    • good
    • 0
この回答へのお礼

ありがとうございました。
そういう意味だったのですね。分かりました。

お礼日時:2007/09/04 14:33

主キーとは、ユニークキー(一意)ということです。


オートナンバー型の場合は、レコードが発生すれば自動的にシーケンシャルにユニークな値が発生します。
ですから、このオートナンバー型はプログラミングの手間隙を省く上では便利。
しかし、一旦、テーブルが破損した場合の修復ではやっかいな問題の種にもなります。
採番テーブル等を利用してオートナンバー型の利用を避ける理由です。
なお、簡易的に、DMAX関数で最大値を取得し+1するという手法もあります。
小規模データベースでDMAX関数の速度とかネットワークトラフィックの混雑が問題にならなければOK。
Access は本来スタンドアローンですから、通常は、DMAX関数での管理で良いと思います。

パターン2は、そういうことでテーブルAの主キーを管理していなきゃ0が発生していたということ。
一回は入力できるでしょうが、2度目からは主キー制約に引っかかって入力不可。

ところで、パターン1でも主キー制約に引っかかっているとのこと。
ならば、先ずは、2つの簡単なテーブルで主キー管理の仕組みを確立されたがいいです。

<A>
ID___Name
1____あああ

<B>
ID___A_ID___Name
1________1___kkk
2________1___いいい

ものすごく簡単なテーブルを用意。
これで、フォームウィザードでフォーム<A>、フォーム<B サブフォーム>を生成。
当然に、主キーを管理しなきゃならんです。

Form:A
Private Sub Form_BeforeInsert(Cancel As Integer)
  Me.ID = Nz(DMax("ID", "A")) + 1
End Sub

Form:B
Private Sub Form_BeforeInsert(Cancel As Integer)
  Me.ID = Nz(DMax("ID", "B")) + 1
End Sub

注意を要するのは、Nz関数を使うこと。
DMax関数は、レコードがゼロであればNull を返します。

[イミディエイト]
? Null + 1
Null

この場合、イミディエイトウィンドウでテストすれば判りますが主キーはカウントアップされないです。

※ここに示している方法は、最善とは限りません。単なる初手のやり方です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
上のほうはなんとなく理解できたのですが、
下の部分が難しくてよく理解できません。
たくさん書いていただいたのに、申し訳ないです。

主キー制約って何ですか?

お礼日時:2007/09/04 13:14

テーブルAの主キーを管理していますか?

    • good
    • 0
この回答へのお礼

早速ありがとうございます。
主キーを管理しているというのは、どういう意味ですか?

あと、質問内容が少し違ってました!申し訳ありません。

パターン1も入力できませんでした。
入力できるのは、パターン1(オートナンバー型)で、主キーを設定しない場合のみでした。

お礼日時:2007/09/04 10:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!