繁体   English   中英

带命令的水晶报表没有出现所有字段

[英]Crystal Report with command doesn't appear all fields

我正在尝试将 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}

我对每个可能有空值的值使用了类似的公式,并在公式的代码编辑器中将选项“空值异常”更改为“空值默认值”,但仍然发生错误。

我在 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"); 并且在报表的dataSource中,它显示了一些数据和一些缺失,我创建了一个与报表相同查询的数据网格视图,以查看数据是否有任何问题,数据网格视图显示结果如预期但我没有知道为什么它不在报告中。 我验证数据库和每个字段并重建,我也创建了新的水晶报告但没有什么不同

下面的代码是最后一个(出现了一些数据)

 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),

停在

ReportDocument cryRpt = new ReportDocument(); 

看看,如果数据集 ds 有数据。(否则你必须处理那个

下一步是创建一个使用该数据结构的 rpt 文件。

有这种方式https://stackoverflow.com/a/8420629/5193536

在您创建 xsd 源的地方或像我一样使用 ds.writexml(filepath) 并创建一个 xml 文件并将其用作基本数据源来创建您的 rpt 文件(就像 dtp)。 我只能找到德文的手册,但您会找到很多特定问题的答案。

所以现在你有了一个可以使用数据集ds的rpt文件,并且不介意数据

当您创建了 rpt 后,使用您的代码通过在 Crystalviewer 中显示来使其生效。

在您第一次制作并了解水晶的必要性后,它会变得更容易,您将花费一些学习时间来获得一份好的报告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM