質問: ### 前提・実現したいこと ODBCデータソースにMySQLのDBを登録し、Access2010にて、リンクテーブルで管理しているMySQL側のテーブル(仮にAとします)と、 別のAccessDBからのリンクテーブル(仮にBとします)を管理しています。 Bには1ヶ月間の出勤時刻データが格納されていて、毎日更新されます。 AはBの累積データが格納されています。 月初めにBからAに1ヶ月分のデータレコードを用意し、以後は毎日レコード更新という形で Aのデータが更新されるように考えています。 テーブル構成は下記のとおりです。(項目省略しています) A 年月日:日付/時刻型(主キー) 社員No:数値型(主キー) 勤務区分:テキスト型 出勤時刻:時刻型 退勤時刻:時刻型 ... B 年月日:日付/時刻型(主キー) 社員No:数値型(主キー) 勤務区分:テキスト型 出勤時刻:テキスト型 退勤時刻:テキスト型 ※10:59訂正しました。B側の時刻データはテキスト型となっておりました。 ### 発生している問題・エラーメッセージ 次のSQL文を実行してデータ更新を行っていますが、勤務区分をはじめ、他の数値・テキスト項目は 更新されているのですが、時刻の項目だけが更新されません。 ``` UPDATE A INNER JOIN B ON A.年月日=B.年月日 and A.社員No=B.社員No SET A.出勤時刻=B.出勤時刻,A.退勤時刻=B.退勤時刻,A.勤務区分=B.勤務区分 ``` 何か原因として考えられるものがあればご教示下さい。 ※10:59訂正により、テキスト型データを時刻型フィールドには代入できない? ### 試したこと ODBCの設定より、「Return matched rows instead of affected rows」にチェックを入れています。(これが無いと、更新時にレコードのロック違反というエラーメッセージが表示され、勤務区分すらも更新されなかった。) ### 補足情報(FW/ツールのバージョンなど) MySQL ODBC 8.0 Unicode Driver 8.00.12.00 Access2010 SP2 よろしくお願いいたします。 ※17:23 画像削除させていただきました。
回答: テキスト型である出勤時刻および退勤時刻はどのような書式で格納されていますか? 更新先が時刻型であるので、テキスト型でHHMMなど格納されているのであれば、HH:MMのように変換しないと駄目じゃないでしょうか。 但し、ODBCドライバーが暗黙変換してくれればの話ですので、駄目な場合は型を合わせる必要があると思います。 追記 ``` UPDATE A INNER JOIN B ON (A.社員No = B.社員No) AND (A.年月日 = B.年月日) SET A.勤務 = B.勤務, A.出勤 = '11:00', A.退勤 = B.退勤 ``` これで問題ないという事なので、更新されているのかどうかをlastupdateを更新するようにしてみると更新されているかどうかが分かると思います。 ``` UPDATE A INNER JOIN B ON (A.社員No = B.社員No) AND (A.年月日 = B.年月日) SET A.勤務 = B.勤務, A.出勤 = B.出勤, A.退勤 = B.退勤, A.lastupdate=Now() ``` 追記2 暗黙変換のせいかもしれませんので、以下を試してみてください ``` UPDATE A INNER JOIN B ON (A.社員No = B.社員No) AND (A.年月日 = B.年月日) SET A.勤務 = B.勤務, A.出勤 = CStr(B.出勤), A.退勤 = CStr(B.退勤) ```