Accessは手軽に作れる半面、予期しないことがしばしば発生しますよね。
これまで経験した中で原因の特定に苦労したものの1つに、フォームからレポートを開いた際になぜかAccessが落ちるという現象があります。
現象は文字通りで、レポートを開くとAccessが強制終了してしまうのです。
エラー表示も出ず、ブレークポイントを貼っていても引っかからない・・・。
こんな現象が発生したことはないでしょうか?
そこでこの記事では、フォームからレポートを開くとAccessが落ちる場合の原因と対処方法についてまとめました。
このようなことが発生するのはかなりレアなケースだとは思いますが、引っかかってしまうと中々解決まで時間がかかります。
そのようなときは本記事を参考にしてみてください。
Accessでフォームからレポートを開いた際に落ちる現象の詳細
フォームからレポートを開くとAccessが落ちるという現象ですが、詳しく書くと次のような状態になっていました。
- フォームとレポートでは同じクエリを利用。
- クエリを直接開くと結果が問題なく表示される。
- レポートを直接開いた際は問題なく表示される。
- フォーム上にボタンを配置し、ボタンクリックでレポートを表示するような呼び出し方をすると、Accessが落ちてしまう。
この現象の一番の厄介な点は、レポート単体で開いた際はAccessは落ちないという点です。
つまり、クエリ単体、フォーム単体、レポート単体では動くので、処理的には問題はないという事です。
だけど、フォーム経由でレポートを起動した場合のみなぜかAccessが落ちる・・・。
ここがこの問題のハマってしまうポイントになっています。
Accessが強制終了する原因はクエリにあり
フォームからレポートを呼び出した際にAccessが落ちる原因は色々とありそうですが、経験した中で原因としてあったのはクエリに問題があったという事です。
クエリ単体で開くと結果は表示されているのだから、クエリには問題はないのでは?
ロジカルに考えるとこのように判断してしまう(実際していた)のですが、この考えが解決を遠ざけてしまう結果になります。
調べた結果、どうやらクエリで取得した結果をレポートで使用する場合、避けたほうがクエリ(SQL)の良い書き方があるようでした。
クエリを見直してAccessが落ちる現象を解消
実際に、Accessが落ちてしまった場合のクエリと、落ちなくなったクエリを比較しながら解説していきます。
フォームからレポートを呼び出し時に強制終了する場合のSQL
レポートで次のようなクエリをレコードソースに定義した場合、強制終了して落ちます。
SELECT T.COL_1,
T.COL_2,
(SELECT M.NAME FROM TBL_M M WHERE M.CODE = T.COL_1) AS COL_3
FROM TBL_T
行っているのはTBL_MからCODEを条件にNAMEを取得しているような処理で、サブクエリーで実現しています。
クエリ単体は問題なく動きますが、フォームからレポートを起動すると落ちます。
この原因はどうやらサブクエリーにある(上記例だとCOL_3で使用している部分)ようで、サブクエリーが含まれるクエリだとレポートが落ちるようでした。
レポートが落ちないように変更したSQL
サブクエリーが問題なので、サブクエリーを使用しない書き方に変更します。
SELECT T.COL_1,
T.COL_2,
M.NAME AS COL_3
FROM TBL_T
LEFT OUTER JOIN TBL_M M ON M.CODE = T.COL_1
このようにJOIN句を利用してTBL_Mと結合して取得すると、レポート起動時に落ちることがなくなります。
Accessが強制終了するクエリ・強制終了しないクエリ、どちらも得られる結果は同じですが、フォームからレポートを開いた際に、Accessが強制終了して落ちる・落ちないが分かれてしまうのですね。
なんだか原因不明ですが、実際このようなケースが発生するため、ハマってしまいます。す・・・。
まとめ
フォームからレポートを開いた際にAccessが強制終了して落ちてしまう場合の原因と対策についてをまとめました。
原因の一つとして考えられるのが、クエリの書き方です。
レポートで使用するクエリではサブクエリーは使用せず、JOIN句を使ってSQLを書くと、意図しないエラーで悩むことが少なくなるでしょう。