Есть много вещей, которые вы можете улучшить в этом коде.
Увеличение количества городов внутри цикла не требуется.Вы можете получить счет непосредственно из SQL (select count(*) from setup_city
) или из CF после построения списка (listlen(cities_list
).
В этом отношении нет необходимости циклически просматривать список вручную, когда вы можете просто использовать ValueListчтобы CF сделал всю работу за вас:
cities_list = ValueList( get_city.city_id );
cities_list_name = ValueList( get_city.city_name );
Нет смысла составлять список месяцев, если все, что вы когда-либо собираетесь сделать, это цикл от 1 до 12. Используйте 1 к 12цикл вместо.
type_index
не должен быть списком, если у вас есть только один элемент.Вместо этого используйте переменную.Замените его списком, только когда вам действительно нужен список;это также избавит от необходимости использовать evaluate
, что делает ваш код трудным для чтения и трудным для понимания людьми.То же самое для cc_index
.
Поскольку доступ к областям возможен, как если бы они были структурами, обычно лучше (и может быть значительно быстрее) использовать structkeyexists( attributes, "money" )
, а не isdefined( "attributes.money" )
.Конечно, определение области действия для isdefined
действительно помогает ... isdefined( "money" )
не только медленный, но и может привести к совершенно другой переменной, если вы не будете осторожны.
Говоря о структурах, я бы определеннорекомендуем использовать их, а не объединять имена переменных.Очень сложно разобрать то, что вы написали, чтобы понять, что вы пытаетесь сделать: использование структур облегчит выполнение.
Наконец, мне кажется, что вы выполняете тонну работы в ColdFusion, чтобы сделать то, что ваша база данных могла бы сделать для вас гораздо проще.Если вам нужны общие итоги для компаний по городам, почему бы просто не сделать это?
<cfquery name="GET_SALES_GRAND_TOTAL" datasource="#dsn#">
SELECT
SUM(NETTOTAL) NETTOTAL,
SC.CITY_ID,
C.FULLNAME,
C.COMPANY_ID AS COMPANY_ID
FROM
#DSN2_ALIAS#.INVOICE I,
SETUP_CITY SC,
COMPANY C
WHERE
MONTH(INVOICE_DATE) >= 1
AND MONTH(INVOICE_DATE) < 12
AND C.COMPANY_ID=I.COMPANY_ID
AND SC.CITY_ID=C.CITY
AND PURCHASE_SALES=1
GROUP BY
SC.CITY_ID,
C.FULLNAME,
C.COMPANY_ID
</cfquery>
Нужно ли проверять, чтобы месяц был от 1 до 12?Если существует INVOICE_DATE, то он должен иметь месяц от 1 до 12. Я бы либо полностью удалил эти строки из запроса, либо заменил бы их на INVOICE_DATE IS NOT NULL
.
После этого вы сможете получить свою таблицурезультаты выглядят примерно так:
<cfoutput query="GET_SALES_TOTAL" group="AY">
<!--- months first --->
<tr>
<!--- month-specific stuff goes here --->
<td>month_header</td>
<cfoutput group="city_id">
<!--- city-specific stuff --->
<td><!--- format NETTOTAL however you want here ---></td>
</cfoutput>
</tr>
</cfoutput>
<tr>
<td>grand_total_header</td>
<cfoutput query="GET_SALES_GRAND_TOTAL" group="city_id">
<td><!--- format NETTOTAL here ---></td>
</cfoutput>
</tr>
Надеюсь, это поможет вам.Я настоятельно рекомендую вам прочитать о массивах и структурах;кто-то, использующий evaluate
, обычно делает это нелегко, когда есть намного более простой способ управления вещами, и есть множество примеров как для SO, так и для других частей кода CF, из которых вы должны научиться.