• ベストアンサー

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ビューで確認するとパラメータの入力を求められます。 この問題にはまってしまっています。 ご教授のほどよろしくお願いいたします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答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ビューで見た時の " は、 "" にします。

ejty110
質問者

お礼

引き続きのご回答ありがとうございます。 無事に完成いたしました。 丁寧なご回答に感謝しております。 ありがとうございました。

その他の回答 (3)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答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度確認してみてください。

ejty110
質問者

お礼

ありがとうございます!!! こんなコードになるとは想像もつきませんでした。。。 ご提示いただいた方法でできていることを確認できました。 SQLビューでは確認できましたので、これをVBEに転記してみて 試してみます。

ejty110
質問者

補足

すいません。追加で質問させてください。 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)
回答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件目以降はエラーとなると思うのですが。

ejty110
質問者

お礼

フィールド名は便宜上、noやnameとしておりまして、 本来はアンダーバーの付いた名前となっております。 また、[]で囲んでみたところ、同様に何もおきませんでした。 SQLビューではパラメータの入力を求められます。 >select dmax("id", "A")+1, B.idid, B.no, B.name from B のみのクエリ表示はどうなりますか。 これを実行すると自動発番したいidがかぶっていました。。。 完全にこれでキーがかぶってしまい、エラーの原因であることがわかりました。 ちなみにテーブルBには5件のデータが入っています。 この方法で連番を振るのは不可能なのでしょうか?? 全然想像が付きませんので、引き続きご指導をお願いいたします。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答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 としてみると、どうなりますか。

ejty110
質問者

お礼

早速の回答ありがとうございます。 Visual Basic Editorでご教授いただいたように書くと 赤文字となりエラーとなってしまいます。

ejty110
質問者

補足

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

関連するQ&A

  • CakePHPとMySqlを使用しています。INSERTしたあと、id

    CakePHPとMySqlを使用しています。INSERTしたあと、idを取得する方法について教えて頂きたいです。 データをINSERTとSELECTをする関数を作成し、 メインの関数でINSERTとSELECTをする関数を呼び出すと、idがNULLとなってしまいます。 しかし、1つの関数でINSERTとSELECTを行うとidを取得する事ができました。 この方法は問題ないのでしょうか? この方法だとなぜidが取得できるんでしょうか? また、これ以外の方法でidを取得できる方法があればお教え頂きたいです。 宜しくお願いします。 【hogeテーブル】 id(PRIMARY。オートインクリメントさせています) name ●idがNULLになる方法 function main() { $this->insertHoge(); $id = $this->getHoge(); ←結果がNULLになる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($sql); return $result; } function getHoge() { $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($sql); return $result; } ●idが取得できる方法 function main() { $id = $this->insertHoge(); ←idがかえってくる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($_sql); $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($_sql); return $result; }

    • 締切済み
    • PHP
  • EXCEL VBAでSQL文自動作成

    VBA初心者です。 エクセルに入ってる値をVBAで自動的にINSERT文を作りたいと思っております。 とりあえず簡単でいいんで教えていただけないでしょうか。 ---------------------------------------------------------- A1:テーブル名 B1:shain A2:カラム名  B2:ID    C2:NAME      D2:address A3:型 B3:int   C3:varchar(20)   D3:varchar(30) B:41 C4:鈴木 D4:suzuki B:52 C5:阿部 D5:abe B:63 C6:田口 D6:taguchi 上記のようなエクセルがあります。 INSERT INTO shain(ID,NAME,address) values(1,'鈴木','suzuki'); というINSERT文を作りたいと思っております。 他にツールはあると思いますが、VBAのみで作らなければなりません。 めっちゃ困ってるんでどなたか助けてください

  • SQLServerのID列(自動連番)について

    PHPとSQL Serverでウェブアプリケーションを作っています。 例として、下記のようなテーブルを想定します。 テーブル名 users  user_id [int] ←主キー(IDENTITYプロパティを指定して、1ずつ増える連番)  name [char(10)] IDENTITYにより、INSERT INTO でuser_idの値を指定せずとも、一意のID値が割り振られます。 このINSERT処理は、PHPのmssql_queryでSQL文を発行しているのですが、 この時割り振られたuser_idが何であるかは、どうやって調べればよいのでしょうか。 IDENTITYを利用せず、INSERTする前にSELECT MAX(user_id)を発行して、 最も大きなuser_idを調べ、それを+1してINSERT、とすれば当然user_idは分かりますが、 せっかくIDENTITYの機能があるのに明らかに無駄な処理です。 どなたか分かる方、よろしくお願いします。

    • ベストアンサー
    • PHP
  • INSERT時に発番を行いたい

    ATBLからBTBLへのINSERT時発番を行いたい <環境> SQLSERVER 2008 <ATBL> CD varchar(3) KEY NO int KEY NAME varchar(10) <BTBL> CD varchar(3) KEY NO int KEY NAME varchar(10) <BTBLのデータ> CD   NO   NAME 001 1 太郎 001 3 次郎 001 5 三郎 BTBLをATBLへINSERTしたいのですが、この時、NOを1から再付番したいのです。 INSERTクエリで一発で更新できますでしょうか? ご教授お願いします。

  • ACCESSのクエリ(SQLビューについて)

    こんにちはtmgmです。 ACCESSのクエリ(SQLビューについて)について質問です。"INSERT INTO TBL SELECT * FROM TBL1"というようなINSERT文をSQLビューに書き込んで実行することはできるんですが、これが複数行になるとどうしてもエラーが出てしまいます。ちなみに実行したい同じような文体のSQL文は100行近くあります。どうすればよいでしょうか?

  • insert into select で別テーブルのID分挿入したい

    SQLでこんなことは可能でしょうか。 列 IDとTEXT をもつテーブルA と、 列 IDをもつテーブルBがあります。 テーブルAに、テーブルBのID分のデータを挿入したいです。 TEXTはテーブルAのID=1のTEXTデータを全ての列に挿入します。 このような場合のSQL文を調べてるのですが、 なかなかわからなくて困っています。 insert into select b.id,a.text from tableA as a, tableB as b でもうまくいきませんでした。 何かいい方法はないでしょうか? 回答お待ちしております。

  • 受け取ったIDに該当する物にデータをDBに格納

    $query = "select * from ki where id= '{$_GET['id']}'"; こんな風に受け取ったIDによって表示が変わるページなんですが、 $sql = 'INSERT INTO kise(gazou2) VALUES ("' . $output . '")'; だと、新たにフィールドを作ってデータを格納してしまいます。 例えば{$_GET['id']}で受け取ったIDに該当するフィールドに格納したい場合 $sql = 'INSERT INTO kise(gazou2) VALUES ("' . $output . '")'; をどう改変したら良いですか?? $sql = 'INSERT INTO kise({$_GET['id']}gazou2) VALUES ("' . $output . '")'; と力ずくでしてみましたがダメでした。

    • 締切済み
    • PHP
  • エクセルでSQL文を自動で出力させたい

    INSERT INTO `TableInfo` ( `author_id` , `name` , `no` , `addr` ) VALUES ('其一', '其二', '其三', '其四'); 上記のようなテーブルがありINSERTでデータを登録させていきたいと思っています。 そこで、エクセルに打ち込んだデータを、 '其一' '其二' '其三' '其四' に置き換えてSQL文としてテキストファイル等に出力させたいと思います。 エクセルはあまり得意ではなくどうやれば良いか判りません。 どなたか御教授お願い致します。

  • 行ごとに連番を付けたい

    例えば下記のようなデータがあったときに "Name","sub","cnt" A,a,100 B,a,200 A,b,150 A,c,110 B,b,250 ビューで WHERE (sub >= b) で A,b,150 B,b,250 を取得するのは簡単なのですが 1,A,b,150 2,B,b,250 と取得した行に対して連番を付けていきたいのですが できないでしょうか? CREATE TABLE #t ( No int IDENTITY(1,1), Name char(200), sub char(200), cnt int ) INSERT INTO #t( Name , sub , cnt ) SELECT ・・・・・・・・ とストアドではできるのですが、 ビューでできたらやりたいのです。 お願いいたします。

  • INSERT時にデータ登録とmaxの発番がしたい

    <環境> SQLSERVER 2012 入力フォームに、入力した後で、DBに登録した際に、 依頼Noに、既にあるデータのMAX+100の値を登録したいです。 依頼NoにMAX+100の連番をふることは以下の方法でできたのですが、 INSERT INTO テーブル1(依頼No) SELECT MAX(依頼No)+100 AS NEW_ID FROM テーブル1 入力フォームのデータと登録と同時に、依頼Noを振りたいのですができません。 以下のように書いてみましたが、 根本的に間違っていると思うので、いい方法をご教授いただけたらと思います。 ※iraibi は入力フォームで、依頼日を入力した値です。 INSERT INTO テーブル1 (依頼No,依頼日) VALUES ('SELECT MAX(依頼書No)+100 AS NEW_ID FROM テーブル1','" & iraibi & "') 宜しくお願いいたします。

専門家に質問してみよう