2012-04-11 2 views
3

現在、以下の方法を使用してすべてのレポートセクションに接続情報を割り当てます。しかし、レポートには多くのセクションがあるので、レポートはほぼ10秒後に表示されます。それは本当に遅く見えます。クライアント側にインストールされたときに、各CRにログオン情報を設定する方法はありますか?DBログ情報が各Crystal Reportsセクションに適用されるとアプリケーションが遅くなる

JFYI:すべてのCRは、同じログイン資格情報を使用して同じDBに接続します。前もって感謝します。

readDiamondBillReport = new RealDiamondBill(); 
         crConnectionInfo.ServerName = db.Connection.DataSource; 
         crConnectionInfo.DatabaseName = db.Connection.Database; 
         crConnectionInfo.UserID = "client"; 
         crConnectionInfo.Password = "client"; 
         crConnectionInfo.IntegratedSecurity = false; 

         CrTables = readDiamondBillReport.Database.Tables; 
         foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables) 
         { 
          crtableLogoninfo = CrTable.LogOnInfo; 
          crtableLogoninfo.ConnectionInfo = crConnectionInfo; 
          CrTable.ApplyLogOnInfo(crtableLogoninfo); 
         } 

         Sections crSections2 = readDiamondBillReport.ReportDefinition.Sections; 
         // loop through all the sections to find all the report objects 
         foreach (Section crSection in crSections2) 
         { 
          ReportObjects crReportObjects = crSection.ReportObjects; 
          //loop through all the report objects in there to find all subreports 
          foreach (ReportObject crReportObject in crReportObjects) 
          { 
           if (crReportObject.Kind == ReportObjectKind.SubreportObject) 
           { 
            SubreportObject crSubreportObject = (SubreportObject)crReportObject; 
            //open the subreport object and logon as for the general report 
            ReportDocument crSubreportDocument = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName); 

            Tables SubCrTables = crSubreportDocument.Database.Tables; 
            foreach (CrystalDecisions.CrystalReports.Engine.Table SubCrTable in SubCrTables) 
            { 
             crtableLogoninfo = SubCrTable.LogOnInfo; 
             crtableLogoninfo.ConnectionInfo = crConnectionInfo; 
             SubCrTable.ApplyLogOnInfo(crtableLogoninfo); 

            } 
           } 
          } 
         } 

         readDiamondBillReport.Refresh(); 
+0

好奇心の疎外さから、レポートのDB更新のタイミングをリフレッシュと比較してみましたか? – Ryan

+0

@ Ryan:データベース更新のタイミングをどういう意味ですか? – Marshal

+0

あなたのコードが 'readDiamondBillReport.Refresh()'でレポートをリフレッシュするのと比べてレポートのデータソースを更新するのにかかる時間を意味します。私の推測では、10秒間の大半が更新ではなく更新に行くということです。 – Ryan

答えて

3

私は最終的に、ログオン情報を適用しても問題ではなく、レポートを更新することもありませんでした。しかし、それは私がクリスタルレポートで透かしを設定するために使用した私の大きな画像オブジェクトでした。

この画像をウォーターマークとして使用したレポートが10件ありました。私は、透かし画像を削除し、現在、次のような問題が解決されています

  1. プロジェクトは非常に非常に高速に構築します。以前はビルドに約1分かかりましたが、現在は8〜10秒に大幅に短縮されています。

  2. プロジェクトへの変更、特にレポートへの変更は、はるかに速く保存されます。

  3. 1つまたは2つのビルド後に"Not enough storage is available to complete this operation"を取得するために使用されました。私はVSを再起動し、各ビルドのために指を交差させなければならなかった。

  4. CrystalReportViewerでCrystal Reportsが高速に表示され、objrpt.PrintToPrinterが500倍高速に機能します。

これらの点が仲間のプログラマーに役立つことを願っています。

2

すべてのレポートには、サブレポートコレクションがあります。

各セクションのサブレポートを検索する代わりに、各サブレポートのテーブルにログイン情報を適用できます。ここで

は、いくつかのコード

private void showrep(string repName) 
     { 
      rd = new ReportDocument(); 
      rd.Load(pth+"\\"+repName); 
      LogInInfo(); 

      crv.ReportSource = rd; // crv is the reportviewer 
      crv.Show(); 
     } 

     private void LogInInfo() 
     { 
      MyApp.Properties.Settings s = new MyApp.Properties.Settings(); 
      TableLogOnInfo linfo = new TableLogOnInfo(); 
      linfo.ConnectionInfo.DatabaseName = s.dbname; 
      linfo.ConnectionInfo.UserID = s.usr; 
      linfo.ConnectionInfo.Password = s.pw; 
      linfo.ConnectionInfo.ServerName = s.svr; 

      foreach (Table t in rd.Database.Tables) 
      { 
       t.ApplyLogOnInfo(linfo); 
      } 
      foreach (ReportDocument sr in rd.Subreports) 
      { 
       foreach (Table t in sr.Database.Tables) 
       { 
        t.ApplyLogOnInfo(linfo); 
       } 
      } 
     } 

であることがお役に立てば幸いです。

+0

ログオン情報とともにテーブルのみが適用されます。 RecordSeletionFormulaとGroupSelectionFormulaがセクション内にある場合はどうなりますか。または抑制または他の数式。また、ログオン情報にも非常に依存します。したがって、すべての要素にログオン情報を適用する必要があります。 – Marshal

+2

あなたの質問はそのことを説明しておらず、前のコードで同じことをしていませんでした。すべてのレポート/サブレポートにはデフォルトでログイン情報が適用されているため、これらの情報はすべてのセクションで使用できます。レコード選択式と抑制式はほとんどlogininfoを必要としません!プッシュモデルのバインドでは、ログイン情報を一切表示せずにレポートをレンダリングすることもできます。 XMLスキーマを使用して作成されたレポートには、データベースのログイン情報はありません。それらにデータセットを渡すだけです。 – Deb

3

あなた自身の質問に答えても、私はCrystal Reportsで使用できる別の方法を指摘します。通常、人々はCrystal Reportで接続が設定され、レポートに埋め込まれたクエリに基づいてデータセットが「プル」される「プル」手法を使用します。

しかし、「プッシュ」アプローチも使用できます。このシナリオでは、Crystal ReportデータソースをXSDスキーマにバインドし、Crystal Reportにデータセットを設定するだけです。 .NETでは、データセットからXSDを簡単に生成できるので、このアプローチは簡単です。したがって、渡されたデータセットから必要な特定のテーブルにサブレポートをバインドすることができます。

ここでの利点は、データは任意のDBMS(データベースに依存しない)から来て、レポート(カスタムセキュリティ、結合などの実装)に渡す前に必要に応じて操作できることです。

.NETデータセットのように大量のデータを持つレポートにこのアプローチを実装しないという注意点は、メモリを大量に消費する可能性があります。

ただし、パフォーマンスの問題はイメージに関連しているため、このアプローチは役に立たなかったでしょう。

関連する問題