【问题标题】:Crystal Report with command doesn't appear all fields带有命令的水晶报表不会出现所有字段
【发布时间】: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


【解决方案1】:

停在

ReportDocument cryRpt = new ReportDocument(); 

看看,数据集 ds 是否有数据。(否则你必须处理它

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

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

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

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

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

在你第一次做这个之后,了解了水晶的必要性,它会变得更容易,你会花一些学习时间来获得一份好的报告。

【讨论】:

  • 我给了你一个答案,这有助于解决你的问题。所以接受它并给它一个upvote.. 至于你的sql问题,没有任何数据和你想要的东西,我真的帮不了你。如果你有一个错误,我可以找到。但是你必须进行实验,直到你得到你的结果。但我需要一个 dbfiddle.uk 示例来显示数据、你得到的和预期的结果
猜你喜欢
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多