Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


604 / 2272 ツリー ←次へ | 前へ→

【10968】テーブルの更新?方法 ON 09/1/31(土) 15:14 質問[未読]
【10970】Re:テーブルの更新?方法 ON 09/1/31(土) 22:23 発言[未読]
【10973】Re:テーブルの更新?方法 小僧 09/2/2(月) 4:19 回答[未読]
【10977】Re:テーブルの更新?方法 ON 09/2/3(火) 17:36 お礼[未読]
【10978】Re:テーブルの更新?方法 小僧 09/2/3(火) 20:36 発言[未読]
【10994】Re:テーブルの更新?方法 ON 09/2/8(日) 21:16 お礼[未読]

【10968】テーブルの更新?方法
質問  ON  - 09/1/31(土) 15:14 -

引用なし
パスワード
   こんにちは わかりにくいと思いますが、よろしくお願いいたします

場所AのMDBと場所BのMDBのテーブルのDTを同じにしたいと思っています
以前は、TBLのみのMDBをコピーして同じにしていました
今回は
更新日時ファールドを追加して、これを元に、
 更新レコードの置き換え
 追加レコードの追加
したいと思っています

構成は
 レコードのみのMDBが1つ R-MDB
 フォーム系のMDBが1つ F-MDB

R-MDBには
 ・DT_TBL が1つ
 ・add_TBL が1つ(更新レコード、追加レコードのみ:更新日時Fで抽出作成)
F-MDBでは、上記のTBLをリンクして使用しています

運用方法は
レコード編集追加は、場所Aと場所Bで行っているので
add_TBLのみを持ち運んでTBLの同期?を行いたいと思っています

処理方法としては
 1)DT_TBLとadd_TBLで、IDフィールドが一致したレコードで
   DT_TBLから、上記レコードを削除
 2)DT_TBLにadd_TBLを追加
でいいような気がします

で、
1)削除クエリを実行し
DELETE DT_TBL.*
FROM DT_TBL INNER JOIN add_TBL ON DT_TBL.[No] = add_TBL.[No];

2)追加クエリを実行する
INSERT INTO DT_TBL
SELECT add_TBL.*
FROM add_TBL;

でいいような気がしています

上記について
Q1)このクエリは、R-MDB、F-MDB どちらのMDBにおいて実行したほうがよいのでしょうか
  どちらでもかまわないような気もしますがちょっと気になります

Q2)削除、追加のアクションクエリを1つの
SQLつで実行するようなことは出来ますか

その他、アドバイスありましたらよろしくお願いいたします

【10970】Re:テーブルの更新?方法
発言  ON  - 09/1/31(土) 22:23 -

引用なし
パスワード
   結果報告です

>1)削除クエリを実行し
を、F-MDB で実行してみましたが

指定されたテーブルから削除できませんでした。
となってしまいました

結合した他のテーブルのデータを元に削除するクエリ3
ht tp://www.nurs.or.jp/~ppoy/access/access/acQ011.html
で、希望の操作かないました

>Q2)削除、追加のアクションクエリを1つの
>SQLつで実行するようなことは出来ますか

>その他、アドバイスありましたらよろしくお願いいたします

こちらについて何かありましたらよろしくお願いいたします

【10973】Re:テーブルの更新?方法
回答  小僧  - 09/2/2(月) 4:19 -

引用なし
パスワード
   ▼ON さん:
こんにちは。

> Q2)削除、追加のアクションクエリを1つの
> SQLつで実行するようなことは出来ますか

残念ながらAccessではできません。
Access以外のデータベースでは
「UPSERT」なんてキーワードでWeb検索すると
それに近いような事柄が出てくるかと思われます。


仕様がちょっと解りづらいのですが、
新規レコードが加わり、さらに更新がかかった場合、
add_TBLに ID が重複するような事がなければ良いのですが…。


また、削除クエリと追加クエリを行う間に
他割り込み処理が入らない事に注意が必要かもしれません。
(他ユーザの使用や突然のPCのシャットダウン、
ACCESSのフリーズによる強制終了など)

クエリをダブルクリックするのではなく
モジュールからVBAにて実行させる様な方法をとれば、
追加クエリが正常に終了しなかった場合には
削除クエリも行わなかった事にする事も可能です。

こちらについては「トランザクション」「Access」などを
キーワード検索すると事例が載っているかと思われます。


また、こちらも蛇足になるのですが
レコードの削除・追加を頻繁に繰り返すと
MDBの容量が肥大化する事が多々あります。
(定期的に最適化をすれば問題はないのですが)

・IDがある場合のUPDATE処理
・IDがない場合のINSERT処理

という方が、無駄なゴミを作らないですみそうですね。

【10977】Re:テーブルの更新?方法
お礼  ON  - 09/2/3(火) 17:36 -

引用なし
パスワード
   ▼小僧 さん:
遅くなりました ありがとうございます

>残念ながらAccessではできません。
>Access以外のデータベースでは
>「UPSERT」なんてキーワードでWeb検索すると
>それに近いような事柄が出てくるかと思われます。

そーなんですか
ありがとうございます 勉強になります


>仕様がちょっと解りづらいのですが、
ですね 申し訳ありませんでした

必ず、一方でしか作業することがないので
>add_TBLに ID が重複するような事がなければ良いのですが…。
は、大丈夫な気がしますが・・・
確かにまずいですね
この辺もう少し考えて対処したいと思います


>クエリをダブルクリックするのではなく
>モジュールからVBAにて実行させる様な方法をとれば、
>追加クエリが正常に終了しなかった場合には
>削除クエリも行わなかった事にする事も可能です。

>こちらについては「トランザクション」「Access」などを
>キーワード検索すると事例が載っているかと思われます。
 ・・・
>という方が、無駄なゴミを作らないですみそうですね。

勉強になります ありがとうございます


>また、削除クエリと追加クエリを行う間に
>他割り込み処理が入らない事に注意が必要かもしれません。
>(他ユーザの使用や突然のPCのシャットダウン、
>ACCESSのフリーズによる強制終了など)
これは、コードで対応できるものなのでしょうか
それともトランザクションを組み込めば対応できるのでしょうか

この辺理解がありません
簡単にコメント頂けるとうれしいです

よろしくお願いいたします

【10978】Re:テーブルの更新?方法
発言  小僧  - 09/2/3(火) 20:36 -

引用なし
パスワード
   ▼ON さん:
こんにちは。

>これは、コードで対応できるものなのでしょうか
>それともトランザクションを組み込めば対応できるのでしょうか

そうですね。
クエリをダブルクリックしたり、
VBAのコードでいえば OpenQueryメソッドを使ったりした場合には
トランザクションの概念がありません。

前回のご質問にあったように
人がいない時に定時で実行させようとした際にエラーが発生した場合
ちゃんとロールバックしているのか、
途中まで作業がすすんでしまっているのか等の
ログが吐き出される訳ではない為、不安が残ってしまいます。

DAO や ADO の Execute メソッドを利用して
SQLを実行する場合においては
トランザクションを設定する事ができるため、
一連の処理を「全て行う」か「全て中止する」事ができます。

今回は削除して追加する処理になるため、
片方しか行われないと問題が発生してしまいます。

もし、定時の作業で行うのであれば
きちんとトランザクションを用いた方が無難かと思った次第です。

【10994】Re:テーブルの更新?方法
お礼  ON  - 09/2/8(日) 21:16 -

引用なし
パスワード
   ▼小僧 さん:
大変遅くなりました m(_ _)m

詳細な解答いただきありがとうございます

何度かトランザクションにチャレンジしたことがあったのですが
いまいち理解できずにいました

>VBAのコードでいえば OpenQueryメソッドを使ったりした場合には
>トランザクションの概念がありません。

>DAO や ADO の Execute メソッドを利用して
>SQLを実行する場合においては
>トランザクションを設定する事ができるため、
>一連の処理を「全て行う」か「全て中止する」事ができます。

DAOでは、トランザクションが出来ない
といったページも見たことがあったような気がしていたのですが

前回、
【10900】エクセルからアクセスへAddNewで
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=10900;id=access
で、書き込み頂いた
>DAO で記述されている場合は
>AddNew で排他処理が行われ、Updateで排他が解除されます。



>DAO や ADO の Execute メソッドを利用して
>SQLを実行する場合においては
>トランザクションを設定する事ができるため、
>一連の処理を「全て行う」か「全て中止する」事ができます。

なんとなく全体像が見えてきたような気がします


>今回は削除して追加する処理になるため、
>片方しか行われないと問題が発生してしまいます。

>もし、定時の作業で行うのであれば
>きちんとトランザクションを用いた方が無難かと思った次第です。

詳細な説明で、重要性が理解できたような気がします

ものにするのには少し時間がかかると思いますが
何とか頑張りたいと思います

ありがとうございました
今後もよろしくお願いいたします

604 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078198
(SS)C-BOARD v3.8 is Free