Crystal Reports 使用多个表格 - 不能完全正确

Posted

技术标签:

【中文标题】Crystal Reports 使用多个表格 - 不能完全正确【英文标题】:Crystal Reports using multiple tables - can't quite get it right 【发布时间】:2022-01-09 13:35:31 【问题描述】:

我正在尝试使用 Visual Studio (2019) 将一些 Crystal Reports 添加到旧的 C# WinForms 项目中。 我以前做过,但这是我第一次需要一次从多个(SQL)表中提取数据,这似乎是我问题的根源。希望有人能告诉我哪里出错了?

如果我使用 SQL 查询或存储过程来创建我的数据集,我似乎无法使用公式,但我尝试的所有其他方法都存在数据丢失或身份验证问题。

TLDR: 我需要一个水晶报表中的 2 个表中的数据。这些表之一是最近添加的,应用程序的其他部分可以通过“masterDataSet”毫无问题地访问。

    如果我尝试使用我手动设置的现有 masterDataSet (在代码中 - 没有设计器文件)添加了新表,它无法显示 任何数据(标题除外) 如果我尝试将一个数据集中的 2 个表用于报告,则来自一个 表不见了 如果我尝试使用 2 个数据源,则报告在 localhost 上正常,但要求在生产中登录数据库(最接近成功,但我认为这是因为我使用了 OLE DB 并且找不到如何连接到生产服务器 - 它是在 *** 之后) 如果我尝试使用 SQL 查询创建包含一个表适配器的数据集,其中包含计算字段所需的所有数据,则计算字段不会包含在报告中(标签和数据)

这些是我记得迄今为止尝试过的事情......

尝试 1:我更新了现有数据集“masterDataSet”以包含新添加的表和添加到预先存在的表中的字段。该数据集已用于应用程序中的几乎所有其他报表和表单(有很多),但我不知道其中是否有任何使用多个表(有没有办法在不查看每个报表的数据源的情况下进行检查?) . 设置数据源位置,验证数据库...

问题:没有数据显示。

我见过其他人遇到此问题,但他们的问题似乎是多个数据集,而不是 1 个具有多个表的数据集。 注意:我必须手动更新这个数据集,因为它没有“设计器”文件,只有一个 .cs 文件。这个项目必须在我之前的某个时间从反编译版本重建,所以我认为这与它有关。但是我很确定我正确地更新了它,因为它适用于它所使用的所有相关表单功能。这是我参与过的唯一一个 WinForms/Crystal Reports 项目,所以我只知道由于我在过去几年中所做的所有故障排除研究,有些事情并没有达到应有的水平!

尝试 2: 我设法让它在本地工作,方法是使用现有数据集添加一部分数据,并创建另一个数据集来添加另一个表中的数据。这似乎有效...

问题:在本地工作,但在生产中,在尝试加载报告时它要求数据库登录。

还尝试使用两个表创建一个全新的数据集,但这给了我与 Attempt1 相同的结果:没有显示数据。 (另外,使用单个数据源时不能“显示 SQL 查询”;它是灰色的)

我看到其他人询问这个问题,但大多数解决方案都是在 VB 中,我不太了解,无法翻译成 C#。此外,代码经常在没有任何指示它实际需要去哪里的情况下发布。 因此,我查看了一些关于在 Crystal Reports 中使用多个表并尝试不同方法的文章和视频,例如“使用 SQL 语句”在 DataSet 中填充 TableAdapter。

尝试 3: 到目前为止,我得到的最接近的方法是使用存储过程将数据拉到一起(在 2 个表上使用内部联接,以防相关)。 创建一个新的数据集 添加 tableadapter,在向导中使用现有的存储过程(也尝试过“创建存储过程”) 设置数据源,验证数据库... 所有基本领域似乎都可以工作......

问题:但是我的公式因“此字段名称未知”而中断。 保存公式时它不会告诉我任何问题,只有在生成报告时才告诉我。

报告中两个公式之一的简化​​示例,都导致错误(另一个是2个nums的总和):

if(BCFPSTAT.facility_type) = 0
then 'Facility Suspended'
else
'other'

这个公式在我最初使用 2 个数据集的几乎可以工作的迭代中有效。它需要检查第一个表中的一个字段,并根据数值在报表中插入一个字符串。

感觉这不应该这么难! 我没有偏好使用哪种方法来使这些数据发挥得很好,但如果可能的话,我自然更愿意使用我已经部分工作的方法之一。

如果你们都需要任何进一步的信息,请告诉我,任何关于我哪里出错的指导将不胜感激!

额外信息,以防有用...

此查询获取正确的数据:(已编辑以更正客户端/table2 错字)

SELECT table1.*, table2.fee1, table2.fee2, table2.type
from table1
left join table2 on table1.client = table2.client

ConnectionString 也在 app.config 中,因此被选为(设置)我的本地版本使用集成安全性,生产版本具有登录详细信息。

属性中预先存在的“masterDataSet”数据库 DLL 是 crdb_adoplus.dll

我自己尝试过的是

1 也使用 crdb_adoplus.dll

& 数据库类型:

ADO.NET (XML) OLE DB (ADO)(这个在本地工作,但要求 生产证书)

此外,Visual Studio 在尝试使用这些工具进行处理时经常崩溃 “应用程序:devenv.exe 框架版本:v4.0.30319 说明:进程因未处理的异常而终止。 异常信息:System.AccessViolationException..."

我也不知道为什么。

更新

尝试 4... 我尝试了 Wanderi Mwangi 的建议:使用 SQL 查询替换公式。虽然我不想对需要使用这些数据的所有 3 份报告都执行此操作,但我认为值得尝试看看是否可以让 something 正常工作。 不开心。

我通过将它们放入来添加字段。除了 SQL 查询之外没有脚本。我试过验证、重建、注销/登录服务器、删除和重新添加数据源和所有字段、重新启动我的机器.. SQL 创建的列拒绝显示 - 包括标签。尽管 SQL 预览显示了所有正确的数据,而报表预览在适当的位置显示了虚拟数据。

这个应用程序让我大吃一惊,似乎没有什么可以按应有的方式工作

【问题讨论】:

left join client on table1.client = table2.client ... table2 别名从何而来?也许client 应该是table2 或者table2 应该是client 抱歉@AlwaysLearning 在我简化名称时打错了字。查询本身不是问题;如前所述,它返回正确的数据 【参考方案1】:
SELECT table1.*, table2.fee1, table2.fee2, table2.type
from table1
left join **client** on table1.client = table2.client

    从这个查询:左连接客户端,应该是左连接表2

    而不是应用公式,

    if(BCFPSTAT.facility_type) = 0 然后“设施暂停” 别的 '其他'

您可以定制您的查询以做出该决定:

SELECT table1.*, table2.fee1, table2.fee2, table2.type, case WHEN table2.type = 0 THEN 'Facility Suspended' Else 'other' end as FacilityStatus
    from table1
    left join table2 on table1.client = table2.client

【讨论】:

谢谢! table2 应该是一个错字,道歉!我可以尝试将公式移动到此报告的查询中,看看它是否在服务器上正常运行,但还有一些其他报告有点复杂,而且这种方法对他们来说不实用,所以我宁愿如果可以的话,解决根本问题! 我尝试将公式放入查询中,虽然在预览 SQL 结果时它确实产生了正确的结果,但报告中的“FacilityStatus”为空白 如果其他字段不为空,则 FacilityStatus 也不应为空。确保您已将其拖放到报告中,并确保您编写的脚本没有影响它。 是的,它不应该是空白的,但它是。理论上,它是否也不能在公式中工作,或者在同一数据集中显示来自 2 个表的数据?总之,不开心。添加到 Qn 作为尝试 4!我没有添加任何脚本。感谢您的尝试!

以上是关于Crystal Reports 使用多个表格 - 不能完全正确的主要内容,如果未能解决你的问题,请参考以下文章

Crystal Reports 不会显示相关的表格数据

Crystal Reports 2008 中的单个条形图需要多个页面

Crystal Reports:需要使用汇总字段作为记录选择公式的一部分

Crystal Reports中的证书错误

Vb.net 和 Crystal Reports 添加组和子报表

使用Crystal Reports ReportDocument