将DataSet和ODBC数据源连接到单个Crystal Report(C#)

2020-09-07 08:48发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有一个Web应用程序(带有Webform的.NET MVC,用于显示Crystal Report Viewer)。 我在Visual Studio中创建了一个数据集。 我正在尝试将此数据集连接到具有来自ODBC数据库的字段的现有Crystal Report。 如何配置报告以连接到两个数据源? 我能够将每个报表连接到不同的报表,但不能连接在一起。 谢谢!

//连接到数据集
 受保护的void Page_Load(对象发送者,EventArgs e)
         {
             ReportDocument报告=新的ReportDocument();
             字符串reportPath2 = Server.MapPath(" CrystalReport2.rpt");

             DataSet ds = new DataSet(" Customers");
             DataTable表=新的DataTable("客户");
             table.Columns.Add(" Name",typeof(System.String));
             table.Columns.Add(" Age",typeof(System.Int32));
             DataRow row1 = table.NewRow();
             row1 [" Name"] =" John Doe";
             row1 [" Age"] = 45;

             table.Rows.Add(row1);
             ds.Tables.Add(table);

             report.Load(reportPath2);
             report.SetDataSource(ds);
             CrystalReportViewer1.ReportSource =报告;
         }
//****************************************************  **************************************
//连接到ODBC
 受保护的void Page_Init(对象发送者,EventArgs e)
         {
             字符串reportPath = Server.MapPath(" CrystalReport2.rpt");

            //首次加载报告
             if(!IsPostBack ||(ReportDocument)Session [" Report"] == null)
             {
                 report = new ReportDocument();
                 report.Load(" reportPath");
                 ConfigureCrystalReport(report);
                 Session.Add(" Report",report);
             }
          //连接Crystal Report Viewer以在会话中显示已加载的报告
           CrystalReportViewer1.ReportSource =(ReportDocument)Session [" Report"];

          //防止在报表打开时提示参数
           CrystalReportViewer1.EnableParameterPrompt = false;
         }

   公共无效ConfigureCrystalReport(ReportDocument报告)
         {
             ConnectionInfo connectionInfo =新的ConnectionInfo();
             AssignConnection(connectionInfo);

            //将连接分配给主报表中的所有表
             foreach(report.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
             {
                 AssignTableConnection(table,connectionInfo);
             }

            //循环遍历所有节及其对象,以对子报表执行相同的操作
             foreach(report.ReportDefinition.Sections中的" CrystalDecisions.CrystalReports.Engine.Section"部分)
             {
                //在每个部分中,我们需要遍历所有报告对象
                 foreach(CrystalDecisions.CrystalReports.Engine.ReportObject reportObject在section.ReportObjects中)
                 {
                     如果(reportObject.Kind == ReportObjectKind.SubreportObject)
                     {
                         SubreportObject subReport =(SubreportObject)reportObject;
                         ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName);

                         foreach(subDocument.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
                         {
                             AssignTableConnection(table,connectionInfo);
                         }
                     }
                 }
             }
         }


         公共静态void AssignConnection(ConnectionInfo连接)
         {
            //自动登录数据库而不会提示用户
             connection.UserID =" USER_ID";
             connection.Password =" _PASSWORD";
             connection.ServerName =" SERVER_NAME";
         }

         公共静态无效AssignTableConnection(CrystalDecisions.CrystalReports.Engine.Table表,ConnectionInfo连接)
         {
            //缓存登录信息块
             TableLogOnInfo logOnInfo = table.LogOnInfo;


            //设置连接
             logOnInfo.ConnectionInfo =连接;


            //将连接应用于表!
             table.ApplyLogOnInfo(logOnInfo);
         }


 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有一个Web应用程序(带有Webform的.NET MVC,用于显示Crystal Report Viewer)。 我在Visual Studio中创建了一个数据集。 我正在尝试将此数据集连接到具有来自ODBC数据库的字段的现有Crystal Report。 如何配置报告以连接到两个数据源? 我能够将每个报表连接到不同的报表,但不能连接在一起。 谢谢!

//连接到数据集
 受保护的void Page_Load(对象发送者,EventArgs e)
         {
             ReportDocument报告=新的ReportDocument();
             字符串reportPath2 = Server.MapPath(" CrystalReport2.rpt");

             DataSet ds = new DataSet(" Customers");
             DataTable表=新的DataTable("客户");
             table.Columns.Add(" Name",typeof(System.String));
             table.Columns.Add(" Age",typeof(System.Int32));
             DataRow row1 = table.NewRow();
             row1 [" Name"] =" John Doe";
             row1 [" Age"] = 45;

             table.Rows.Add(row1);
             ds.Tables.Add(table);

             report.Load(reportPath2);
             report.SetDataSource(ds);
             CrystalReportViewer1.ReportSource =报告;
         }
//****************************************************  **************************************
//连接到ODBC
 受保护的void Page_Init(对象发送者,EventArgs e)
         {
             字符串reportPath = Server.MapPath(" CrystalReport2.rpt");

            //首次加载报告
             if(!IsPostBack ||(ReportDocument)Session [" Report"] == null)
             {
                 report = new ReportDocument();
                 report.Load(" reportPath");
                 ConfigureCrystalReport(report);
                 Session.Add(" Report",report);
             }
          //连接Crystal Report Viewer以在会话中显示已加载的报告
           CrystalReportViewer1.ReportSource =(ReportDocument)Session [" Report"];

          //防止在报表打开时提示参数
           CrystalReportViewer1.EnableParameterPrompt = false;
         }

   公共无效ConfigureCrystalReport(ReportDocument报告)
         {
             ConnectionInfo connectionInfo =新的ConnectionInfo();
             AssignConnection(connectionInfo);

            //将连接分配给主报表中的所有表
             foreach(report.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
             {
                 AssignTableConnection(table,connectionInfo);
             }

            //循环遍历所有节及其对象,以对子报表执行相同的操作
             foreach(report.ReportDefinition.Sections中的" CrystalDecisions.CrystalReports.Engine.Section"部分)
             {
                //在每个部分中,我们需要遍历所有报告对象
                 foreach(CrystalDecisions.CrystalReports.Engine.ReportObject reportObject在section.ReportObjects中)
                 {
                     如果(reportObject.Kind == ReportObjectKind.SubreportObject)
                     {
                         SubreportObject subReport =(SubreportObject)reportObject;
                         ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName);

                         foreach(subDocument.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
                         {
                             AssignTableConnection(table,connectionInfo);
                         }
                     }
                 }
             }
         }


         公共静态void AssignConnection(ConnectionInfo连接)
         {
            //自动登录数据库而不会提示用户
             connection.UserID =" USER_ID";
             connection.Password =" _PASSWORD";
             connection.ServerName =" SERVER_NAME";
         }

         公共静态无效AssignTableConnection(CrystalDecisions.CrystalReports.Engine.Table表,ConnectionInfo连接)
         {
            //缓存登录信息块
             TableLogOnInfo logOnInfo = table.LogOnInfo;


            //设置连接
             logOnInfo.ConnectionInfo =连接;


            //将连接应用于表!
             table.ApplyLogOnInfo(logOnInfo);
         }


 
付费偷看设置
发送
3条回答
四川大学会员
1楼 · 2020-09-07 09:06.采纳回答

不支持,不添加子报告,并为其设置第二个数据源。 这就是我们为第二个数据源提供子报表的原因。

首先在Designer中尝试它,然后在代码中进行相同的操作。

何必丶何苦呢
2楼-- · 2020-09-07 09:10

感谢您的帮助。 我花了几天时间试图弄清楚这一点,您却为我指明了正确的方向。

我在Designer中将子报表的数据源设置为DataSet进行了尝试,但是我看不到详细填充的数据。 我的数据集数据是从应用程序动态创建的。 我应该在哪里放置将子报表连接到数据源的代码,我应该在哪里放置创建数据以填充数据的代码? 你有示例代码吗? 谢谢。

编辑:解决了此问题。 请参阅 https://answers.sap.com/questions/ 12710107/passing-parameters-to-subreport-1.html 获取代码。

浮生未央
3楼-- · 2020-09-07 09:10

下载WIKI链接到Parameter test应用,它具有用于设置main和 子报表:

https: //wiki.scn.sap.com/wiki/display/BOBJ/Crystal+Reports%2C+Developer+for+Visual+Studio+Downloads

一周热门 更多>