2014-10-19 3 views
0

У меня есть вопрос относительно cfspreadsheet .... Поэтому я использую cfspreadshseet для создания таблиц Excel для целей отчетности. Моя страница позволяет пользователю выбирать любые столбцы из базы данных для включения в отчет. Так вот пример:CFspreadsheet looping

Электронная таблица может выглядеть следующим образом:

имя --- Фамилия --- Организация --- Адрес --- Город --- --- Государственного Zip-- -Concern

Джо Смит образец 12 главный денвер совместно 80513 проблемы идут здесь

Мой вопрос заключается в следующем, если Джо имеет более чем 1 беспокойство я получаю несколько строк с информацией Джо ... есть способ, которым я могу цикл проблемы и только 1 ряд для Джо?

Спасибо,

Стив

+2

Атрибут группы cfoutput представляется подходящим для этой ситуации. –

+0

Итак, у меня есть cfquery, которая получает данные отчета, вы предлагаете мне использовать cfoutput для ее группировки, а затем писать таблицу? – Artisdesigns

+0

Вот что я предлагаю. –

ответ

2

Использование функции «group» cfoutput отлично подходит для этой задачи. Чтобы выкинуть еще одну возможность, вы также можете создать список в запросе базы данных.

Например, MySQL имеет функцию GROUP_CONCAT. Я не знаю структуру таблиц, но говорят, что у вас есть две таблицы User и UserConcern, вы могли бы использовать GROUP_CONCAT как так сцепить значения «КОНЦЕРН» в одну строку:

SQLFiddle

SELECT 
    u.UserID 
    , u.FirstName 
    , ... other columns 
    , GROUP_CONCAT(uc.Concern) AS ConcernList 
FROM UserTable u INNER JOIN UserConcern uc 
     ON uc.UserID = u.UserID 
GROUP BY 
    u.UserID 
    , u.FirstName 
    , ... other columns 

для SQL Server, стандартная хитрость заключается в том, чтобы использовать XML Path:

SQLFiddle

SELECT 
    u.UserID 
    , u.FirstName 
    , ... other columns 
    , STUFF((SELECT ',' + uc.Concern 
       FROM UserConcern uc 
       WHERE uc.UserID = u.UserID 
       ORDER BY uc.Concern 
       FOR XML PATH('') 
       ) 
       , 1, 1, '' 
     ) AS ConcernList 
FROM UserTable u 
GROUP BY 
    u.UserID 
    , u.FirstName 
    , ... other columns 

Затем просто создайте таблицу, как обычно.

+0

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

0

Предполагая, что вы хотите, отдельные строки для каждого комментария, что-то, как это будет работать:

<cfset current_id = ""> 
<cfloop query = "my_query"> 
    <cfset next_id = user_id> 
    <!--- or whatever else forms the primary key ---> 
    <cfif next_id neq current_id> 
     <cfset current_id = next_id> 
     <cfset SpreadsheetAddRow(my_spreadsheet, "#first_name#,#last_name#,etc, #comment#"> 
    <cfelse> 
     <cfset SpreadsheetAddRow(my_spreadsheet, ",,#comment#"> 
    </cfif> 
</cfloop> 

Это основано на информации. Если у вас есть уникальный идентификатор, атрибут группы будет работать лучше.

+0

Я ищу список проблем в одной ячейке в электронной таблице Excel ... так что в приведенном выше примере Джо будет иметь одну строку в электронной таблице Excel, но если у Джо больше чем 1 проблема, они будут перечислены как wor1, беспокойство2, беспокойство3 в одной ячейке – Artisdesigns

+0

См. ответ cfqueryparam для использования listAppend. –

2

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

<cfoutput query ="thequery" group="UserID"> 
    <cfset cList=""> 
    <cfoutput group="concern"> 
    <cfset cList=ListAppend(cList,Concern)> 
    </cfoutput> 
    <cfset temp = spreadsheetAddRow(my_spreadsheet,"'#fn#','#ln#',...,'#cList#'"> 
</cfoutput> 
+0

+1. Просто отметьте, что «группа» требует, чтобы результат запроса сортировался одинаково, или он не будет работать правильно. Поэтому, если вы группируете «UserID», убедитесь, что «ORDER BY UserID» в вашем запросе db. – Leigh

Смежные вопросы