【问题标题】:Crystal Report multi table failure水晶报表多表失败
【发布时间】:2012-04-17 15:14:57
【问题描述】:

我还是 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 不工作....因为我的整个程序都是基于它的。

【问题讨论】:

  • 检查两个表之间的链接。它们符合您的预期吗?

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


【解决方案1】:

您不需要对数据集/数据视图执行任何代码。我建议您允许报告“提取”数据(您现在正在将数据“推送”到报告中)。

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

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% 肯定现在正在发生。)

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

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

成功的故障排除路径:

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

2) 在报告中使用加入选项: * 即使只有一个表格,也会导致空白报告 * 关注第二张表不读取数据

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

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

  • 已将“订单”表中的主 ID 字段 (mat_code) 连接到第二个表“材料”中的同一字段 (mat_code)。这看起来不错。
  • 尝试了左外连接,链接类型为“>=”。该报告打印了带有数据的第一个表(订单)。但仍然没有第二张表的(材料)数据。
  • 制作了一个新报表,这次先添加“第二个”表(物料),然后添加第一个(订单)。这次使用外连接,只有材料表显示数据。换句话说,它似乎只为第一个或主表提取数据,然后停止。

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 更新、驱动程序包等)解决。

  • 测试运行良好。即使没有制作子报告。数据按预期提取。

【讨论】:

  • 你的理论听起来很有道理。我用了你的代码。没有错误,但报告中也没有数据。我在报告中使用了连接选项,这也导致了一个空白报告,即使我只使用一个表。我认为问题在于第二个表没有读取任何数据。
  • 如果是这种情况,那么这可能就是您加入的方式。例如,如果您对第二个表进行右外连接并且它没有数据,那么即使是第一个表的行也不会返回。因此,要么连接导致两个表都依赖于在该连接上查找数据,要么您对返回的行有某种过滤器。 (即记录选择公式,where 子句中的内容。)
  • 我做了一个左外连接,链接类型为 ">="。该报告打印了带有数据的第一个表(订单)。但仍然没有第二张表的(材料)数据。所以我做了一个新的报告,但这次先添加“第二”表(材料),然后再添加第一个。这次使用外连接,只有材料表显示数据。所以由于某种原因,报告只提取第一个表的数据,然后停止。可能是设置问题还是许可限制?
  • 子报告也显示为空白。将其用作主要报告,它可以工作。所以仍然没有填充第二个表。
  • 您在哪个字段上进行了子报表链接?另外,请确认您正在使用我建议的代码来允许报告提取自己的数据?如果你推送数据,我无法保证你会得到什么。
【解决方案2】:

在水晶报表中检查两个表格之间的链接。它们符合您的预期吗?

检查一下

Field Explorer> DataBaseFields > (RightClick) DatabaseExpert > (See Tab) Links

【讨论】:

  • 链接似乎是正确的。有一条线连接相应的列。而且我没有看到任何错误。
  • 纸上的链接是正确的。 Crystal Report 自动正确建立了链接。但我认为问题在于不满足链接的条件。
  • 我正在使用 mysql 数据库。在 Workbench 中运行查询会给出正确的结果。我什至在表单中包含了一个 Datagridview,它还从完全相同的数据集中加载了正确的结果。
  • @user1339124 用时间线在问题中写下您的更新......这样每个人都可以轻松阅读并思考它。
  • 对不起,我讨厌人们表现得很愚蠢。但我真的不明白我应该如何编写更新。我必须使用您的建议中的新反馈来编辑问题吗?然后我是否只需手动输入日期以显示时间线?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多