プロが教えるわが家の防犯対策術!

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ビューで確認するとパラメータの入力を求められます。

この問題にはまってしまっています。
ご教授のほどよろしくお願いいたします。

A 回答 (4件)

> 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
としてみると、どうなりますか。

この回答への補足

30246kikuさんいつも回答ありがとうございます。

回答してくださったSQL文をSQLビューで記載すると
レコードのキー違反が出てしまいました。
ちなみに追記したい「id」は数値型で、インデックスは「はい (重複なし)」
となっており、このテーブルの主キーにしております。

補足日時:2009/04/13 21:46
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

Visual Basic Editorでご教授いただいたように書くと
赤文字となりエラーとなってしまいます。

お礼日時:2009/04/13 21:44

1度、予約名とか使わないフィールド名にしてみたらどうなりますか。


(no, name は予約語のようです)

もしくは、各フィールド名を [ ] で囲ってみるとどうなりますか。

select dmax("id", "A")+1, B.idid, B.no, B.name from B
のみのクエリ表示はどうなりますか。

テーブルBには、何件レコードが入っていますか。

2件以上の場合には、
dmax("id", "A")+1
が同じ値になるので、2件目以降はエラーとなると思うのですが。
    • good
    • 0
この回答へのお礼

フィールド名は便宜上、noやnameとしておりまして、
本来はアンダーバーの付いた名前となっております。


また、[]で囲んでみたところ、同様に何もおきませんでした。
SQLビューではパラメータの入力を求められます。

>select dmax("id", "A")+1, B.idid, B.no, B.name from B
のみのクエリ表示はどうなりますか。

これを実行すると自動発番したいidがかぶっていました。。。
完全にこれでキーがかぶってしまい、エラーの原因であることがわかりました。
ちなみにテーブルBには5件のデータが入っています。


この方法で連番を振るのは不可能なのでしょうか??
全然想像が付きませんので、引き続きご指導をお願いいたします。

お礼日時:2009/04/13 23:03

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度確認してみてください。

この回答への補足

すいません。追加で質問させてください。
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

まだダブルコーテーションの意味があまりよく理解できていませんので、
その辺も含めてご教授いただけるとありがたいです。
よろしくお願いいたします。

補足日時:2009/04/14 00:16
    • good
    • 0
この回答へのお礼

ありがとうございます!!!
こんなコードになるとは想像もつきませんでした。。。
ご提示いただいた方法でできていることを確認できました。

SQLビューでは確認できましたので、これをVBEに転記してみて
試してみます。

お礼日時:2009/04/13 23:55

> 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ビューで見た時の " は、 "" にします。
    • good
    • 0
この回答へのお礼

引き続きのご回答ありがとうございます。
無事に完成いたしました。

丁寧なご回答に感謝しております。
ありがとうございました。

お礼日時:2009/04/14 10:04

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