Crystal Report多表失败

时间:2012-04-17 15:14:57

标签: c# crystal-reports-2008 multi-table

我还是C#的新手并且报告,为了采取措施,我开始使用一张桌子的Crystal Report。

最终我发现它并且它的工作非常出色。

然后我在报告中添加了另一张表。我的代码中没有更改任何内容。将第二个表中的字段添加到报表中会生成空白报表。

再次删除该字段(因此报表上没有第二个表的列),报表再次生成数据。

所以我觉得问题出在报告方面。但无论如何我已经包含了代码:

private void Load_Ord_Rep()
{
    using (MySqlConnection conn = new MySqlConnection(OTW.Properties.Settings.Default.wcdbConnectionString))
    {
        conn.Open();

        String sql = "SELECT * FROM wcdb.order_table, wcdb.mat_table WHERE order_no = '13661' and order_table.mat_code = mat_table.mat_code";

        using (MySqlCommand cmdSel = new MySqlCommand(sql, conn))
        {

            DataSet ds = new DataSet();
            MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);

            da.Fill(ds);

            ReportDocument rpt = new ReportDocument();
            rpt.Load("C:\\Visual Studio 2008\\Projects\\OTW\\OTW\\CrystalReport3.rpt");

            dataView1.Table = ds.Tables[0];
            rpt.SetDataSource(dataView1);


            crystalReportViewer1.ReportSource = rpt;
            crystalReportViewer1.Refresh();
        }
        conn.Close();
    } 
}

经过进一步调查,我得出的结论是问题不是代码或链接,而是第二个表的加载。我做了一个外连接,值相等或更大。只有第一个表的结果显示在报告上。因此,由于未读取第二个表的值,因此无法在两个表之间建立连接,因此报表上没有数据。现在问题是:为什么Crystal Report没有读取第二个表格??

更新

我从主报告中删除了第二个表格,并添加了包含数据的子报告。与以前相同的结果。 sup报告显示空白。它自己运行sup报告(作为主报告),它正确填充。我正在使用MySQL,那么它可能是数据库问题吗?

更新

我创建了一个新应用,这次使用ODBC(而不是ADO.NET)将报告连接到数据库。它的效果非常好。现在弄清楚为什么ADO.Net不起作用....因为我的整个程序都是基于它。

2 个答案:

答案 0 :(得分:0)

检查水晶报告中两个表之间的链接。它们是否符合您的期望?

通过

检查

Field Explorer> DataBaseFields> (RightClick)DatabaseExpert> (见标签)链接

答案 1 :(得分:0)

您无需执行使用数据集/数据视图执行的任何代码。我建议你允许报告“拉”数据(你现在正在“推送”数据到报告)。

要提取数据,只需要以下内容:

ReportDocument rpt = new ReportDocument(); 
rpt.Load("C:\\Visual Studio 2008\\Projects\\OTW\\OTW\\CrystalReport3.rpt"); 

rpt.SetDataBaseLogon("userName", "password", "servername", "database"); 

crystalReportViewer1.ReportSource = rpt; 

这样可以通过传入数据视图来降低报告混乱的风险,因为数据视图不知道如何在设计报表时映射到您添加的表格。 (我现在99.999%肯定会发生这种情况。)

如果您需要设置任何代码,则上面的所有代码都缺少参数。看起来您可能正试图“推送”数据,因为您想过滤该订单号或其他内容?如果是这样的情况下,添加一个“记录选择公式”您的报告中,它的基础是在一个水晶报表参数公式“其中”方面并添加rpt.SetParameter(参数)线到我提供的代码。

不,这不是许可限制,我很确定。

成功排查路径:

1)使用简单代码加载报告: *没有错误,但报告中没有数据

2)在报告中使用了加入选项: *即使只有一张桌子,也会产生空白报告 *关注第二张表不读数据

3)通过“记录选择公式”检查记录过滤,这可能会限制/阻止返回行 *在这种情况下,不适用

4)分析了联接是如何完成的: [“这可能就是你加入的方式。例如:如果你对第二个表做了一个正确的外连接并且它没有数据,那么即使第一个表的行也不会回来。”]

  • 在'orders'表中的主id字段(mat_code)上连接到第二个表中的相同字段(mat_code)'material'。这看起来很好。
  • 尝试左外连接,链接类型为“> =”。该报告打印了第一个表(订单)和数据。但仍然是 none 的第二个表'(材料)数据。
  • 做了一个新的报告,这次首先添加“第二”表(材料)然后是第一个(订单)。这次使用外部联接,只有材料表显示数据。换句话说,它似乎只为第一个或主表提取数据,然后停止。

5)尝试通过将第二个表的数据放入子报表并将子报表链接到同一个“mat_code”字段来加载第二个表的数据:

(有用的教程:http://vb.net-informations.com/crystal-report/vb.net_crystal_report_subreport.htm

  • 子报告也显示空白。只有主报告有效。无法填充子报表中存在的任何表。
  • 仍然看不到使用简单建议代码的数据,他的原始代码仍显示第一个表的数据

6)检查表的连接和定义与报告提交或加载的实际数据结构/内容之间是否不匹配。建议进行具体测试,请访问: i)'设置数据库位置'(您管理报告的表) ii)查看是否使用了XML / DataSet而不是OLEDB iii)将数据库表位置更改为相同的表,但使用OLEDB连接类型(对所有表重复)

  • 当尝试上面的时候,当点击“更新”按钮时,屏幕只是瞬间闪烁,但没有显示任何消息。再次测试报告后,行为仍然没有变化。他正在使用ADO.NET连接数据。

7)仍然高度怀疑数据表定义和连接类型。建议进行以下测试: i)使用简单的测试代码制作一个全新的1页应用程序。 ii)从一开始使用 OLEDB 制作一份仅包含“订单”和“材料”表的新报告 iii)仅将主表中的mat_code字段添加到报告中 iv)为mat_code上链接的“材料”添加子报告 v)仅在子报表上显示mat_code vi)运行应用程序

如果数据显示,则问题是:

答案1:数据库定义(在报告首次发布时通过ADO.NET连接到表中时读取)与以后加载报告时找到的实际数据表/列定义不匹配(即有人编辑了“材料”表来更改列定义或字段数等。)

答案2:将ADO.NET数据推送到报表所需的Crystal Reports和Windows驱动程序的特定组合可能存在缺陷。在OLEDB上使用拉数据模型可能会解决一些问题。可以使用最新的Crystal Reports和/或Windows驱动程序(即修补程序或Windows更新,驱动程序包等)解决这些问题。

  • 测试工作正常。即使没有制作子报告也是如此。这些数据就像它应该的那样进入。