【動作環境】Windows10/Office365ユーザー(開発者・確認者1・確認者2)
社内共有フォルダに1つの排他設定済ACCESSを配置
==============================
EXCELテンプレートへテーブルのデータを出力し、ファイル保存する処理機能があります。
動作検証のため、確認者1と確認者2に上記機能を使用していただいたのですが、
下記順番で操作するとテーブルデータの一部が出力されていない状態で出力され、
「エラー3343 データベースの形式を認識できません」が発生し
データベースの修復でバックアップファイルが生成される現象が起きてしまいます。
<エラー発現状況>
1:開発者→確認者1へACCESSファイルをメールで送付
2:確認者1がACCESSを保存し、社内共有フォルダへ配置
3:確認者1がACCESSのEXCEL出力機能でファイル保存(正常出力)
4:確認者1がACCESを完全終了(閉じる時に自動で最適化する設定有)
5:確認者2がACCESSを開き、EXCEL出力機能でファイル保存(一部データが出力されていない)
6:確認者2が再度ACCESSのEXCEL出力機能でファイル保存を試みると、
エラー3343が発生しデータベースの修復でバックアップファイルが生成される
開発者から確認者2へメール送付したACCESSを
開発者2が共有フォルダに配置し、開発者2がそのまま出力すると
上記エラーは起こりません。
開発者1を経由するとエラーが起こってしまいます。
このような現象を経験したことがなく、
ACCESSプログラムコードが怪しいのか、環境が怪しいのか、
どこを深堀すればよいのか分からず途方にくれております。
もし同じようなケースのご経験がある方がいらっしゃれば、
どうかご助力いただきたい気持ちでいっぱいです。
==============================
【ご指摘を頂いての状況追記1】
・自動最適化ON/OFFでも同様の現象でした。
・現状、ACCESSは分割しておらず、単一ファイルとして使用しております。
・確認者1のACCESS終了後は、確認者1のタスクマネージャーにプロセスが残っていない
状態で確認者2にACCESSを起動してもらっております。
・EXCEL出力機能を使わないでファイルを回した場合の検証について、
先日一度、上記手順4の後に、確認者2に別機能(パス指定のエクセルファイルを
一時テーブルに読込み成形してテーブルに登録する)を使用してもらった時にも
3343エラーが起こった記憶があります。
==============================
【状況追記2】
・下の画像はオプション>クライアントの設定の設定状況です。
・本ACCESSはDAOで作成済のクエリを実行する処理が多いため、解決策調査時
下記MSの記事「Access でデータベースが '矛盾がある状態' にあると報告される」も
ヒットしているのですが、バージョンや更新日時上違うのだろうかと思っています。
リンク
・手順5の一部データが出力されていない点について、下記2のデータのみが
一時テーブルへ登録されないまま出力処理が完了します。
1:一時テーブル全データ削除
2:一時テーブルに明細データ1を登録
3:一時テーブルに明細データ2を登録
4:一時テーブルデータのレコードセット取得
Set rs = CurrentDb.OpenRecordset(一時テーブル, dbOpenDynaset)
5:一時テーブル並び替え適用
rs.Sort = "項目A ASC, 項目B ASC"
6:並び替えレコードセット再設定
Set rs = rs.OpenRecordset
7:エクセル書き込み
明細データ登録の処理は、ファンクション化しているため変数の宣言部分を略しますが
下記のような形です。
1:Set qf = CurrentDb.QueryDefs(クエリ名)
2:パラメータがある場合
qf.Parameters(パラメーター名) = パラメーター値
3:qf.Execute
4:Set qf = Nothing: Close
・両確認者に使っていただく機能がエクセル出力機能とエクセル取込機能であり、
誰かを介すると(共有して使用すると)出力時動作不備が起こるという点で、
この一時テーブル周辺が怪しいのではと試行錯誤していたのですが、
どうにも詰まってしまい…。
出力機能部分に着目して検証を行っておりますが、
コメントでご指摘いただいたように
他機能使用時も同じなのかも確認したいと思います。
==============================
【状況追記3】
・以下2点は確認中です。
(1)両確認者とも別機能使用した場合についてと、
(2)新規にACCESSファイルを作成し、オブジェクトをすべてインポートした場合
・エラー発現状況5で一部データが出力されない件について、
一時テーブルへ登録するINSERTのアクションクエリのSQLが
何故か冒頭のSELECT までの不完全なSQLに書き換えられてしまっているため
であることが分かりました。
これはクエリのSQLビューで確認いたしました。(上書きされている状態)
INSERT INTO 一時テーブル名
SELECT;(…正しくは以下も続く)
====================
【状況追記4】
SQLの上書きに関して、クエリ実行関数にコードを組み込んでおりました。
これは別箇所で条件を書き加えたいケースに対応するために入れたものでした。
以下クラスのファンクション抜粋(変数宣言略)
【1】
Public Sub SetQuery(ByVal strQue As String)
Set qf = CurrentDb.QueryDefs(strQue)
' クエリSQL取得(元)
baseSQL = qf.sql
End Sub
【2】
Public Sub Execute()
' クエリ実行
qf.Execute
' SQL文を元に戻す
If Not 別モジュール.IsNullOrEmpty(baseSQL) Then
qf.sql = baseSQL
End If
End Sub
【3】
Public Sub ObjClose()
Set qf = Nothing: Close
baseSQL = ""
End Sub
====================
baseSQLはString型で、元のSQL文は3652文字です。
→ 現在はSQL文を元に戻す処理を抜いたクエリ実行ファンクションを設けて
上書きが走らないように修正致しました。
・検証ケースについて、
開発者→確認者1→確認者1(続けてもう一度)と
開発者→確認者2→確認者2(続けてもう一度)のケースは
上手くいくとの報告でした。
==============================
【状況追記5】
(1)両確認者とも別機能使用した場合について
→ こちらは問題ないとのことでした。
(2)新規にACCESSファイルを作成し、オブジェクトをすべてインポートした場合
→ 同様のエラーが出てしまうのとのことでした。
原因の解明はまだ出来ていないのですが、どうにもならない場合に備え
分割化し使用者ごとにコピーフロントを作成し操作(使用後自動削除)してもらう
ことで回避することを考えています…!
==============================
【状況追記6】
分割化して共有フォルダに配置し、バッチで使用者ごとにフロントコピー&起動するように
本番配置したところ、確認者1が帳票出力すると件のエラーが発生し、次に下のエラーメッセージが表示されるのですが、他の人が試すとうまくいくということが起こりました。
==============================
【状況追記7】
自己解決致しましたのでご報告致します。
エラーが起こってしまう原因は、状況追記2での明細データ1登録の際、
データにより文字列「-」を日付型に格納していたことでした。
こんな初歩中の初歩のポイントに…と思うと、もう、全力で脱力してしまいました。
藁をも縋る思いで投稿した拙い質問にお時間割いてコメントくださったお二人には本当に感謝しております。
とても心救われておりました。この度はありがとうございました。
同じOffice365環境のはずなのに、エラーが発現する環境と全く発現しない環境があることだけが謎です…!
当て推量ですが、自動最適化をOFFにするとどうなりますか?
追加情報があると、回答がつき易いかもしれません。フロントエンドとバックエンドに分割していますか?
りんご様
至らぬ質問にお言葉下さり、ありがとうございます。
自動最適化設定について、OFF/ONどちらも試してみたのですが、
同様の現象となってしまいます。
また、ACCESSは現状、単一ファイルで使用しております。
ご助言いただいたとおり、追加情報についても追記2で記載したいと思います。
お目通しくださりありがとうございます。
現象を知っているわけではありません。
「完全終了」はタスクマネージャーにプロセスが残っていないのも確認していますか?
新規にACCESSファイルを作成し、オブジェクトをすべてインポートしてみるとどうですか?
EXCEL出力機能を使わないでファイルを回した場合は正常に動作していますか?
hiroton様
とんでもございません。
コメント・ご指摘いただけるだけでも非常にありがたく思います。
コメントくださりありがとうございます。
ACCESS終了時はプロセスの終了を確認してもらっています。
EXCEL出力機能を使わないでファイルを回した場合については、
先日一度、手順4の後、確認者2が別機能を使用時
同様の現象が起こったことがありました。
(1)両確認者とも別機能使用した場合についてと、
(2)新規にACCESSファイルを作成し、オブジェクトをすべてインポートした場合
については、未検証のため両確認者の都合がつき次第検証したい所存です。
当質問お目通し下さりありがとうございます。
りんご様
コメントありがとうございます…!
りんご様のお察しの通り、SQLを上書きするコードを組み込んでおりました。
これは別箇所で条件を書き加えたいケースに対応するために入れたものでした。
以下クラスのファンクション抜粋(変数宣言略)
====================
【1】
Public Sub SetQuery(ByVal strQue As String)
Set qf = CurrentDb.QueryDefs(strQue)
' クエリSQL取得(元)
baseSQL = qf.sql
End Sub
【2】
Public Sub Execute()
' クエリ実行
qf.Execute
' SQL文を元に戻す
If Not 別モジュール.IsNullOrEmpty(baseSQL) Then
qf.sql = baseSQL
End If
End Sub
【3】
Public Sub ObjClose()
Set qf = Nothing: Close
baseSQL = ""
End Sub
====================
baseSQLはString型で、元のSQL文は3652文字です。
開発者→確認者1→確認者1(続けてもう一度)と
開発者→確認者2→確認者2(続けてもう一度)のケースは
上手くいくとの報告でした。
両確認者の方が丁度予定が多忙となっており、
昨日から同環境での検証が進んでおらず非常に歯がゆいです。
検証のアドバイスを頂いている中、恐縮です。
謎の現象が謎のままなのは歯がゆいですが
そもそもメールでACCESSファイルを盥回しにする?という運用は改善できないんでしょうか?(あまりいい運用方法とは思えません)
hirotonさん
コメントありがとうございます。恐れ入ります。
運用について、
<エラー発現状況>の2にある社内共有フォルダが
開発者ではアクセス権がない部署内フォルダのため、
試用期間の今は開発者から確認者1へメール送付したACCESSを
確認者1と確認者2が確認してくださっている状況なのですが、
本動作不具合解消後の本運用移行はその社内共有フォルダに
アクセスできる確認者1と確認者2が共有使用する形となります。
現在同ACCESSの別作業のため単一ACCESSで色々しておりますが、
ACCESSを共有する以上壊れる可能性が高いため、
最終的には分割化してバッチでフロントをコピー・起動したものを
各ユーザーに操作してもらう形を視野に入れております。
取り敢えず、qf.sqlやbaseSQLやその他SQLの中身が期待通りになっているか、要所要所で再度チェックしておくのはどうでしょう。例えば。
りんご様
ありがとうございます。
上記方法にて、想定通りの内容であることを確認致しました。
また、処理での上書きを完全に回避するために不必要な場合は
上書きしないようにも修正するように致しました。
ですがやはり、人を介すると
同じ現象になってしまうとのことでした…!
>> 10
あれこれ修正した結果、
INSERT INTO 一時テーブル名 SELECT;(…正しくは以下も続く)
これがどう変化したのでしょう。SELECT以下も正しく続く事を確認出来たから、他の原因を探しているという事でしょうか。
AccessVBAには、IsNullOrEmpty()は無いと思ったのですが。他言語の機能も使えるようにあれこれされていたんでしょうかね。
りんご様
コメントありがとうございます。
修正内容は、質問の【状況追記4】に記載の通り下記内容で修正致しました。
「→ 現在はSQL文を元に戻す処理を抜いたクエリ実行ファンクションを設けて
上書きが走らないように修正致しました。」
本機能と関係ない別機能で、上書きが必要な個所のみ上書きする処理の入ったファンクションを呼んでいます。
>If Not 別モジュール.IsNullOrEmpty(baseSQL) Then
こちらは別モジュールにある名前の通りの機能の自作メソッドです。
同じOffice365を使っているはずなのに、
人(環境)によりエラーを出してくれる場合と正常終了する場合があるというところで
原因追及に足をとられてしまっております。
ここが本当に分かりません…。
修正しましたという回答では、本当に原因が取り除かれたのか取り除いたつもりになっているのかわかりません。もう一度聞きます。INSERT INTO 一時テーブル名 SELECT;(…正しくは以下も続く)がINSERT INTO 一時テーブル名 SELECT 正しくは以下も続く;になった事を確認しましたか?修正前に戻すとINSERT INTO 一時テーブル名 SELECT;(…正しくは以下も続く)に戻る事を確認出来ましたか?YES or NOで教えて頂けますか?
りんご様
ご指摘ありがとうございます。
>YES or NOで教えて頂けますか?
こちらYESで回答いたします。
すると、エラー3343は未解決だけど、一部データが出力されていない状況は改善されたという事になりましたか?
>> 4
Excelのバックグラウンドプロセス終了も確認済でしょうか?要するに、Excel出力機能のコードも再確認するのはどうかな。オブジェクトの破棄を忘れていない事、いきなりプロパティを使っていない事。別のエラーのアレだから、無関係かもしれないけど念の為に。
やれそうな事を捻り出してみましたが、正直力不足でした。助けになれずすまない。