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ビューで確認するとパラメータの入力を求められます。
この問題にはまってしまっています。
ご教授のほどよろしくお願いいたします。
No.1
- 回答日時:
> 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」は数値型で、インデックスは「はい (重複なし)」
となっており、このテーブルの主キーにしております。
早速の回答ありがとうございます。
Visual Basic Editorでご教授いただいたように書くと
赤文字となりエラーとなってしまいます。
No.2
- 回答日時:
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件のデータが入っています。
この方法で連番を振るのは不可能なのでしょうか??
全然想像が付きませんので、引き続きご指導をお願いいたします。
No.3
- 回答日時:
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
まだダブルコーテーションの意味があまりよく理解できていませんので、
その辺も含めてご教授いただけるとありがたいです。
よろしくお願いいたします。
ありがとうございます!!!
こんなコードになるとは想像もつきませんでした。。。
ご提示いただいた方法でできていることを確認できました。
SQLビューでは確認できましたので、これをVBEに転記してみて
試してみます。
No.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ビューで見た時の " は、 "" にします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- JavaScript gasについて 1 2022/05/31 21:51
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
[MySQL] UNIQUE制約の値を更新...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
selectした大量データをinsert...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
MySQLのint型で001と表示する方...
-
VIEWの元のテーブルのindexって...
-
複数テーブルのGROUP BY の使い...
-
Unionした最後にGROUP BYを追加...
-
Access パラメータクエリをcsv...
-
LAST_INSERT_IDで同時にアクセ...
-
PL/SQLの変数について
-
[SQLServer] テーブル名からカ...
-
VMwareがCDドライブを認識する...
-
1対多結合で多を絞り込み条件と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報