いつもお世話になります。
下記の件、相談させてください。
《テーブル定義》
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テーブルに空白データしか追加されない。
ちなみに、④を単独で実行(定義済みクエリ実行/コード実行のいずれも問題なし)すると正しく機能します。
一連に動作の中でやりたい
どうのように対応したらよいでしょうか?
アドバイスいただけますでしょうか。
の
acImportDelim
はTransferTextの引数です。エクセルをインポートするなら、下記を参考に適切な引数を設定してください。Excel VBA を学ぶなら moug モーグ | 即効テクニック | データをExcelファイルにエクスポートする
あと、Mtbl_A にインポートしている感じですが、更新するときに参照しているのは、Mtbl_A_Info になっているようですが、おかしくないですか。
どうもありがとうございます。
インポートの引数はみなおします。
ご指摘通りです。
Mtbl_A_Infoは書き間違きです。
Mtbl_Aが正しいですり
現状で、① ② ③ の処理が希望通りの動作してして、④ だけが空白データしか追加されないというのは、コードを見る限りは原因は想像つかないですね。
単独ではうまくいくんですよね。
もし、症状を再現できる、サンプルデータを含むデータベースファイルとエクセルファイルを作成することが可能なら、それを右サイドメニューのファイル送信フォームから送信していただけますか。
お返事ありがとうございます。
申し訳ありません。ここが問題ではありませんでした。この後にもいくつか処理をしてまして、そちらが問題でデータが消えてしまっていました。そちらのロジックを見直して解決にいたりました。
重ねてお聞きしたいのですが、アクションクエリを複数連続でExecuteメソッドを使って実行していますが、このような対応で問題ないでしょうか?
念のため、同期されるというのは確認していますが、より確実に処理するような手当てがありますでしょうか?例えば、トランザクション処理の中に入れるとか?
重ねてアドバイスよろしくお願いします。
共有していて複数のユーザーが同時に更新する可能性があるなら、トランザクション処理内で実行するようにした方がいいでしょう。そうでないなら、Executeメソッドで問題ないです。
ご回答ありがとうございます。
一応、フロントバックに分割してネットワーク経由で利用することを検討していまので、トランザクションも検討してみます。