【问题标题】:Crystal Report Select Only First Row水晶报表只选择第一行
【发布时间】:2014-06-24 05:58:22
【问题描述】:

假设我有以下 2 个表:

表 A:

CompanyCode
LocationCode
FormNumber
EmployeeNumber
...

表 B:

CompanyCode
LocationCode
FormNumber
EmployeeNumber
ClaimDate
...

使用所有 4 个参数 (CompanyCode,LocationCode,FormNumber,EmployeeNumber) 连接表 A 和表 B。这 4 个参数将作为报告的输入。 A表的一行可以有B表的多行。

在 Crystal Report 中,对于表 A 中的每条记录,我只想要表 B 中具有最早 ClaimDate 的行。

使用 SQL,这可以通过以下方式完成:

SELECT        *
FROM          TableA a
INNER JOIN    TableB b ON 
              a.CompanyCode = b.CompanyCode AND
              a.LocationCode = b.LocationCode AND
              a.FormNumber = b.FormNumber AND
              a.EmployeeNumber = b.EmployeeNumber
WHERE         a.CompanyCode = @CompanyCode AND
              a.LocationCode = @LocationCode AND
              a.FormNumber = @FormNumber AND
              a.EmployeeNumber = @EmployeeNumber AND
              b.ClaimDate IN
             (SELECT   MIN(b.ClaimDate)
              FROM     TableB b 
              WHERE    b.CompanyCode = @CompanyCode AND
                       b.LocationCode = @LocationCode AND
                       b.FormNumber = @FormNumber AND
                       b.EmployeeNumber = @EmployeeNumber )

但我不太确定如何在 Crystal Report 中做到这一点。我尝试使用 SQL 表达式,但似乎 SQL 表达式无法通过报表输入。

【问题讨论】:

  • 报告中的数据应该是什么样子?
  • 实际显示的数据不涉及数值。只是后端的计算。报告中有 2 个部分,它将被隐藏/不基于字段值。所以在那个查询中,我会得到另一个字段,将其命名为Amount,所以它将是最早日期的Amount。然后这个Amount 将使用货币表转换为其他值。如果此数量超过某个特定值,它将隐藏一个部分并显示另一个部分。反之亦然。所以我认为以上是解决这个问题的第一步。
  • 尝试这样的事情...将数据放在详细信息部分并按照降序排序,然后将supress写为if recordnumber=1 then false else true..这只是一个想法..不确定是否它会工作..试一试

标签: sql crystal-reports


【解决方案1】:

您需要在命令中创建 4 个参数(CompanyCodeLocationCodeFormNumberEmployeeNumber)。

命令的查询:

SELECT        *
FROM          TableA a
INNER JOIN    TableB b ON 
              a.CompanyCode = b.CompanyCode AND
              a.LocationCode = b.LocationCode AND
              a.FormNumber = b.FormNumber AND
              a.EmployeeNumber = b.EmployeeNumber
WHERE         a.CompanyCode = {?CompanyCode} AND
              a.LocationCode = {?LocationCode} AND
              a.FormNumber = {?FormNumber} AND
              a.EmployeeNumber = {?EmployeeNumber} AND
              b.ClaimDate IN
             (SELECT   MIN(b.ClaimDate)
              FROM     TableB b 
              WHERE    b.CompanyCode = a.CompanyCode AND
                       b.LocationCode = a.LocationCode AND
                       b.FormNumber = a.FormNumber AND
                       b.EmployeeNumber = a.EmployeeNumber )

【讨论】:

    【解决方案2】:

    首先,为表 A 中的数据对行进行适当的分组。然后为每个组创建一个从头开始的运行总计字段(确保记录按日期排序)。验证每个明细行的运行总计正确后,创建一个组选择公式,显示运行总计等于 1 的记录。

    【讨论】:

    • 我不太清楚为什么我需要进行累计。这可能也有效,但我更喜欢@craig 答案,因为它非常简单。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多