2011-07-05 3 views
-1

J'ai créé une table en utilisant le système de listes coldfusion, les lignes sont des mois et les colonnes sont des villes, et la variable est les ventes, maintenant je dois ajouter à chaque variable de vente évaluée, la liste des ces ventes, jusqu'ici il n'y a pas de problème avec l'écriture du sql de cette table et les ventes, mais je ne peux pas définir # la liste de ces sociétés qui appartiennent à chaque vente dans le tableau, puisque c'est la LISTE des sociétés, pas une variable comme la vente, j'espère que je me suis fait clair :) voici mon code:Évaluer la liste des variables ColdFusion

La requête avec quelques jeux:

<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> 

ici est e Définitions e pour les listes:

<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> 

et voici la table:

<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> 

il dit: Variable company_COMPANY_ID_1_1 est définie. où est mon erreur? Je ne peux pas évaluer la liste des company_idies de la même façon que j'ai évalué le NETTOTAL, puisque le total net n'est pas la liste, mais seulement une valeur ... Et merci à tous pour l'aide et l'attention! ;)

+1

trop de code ... –

+0

@richard son suffit d'avoir un coup d'oeil aux deux derniers avec c_index, les autres sont comme un exemple pour cela – user775917

Répondre

1

Il y a beaucoup de choses que vous pouvez améliorer dans ce code.

Il n'est pas nécessaire d'incrémenter le nombre de villes dans une boucle. Vous pouvez obtenir le compte directement à partir de SQL (select count(*) from setup_city) ou de CF après avoir construit votre liste (listlen(cities_list).

Pour cette question, il est inutile de boucler la liste manuellement lorsque vous pouvez simplement utiliser ValueList avoir CF faire le travail pour vous:

cities_list = ValueList(get_city.city_id); 
cities_list_name = ValueList(get_city.city_name); 

Il n'y a aucune raison de construire une liste de mois si tout ce que vous Vous pouvez faire une boucle de 1 à 12. Utilisez plutôt la boucle 1 à 12.

type_index n'a pas besoin d'être une liste si vous n'avez qu'un seul article. Utilisez la variable à la place. Remplacez-le par une liste uniquement lorsque vous avez réellement besoin d'une liste; cela supprimera également la nécessité d'utiliser evaluate, ce qui rend votre code difficile à lire et difficile à suivre. Même chose pour cc_index. Étant donné que les oscilloscopes sont accessibles comme s'il s'agissait de structs, il est généralement préférable (et peut être beaucoup plus rapide) d'utiliser structkeyexists(attributes, "money") plutôt que isdefined("attributes.money"). Spécifier la portée pour isdefined aide, bien sûr ... isdefined("money") est non seulement lente, mais pourrait renvoyer une variable complètement différente si vous ne faites pas attention.

En parlant de structures, je recommande fortement de les utiliser plutôt que des noms de variables concaténées. Il est extrêmement difficile d'analyser ce que vous avez écrit afin de comprendre ce que vous essayez de faire: l'utilisation de structures faciliterait le suivi. Finalement, il me semble que vous faites beaucoup de travail dans ColdFusion pour faire quelque chose que votre base de données pourrait faire pour vous beaucoup plus facilement. Si vous avez besoin de totaux généraux pour les entreprises par ville, pourquoi ne pas le faire?

<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> 

Est-il nécessaire de vérifier que le mois se situe entre 1 et 12? Si INVOICE_DATE existe, il doit avoir un mois entre 1 et 12.Je supprimerais entièrement ces lignes de la requête ou les remplacerais par INVOICE_DATE IS NOT NULL.

Vous devriez alors être en mesure d'obtenir votre tableau des résultats avec quelque chose qui ressemble à peu près comme ceci:

<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> 

Espérons que cela est d'un peu d'aide pour vous. Je vous encourage fortement à lire sur les tableaux et les structures; quelqu'un qui utilise evaluate le fait généralement à la dure quand il y a une façon beaucoup plus facile de gérer les choses, et il y a beaucoup d'exemples sur SO et ailleurs de code CF que vous devriez être capable d'apprendre.

+0

merci pour toutes ces instructions, je vais essayer de le changer dans un meilleur comme vous l'avez probablement compris, je suis juste un débutant en coldfusion et sql, donc j'ai fait ce que je pouvais)) j'accepterai votre réponse comme correcte, puisqu'il n'y a pas beaucoup de gens pour y répondre de toute façon, – user775917

+0

btw cela fonctionne parfaitement, beaucoup plus vite et plus facilement! :) mais j'ai encore quelques erreurs)) http://stackoverflow.com/questions/6607421/group-by-cities – user775917

+0

@user, content de pouvoir aider; C'est un bon endroit pour être si vous avez plus de questions. –

Questions connexes