Microsoft Access 掲示板

更新クエリを連続実行、期待通りの結果が得られない

6 コメント
views
4 フォロー

いつもお世話になります。

下記の件、相談させてください。

《テーブル定義》
Mtbl_A: 全従業員データ (月度更新:Excelデータを洗い替えでインポート)
Mtbl_B: Mtbl_Aから社員のみを抽出したデータを登録 (月度更新:先月との差分を追加・更新)
Mtbl_C: Mtbl_Aから社員外のみを抽出したデータを登録 (月度更新:先月との差分を追加・更新)
※前提:初月はMtbl_B、Mtbl_Cともにデータ無し、次月以降から差分更新となる

《データの取得と更新の現状のコード抜粋》

Private Sub データ取得_Click()

Set db = CurrentDb()

'初期化①
db.Execute "Delete * From Mtbl_A", dbFailOnError

'インポート②
DoCmd.TransferSpreadsheet acImportDelim, , "Mtbl_A", strExcelFilePath, True

'Mtbl_Bに差分のみを追加・更新(更新フィールドは一部のみ記載)③
strSQL = "UPDATE Mtbl_A_Info AS [T2] LEFT JOIN MtblB AS [T1] " &
        "ON [T2].社員番号 = [T1].社員番号 " &
        "SET " &

        "[T1].[社員番号]=[T2].[社員番号], [T1].[氏名]=[T2].[氏名],・・(略)・・ " & _
    "Where 区分='社員'"

db.Execute strSQL, dbFailOnError

'Mtbl_Cに差分のみを追加・更新(更新フィールドは一部のみ記載)④
strSQL = "UPDATE Mtbl_A_Info AS [T2] LEFT JOIN MtblC AS [T1] " &
        "ON [T2].社員番号 = [T1].社員番号 " &
        "SET " &

        "[T1].[社員番号]=[T2].[社員番号], [T1].[氏名]=[T2].[氏名],・・(略)・・ " & _
    "Where 区分='社員外'"

db.Execute strSQL, dbFailOnError

db.Close

Msgbox "終了"

End Sub

《状況の不具合》
初月処理で、④のアクションでMtbl_Cテーブルに空白データしか追加されない。
ちなみに、④を単独で実行(定義済みクエリ実行/コード実行のいずれも問題なし)すると正しく機能します。

一連に動作の中でやりたい
どうのように対応したらよいでしょうか?
アドバイスいただけますでしょうか。

美月
作成: 2019/03/18 (月) 16:18:41
通報 ...
1
DoCmd.TransferSpreadsheet acImportDelim, , "Mtbl_A", strExcelFilePath, True

acImportDelimはTransferTextの引数です。エクセルをインポートするなら、下記を参考に適切な引数を設定してください。

Excel VBA を学ぶなら moug モーグ | 即効テクニック | データをExcelファイルにエクスポートする

あと、Mtbl_A にインポートしている感じですが、更新するときに参照しているのは、Mtbl_A_Info になっているようですが、おかしくないですか。

2
美月 2019/03/18 (月) 19:10:54 a63a9@d6973

どうもありがとうございます。
インポートの引数はみなおします。

ご指摘通りです。
Mtbl_A_Infoは書き間違きです。
Mtbl_Aが正しいですり

3

現状で、① ② ③ の処理が希望通りの動作してして、④ だけが空白データしか追加されないというのは、コードを見る限りは原因は想像つかないですね。
単独ではうまくいくんですよね。

もし、症状を再現できる、サンプルデータを含むデータベースファイルとエクセルファイルを作成することが可能なら、それを右サイドメニューのファイル送信フォームから送信していただけますか。

4
美月 2019/03/19 (火) 18:06:28 a63a9@d6973

お返事ありがとうございます。

申し訳ありません。ここが問題ではありませんでした。この後にもいくつか処理をしてまして、そちらが問題でデータが消えてしまっていました。そちらのロジックを見直して解決にいたりました。

重ねてお聞きしたいのですが、アクションクエリを複数連続でExecuteメソッドを使って実行していますが、このような対応で問題ないでしょうか?

念のため、同期されるというのは確認していますが、より確実に処理するような手当てがありますでしょうか?例えば、トランザクション処理の中に入れるとか?

重ねてアドバイスよろしくお願いします。

5

共有していて複数のユーザーが同時に更新する可能性があるなら、トランザクション処理内で実行するようにした方がいいでしょう。そうでないなら、Executeメソッドで問題ないです。

6
美月 2019/03/20 (水) 08:27:43 a63a9@2b37a

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

一応、フロントバックに分割してネットワーク経由で利用することを検討していまので、トランザクションも検討してみます。