【发布时间】:2020-05-17 22:08:06
【问题描述】:
我正在尝试将 3 个 MySQL 表中的数据显示到一个水晶报表中。我使用“标准报告创建向导”窗口中的“添加命令”选项编写了自己的查询,而不是使用连接到数据库的连接器(因为我想编写自己的查询代码)
下面我要执行的查询代码,我在命令中写了:
SELECT
ubc.boq_table.itemNum,
ubc.boq_table.descriptionOfWork,
ubc.boq_table.unit,
ubc.boq_table.contractualQuantity,
ubc.boq_table.priceNum,
ubc.summary.executedQuantLastSummary,
ubc.summary.priceLastWorks,
ubc.summary.executedQuantBetw2Sum,
ubc.submittal.priceCurrentWorks
FROM
ubc.boq_table
LEFT OUTER JOIN ubc.summary ON
ubc.boq_table.itemNum = ubc.summary.itemNum
LEFT OUTER JOIN ubc.submittal ON
ubc.boq_table.itemNum = ubc.submittal.itemNum
WHERE
ubc.boq_table.projectName = 'proj'
UNION
SELECT
ubc.boq_table.itemNum,
ubc.boq_table.descriptionOfWork,
ubc.boq_table.unit,
ubc.boq_table.contractualQuantity,
ubc.boq_table.priceNum,
ubc.summary.executedQuantLastSummary,
ubc.summary.priceLastWorks,
ubc.summary.executedQuantBetw2Sum,
ubc.submittal.priceCurrentWorks
FROM
ubc.summary
LEFT OUTER JOIN ubc.boq_table ON
ubc.summary.itemNum = ubc.boq_table.itemNum
LEFT OUTER JOIN ubc.submittal ON
ubc.summary.itemNum = ubc.submittal.itemNum
WHERE
ubc.summary.projectName = 'proj'
UNION
SELECT
ubc.boq_table.itemNum,
ubc.boq_table.descriptionOfWork,
ubc.boq_table.unit,
ubc.boq_table.contractualQuantity,
ubc.boq_table.priceNum,
ubc.summary.executedQuantLastSummary,
ubc.summary.priceLastWorks,
ubc.summary.executedQuantBetw2Sum,
ubc.submittal.priceCurrentWorks
FROM
ubc.submittal
LEFT OUTER JOIN ubc.boq_table ON
ubc.submittal.itemNum = ubc.boq_table.itemNum
LEFT OUTER JOIN ubc.summary ON
ubc.submittal.itemNum = ubc.summary.itemNum
WHERE
ubc.submittal.projectName = 'proj'
ORDER BY
itemNum;
以下代码我写在表单的onLoad函数中显示水晶报表注意“FullOuterQuery”与第一个代码相同
MySqlCommand Command = new MySqlCommand(FullOuterQuery, connection);
adapter.SelectCommand = Command;
adapter.Fill(table);
ReportDocument doc;
CrystalReport1 report = new CrystalReport1();
report.SetDataSource(table);
doc = new ReportDocument();
doc.Load("C:\\Users\\PC\\Desktop\\WindowsFormsApp6\\WindowsFormsApp6\\WindowsFormsApp6\\CrystalReport1.rpt");
crystalReportViewer1.ReportSource = report;
我的问题是水晶报表有空值(实际上没有找到值),因为我从 3 个表中检索并且出现此错误“对象引用未设置为对象的实例”我想用零替换所有空值但是我无法在我在命令中编写的查询中进行此操作。
我尝试使用公式来检查值是否为空,然后用零替换 例如:
if(isnull({Command.priceCurrentWorks})) then
{Command.priceCurrentWorks} = 0
else
{Command.priceCurrentWorks} = {Command.priceCurrentWorks}
我使用类似的公式,每个值都可能有 null 并在公式的代码编辑器中将选项“空值异常”更改为“空值的默认值” 但是仍然会发生错误。
我在 where 条件 projectName = 'proj' 中编写的第二个问题,但用户应该输入一个项目名称,如 where projectName = '"+ projectNameTextBox.tex+"' ; 我如何在我在命令中编写的查询中进行此操作,因为当我尝试编辑它时在 FullOuterQuery(以 c# 形式编写的查询)中没有任何变化 注意:我在 localhost phpMyAdmin 中测试了我的查询并且它有效。
更新 我删除公式并将命令中的 SELECT 查询编辑为这样
SELECT
ubc.boq_table.itemNum,
ubc.boq_table.descriptionOfWork,
ubc.boq_table.unit,
ubc.boq_table.contractualQuantity,
ubc.boq_table.priceNum,
IFNULL(ubc.summary.executedQuantLastSummary,0),
IFNULL(ubc.summary.priceLastWorks,0),
IFNULL(ubc.summary.executedQuantBetw2Sum,0),
IFNULL(ubc.submittal.priceCurrentWorks,0)
当我使用以下代码时,没有发生错误,也没有发生数据
adapter = new MySqlDataAdapter(FullOuterQuery, connection);
DataSet ds = new DataSet();
adapter.Fill(ds);
ReportDocument cryRpt = new ReportDocument();
cryRpt.Load("C:\\Users\\PC\\Desktop\\WindowsFormsApp6\\WindowsFormsApp6\\WindowsFormsApp6\\CrystalReport1.rpt");
cryRpt.DataSourceConnections.Clear();
cryRpt.SetDataSource(ds);
crystalReportViewer1.ReportSource = cryRpt;
crystalReportViewer1.Refresh();
更新 2:
当我在 adapter.Fill(ds,"boq_table"); 这样的适配器中命名我的表时
在报告的数据源中,它显示了一些数据和一些缺失,
我用报表的相同查询创建了一个数据网格视图,看看数据是否有问题,数据网格视图按预期显示结果,但我不知道为什么它不在报表中。
我验证数据库和每个字段并重建,我还创建了新的水晶报表,但没有什么不同
下面的代码是最后一段(里面出现了一些数据)
adapter = new MySqlDataAdapter(FullOuterQuery, connection);
DataSet ds = new DataSet();
adapter.Fill(ds,"boq_table");
adapter.Fill(ds, "summary");
adapter.Fill(ds, "submittal");
ReportDocument cryRpt = new ReportDocument();
dataGridView1.DataSource = ds.Tables["boq_table"];
dataGridView1.DataSource = ds.Tables["summary"];
dataGridView1.DataSource = ds.Tables["submittal"];
cryRpt.Load("C:\\Users\\PC\\Desktop\\WindowsFormsApp6\\WindowsFormsApp6\\WindowsFormsApp6\\CrystalReport1.rpt");
cryRpt.DataSourceConnections.Clear();
cryRpt.SetDataSource(ds.Tables["boq_table"]);
cryRpt.SetDataSource(ds.Tables["summary"]);
cryRpt.SetDataSource(ds.Tables["submittal"]);
crystalReportViewer1.ReportSource = cryRpt;
crystalReportViewer1.Refresh();
以下字段不出现
IFNULL(ubc.summary.priceLastWorks,0),
IFNULL(ubc.summary.executedQuantBetw2Sum,0),
IFNULL(ubc.submittal.priceCurrentWorks,0)
你可能会认为 IFNULL 有问题,或者是因为另一个表中存在字段但下面的查询行正确显示数据
IFNULL(ubc.summary.executedQuantLastSummary,0),
【问题讨论】:
-
您是如何创建 CrystalReport1.rpt 的,您是否正确引用了您的表格。我个人从我的数据集中创建了一个 xml 文件,并将该 xml 文件用作我的报告的数据源。我感觉你的命令有点不对劲,见stackoverflow.com/a/8010215/5193536
-
您是否在应用程序中使用本地数据库文件?我正在使用 MySQL phpMyAdmin localhost,我不知道这是否可以与数据集一起使用,我根据您附加的链接更新帖子,请再次查看我的帖子。
标签: c# mysql crystal-reports