質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

7336閲覧

accessでのINSERT,DELETEの書き方について教えてください

makino

総合スコア32

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/03/25 02:00

編集2016/03/25 02:26

初心者で申し訳ないのですが、
accessでのSQLで、UPDATE,INSERT,DELETEを組み合わせた書き方がよくわかりません。

マスターとトランザクションで、
1 商品コードが被ったら更新、
2 マスター側に商品コードがなかったら追加、
3 商品コードが被ってるけど、追加するデータが入ってなかったら削除
というプログラムです。

まず、INSERTするとテーブルのデータが全て追加されてしまうので、
1行ずつ追加したいこと。

次に、Ifでrs_ans! rs_transaction!としてるので、毎回、OpenとCloseを繰り返さなければならないのか。
(現在ここでエラーになります・・・)

そもそもIf文ではなくUnionで書けないのか・・・

色々とおかしな部分があるかと思いますが、教えてください。お願いします。

SQL

1Sub Key() 2 3Dim cnn As ADODB.Connection 4 5Dim rs_master As ADODB.Recordset 6Dim rs_ans As ADODB.Recordset 7Dim rs_transaction As ADODB.Recordset 8Dim aSQL As String 9 10Set cnn = CurrentProject.Connection 11Set rs_master = New ADODB.Recordset 12Set rs_ans = New ADODB.Recordset 13Set rs_transaction = New ADODB.Recordset 14 15 16 rs_master.Open "master", cnn, adOpenKeyset, adLockOptimistic 17 rs_ans.Open "ans", cnn, adOpenKeyset, adLockOptimistic 18 19 Do Until rs_master.EOF 20 rs_ans.AddNew 21 22 rs_ans!商品コード = rs_master!商品コード 23 rs_ans!商品名 = rs_master!商品名 24 rs_ans!単価 = rs_master!単価 25 26 rs_ans.Update 27 rs_ans.MoveNext 28 rs_master.MoveNext 29 Loop 30 31 32 rs_transaction.Open "transaction", cnn, adOpenKeyset, adLockOptimistic 33 rs_ans.MoveFirst 34 35 Do Until rs_transaction.EOF 36 37 If rs_ans!商品コード = rs_transaction!商品コード Then 38 aSQL = "UPDATE ans SET ans.商品名 = '" & rs_transaction!商品名 & "', ans.単価 = " & rs_transaction!単価 & "" & _ 39 " WHERE ans.商品コード = " & rs_transaction!商品コード & "" 40 41 If rs_transaction!単価 = 0 And rs_transaction!商品名 Is Null Then 42 aSQL = "DELETE FROM ans" & _ 43 " WHERE (" & rs_transaction!単価 & " = 0) & (" & rs_transaction!商品名 & " IS NULL)" 44 End If 45 46 ElseIf rs_ans!商品コード <> rs_transaction!商品コード Then 47 aSQL = "INSERT INTO ans ( 商品コード, 商品名, 単価 ) SELECT transaction.商品コード, transaction.商品名, transaction.単価 " & _ 48 " FROM transaction WHERE ans.商品コード <> " & rs_transaction!商品コード & "" 49 50 End If 51 52 rs_ans.Close 53 rs_ans.Open aSQL, cnn, adOpenKeyset, adLockOptimistic 54 rs_transaction.MoveNext 55 Loop 56 57Set rs_ans = Nothing 58rs_master.Close: Set rs_master = Nothing 59rs_transaction.Close: Set rs_transaction = Nothing 60cnn.Close: Set cnn = Nothing 61 62End Sub

~追記~

masterにあるデータをtransactionのデータと比較して、処理し、
ansのテーブルに出力する流れです。
商品コード、商品名、単価が全てのテーブルにあります。

1度ansのテーブルにmasterのデータを全て書いて、
rs_ans!商品コード = rs_master!商品コード
rs_ans!商品名 = rs_master!商品名
rs_ans!単価 = rs_master!単価
( ↑のループ部分です。 )

それをtransactionのテーブルと比較し処理するのがいいかなと思っただけですので、
他によい方法があれば教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2016/03/25 02:12

master、ans、transaction のそれぞれのテーブルの関係性を整理していただけますか。 追加、削除、更新の対象は ans ですか。
guest

回答2

0

先に突っ込み的な話ですが、

  • rs_ans.AddNew するなら、rs_ans.MoveNextは不要です
  • せっかくRecordset(rs_ans)を開いている状態で、あえてSQLを発行して処理しようとするのはなぜでしょうか。

本題ですが、プランとして

  • まず「マスター」と「トランザクション」を結合した、各レコードについて評価すればいいようなレコードセットを作る
  • そのレコードセットの各行に対して、rs_ans に追加していく

方がスマートかと思いました。

SQL

1SELECT * FROM master LEFT JOIN transaction ON master.商品コード = transaction.商品コード 2WHERE transaction.商品コード IS NULL

で master にしかないデータ、

SQL

1SELECT * FROM master LEFT JOIN transaction ON master.商品コード = transaction.商品コード 2WHERE transaction.商品コード IS NOT NULL

で master 、transaction 両方にあるデータ、

SQL

1SELECT * FROM transaction LEFT JOIN master ON transaction.商品コード = master.商品コード 2WHERE master.商品コード IS NULL

で transaction にしかないデータ、になるので、それぞれのパターンでレコードセットを作成して処理すれば、削除せずにできる気がします。

投稿2016/03/25 02:40

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Do Until rs_transaction.EOF
の所を下記のようなSQLにしたら出来るのでは?

下記のSQLは参考です。
実際の環境で動かしていないので実際に動かすと
構文エラーが出るかも知れません。

SQL

1 2--削除処理 3DELETE FROM ans 4INNER JOIN transaction 5ON ans.商品コード = transaction.商品コード 6WHERE transaction.単価=0 AND transaction.商品名 Is Null 7 8--更新処理 9UPDATE ans 10INNER JOIN transaction 11ON ans.商品コード = transaction.商品コード 12SET ans.単価=transaction.単価,ans.商品名 = transaction.商品名 13WHERE transaction.単価<>0 OR transaction.商品名 Is Not Null 14 15--追加処理 16INSERT INTO ans 17SELECT transaction.* FROM transaction 18LEFT JOIN ans 19ON ans.商品コード = transaction.商品コード 20WHERE (transaction.単価<>0 OR transaction.商品名 Is Not Null) AND ans.商品コード Is Null

投稿2016/03/25 02:36

cry_4_the_moon

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makino

2016/03/25 04:35

ありがとうございます。 下記のように書いたところ、更新はされるのですが、 削除と追加がされない状態になりました。 書き方が間違ってますでしょうか?   rs_ans.MoveFirst rs_ans.Close Do Until rs_transaction.EOF    aSQL = "DELETE FROM~    aSQL = "INSERT INTO~    aSQL = "Update~   rs_ans.Open aSQL, cnn, adOpenKeyset, adLockOptimistic rs_transaction.MoveNext Loop
cry_4_the_moon

2016/03/25 10:07

Do Until rs_transaction.EOF  中略 rs_transaction.MoveNext を aSQL = "DELETE FROM~ rs_ans.Open aSQL, cnn, adOpenKeyset, adLockOptimistic aSQL = "INSERT INTO~ rs_ans.Open aSQL, cnn, adOpenKeyset, adLockOptimistic aSQL = "Update~ rs_ans.Open aSQL, cnn, adOpenKeyset, adLockOptimistic としたら使えるはずです。 紹介したSQLは、1行づつ処理するのではなく一括で処理を行えるようにしたものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問