цикл запроса coldfusion не взаимодействует

#coldfusion #cfloop

#coldfusion #cfloop

Вопрос:

Я пытаюсь создать функцию для создания 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’. Есть идеи?

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

1. Если вы выполните поиск QueryToCsv в поисковой системе, вы найдете существующие функции, которые делают именно то, что вы хотите, только они уже написаны и, скорее всего, также были протестированы на наличие ошибок.

2. CFLib.org это отличный ресурс для комментария Питера. Вы также можете использовать cfgloss.com для поиска документации ColdFusion и CFlib.org содержимое.

3. Да, я обнаружил, что решение Бена Наделя, упомянутое ниже, с несколькими изменениями, отлично работает. Все еще нужно выяснить, как разрешить пользователю выбирать, куда сохранять файл. Еще один вопрос!

Ответ №1:

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

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

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

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

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

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

1. Что ж, будь я проклят — это сделало это. Ваш совет по использованию атрибута ColumnList избавляет меня также от необходимости передавать аргумент заголовка. Спасибо!

Ответ №2:

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

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