/ .NET

Windowsアプリの帳票ツールとしてはそれなりにメジャーかと思われるクリスタルレポートのお話。

かれこれ10年以上前に初版開発した業務用パッケージアプリで Visual Studio 2005 付属版のクリレポを使って以来、今なお現役という状況。
アプリ自体は Windows Forms から WPF に移行したり、データベースが Oracle から PostgreSQL に変わったり、と色々手が入ったものの、帳票に関してはこれといった変更も行われずに過ごしてきました。
最近になってようやく最新版に刷新するか、という流れになってきたので早速調査。

ちなみに、VS2005 付属のクリレポでは VC++ 2005 のランタイムが使われているのですが、同ランタイムは2016年にサポート切れ、提供も終了とのこと。
確かに「最新のサポートされる Visual C++ のダウンロード」に 2005 は掲載されていませんが、VC++ 2005 ランタイム自体は普通にダウンロードページが生きてたりします。
まぁ、サポートが切れているのは間違いなさそうなので、今後の利用は控えるべきでしょう。

クリレポの話に戻して、Wikipediaによれば、Crystal Decisions 社から Business Objects 社を経て、現在は SAP 社が取り扱っているようで、「SAP Crystal Reports」という名称になっておりました。
様々なバージョンがある単体版はさておき、Visual Studio への統合はどうなっているのかしらん、と心配だったのですが、どうやら継続して無償提供されているようで、「SAP Crystal Reports, developer version for Microsoft Visual Studio」として提供されている模様。
最新情報を得るためにはこちらのページも参照しておいたほうが良いかもしれません。
ちなみにダウンロードページの直リンはこちら

Visual Studio 上でレポートデザイナを使うためには VS IDE 用のパッケージを、実行環境にはランタイムモジュールをそれぞれ導入する必要があります。
VS IDE 用のパッケージは Visual Studio 2015 への導入のみ確認しました。(VS2017 で利用可能かは未確認)
また、アプリのインストーラにランタイムを同梱するためのマージモジュールも提供されています。(マージモジュールを利用すると個別にランタイムを入れる必要がなくなり、インストーラが一本化できます)

で、本題はここから。

新しいマージモジュールをインストーラに組み込んでみたところ、どうにもうまくインストールできません。
表示されるエラーはこんな感じ。

モジュール C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\crtslv.dll で登録に失敗しました。HRESULT -2147024770。サポート担当者に問い合わせてください。

マージモジュールを利用したインストーラ作成について書かれているページを見ると、VC++ 2005 ランタイムのマージモジュールをセットアッププロジェクトに含めるように書かれているのですが、実際に VC++ 2005 のマージモジュール (Microsoft_VC80_CRT_x86.msm など) を含めてみても効果なし。
埒が明かないので、Dependency Walkerを引っ張り出して、SAPクリレポランタイムが参照している DDL を調べてみたところ、VC++ 2015 のランタイムを参照していることが判明。
セットアッププロジェクトに VC++ 2015 ランタイムのマージモジュール (Microsoft_VC140_CRT_x86.msm と Microsoft_VC140_MFC_x86.msm) を追加してあげると、ようやくインストールが成功しました。(_x86、_x64 どちらを利用するかはセットアッププロジェクトの TargetPlatform に合わせるべし)
SAPクリレポランタイムのバージョンは現時点で 13.0.22 のようですが、ここに至るまでに何度もバージョンアップが重ねられていると思われるので、SAPクリレポを使用する場合は今後のバージョンの変化に注意が必要かもしれません。

実行環境が整ったところで、旧デザイナで作成したレポートファイルをSAPクリレポ配下で使えるか試したところ、特に問題なく利用できる様子。
FAQによれば、レポートファイル (.rpt) の互換性は保たれているとのこと。
データソースに DataSet をセットする方式、かつ Windows Forms 用のビューアしか確認していませんが、ビューアの体裁を合わせるためにプロパティ変更が多少必要だったものの、レポート出力のロジック自体は特に変更の必要なく動いているようなので、これなら普通に移行できそうです。
ちなみに、コードは少し書きにくいですが、動的参照 (Reflection) を使うと新/旧どちらのランタイムでも動かせて便利だったりします。



コメントを残す

メールアドレスが公開されることはありません。