3

現在、次の方法を使用して、すべてのレポートセクションに接続情報を割り当てています。しかし、レポートには多くのセクションがあるので、レポートはほぼ10秒後に表示されます。これは本当に遅いように見えます。クライアント側にインストールするときに、各CRにログオン情報を一度に設定できる他の方法はありますか。

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();
4

3 に答える 3

3

最終的に、ログオン情報の適用もレポートの更新も問題ではないことがわかりました。しかし、Crystal レポートに透かしを設定するために使用したのは、私の大きな画像オブジェクトでした。

この画像を透かしとして使用したレポートが 10 件ありました。透かし入りの画像を削除したところ、次の問題が解決されました。

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

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

  3. 以前は、1 つまたは 2 つのビルドの後で、「この操作を完了するのに十分なストレージがありません」というメッセージが表示されていました。ビルドごとに VS を再起動して指を交差させる必要がありました。

  4. Crystal Report は、CrystalReportViewer でより高速に表示され、objrpt.PrintToPrinter500 倍高速に動作します。

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

于 2012-04-17T15:06:17.910 に答える
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);
                }
            }
        }

それが役に立てば幸い。

于 2012-04-14T06:06:35.803 に答える