Вывод динамического запроса Coldfusion

Не уверен, что это возможно или нет. То, что я пытаюсь сделать, это построить строку вывода с помощью запросов. Я объединяю вывод «имя» и добавляю «значение» в конец. Затем вывод строки. Я не думаю, что это возможно. Но ищу любые варианты.

Итак, вот что у меня есть:

qry1 — основной запрос. qry2 получает значение для добавления в конец строки. Таким образом, значение переменной test будет выглядеть так: "variables.qry1.100"

Что имело бы смысл для qry1, так как это часть объекта запроса. Итак, тогда эта строка вернет правильное значение из базы данных, поскольку есть подзапрос с именем 100.

<cfoutput>
<cfloop query="variables.qry2">
    <cfset test = variables.qry1. & variables.qry2.#valueID#>
<td>#test#</td> 
</cfloop>
</cfoutput>

Большое спасибо.

JC


person jeeperscreepers    schedule 18.01.2013    source источник
comment
Что именно вам нужно вывести? Вы хотите сделать test имя динамической переменной, а затем вывести эту переменную?   -  person Vincent P    schedule 18.01.2013
comment
да, так что тест должен читать #variables.qry1.100# приравнивается к имени подзапроса, а затем выводит подзапрос, поэтому возвращаемое значение может быть 12324 для #variables.qry1.100#, поэтому, если он не является динамическим, он будет просто читать #variables.qry1. 100#, который вернет из запроса значение 100. Я пытаюсь динамически создать выходную строку, которая затем выводит значение из запроса.   -  person jeeperscreepers    schedule 18.01.2013
comment
Я добавил свой ответ. Но зачем ты это делаешь? Использование одного выходного значения запроса для выбора столбца в другом запросе кажется странным. По крайней мере, мне.   -  person Vincent P    schedule 18.01.2013
comment
Я использую его для динамического создания отчета, который выводится в Excel. Последний набор имен столбцов является динамическим и может быть изменен, добавлен и т. д., поэтому запрос создает имена столбцов, а затем присваивает значения подзапроса этим столбцам. Каждый подзапрос создается динамически и присвоен идентификатор. Это идентификатор, который я использую для возврата значения.   -  person jeeperscreepers    schedule 18.01.2013
comment
Теперь имеет смысл. Беспокоился, что ты, возможно, зарабатываешь себе больше работы.   -  person Vincent P    schedule 18.01.2013
comment
Это единственный способ, которым я мог придумать это, потому что все это дуинамические имена столбцов и значения, что-то вроде кошмара, чтобы понять, лол.   -  person jeeperscreepers    schedule 18.01.2013


Ответы (3)


То, что вы пытаетесь сделать, возможно, но сначала вам нужно создать имя переменной.

Вместо

<cfset test = variables.qry1. & variables.qry2.#valueID#>

Пытаться

<cfset test = "variables.qry1.#variables.qry2.valueID#">

Тогда тест будет variables.qry1.[valueID value]. Обратите внимание, что [значение valueID] — это то, что возвращается из запроса, поэтому фактическое значение внутри переменной.

Затем, чтобы отобразить значение variables.qry1.[valueID value].

#evaluate(test)#

ОБНОВЛЕНИЕ Как сказано в ответе Адама Кэмерона. Вы действительно должны стараться избегать функции evaluate(), это сильно влияет на производительность и не считается хорошей практикой. Вместо этого используйте следующий код (это скопировано из ответа Адама Кэмерона)

#variables.qry1[variables.qry2.valueID][1]#

ПРИМЕЧАНИЕ. Посмотрите ответ Адама Кэмерона, чтобы лучше описать, что происходит.

person Vincent P    schedule 18.01.2013
comment
Большое спасибо за то, что поделились своими знаниями, теперь все работает отлично :) - person jeeperscreepers; 18.01.2013
comment
Извини, Винсент: минусую тебя. Evaluate() почти никогда не должна быть частью какого-либо предлагаемого решения в современном CFML. - person Adam Cameron; 18.01.2013
comment
@Адам Кэмерон. Я обновил свой ответ, чтобы указать, что это плохая практика, а также добавил, что людям лучше посмотреть на ваш ответ. Надеюсь, спрашивающий увидит это, поэтому многие спрашивающие принимают ответ и никогда не читают никаких других ответов. - person Vincent P; 18.01.2013

Итак, в основном, учитывая ваш пример, у вас есть столбец в qry1 с именем 100 (и т. д., возможно, также 200, 300 и т. д.), а значения 100, 200, 300 и т. д. являются значениями строки в столбце valueID qry2? А qry1 - это однострочный запрос? Это правильно?

Если у вас есть имя столбца в динамической строке, вы используете этот синтаксис:

queryName[columnName][rowNumber]

Где queryName — это переменная, которая является запросом, columnName — это строка, содержащая имя столбца, а rowNumber — это номер строки (либо фактическое число, либо переменная, содержащая его).

Итак, используя переменные вашего примера, ваш код будет:

<td>#variables.qry1[variables.qry2.valueID][1]#</td>

Для этого нет необходимости использовать evaluate(), и здесь это не очень хорошее решение. Очень редко возникает необходимость использовать evaluate() в CFML, еще со времен CF5.

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

person Adam Cameron    schedule 18.01.2013

У Адама есть правильное решение. Вот модифицированная версия вашего исходного кода, которая делает то, что, как я думаю, вы пытаетесь сделать.

<cfoutput query="variables.qry1">
<tr>
<cfloop query="variables.qry2">
    <cfset test = variables.qry1[variables.qry2.valueID][variables.qry1.currentrow]>
    <td>#test#</td> 
</cfloop>
</tr>
</cfoutput>
person Billy    schedule 18.01.2013