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

締切り済みの質問

Accessで、オートナンバー型を主キーにして関連テーブルを作った場合

いつも大変お世話になっております。m(_ _)m

(1)以下の設定で自動採番させた管理No.を主キーとし、テーブルを作りました。
データ型:オートナンバー型
書式:"ABC-"000
これで、ABC-から始まる3ケタの連番が自動採番されます。

(2)関連テーブルを作りました。
関連テーブルの「管理No.」は、上記と同じ設定をすると「オートナンバー」でデータが競合するのでは?と思い、テキスト型としました。

(1)を元にフォームを作成しました。
サブフォームを挿入し、(2)のデータを表示させました。管理No.でリンクする作りとなっています。

(1)の情報が1に対して、(2)の情報は複数あります。

管理No.がオートナンバーでない場合、上記のようなフォームを作って、(1)に情報を入力し、(2)に詳細情報として複数のデータを入力すると、(2)の「管理No.」は入力しなくても自動的に同じものがふられていきます。
しかし、今回は(2)に管理No.がふられないだけでなく、ページ内でエラーが発生し、フォーム自体もきちんと表示されません。

原因は、テーブルの作りにあるんでは?と思っています。
この場合、どのように作成すればいいのか教えてください。

やりたいことは、(2)のテーブルに同じ管理No.をいくつも入力しなくても済むように、管理No.でリンクしたサブフォームを作り、必要な情報(管理No.でない情報)を入力すれば、自動的に管理No.がふられるようにしたいのです。
いつもはできます。今回だけできません。

質問の内容が分かりにくい場合は補足します。
大至急の回答をよろしくお願い致します。

投稿日時 - 2006-12-12 17:23:47

QNo.2596677

すぐに回答ほしいです

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

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

回答(6)

ANo.6

#5の方法はスタンドアロンで使用するなら問題ないですが、複数同時にアクセスするとうまく動きません。
複数同時にアクセスされることを考慮する場合、一番確実な自動採番はオートナンバーです。

オートナンバーを併用する例

管理No.をテキスト型に
「ID」という名前のフィールドを増やし、オートナンバーに

フォームの更新前処理を下記のようにする

Private Sub Form_BeforeUpdate(Cancel As Integer)
Me![管理No.] = "ABC-" & Right(Str(Nz(Me![ID], 0) + 1000), 3)
End Sub


スタンドアロン環境ならどちらの方法でもいいと思います。

投稿日時 - 2006-12-14 11:11:40

ANo.5

>挑戦してみたいと思いますが・・・
>できるでしょうか?
簡単なプログラムも複雑なプログラムも
入力して走らせるという手順は同じです

入門書などを読んで簡単なプログラムを作成して走らせられるようになってください

あとはWEBで検索するだけでも有用なプログラムはいくらでも見つかります
それらをヘルプを駆使して理解していけばレパートリーが増えて
そのうち自分でも有用なものを作成できるようになるでしょう

レコードを削除時番号を再計算
Private Sub Form_AfterDelConfirm(Status As Integer)
Me.管理No.DefaultValue = "'" & "ABC-" & Format(Nz(Right(DMax("管理No", "テーブル名"), 3), 0) + 1, "000") & "'"
End Sub

レコード挿入時番号を再計算
Private Sub Form_AfterInsert()
Me.管理No.DefaultValue = "'" & "ABC-" & Format(Nz(Right(DMax("管理No", "テーブル名"), 3), 0) + 1, "000") & "'"
End Sub

フォームを開いたとき番号をセット
Private Sub Form_Open(Cancel As Integer)
Me.管理No.DefaultValue = "'" & "ABC-" & Format(Nz(Right(DMax("管理No", "テーブル名"), 3), 0) + 1, "000") & "'"
End Sub

投稿日時 - 2006-12-13 23:23:33

ANo.4

>自動採番できたとしても、その後、関連テーブルとの関係などで問題もありそうですし・・・
番号を発生させるのは番号を主キーとするテーブルにおいてのみです
関連テーブルはそれを参照するだけですから問題が発生するわけがありません
自動発生でない場合と同じことです

>ただ記述するだけでOKな簡単な内容であればトライできますが・・・
コードの見本をアップすることは出来ますが
どこに書くのかとか、どのように走らせるのかというような
VBAの一般的知識は本でも読んで勉強していただくことになります

投稿日時 - 2006-12-13 16:35:29

お礼

何度もお返事ありがとうございます。
コード見本をアップしていただけますか?
挑戦してみたいと思いますが・・・
できるでしょうか?

投稿日時 - 2006-12-13 19:43:49

ANo.3

>きちんとデータとして「ABC-001」などと自動採番させるには、
>どのような手段が有効なのでしょうか??
そのような文字列を新規レコード入力時に代入するか、
フォームを開く時とレコード追加後にフィールドの既定値にセットしてやります
VBAが必要です
トライしますか?

投稿日時 - 2006-12-12 23:57:43

お礼

お返事が遅くなってすみません。回答ありがとうございました。

VBAですか・・・(^^;)
ただ記述するだけでOKな簡単な内容であればトライできますが・・・
どうなんでしょうか?(すみません。)
しかも、自動採番できたとしても、その後、関連テーブルとの関係などで問題もありそうですし・・・
不明な点があるたびに質問させていただくかもしれませんが・・・
よろしいのでしょうか?

投稿日時 - 2006-12-13 14:28:41

ANo.2

>管理No.がオートナンバーでない場合、上記のようなフォームを作って、
>(1)に情報を入力し、(2)に詳細情報として複数のデータを入力すると、
>(2)の「管理No.」は入力しなくても自動的に同じものがふられていきます
オートナンバーでも同じです
そうならないのは
(2)のオートナンバーが(1)と同じものでないからです
リレーションシップを結ぶフィールドは同じ型でないと駄目です

つまり
>関連テーブルの「管理No.」は、上記と同じ設定をすると
>「オートナンバー」でデータが競合するのでは?と思い、テキスト型としました。
これが原因です
競合を心配する必要は全くありません
とうか(1)と同じものを入力するのでないと関連づけが出来ませんよ

別件ですが
オートナンバーを書式で
>"ABC-"000
のように表示させるのは、いい方法といえませんね
格納されているデータは数値だけですから見る人に誤解を与えるだけですよ

投稿日時 - 2006-12-12 18:46:23

お礼

返答ありがとうございました。お返事が遅くなりすみません。
上記のアドバスとおりやってみたいと思います。

ところで、

別件ですが
オートナンバーを書式で
>"ABC-"000
のように表示させるのは、いい方法といえませんね
格納されているデータは数値だけですから見る人に誤解を与えるだけですよ

↑これについてですが、これは数字データのみ格納されているということですね?きちんとデータとして「ABC-001」などと自動採番させるには、どのような手段が有効なのでしょうか??

投稿日時 - 2006-12-12 19:26:26

ANo.1

>データ型:オートナンバー型
>書式:"ABC-"000

書式の設定で文字列のように見えますが、中身は「数値型」の「長整数型」のデータです。

>関連テーブルの「管理No.」は、上記と同じ設定をすると「オートナンバー」でデータが競合するのでは?と思い、テキスト型としました。

「テキスト型」ではなく「数値型」の「長整数型」にしてみて下さい。

投稿日時 - 2006-12-12 17:51:33

補足

補足ですみません。できました。ありがとうございました。
No.2の方のアドバイスで、オートナンバーにしようかと思いましたが、このテーブルには、別にオートナンバーが設定されていたため設定ができず、数値型としたら問題は解決しました。ありがとうございました。

投稿日時 - 2006-12-12 19:29:37

お礼

回答ありがとうございました。返事が遅くなってすみません。
やはり、同じデータ型にしないとだめなんですね。
やってみます。ありがとうございました。

投稿日時 - 2006-12-12 19:24:55

あなたにオススメの質問