クエリから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」でインデックス付けされたすべての値を吐き出します。何か案は?