Crystal Reports: поместите данные строк из сгруппированных записей в столбцы

#c# #visual-studio-2008 #crystal-reports

#c# #visual-studio-2008 #crystal-отчеты

Вопрос:

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

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

Комментарии:

1. Можете ли вы изменить свой источник данных?

2. Да, у меня также есть доступ к сохраненному коду proc amp; C #. Где и как для меня было бы наилучшим способом получить данные в правильном формате?

Ответ №1:

Вы могли бы достичь этого, используя формулы 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 и contractor contname в первой строке;
  • SiteName, LandlordContState, ArchitectContState и ContractorContState во второй строке;
  • SiteMgr, LandlordContZip, ArchitectContZip и Contractor Contzip на третьей строке.

Комментарии:

1. Итак… В итоге я использовал глобальные переменные в формулах Crystal для решения своей проблемы, но после того, как я закончил, я увидел ваш ответ. Я даже не знал, что могу использовать MAX() со строковыми значениями. Я искал что-то подобное, так что это довольно круто. Из любопытства я все равно попробовал ваше решение, и оно отлично работает! Спасибо! В моей реальной проблеме было гораздо больше полей и соединений с таблицами, чем показано в моем первоначальном примере. В итоге мне пришлось использовать табличную переменную, а затем присоединить ее к другой таблице, потому что одно из моих полей было текстовым типом, который нельзя использовать при группировке. Еще раз спасибо!

Ответ №2:

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

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

 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 вашей воле (этого не произойдет).).

Комментарии:

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