2016-03-23 10 views
0

Я пытаюсь создать массив, который даст мне все значения из моего списка, а затем на основе записей из cfquery I wan, чтобы получать значения в течение многих лет. Чтобы сделать это более ясным, я покажу вам ниже, как мой массив должен выглядеть так:Как построить массив из списка и cfquery?

time slot year2015 year 2016 
0700   0   0 
0715   1   0 
0730   0   0 
0745   0   0 
0800   0   5 

и так далее. Мои значения времени слотов хранятся в <cfset dataList> и выглядит следующим образом:

<cfloop list="#ListGetAt(dataList,i,",")#" index="k" delimiters="|"> 
     <cfoutput>#k#</cfoutput> 
    </cfloop> 

0600 0615 0630 0645 0700 0715 0730 0745 0800 0815 0830 0845 0900 0915 0930 0945 1000 1015 1030 1045 1100 1115 1130 1145 1200 1215 1230 1245 1300 1315 1330 1345 1400 1415 1430 1445 1500 1515 1530 1545 1600 1615 1630 1645 1700 1800 1900 2000 2100 2200 2300 0000 

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

<cfoutput query="getRecords" group="YearRecord"> 
    <cfoutput> 
     #TimeSlot# - #YearRecord# - #ValueYear#<br/> 
    </cfoutput> 
</cfoutput> 

0830 - 2015 - 2 
0915 - 2015 - 2 
1000 - 2015 - 1 
0630 - 2016 - 1 
0800 - 2016 - 1 

Моих записи из двух разных мест. Временные интервалы из моего списка и записи с действительными значениями из моей cfquery. Поэтому я хочу создать свой массив, содержащий все записи из моего списка, и для каждой записи я хочу вывести годный столбец с допустимым значением. Так что я попытался первым, чтобы заполнить мой массив с элементами из списка:

<cfset myArray=ArrayNew(1)> 

<cfloop list="#ListGetAt(dataList,i,",")#" index="z" delimiters="|"> 
    <cfoutput> 
     #myArray[z]# 
    </cfoutput> 
</cfloop> 

и этот код дает мне ошибку:

Type: Expression ********** Line: 253 ********** ********** The element at position 600 of dimension 1, of array variable &quot;MYARRAY,&quot; cannot be found. 

Кроме того, после я заполнить массив, я бы добавить еще два элемента к этому массиву. Год и значения для каждого года. Если кто-то знает, что я делаю неправильно, и что это лучший способ сделать это, пожалуйста, дайте мне знать. Заранее спасибо.

+0

Почему бы просто не использовать один [PIVOT] (https://technet.microsoft .com/en-us/library/ms177410% 28v = sql.105% 29.aspx) или даже более старая 'SUM (CASE ...)' техника? – Leigh

+0

Я пробовал это, но позже у меня возникла проблема с циклом внутри списка. –

+0

Какая проблема? Можете ли вы показать код? – Leigh

ответ

1

В начале. Не знаю Почему везде вы используете ListGetAt (dataList, i, ","). Это внутри большой петли?

Этот код

<cfset myArray=ArrayNew(1)> 

<cfloop list="#ListGetAt(dataList,i,",")#" index="z" delimiters="|"> 
    <cfoutput> 
     #myArray[z]# 
    </cfoutput> 
</cfloop> 

бросает ошибку, потому что туАггау пуст, когда вы цикл над списком. Если вы хотите, чтобы заполнить его таким образом вы shuld сделать это как то

<cfset myArray=ArrayNew(1)> 
<cfset yourList = ListGetAt(dataList,i,",")> 
<cfloop list="#yourList#" index="z" delimiters="|"> 
    <cfset myArray.append(z)> 
</cfloop> 

или просто

<cfset yourList = ListGetAt(dataList,i,",")> 
<cfset myArray = ListToArray(yourList)> 

Но если я понимаю, это хорошо вам нужно 2 одномерный массив. Вы должны сделать это так.

<cfset myArray=ArrayNew(2)> 
<cfset yourList = ListGetAt(dataList,i,",")> 
<cfloop list="#yourList#" index="z" delimiters="|"> 
    <!--- we will append array with our value. later you can append to this year and other values from query ---> 
    <cfset myArray.append([z])> 
</cfloop> 

EDIT 1 Может быть, вы должны думать о Struct не о массиве? Создайте структуру со всеми вашими временными интервалами в качестве ключа. Я буду использовать короткие обозначения.

<cfset str = {}> 
<cfloop list="#yourList#" index="z" delimiters="|"> 
    <cfset str[z] = {'y2015'=0,'y2016'=0,'valYear'=0}> 
</cfloop> 

<cfoutput query="getR" group="theYear"> 
    <cfif theYear eq 2015> 
     <cfset str[z]['y2015'] = theCount> 
    <cfelse> 
     <cfset str[z]['y2016'] = theCount> 
    </cfif> 
</cfoutput> 
<cfdump var="#str#"> 

Теперь вы можете использовать StructKeyList, чтобы получить список ключевых с этой stuct, чтобы петли над этой структурой.

+0

Я пробовал это: \t \t \t \t \t \t \t так что мой Recor ds были в правильном месте, но их дублировали 5 раз. если я удалю свой дополнительный cfoutput, я получаю только первую запись за 2015 год и первые записи за 2016 год. Как это можно исправить? –

+0

Никогда не использовать внутри . Он никогда не заканчивается хорошо. Я обновляю свой ответ другим решением. Описание в запросе - это временной интервал из массива? – Bonanza

+0

Да временной интервал - описание. Если у меня есть два размерных массива вроде: 1. 0600 2. 0 3. 0615 4. 0 5. 0630 6. 2 Как я могу пройти через этот массив, чтобы получить мои значения из позиций? –

1

Если вы хотите добавить что-то в массив, используйте arrayAppend.Помните, что это функция, поэтому, пожалуйста, это:

arrayAppend(myArray, thingsToAdd); 

Только на Lucee или CF2016 работает с образом:

myArray.arrayAppend(thingToAdd); 
+0

ColdFusion 2016 поддерживает 'myArray.append (thingToAdd);' –

 Смежные вопросы

  • Нет связанных вопросов^_^