Crystal Reports

CrystalReportsの帳票を含んだプログラムをディプロイメントする

2008/03/29 Saturday - 23:48:34 by chameleon

VisualStudio2008 ProfessionaにバンドルされているCrystalReportsのレポートを含んだプログラムを配布するためにセットアップファイルをビルドしようとしても、CrystalReportsのランタイムをセットアップに含めるためのマージモジュールが見つからずしばらく悩んでいました。
が、どうやら.msmファイルでセットアップファイルをつくるのではなく、.msiで作ればいいみたいだと判明。
具体的には、セットアッププロジェクトのプロパティーページから「必須コンポーネント」ボタンをクリックして、「CrystalReports Basic for VisualStudio」にチェックを入れ「アプリケーションと同じ場所から必須コンポーネントをダウンロードする」を選択すれば、セットアップファイルにCrystalReporsのランタイムが自動的に同梱されます。これに気づかずしばらくはまりました・・・。マージモジュールが必須だと思ってたんですね。

.msiでランタイムをインストールすれば、ターゲットコンピュータにランタイムが既にインストールされていれば再度インストールされることはありませんからセットアップ時間の短縮につながる可能性があります。マージモジュールでセットアップした場合は、インストールのたびに必ずランタイムもインストールが行われるというセットアップ時の挙動の違いがあります。

CrystalReportsに値を渡す

2008/03/24 Monday - 15:30:40 by chameleon

業務用に作成していたアプリケーションが、ディスクドライブの故障でサーバーを修理したとき以来ちょっと、挙動がへんでCrystalReportsの帳票を開くとき、コードでユーザーアカウントやパスフレーズを設定しているのに、ログインできずにダイアログが表示されてしまう状況が発生するようになったので、コードを見直して修正しました。手を抜いていたところの心当たりがあったので解決はすぐだったんですが・・・そのついでにちょっと帳票を修正しました。
コードから値をCrystalReportsの帳票に渡して、データベースから読み込むフィールド以外でも動的に帳票を変化させるようにしました。
TextObject txtObj;
txtObj = this.mainZaigakuReport.ReportDefinition.ReportObjects["text12"] as CrystalDecisions.CrystalReports.Engine.TextObject;
txtObj.Text = "任意の文字列を書く。";
//Reportobjectnameはレポートオブジェクトの名前を入れる
//TextFieldNameはテキストフィールドの名前を入れる
VisualStudio2005 C#
CrustalReports XI R2 SP3+fix3.4
Windows XP SP2
いろいろな手法があるようですが、これ以外だとパラメータフィールドを使うのがやりやすそうですね。    

Crystal Reports for Visual Studio 2008

2008/03/19 Wednesday - 21:12:20 by chameleon

VS2008 ProfessionalにはCrystalReportsがバンドルされています。しかしながら、Crystal Reports 2008のサブセットのようで、しかも致命的なのは、セットアップファイルを作成して配布するときに必要なCrystalReportsのランタイムを含めるためのマージモジュールがどうやらまだ提供されていないことです。
マージモジュールはMSDNのサイトの情報によると、「CrystalReportsRedist2007_x86.msm」で・・・なんで、2007なのかよくわからないんですが・・・その実態は、「cr_net_2008_mergemodules_mlb_x86.zip」とのことです。(32bit Version)がBusinessObjectsのサイトにもまだ、ファイルはアップロードされていないようで・・・。
CrystalRepors2008のマージモジュールは既に提供されていますから、ちょっとした嫌がらせ・・・じゃなくて、急ぐんなら製品版買えやってことでしょうね。他のバージョンのマージモジュールを試しましたが動作するセットアップファイルを作成できませんでした・・・まあ、商売的には当然ですが。
VS2008に開発環境を全面的に移行させるのはまだ時期尚早と判断しました。何しろ、バンドルされているCrystal Reports for Visual Studio 2008で作成した帳票を含んだプログラムを配布できないんですから。

Crystal Reports ViewerのBusinessObjectロゴを消す

2007/08/27 Monday - 20:30:12 by chameleon

Crystal Reports XI R2でWindowsアプリケーションを作成すると、Crystal Reports Viewerの右上に、「BusinessObject」というロゴが表示されます。これ、プロパティーの設定とかじゃ消えないんですね。WEBアプリケーションの方は、プロパティーの設定で消えるみたいなんですけどね。
で、非常に気になるわけです。なんで、BusinessObjectの宣伝しないといけないのかと・・・。
というわけで、コードで消してみることにします。
 private void toolStripButton_Click(object sender, EventArgs e)
         {
             List<system.Windows.Forms.ToolStripLabel> lbls = new List<toolStripLabel>();
             // コントロールオブジェクトに分解
             foreach (Control ctl in crystalReportViewer.Controls)
             {
                 // ツールバーを取得
     [...]

CrystalReportsViewerの「メイン レポート」と書かれたタブを消す

2006/10/22 Sunday - 18:33:28 by chameleon

もうひとつ、CrystalReportsネタで・・・。
先のエントリーで「メイン レポート」というタブの表示を任意の文字列にすることができるようになったのですが、ないほうがすっきりしてかっこいいんじゃないかと思うこともあるわけで、非表示にする方法も考えてみました。だいたい、さっきコードを書いたときに見当がついていたのでこれはすぐにできそうです。
調査結果
CrystalReportsViewer内には5つのコントロールがあるようです。

CrystalDecisions.Windows.Forms.PageView. (メインウィンドウ)
System.Windows.Forms.Splitter. (グループツリーとメインウィンドウの間の仕切り線)
CrystalDecisions.Windows.Forms.ReportGroupTree. (左側に表示されるグループツリー)
System.Windows.Forms.ToolStrip. (エクスポートや印刷コマンドボタンのあるツールバー)
System.Windows.Forms.StatusBar. (結構邪魔なこともあるステータスバー)

調査に用いたコード
 private void checkReportViewer()
 {
    foreach (object obj in crystalReportViewer.Controls)
    {
     string sControl = obj.GetType().Name.ToString();
     MessageBox.Show(sControl);
    }
 }
 IDEに表示されるプロパティーで消せるもの
グループツリー(ReportGroupTree)とステータスバー(StatusBar)とツールバー(ToolStrip)はプロパティーの設定で非表示にできます。メインウィンドウ(PageView)は非表示にしたら意味ないですから、設定できるプロパティーはありません。スプリッター(Splitter)はグループツリーを非表示にすれば当然消えます。
よって、プロパティーで非表示を選択できなくて、なおかつ消したくなるようなオブジェクトはPageView内にある「メイン レポート」というタブとなります。
StatusBarやTab自体を消すためのコード
 private void hideStatusBar()
 {
    CrystalDecisions.Windows.Forms.PageView objPageView = new CrystalDecisions.Windows.Forms.PageView();
    System.Windows.Forms.TabControl objControl = new TabControl();
 
  foreach(object tab in crystalReportViewer.Controls)
  {
    string strControl = tab.GetType().Name.ToString();
    if(strControl == "StatusBar")
    {
      crystalReportViewer.Controls[4].Visible = false;
    }
    if(strControl == "PageView")
    {
      objPageView = (CrystalDecisions.Windows.Forms.PageView)(tab);
      objControl = [...]

CrystalReports Viewerの「メイン レポート」タブを任意の文字列にする

2006/10/22 Sunday - 17:21:18 by chameleon

Crystal Reports
CrystalReports XI Release2はVisualStudio2005と併用すると、VisualStudioのIDEに統合されて、非常に使い勝手のよい帳票ツールとなります。エディションによってはおまけバージョンのCrystalReportsがついてくるものもあるのですが、自分のエディションにはついていないので別途購入しました。
なお、Windowsアプリケーションなどに組み込む場合は、CrystalReports Developer版以上を購入しなければなりません。また、VisualStudioのIDE内で使うためにはRelease2にアップグレードするためのパッチ(無料)を当てなければ利用できないなどちょっとわかりにくい製品構成になっています。
 Crystal Reports Viewerのタブの文字がダサい
Windowsアプリケーションに埋め込みで作成した帳票は、CrystalReportViewerから見ると、レンダリングされたときViewer内に「メイン レポート」というタブが表示されます。レポート名とかが表示されたり、任意の文字列を指定できれば使い道も広がるのですが、「メイン レポート」しか出てこないのではちょっと使い道がありません。そこで、

任意の文字列に変更ができないか?
非表示にできないか?

を検討してみることにしました。 
まず、ご本家のFAQによると

Q.【開発】 .NETのビューアでプレビューを実行した時のビューア左上の [メイン レポート] のタブは非表示にできますか。
A.残念ですが、このタブを非表示にはできません。固定で表示する内部仕様となります。(2004/11/06)

ダメじゃん。サポート元でキッパリと言い切られています。
もちろん、CrystalReportViewerのプロパティー設定でも消すことはおろか、タブの文字列を設定することすらできません。
が、もう少しGoogle先生に働いてもらったところ、「クリスタルレポート技自慢」という掲示板で「No.2287」の質問
クリスタルレポートビューワーのタブの「メインレポート」という文字列は
変更できないのでしょうか?
ご存知でしたら、ご教授ください。
  というのがあり、その回答のひとつに
ちょっと無理やりですが、変更出来ますよ。
※Crystal Reports for Visual Studio .NET 2003で確認 
Dim objRepView As Object
Dim objControl As Object
    
For Each objRepView In CrystalReportViewer1.Controls
If objRepView.GetType.Name = "PageView" Then
For Each objControl In objRepView.Controls
If objControl.GetType.Name = "TabControl" Then
CType(objControl, TabControl).TabPages(0).Text = "変更したいタイトル"
End If
Next
End If
Next

というのがありました。コードで変更できるとわかれば問題ありません。
上記のコードをとりあえず、C#に書き換えてみます。が、VBとちがって、C#はクラス名とか厳密に記述しないといけなかったりするので・・・えーっと、VBの「CType」ってキャストのことか・・・とかいろいろVBを思い出しながら書き換え、「論よりRun」します。
動きません・・・orz。
まあ、安易に人に頼ってはいけないと思い直し、ちゃんと細かく調査をしながらやり直します。
 private void setTabText(CrystalDecisions.Windows.Forms.CrystalReportViewer crystalReportViewer, string newText)
 {
    foreach (Control control in crystalReportViewer.Controls)
     if [...]

Click Onceするためのサーバー設定

2006/10/15 Sunday - 16:56:07 by chameleon

Visual Studio 2005からビルドしたアプリケーションの配布に「Click Once」が利用できるようになりました。
ノータッチディプロイメントの発展型のような、この技術・・・結構便利です。
特にリリース初期の、こまめにリビジョンアップするようなときには、セットアップファイルの配布に関して頭を悩ますことが減ります。
ここでは、利用しているレンタルサーバーサービス「XREA.COM」で「Click Once」を利用するときの覚書を・・・。
XREA.COMで「Click Once」を利用するためには、.htaccessの編集が必要です。
WEBサイトに配置されたSetupを実行するとブラウザにXMLファイルが表示されてしまうためです。
これはサーバーに、application 拡張子が MIME 型 “application/x-ms-application” に関連付けられていないためです。
.htaccessファイルで設定をオーバーライドしてやれば問題ありません。
.htaccessに追加する設定

AddType application/x-ms-application .application
 

Build

2006/10/10 Tuesday - 21:16:25 by chameleon

先日実験環境ではうまく動作していたコードが、他のクライアントへインストールしたら動かなかった件でかなり落ち込んでいました。
まあ、職場用のツールなので、動かないからと言ってさしたるダメージはないのですが気分がすぐれないことは間違いありません。
自分の職場のSQLServerは管理者権限のないアカウントではWindows統合認証でデータベースにアクセスさせてくれないようでした。
で、SQLServer認証でデータベースにログオンするように書き換え・・・数行の書き換えですのであっさりとクリア。
でもその後が・・・。
しばらくVisualStudioさわらないうちにあれこれと知らないことが増えてたなぁ・・・。
そんなわけでしばらくは、CrystalReportsとVSネタが個人的にブームですので、エントリーにはその二つが続く気配です。

警告

2006/10/09 Monday - 09:37:39 by chameleon

Crystal Reportsのマージモジュール「CrystalReports11_5_NET_2005.msm」をセットアッププロジェクトに追加してビルドすると183個も「警告」を受けた。気が遠くなる。
しかしビルドに時間がかかるなぁ。