- ベストアンサー
Access VBAでのIDの自動発番
AccessのVBAでIDを自動発番するプログラムを書いています。 現在、以下のようなコードを書いています。 Insert into A(id, idid, no, name) select dmax(id, A)+1, B.idid, B.no, B.name from B ちなみにid、idid、noは数値型です。nameはテキスト型です。 このプログラムを実行しても何も起こりません。 SQLビューで確認するとパラメータの入力を求められます。 この問題にはまってしまっています。 ご教授のほどよろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> strSQL = Insert into A(id, idid, no, name) select dmax(id, A) + DCount(*, B, id <= B.id), B.idid, B.no, B.name from B ↓ strSQL = "Insert into A(id, idid, no, name) select dmax(""id"",""A"") + DCount(""*"", ""B"", ""id <="" & B.id), B.idid, B.no, B.name from B" ※ クエリのSQLビューで見た時の " は、 "" にします。
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
1つの例として、 テーブルBにレコード順を示すフィールド、id (オートナンバー)があるとします。 > dmax("id", "A")+1 ↓ dmax("id", "A") + DCount("*", "B", "id <= " & B.id) とすることで、 テーブルAの最大値+テーブルBでの何個目という数値が得られます。 select dmax("id", "A") + DCount("*", "B", "id <= " & B.id), B.idid, B.no, B.name from B で1度確認してみてください。
お礼
ありがとうございます!!! こんなコードになるとは想像もつきませんでした。。。 ご提示いただいた方法でできていることを確認できました。 SQLビューでは確認できましたので、これをVBEに転記してみて 試してみます。
補足
すいません。追加で質問させてください。 VBEでSQL文を転記したところダブルコーテーションらしきところで エラーが出てしましました。 そこで、以下のようにダブルコーテーションを取ってみたら構文 エラーはなくなりましたが、何も実行されなくなってしまいました(汗) dim strSQL as String strSQL = Insert into A(id, idid, no, name) select dmax(id, A) + DCount(*, B, id <= B.id), B.idid, B.no, B.name from B CurrentDb.Execute strSQL, dbFailOnError まだダブルコーテーションの意味があまりよく理解できていませんので、 その辺も含めてご教授いただけるとありがたいです。 よろしくお願いいたします。
- 30246kiku
- ベストアンサー率73% (370/504)
1度、予約名とか使わないフィールド名にしてみたらどうなりますか。 (no, name は予約語のようです) もしくは、各フィールド名を [ ] で囲ってみるとどうなりますか。 select dmax("id", "A")+1, B.idid, B.no, B.name from B のみのクエリ表示はどうなりますか。 テーブルBには、何件レコードが入っていますか。 2件以上の場合には、 dmax("id", "A")+1 が同じ値になるので、2件目以降はエラーとなると思うのですが。
お礼
フィールド名は便宜上、noやnameとしておりまして、 本来はアンダーバーの付いた名前となっております。 また、[]で囲んでみたところ、同様に何もおきませんでした。 SQLビューではパラメータの入力を求められます。 >select dmax("id", "A")+1, B.idid, B.no, B.name from B のみのクエリ表示はどうなりますか。 これを実行すると自動発番したいidがかぶっていました。。。 完全にこれでキーがかぶってしまい、エラーの原因であることがわかりました。 ちなみにテーブルBには5件のデータが入っています。 この方法で連番を振るのは不可能なのでしょうか?? 全然想像が付きませんので、引き続きご指導をお願いいたします。
- 30246kiku
- ベストアンサー率73% (370/504)
> Insert into A(id, idid, no, name) select dmax(id, A)+1, B.idid, B.no, B.name from B ↓ Insert into A(id, idid, no, name) select dmax("id", "A")+1, B.idid, B.no, B.name from B としてみると、どうなりますか。
お礼
早速の回答ありがとうございます。 Visual Basic Editorでご教授いただいたように書くと 赤文字となりエラーとなってしまいます。
補足
30246kikuさんいつも回答ありがとうございます。 回答してくださったSQL文をSQLビューで記載すると レコードのキー違反が出てしまいました。 ちなみに追記したい「id」は数値型で、インデックスは「はい (重複なし)」 となっており、このテーブルの主キーにしております。
お礼
引き続きのご回答ありがとうございます。 無事に完成いたしました。 丁寧なご回答に感謝しております。 ありがとうございました。