在数据集

时间:2016-12-20 10:28:30

标签: c# mysql datatable crystal-reports

我必须创建一个水晶报告,其数据将从Dataset填充。数据集有三个数据表。 即:

  

CustDetais
  BookingDetails
  FoodNExtra

当我通过Crystal Report向导设置水晶报表时,我看到了enter image description here的新屏幕 不知道该怎么做,所以我只是点击下一步。 继承我的水晶报告查看器代码:

private void CRKOTQoute_Load(object sender, EventArgs e)
{
    try
    {
        MySqlCommand cmd = new MySqlCommand("select CustName,Phone,Address,Email from tblCustDetails where custid=@custid", con.con);
        cmd.Parameters.AddWithValue("@custid", BLDashboard.custid);
        MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
        DataSet1 ds = new DataSet1();
        adapter.Fill(ds, "CustDetais");
        if (ds.Tables["CustDetais"].Rows.Count == 0)
        {
            MessageBox.Show("No Data Found", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        MySqlCommand cmd1 = new MySqlCommand("select BookingID,BookingDate,Event,EventDate,EventTime,Pax,Service,ServiceTime from tblBookingDetails where BookingID=@Bookid", con.con);
        cmd.Parameters.AddWithValue("@bookid", BLDashboard.bookingID);
        MySqlDataAdapter adapter1 = new MySqlDataAdapter(cmd1);
        DataSet1 ds1 = new DataSet1();
        adapter.Fill(ds1, "BookingDetails");
        if (ds1.Tables["BookingDetails"].Rows.Count == 0)
        {
            MessageBox.Show("No Data Found", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        MySqlCommand cmd2 = new MySqlCommand("select FoodMenu,ExtraItem from tblItem where BookingID=@Bookid1", con.con);
        cmd.Parameters.AddWithValue("@bookid1", BLDashboard.bookingID);
        MySqlDataAdapter adapter2 = new MySqlDataAdapter(cmd2);
        DataSet1 ds2 = new DataSet1();
        adapter.Fill(ds2, "BookingDetails");
        if (ds2.Tables["FoodNExtra"].Rows.Count == 0)
        {
            MessageBox.Show("No Data Found", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        RPTKOTQoute printKOTqoute = new RPTKOTQoute();
        //RPTKitchenQoute printKOTqoute = new RPTKitchenQoute();
        //RPTKOTTest printKOTqoute = new RPTKOTTest();
        printKOTqoute.SetDataSource(ds);
        printKOTqoute.SetDataSource(ds1);
        printKOTqoute.SetDataSource(ds2);
        crystalReportViewer1.ReportSource = printKOTqoute;
        System.Drawing.Printing.PrintDocument printDocument = new System.Drawing.Printing.PrintDocument();
        printKOTqoute.PrintOptions.PrinterName = printDocument.PrinterSettings.PrinterName;
        printKOTqoute.PrintOptions.PrinterName = "EPSON TM-U220 Receipt";
        printKOTqoute.PrintToPrinter(1, false, 0, 0);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

我使用与here相同的方法。

当我运行水晶报告时没有错误但没有显示数据。 我尝试使用一个数据表,它工作正常。 我也使用MySQL作为数据库。

2 个答案:

答案 0 :(得分:0)

尝试将三个数据集合并为一个,然后再将它们分配给报告数据源:

ds.Merge(ds1)
ds.Merge(ds2)

这样,ds应该包括dsds1ds2中的所有数据(所有表格)。然后,仅指定ds作为报告的数据源。

答案 1 :(得分:0)

我认为Crystal Reports仅支持一个SELECT语句作为每个报告的数据源(至少在我使用过的Crystal Reports 8.5 UI中就是这种情况),如果你使用更多它的行为有点不可预测。这可能是向导要求您加入表格的原因。如果连接查询将带来所需的所有数据不适合您,那么可能唯一的解决方案是在报表中添加子报表。但仍然无法以编程方式添加它们,您应该在设计模式下添加它们,然后通过以下代码将数据集作为数据源附加:

printKOTqoute.Subreports[0].SetDataSource(ds);
printKOTqoute.Subreports[1].SetDataSource(ds1);
printKOTqoute.Subreports[2].SetDataSource(ds2);

另请查看How to set datasource of Sub crystal report in c# win form app