0

我还是 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();
    } 
}

通过进一步调查,我得出结论,问题不在于代码或链接,而在于第二个表的加载。我做了一个外部连接,值相等或更大。报告中仅显示第一个表的结果。所以因为第二个表的值没有被读取,所以两个表之间不能建立连接,因此报告中没有数据。现在的问题是:为什么水晶报表没有读取第二个表!?

更新

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

更新

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

4

2 回答 2

0

检查水晶报表中两个表之间的链接。他们是你所期望的吗?

检查它

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

于 2012-04-17T15:22:02.143 回答
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% 肯定现在正在发生。)

如果您需要设置任何参数,则上面的所有代码都缺少参数。看起来您可能正在尝试“推送”数据,因为您想过滤该订单号或其他内容?如果是这种情况,请在报表中添加一个“记录选择公式”,将其作为该公式的“位置”方面基于 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) 'Set Database Location'(您在其中管理报表的表)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 更新、驱动程序包等)得到解决。

  • 测试运行良好。即使没有制作子报告。数据就像它应该的那样被拉进来。
于 2012-04-18T03:30:14.213 回答