2013-12-05 1 views
1

Я не уверен, что мое название объясняет это очень хорошо. Честно говоря, я не уверен, как это выразить словами, но здесь идет:Как я могу использовать динамически сгенерированные переменные из cfloop отдельно?

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

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

#dollarformat(val(getticket[item].ticketprice * form[item]))# 

Может быть, я нужно придерживаться другого подхода ... предложения/помощь приветствуются.

Вот полный код:

<CFLOOP LIST="#form.fieldnames#" INDEX="item"> 
<cfoutput> 

    <cfquery datasource="outertixdb" name="getticket[item]"> 
     select * from tickets 
     where ticketid = '#item#' 
    </cfquery> 

    #getticket[item].ticketname#: #dollarformat(getticket[item].ticketprice)# x #form[item]# = #dollarformat(val(getticket[item].ticketprice * form[item]))#<br/> 

</cfoutput> 

+0

является 'getticket [пункт]' ссылка на переменную или вы пытаетесь объединить слово getticket с пункта, поэтому запрос называется 'getticket1'? –

ответ

3

Не уверен, что я полностью понимаю, но похоже, что вы просто пытаетесь найти кучу записей билетов, с помощью «id». Затем отобразите отдельные затраты, а также общую сумму. Если это все, что вы делаете, просто дайте поля имя: ticketID. Например:

<input name="ticketID" value="1" ...> 
    <input name="ticketID" value="22" ...> 
    <input name="ticketID" value="45" ...> 
    <input name="ticketID" value="16" ...> 

Тогда значения будут представлены в виде списка т.е. 1,22,45,16, который вы можете кормить в запросе, используя условие IN. Это позволяет вам захватывать все данные в одном запросе. (Как правило, вы хотите избежать выполнения запросов в цикле, потому что выполнение отдельного запроса базы данных для каждый id генерирует много лишних накладных расходов и ухудшает производительность).

* Изменение cfsqltype при необходимости

SELECT TicketID, TicketPrice 
FROM YourTable 
WHERE TicketID IN (<cfquerparam value="#FORM.ticketID#" 
          list="true" 
          cfsqltype="cf_sql_integer"> 
       ) 

UPDATE:

form[item] является значение количества выбора на предыдущей странице.

Это смущающее соглашение об именах. Я бы рекомендовал использовать несколько более интуитивное имя типа «количество». Что-то более подробное описание содержимого. Вы все равно можете использовать идентификатор билета для создания уникальных имен, то есть quantity_#ticketID#. Например, используя тот же билет идентификаторы, как указано выше:

<input name="quantity_1" ...> 
    <input name="quantity_22" ...> 
    <input name="quantity_45" ...> 
    <input name="quantity_16" ...> 

После того, как у вас есть результаты, есть several ways to generate a grand total. Самое простое - инициализировать переменную перед вашим циклом, а затем увеличивать ее при повторении. Используйте билет запроса ID, чтобы захватить значение количества из объема FORM:

<cfset grandTotal = 0> 
<cfoutput query="yourQuery"> 
    <!--- extract quantity value ---> 
    <cfset currQuantity = FORM["quantity_"& yourQuery.ticketID ]> 
    ... display price ... 
    <cfset grandTotal += val(yourQuery.ticketPrice * currQuantity)> 
</cfoutput> 

GrandTotal <cfoutput>#grandTotal#</cfoutput> 
+0

Эй, я увидел, что вы удалили свой ответ на другой поток. Я надеялся пересмотреть это и, возможно, пересмотреть всю структуру сайта билета. Я искренне верю, что вы можете что-то сказать, и хотите представить свои идеи тем властям. Если вы можете вернуть его, это будет потрясающе. –

4

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

<cfquery datasource="outertixdb" name="#getticket[item]#"> 

Для обработки всего, вы бы сначала нужна переменная до cfloop

<cfset total = 0 /> 

Затем внутри цикла, вы просто добавить цену билета на общую

<cfset total = total + getticket[item].ticketprice /> 

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

И, наконец, если вам не нужны все данные в таблице tickets, не используйте «select * ..», просто вытащите нужные вам данные.

+0

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

+0

Да, я просто понял, что в ответе Ли. –

+0

Это работает, но теперь меня беспокоит запрос внутри цикла, и я не совсем понимаю предложение Ли. –

0

Я бы рекомендовал выбрасывая весь динамически с именем вещи запроса.

<cfset total = 0> 

<CFLOOP LIST="#form.fieldnames#" INDEX="item"> 

    <cfquery datasource="outertixdb" name="getticket"> 
     select * from tickets 
     where ticketid = <cfqueryparam cfsqltype="cf_sql_varchar" value="#item#"> 
    </cfquery> 

<cfset total += getticket.ticketprice />  


<cfoutput query="getTicket"> 
    #ticketname#: #dollarformat(ticketprice)# &times; #form[item]# 
    = #dollarformat(val(ticketprice * form[item]))#<br/> 
</cfoutput> 
</cfloop> 

Выход ваш общий по мере необходимости