Оцените список переменных ColdFusion - PullRequest
0 голосов
/ 05 июля 2011

Я создал таблицу с использованием системы холодных списков, строки - месяцы, столбцы - города, а переменная - продажи, теперь мне нужно добавить к каждой оцененной переменной продажи список компаний, которые сделали эти продажи, пока чтонет проблем с записью sql этой таблицы и продаж, но я не могу определить - # оценить # список этих компаний, которые относятся к каждой продаже в таблице, поскольку это СПИСОК компаний, а не одна переменная, такая как продажаНадеюсь, я все прояснил :) Вот мой код:

Запрос с несколькими наборами:

<cfset month_list_name = "#message13#,#message2#,#message3#,#message4#,#message5#,#message6#,#message7#,#message8#,#message9#,#message10#,#message11#,#message12#">
                <cfset type_index = 'NETTOTAL'>
                <cfquery name="GET_CITY" datasource="#DSN#">
                    SELECT CITY_ID,CITY_NAME FROM SETUP_CITY ORDER BY CITY_NAME
                </cfquery>
                <cfquery name="GET_COMPANY" datasource="#DSN#">
                    SELECT COMPANY_ID,FULLNAME FROM COMPANY ORDER BY COMPANY_ID
                </cfquery>
                <cfset c_index = 'COMPANY_ID'>
                <cfset no_cities = 0 />
                <cfset cities_list = ''>
                <cfset cities_list_name = ''>
                <cfset month_list = ''>
                <cfoutput query="get_city"><cfset cities_list = listappend(cities_list,city_id)><cfset no_cities ++ /></cfoutput>
                <cfoutput query="get_city"><cfset cities_list_name = listappend(cities_list,city_name)></cfoutput>
                <cfloop from="1" to="12" index="i"><cfset month_list=listappend(month_list,i)></cfloop>
                <cfquery name="GET_SALES_TOTAL" datasource="#dsn#">
                    SELECT
                        SUM(NETTOTAL) NETTOTAL,
                        SC.CITY_ID,
                        DATEPART(MM,INVOICE_DATE) AY,
                        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
                        DATEPART(MM,INVOICE_DATE),
                        SC.CITY_ID,
                        C.FULLNAME,
                        C.COMPANY_ID
                </cfquery>

Вот определения для списков:

<cfloop list="#month_list#" index="month_index">
                <cfloop list="#cities_list#" index="city_index">
                    <cfoutput query="GET_SALES_TOTAL">
                        <cfif city_id eq city_index and AY eq month_index>
                            <cfloop list="#type_index#" index="tt_index">
                                <cfset 'alan_#tt_index#_#city_index#_#month_index#' = evaluate(tt_index)>
                                <cfset 'alan2_#city_index#_#tt_index#_#month_index#' = evaluate(tt_index)>
                            </cfloop>
                            <cfloop list="#c_index#" index="cc_index">
                                <cfif cc_index eq company_id>
                                    <cfset 'company_#cc_index#_#city_index#_#month_index#' = evaluate(cc_index)>
                                </cfif>
                            </cfloop>
                        </cfif>
                    </cfoutput>
                </cfloop>
            </cfloop>

а вот таблица:

<cfloop list="#month_list#" index="m_index">
                    <tr class="color-row" height="20">
                        <td width="150" nowrap><b><cfoutput>#left(listgetat(month_list_name,listfind(month_list,m_index)),20)#</cfoutput></b></td>
                        <cfloop list="#cities_list#" index="ddd_other">
                            <cfloop list="#type_index#" index="ii_index">
                                <td align="center">
                                    <cfif isdefined('alan_#ii_index#_#ddd_other#_#m_index#') and len(evaluate('alan_#ii_index#_#ddd_other#_#m_index#'))>
                                        <cfset all_toplam=evaluate('alan_#ii_index#_#ddd_other#_#m_index#')+all_toplam>
                                        <cfset 'total_#ii_index#_#m_index#'=evaluate('total_#ii_index#_#m_index#') + #evaluate('alan_#ii_index#_#ddd_other#_#m_index#')#>
                                        <cfset 'total2_#ddd_other#'=evaluate('total2_#ddd_other#') + #evaluate('alan2_#ddd_other#_#ii_index#_#m_index#')#>
                                        <cfif listfindnocase('NETTOTAL',ii_index)>
                                            <cfif isdefined('attributes.money') and attributes.money is 2>
                                                <cfoutput>#TLFormat((evaluate('alan_#ii_index#_#ddd_other#_#m_index#')/get_money.rate2),2)#</cfoutput>
                                            <cfelse>
                                                <cfoutput>#TLFormat(evaluate('alan_#ii_index#_#ddd_other#_#m_index#'),2)#</cfoutput>
                                            </cfif>
                                        <cfelse>
                                            <cfif isdefined('attributes.money') and attributes.money is 2>
                                                <cfoutput>#TLFormat((evaluate('alan_#ii_index#_#ddd_other#_#m_index#')/get_money.rate2),2)#</cfoutput>
                                            <cfelse>
                                                <cfoutput>#TLFormat(evaluate('alan_#ii_index#_#ddd_other#_#m_index#'),2)#</cfoutput>
                                            </cfif>
                                        </cfif>
                                    <cfelse>
                                        0
                                    </cfif>
                                    <cfloop list="#c_index#" index="co_index">
                                        <cfif listfindnocase('COMPANY_ID',co_index)>
                                            <cfoutput>#evaluate('company_#co_index#_#ddd_other#_#m_index#')#</cfoutput>
                                        </cfif>
                                    </cfloop>
                                </td>
                            </cfloop>
                        </cfloop>
                        <cfloop list="#type_index#" index="kk_ind">
                            <td align="center" class="txtbold">
                                <cfif isdefined('attributes.money') and attributes.money is 2>
                                    <cfoutput>#TLFormat((evaluate('total_#kk_ind#_#m_index#')/get_money.rate2),2)#</cfoutput>
                                <cfelse>
                                    <cfoutput>#TLFormat(evaluate('total_#kk_ind#_#m_index#'),2)#</cfoutput>
                                </cfif>
                            </td> 
                        </cfloop>
                    </tr>
                    </cfloop>

там написано: переменная company_COMPANY_ID_1_1 не определена.где моя ошибка?Я не могу оценить СПИСОК company_idies таким же образом, как я оценил NETTOTAL, поскольку чистая сумма - это не список, а только одно значение ... И спасибо всем за помощь и внимание!;)

1 Ответ

1 голос
/ 06 июля 2011

Есть много вещей, которые вы можете улучшить в этом коде.

Увеличение количества городов внутри цикла не требуется.Вы можете получить счет непосредственно из 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, из которых вы должны научиться.

...