2011-07-05 59 views
-1

我使用coldfusion列表系统创建了一个表格,行数是月份,列是城市,变量是销售额,现在我需要将其添加到每个评估的销售变量中,公司列表这些销售,到目前为止写这个表和销售的SQL没有问题,但我不能定义 - #评估这些公司的名单,属于表中的每个销售,因为它是公司的列表,并不像销售一个变量,我希望我自己清楚:)这里是我的代码:评估ColdFusion变量列表

一些设置查询:

<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是不确定的。我的错误在哪里? 我不能像评估NETTOTAL一样评估company_idies的LIST,因为净总数不是列表,但只有一个值...并感谢大家的帮助和关注! ;)

+1

太多的代码... –

+0

@richard它足以看看最后两个与c_index,其他人就像一个例子 – user775917

回答

1

在这段代码中你可以改进很多东西。

增加循环内的城市数量是不必要的。您可以在建立您的列表(listlen(cities_list)后直接从SQL(select count(*) from setup_city)或CF中获取计数。

对于这个问题,它手动是不必要的遍历列表时,你可以简单地使用值列表有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的用户通常会在管理事情变得更加简单的情况下采用这种方式,并且您应该可以从中学到很多有关CF和其他地方的示例。

+0

谢谢你所有这些指示,我会尽量改变它在更好方式,因为你可能理解,即时通讯只是一个新手在ColdFusion和SQL,所以我做了我可以))我会接受你的答案是正确的,因为没有多少人回答它,反而把坏))) – user775917

+0

顺便说一句,它工作完美,更快,更容易! :)但仍然有一些错误))http://stackoverflow.com/questions/6607421/group-by-cities – user775917

+0

@用户,很高兴我可以帮助;如果你有更多的问题,这是一个好地方。 –