Цикл запроса coldfusion не работает

Я пытаюсь создать функцию для создания CSV-файлов из запросов. После выполнения запроса я перебираю его и добавляю поля каждой строки в объект StringBuffer. С этой целью я помещаю имена столбцов в массив:

<cfset indexes = #ListToArray(Arguments.header)# />

где аргумент в настоящее время является строкой, например:

"col1, col2, col3...."

Я проверил, что и запрос, и массив являются такими, какими они должны быть, путем дампа. Проблема возникает при циклическом просмотре результатов запроса. Данный:

<cfset indexes_length = #ArrayLen(indexes)# />
<cfloop query="query_for_csv">
        <cfloop index="i" from="1" to="#indexes_length#">
            <cfset attr = #indexes[i]# />
            <cfset sbOutput.Append(
                "#query_for_csv[attr][query_for_csv.CurrentRow]#") />
        </cfloop>           
    </cfloop> 

Выводится только первое значение первой строки, прежде чем я получу сообщение об ошибке:

[Table (rows 10 columns col1, col2, col3):
[col1: coldfusion.sql.QueryColumn@6f731eba]
[col2: coldfusion.sql.QueryColumn@6ee67e7f] 
[col3: coldfusion.sql.QueryColumn@5c6647cb] 
is not indexable by col2 

Если я заменю переменную #attr# литералом "col2":

#query_for_csv['col2'][query_for_csv.CurrentRow]#

затем цикл проходит без проблем и выдает все значения, индексированные 'col2'. Любые идеи?


person earachefl    schedule 09.11.2011    source источник
comment
Если вы поищите QueryToCsv в поисковике, то найдете существующие функции, которые делают именно то, что вам нужно, только они уже написаны и, скорее всего, тоже проверены на наличие ошибок.   -  person Peter Boughton    schedule 09.11.2011
comment
CFLib.org — отличный источник комментариев Питера. Вы также можете использовать cfgloss.com для поиска документации ColdFusion и контента CFlib.org.   -  person Aaron Greenlee    schedule 09.11.2011
comment
Да, я обнаружил, что решение Бена Наделя, упомянутое ниже, с некоторыми изменениями отлично работает. Еще нужно выяснить, как разрешить пользователю выбирать, куда сохранить файл. Другой вопрос!   -  person earachefl    schedule 10.11.2011


Ответы (2)


Я предполагаю, что проблема заключается в пробелах в вашем списке заголовков, поэтому, вероятно, это сработает:

<cfset attr = trim(indexes[i]) />


Однако, поскольку вы их не используете, вам, вероятно, это не нужно, и вы можете просто сделать это...

<cfloop query="QueryName">
    <cfloop index="CurCol" list=#QueryName.ColumnList# >
        <cfset sbOutput.Append(
            QueryName[CurCol][QueryName.CurrentRow]
        )/>
    </cfloop>
</cfloop>


ps
Обратите внимание, что здесь есть только одна пара хэшей — в ваших исходных фрагментах кода также должна быть только одна пара (в атрибуте to) — остальные являются ненужным шумом.

person Peter Boughton    schedule 09.11.2011
comment
Ну, будь я проклят - это сделало это. Ваш совет по использованию атрибута ColumnList избавляет меня от необходимости передавать аргумент заголовка. Спасибо! - person earachefl; 09.11.2011

Как уже было сказано ранее, старайтесь избегать пробелов до или после элемента списка.

Если вы хотите сравнить записи, ознакомьтесь с подходом, который выбрал Бен Надель для реализации такого конвертера Query2CSV: http://www.bennadel.com/blog/1239-Updated-Converting-A-ColdFusion-Query-To-CSV-Using-QueryToCSV-.htm

person mz_01    schedule 09.11.2011