2012-03-01 2 views
1

Я обхват через запрос, чтобы создать список номеров деталей для заполнения списка номеров деталей:Добавить список элементов запросов к одному элементу массива

<cfset binlist = "" > 
<cfset a = 1 /> 
    <cfloop query="getParts"> 
    <cfif a > 
     <cfset binlist = getParts.binnum> 
     <cfset a = 2 > 
    <cfelse> 
     <cfset binlist = binlist & "," & getParts.binnum > 
    </cfif> 
    </cfloop> 

Я хочу, чтобы добавить binlist элемента в элемент массива для заполнения электронной таблицы:

<cfset aColumns = [ partnum, shortchar08, partdescription, binlist, inventory.currinv , staged.stagedqty, alloc.allocqty, available, shelfCount, shipdtl.shipqty, getNumberofStores.numStores, tordered, APS, paddedLeadTime, LWM, storesRemain] /> 

<!---add the column data to the spreadsheet---> 
<cfset SpreadsheetAddRow(SpreadsheetObj, ArrayToList(aColumns)) /> 

1 часть может быть в нескольких ящиках. Он работает на моей странице вывода CF, но не в электронной таблице, которую я пытаюсь сгенерировать, чтобы показать несколько ящиков для части

Созданная таблица содержит только один бит на каждую часть, а не несколько ящиков для частей, которые имеют несколько ящиков.

+0

Я не после того, что именно вы пытаетесь сделать? Кроме того, если вы можете отобразить код в html, вы можете обмануть и отправить html в excel с помощью cfcontent. Кроме того, вы можете просто, если ваша исходная логика многозначительна, используя ValueList() или ListAppend(), если вы хотите сделать еще одну логику внутри цикла. – Busches

+0

Спасибо за ответ, кусты, однако, binnum не ограничивается конкретной частью. – aparker81

ответ

2

Я думаю (если я понимаю вашу логику), то, что вы пытаетесь сделать, это просто одна строка кода в Coldfusion:

<cfset binList = ValueList(getParts.binnum) /> 

Если вы посмотрите на свой код, похоже, что вы встраиваете список в массив, а затем преобразуете массив в список. Если у вас есть список, разделенный запятыми, то придерживайтесь этого в середине другого списка, разделенного запятыми, они просто будут интерпретироваться как отдельные элементы, а не набор.

Посмотрите, что произойдет, если вы измените разделитель на что-то другое, чем запятой, так что он не запутаться с большим списком:

<cfset binList = ValueList(getParts.binnum, ';') /> 

Update:

Хорошо, я вижу, у вас есть проблема группировки деталей. Позвольте мне обновить свое решение:

<!--- loop over unique parts --> 
<cfoutput query="getParts" group="partnum"> 
    <cfset binlist = "" > 
    <!--- loop over bin numbers for each part ---> 
    <cfoutput> 
     <cfset binlist = ListAppend(binlist, getParts.binnum, ';') /> 
    </cfoutput> 
    <!--- do row level stuff here ---> 
    <cfset aColumns = [ partnum, shortchar08, partdescription, binlist, inventory.currinv , staged.stagedqty, alloc.allocqty, available, shelfCount, shipdtl.shipqty, getNumberofStores.numStores, tordered, APS, paddedLeadTime, LWM, storesRemain] /> 

    <!---add the column data to the spreadsheet---> 
    <cfset SpreadsheetAddRow(SpreadsheetObj, ArrayToList(aColumns)) /> 

</cfoutput> 

В принципе, вы не смешиваете CFOUTPUT и CFLOOP. Если вы используете CFOUTPUT для группировки, необходим внутренний CFOUTPUT (минус параметр группы), чтобы получить внутреннюю группировку.

+0

Hah ... я избил меня! Мои мысли точно. – bpanulla

+0

Великие умы, вы знаете. ;) –

2

Вы изобретаете колесо. valuelist (getparts.binnum) предоставит вам ваш список, не зацикливая и проверяя. Или, по крайней мере, вы можете использовать «listAppend()», чтобы избежать всей этой проверки запятой :)

+0

Спасибо, Марк. Я пробовал это, но он, кажется, тянет каждый бункер, а не ограничивает бункеры конкретными partnums. Я пытаюсь: ' ' – aparker81

+0

Ваш код, указанный выше, не ограничивает их ... код цикла просто добавляет часть num в список, созданный вручную. Если вы хотите быстро и просто фильтровать номера деталей, попробуйте использовать запрос запроса: AS в выберите partnum из getParts, где partnum <> '' OR ... добавьте условия здесь –

+0

См. мой обновленный ответ. –

1

Если ваш запрос содержит только строки для одной части, функция ValueList(), вероятно, является способом перехода сюда. Вам может потребоваться использовать другой разделитель для вашего списка бен держать их отдельно от других элементов в массиве, который вы передаете SpreadSheetAddRow:

<!--- Second argument uses space as delimiter ---> 
<cfset binlist = ValueList(getParts.binnum, " ") > 

<!---add the column data to the spreadsheet---> 
<!--- Explicitly use comma as delimiter ---> 
<cfset SpreadsheetAddRow(SpreadsheetObj, ArrayToList(aColumns, ",")) /> 

Это также звучит, как у вас возникли проблемы с разметкой запроса в наборы по частям. Поэтому, возможно, ValueList не сделает это за вас, не используя Query of Query (QoQ). Если вы уже используете сгруппированный cfoutput, просто собрать вверх часть/binlist отображение в Struct:

<cfset part_bins = structNew()> 
<cfoutput query="getParts" group="partnum"> 
    <cfoutput> <!--- partnum group ---> 
    <cfif structKeyExists(part_bins, getParts.partnum)> 
     <cfset part_bins[getParts.partnum] = listAppend(part_bins[getParts.partnum], getParts.binnum, " ")> 
    <cfelse> 
     <cfset part_bins[getParts.partnum] = getParts.binnum> 
    </cfif> 
    <cfoutput> 
</cfloop> 

Затем вытащить список бен из структуры, когда вы сделаете свой массив:

<cfset aColumns = [ partnum, shortchar08, partdescription, 
    part_bins[partnum], inventory.currinv , staged.stagedqty, 
    alloc.allocqty, available, shelfCount, shipdtl.shipqty, 
    getNumberofStores.numStores, tordered, APS, paddedLeadTime, 
    LWM, storesRemain] /> 

Возможно, вам придется обрабатывать случаи, когда часть не имеет корзин - это вызовет исключение структуры.

0

Вы не говорите, какую платформу базы данных вы используете, но вы можете выполнить этот же трюк, используя агрегированную функцию в SQL.Например, в MySQL:

SELECT partnum, GROUP_CONCAT(DISTINCT binnum SEPARATOR ' ') 
FROM Parts 
GROUP BY partnum 

Аналогичная функция существует в PostgreSQL:

array_to_string(array_agg(binnum),' ') 
Смежные вопросы