Crystal Reports:将分组记录中的行数据放入列中

本文关键字:数据 记录 Reports Crystal | 更新日期: 2023-09-27 18:13:07

好的,那么我的Crystal Reports数据源的行看起来像这样:

|--------+----------+---------+------------+-----------+-----------+---------|
| SiteNo | SiteName | SiteMgr | ContType   | ContName  | ContState | ContZip |
|--------+----------+---------+------------+-----------+-----------+---------|
| 1262   | S. Belt  | Joe B.  | Landlord   | Mike      | CA        | 90017   |
| 1262   | S. Belt  | Joe B.  | Architect  | Paul      | TX        | 77040   |
| 1262   | S. Belt  | Joe B.  | Contractor | Chris     | AZ        | 85016   |
|--------+----------+---------+------------+-----------+-----------+---------|

有数百个站点编号(SiteNo),每个站点编号有三行…报告中的每条记录都需要这样格式化:

|------------+------------+------------+------------|
|    Site    |  Landlord  | Architect  | Contractor |
|------------+------------+------------+------------|
| 1262       | Mike       | Paul       | Chris      |
| S. Belt    | CA         | TX         | AZ         |
| Joe B.     | 90017      | 77040      | 85016      |
|------------+------------+------------+------------|

由于数据源的前三列(SiteNo、SiteName、SiteMgr)对于特定站点总是相同的,因此报告按SiteNo分组。这部分我已经算出来了。我把它放在组页脚。然后,我所纠结的部分是,根据联系类型(ContType: Landlord, Architect, or Contractor),信息需要放在相关的列中。

不确定最好的方法是什么?

Crystal Reports:将分组记录中的行数据放入列中

您可以通过使用Crystal公式来实现这一点,但我认为如果您修改SQL查询,则更容易理解和维护,如下所示:

select SiteNo,
       max(SiteName)     SiteName,
       max(SiteMgr)      SiteMgr,
       max(case ContType
               when 'Landlord' then ContName
               else NULL
           end)          LandlordContName,
       max(case ContType
               when 'Landlord' then ContState
               else NULL
           end)          LandlordContState,
       max(case ContType
               when 'Landlord' then ContZip
               else NULL
           end)          LandlordContZip,
       max(case ContType
               when 'Architect' then ContName
               else NULL
           end)          ArchitectContName,
       max(case ContType
               when 'Architect' then ContState
               else NULL
           end)          ArchitectContState,
       max(case ContType
               when 'Architect' then ContZip
               else NULL
           end)          ArchitectContZip,
       max(case ContType
               when 'Contractor' then ContName
               else NULL
           end)          ContractorContName,
       max(case ContType
               when 'Contractor' then ContState
               else NULL
           end)          ContractorContState,
       max(case ContType
               when 'Contractor' then ContZip
               else NULL
           end)          ContractorContZip
from Contacts
group by SiteNo

延长报告的详细信息部分,使其可以有三行,然后放置:

  • SiteNo、LandlordContName、ArchitectContName和ContractorContName在第一行;
  • SiteName, LandlordContState, ArchitectContState和ContractorContState在第二行;
  • SiteMgr, LandlordContZip, ArchitectContZip和ContractorContZip在第三行。

我认为您最好的选择,如果您有数据相对较好的约束,如您的示例中所描述的,是修改您的存储过程,以返回需要在报告中显示的数据。

例如,一个选项是:

SELECT (SiteNo + CHAR(13) + SiteName + CHAR(13) + SiteMgr) AS SiteDetails ,
       (ContName + CHAR(13) + ContState + CHAR(13) + ContZip) AS LandlordDetails ,
       (SELECT ContName + CHAR(13) + 
               ContState + CHAR(13) + 
               ContZip 
          FROM Contacts 
         WHERE SiteNo = c.SiteNo and ContType = 'Architect') AS ArchitectDetails ,
       (SELECT ContName + CHAR(13) + 
               ContState + CHAR(13) + 
               ContZip 
          FROM Contacts 
         WHERE SiteNo = c.SiteNo and ContType = 'Contractor') AS ContractorDetails 
 FROM Contacts c
WHERE c.ContType = 'Landlord'

此方法检索所有房东详细信息,然后执行子查询以检索其他相关联系人。这是非常具体的问题,可能不是最好的一般解决方案。然而,我已经广泛地处理过(比我关心的要多得多)Crystal报告,并且总是发现它可以更容易地生成您在SQL中需要的数据,而不是试图使Crystal屈服于您的意愿(这不会发生)。