Crystal Reports: поместите данные строк из сгруппированных записей в столбцы - PullRequest
1 голос
/ 02 ноября 2011

Хорошо, поэтому в моем источнике данных 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 или Contractor), информация должна идти в соответствующий столбец.

Не уверен, что лучший способ сделать этоэтот?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Этого можно достичь, используя формулы 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 на третьей строке.
2 голосов
/ 02 ноября 2011

Я думаю, что ваш лучший вариант, если у вас есть относительно хорошо ограниченные данные, как описано в вашем примере, это изменить хранимую процедуру так, чтобы она возвращала данные так, как они должны отображаться в отчете.

Например, одним из вариантов будет:

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 Reports и всегда обнаруживал, что гораздо проще создать данные, которые вам нужны в SQL, чем пытаться согнуть Crystal по своей воле (не произойдет).

...