代码之家  ›  专栏  ›  技术社区  ›  Ego Placebo

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

  •  0
  • Ego Placebo  · 技术社区  · 3 年前

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

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

    太长,读不下去了 我需要一个Crystal Report中两个表的数据。其中一个表是最近添加的,应用程序的其他部分可以通过“masterDataSet”毫无问题地访问它。

    1. 如果我尝试使用已手动访问的现有master数据集 (在代码中-没有设计器文件)添加了新表,但无法显示 任何数据(标题除外)
    2. 如果我尝试在一个数据集中使用两个表作为报告,则数据来自 缺少表
    3. 如果我尝试使用2个数据源,报告在localhost上是可以的,但要求在生产中登录DB(最接近成功,但我认为这是因为我使用了OLE DB,无法找到如何连接到生产服务器-它位于VPN后面)
    4. 如果我尝试使用SQL查询创建一个数据集,该数据集包含一个表适配器,其中包含所有所需数据(包括计算字段),则计算字段不包括在报告中(标签和数据)

    这些都是我迄今为止尝试过的事情。。。

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

    问题:未显示任何数据。

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

    尝试2: 我使用现有的数据集添加数据的一部分,并创建了另一个数据集来添加另一个表中的数据,从而使其在本地工作。这似乎奏效了。。。

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

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

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

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

    问题:但后来我的公式被打断了,变成了“这个域名是未知的”。 在保存公式时,它不会告诉我任何问题,只是在生成报告时。

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

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

    这个公式在我使用2个数据集的原始几乎工作的迭代中起作用。它需要检查第一个表中的一个字段,并根据数值向报告中插入一个字符串。

    感觉这不应该这么难! 我不喜欢使用哪种方法来获得这些数据,当然,如果可能的话,我更喜欢使用我已经部分工作的方法之一。

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

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

    此查询获取正确的数据:(经过编辑以更正客户端/表2的拼写错误)

    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 描述:由于出现未处理的异常,进程已终止。 异常信息:系统。AccessViolationException。。。"

    我不知道为什么。

    更新

    尝试4。。。 我尝试了Wanderi Mwangi的建议:使用SQL查询来替换公式。虽然我不想对我需要使用这些数据的所有3份报告都这样做,但我认为值得一试,看看我是否可以 某物 工作 没有快乐。

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

    这个应用程序在lol中让我头疼,似乎没有什么能正常工作

    0 回复  |  直到 3 年前
        1
  •  0
  •   Wanderi Mwangi    3 年前
    SELECT table1.*, table2.fee1, table2.fee2, table2.type
    from table1
    left join **client** on table1.client = table2.client
    
    1. 从这个查询:左联接客户端,应该是左联接表2

    2. 代替应用公式,

      如果({BCFPSTAT.activity_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