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

解決済みの質問

Access2000 VBA(ADO)を使用して主キーの空きを探す処理

「id」(文字型・8バイト)を主キーとした、簡単なテーブルを作成しました。
この「id」のフィールドには一応「KEY-0」~「KEY-10」まで入力されています。
(数字の部分は0,1,2,3,4,5・・・10となっています。)
この主キーの空き(重複しない値)を探す処理を以下の様に作成しましたが、どうも上手いきません。
期待する主キーの空きは、「KEY-11」だと思うのですが、なぜか「KEY-10」で処理が抜けてしまいます。

ソフトウェア)Access2000
言語)VBA(ADOを使用しました。)

初歩的な事かもしれませんが、とても悩んでいます。
どなたかご教授いただけないでしょうか?
何卒、宜しくお願いします。

処理ここから
Private Sub IdCheck_Click()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim i As Integer
Dim TempKey as String
Dim flgKey As Boolean

Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open "TEST_TABLE", cn, adOpenKeyset, adLockOptimistic

'各変数など初期化
TempKey = ""
i = 0
flgKey = False

'主キーの空きを探すまで処理を繰り返す。
Do
TempKey = "KEY-" & CStr(i)
rs.Find "id='" & TempKey & "'"
'主キーの空きがあった場合
If rs.EOF Then
'処理を終える
flgKey = True
'主キーの空きがない場合
Else
i = i + 1
End If
Loop Until flgKey = True

'一応表示させて値の確認をしています。
MsgBox TempKey

rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

End Sub
ここまで

投稿日時 - 2005-03-25 00:33:35

QNo.1289636

困ってます

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

失礼なことを伺うようで恐縮ですが(^^;
ご提示のような方法で空きキーを探すのに特別な理由があるのでしょうか?
データベースを使うメリットが全くないように思われます。折角の主キーなのにデータ多数でも最初から1件ずつ比較して探して行く気の遠くなるような処理です。

単に重複しないキーということであれば「オートナンバー型」が一番簡単です。

データ入力が取り消された時、番号が飛んでしまうことを嫌うのであれば

SELECT Max(xx.ID) AS IDの最大 FROM xx;

みたいなSQL文で求めた最大値に+1するとか

上記例ですとどちらも数値型ですが、主キーが文字型であることにも理由があるのでしょうか?
必ず「KEY-」が付いているのも冗長に感じられます。
それぞれに理由があると思いますが、それを明示されれば、より適切なレスが付くと考えます。

投稿日時 - 2005-03-25 07:04:39

お礼

早速、ご教授くださいまして有難うございます。
また、お返事遅くなり申し訳ございませんでした。
fuuten_no_neko様のご指摘が、とても的確なご回答だと感じました。
>データベースを使うメリットが全くない
「あぁ、そうか。やっぱり甘いなぁ、自分は・・・」と思わず溜息をついてしましました。。。
おっしゃるとおりですね。
根本的にDBやSQLの勉強不足と痛感いたしました。

>主キーが文字型であることにも理由があるのでしょうか?
文字型である理由は特にありませんでした。
プログラムベースで主キーを割り当てようと考えた時、「折角なら、それからどんな番号、コードなのか分かった方が良いのかな?」なんて考えたものですから。

当初、主キーはオートナンバー型で考えていました。
ただ、参考書やWeb等で調べてみたところ、いくつかオートナンバー型の使用に注意・否定的な意見が見受けられましたので使用すべきではないのかと思い・・・
「プログラムで制御」→「主キーを文字型」→「主キーの空きを探す処理(プログラム)」の様に考えが移行していってしまった訳です。。。
でも、オートナンバー型や文字型にせよ、要は使いどころなんでしょうか。

fuuten_no_neko様のご教授いただいたとおり、主キーを数値型にして、SQLまたはオートナンバー型で考え直したいと思います。

>失礼なことを伺うようで恐縮ですが
とんでもございません!!
まだ、この様な場での質問に不慣れなものでして。
スミマセン。

>それを明示されれば、より適切なレスが付くと考えます。
おしゃるとおりですね。
今後、出来る限り簡潔・的確にお伝えする様努めます。
また、煮詰まってしまった場合こちらで、教えを請う事が多々あるかと思いますが、宜しくお願いいたします。
本当に有難うございました。

投稿日時 - 2005-03-25 17:55:03

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

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

回答(2)

ADOのFINDメソッドは、パラメータ省略時カレント行より後ろをサーチしますが...
そのロジックで、KEY-1 KEY-2 KEY-3 ・・・ KEY-10 の順で行が存在することが、
保証されていますか?

ということを考えて見てください。

というか、最も合理的な処理は、”空き番”自体を問い合わせるSQLを使うことだと思います。
それにより、VBAでの無駄なロジックを消化できるかと思います。

投稿日時 - 2005-03-25 02:42:29

お礼

早速、ご教授くださいまして有難うございます。
また、お返事遅くなり申し訳ございませんでした。
>ADOのFINDメソッドは、パラメータ省略時カレント行より後ろをサーチしますが...
>KEY-1 KEY-2 KEY-3 ・・・ KEY-10 の順で行が存在することが、保証されていますか?
いや、全く保証されていませんでした。
ADOのDB操作に関してもう少し調べたいと思います。
同時にfuuten_no_neko様に述べた内容と重なってしまいますが、DBやSQLの勉強をもっとしようと思います。
今回は、SQLまたはオートナンバー型で考え直したいと思います。

また、煮詰まってしまった場合こちらで、教えを請う事が多々あるかと思いますが、宜しくお願いします。
本当に有難うございました。

投稿日時 - 2005-03-25 17:56:41

あなたにオススメの質問