Добавить список элементов Query в один элемент Array - PullRequest
1 голос
/ 01 марта 2012

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

<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, но не в электронной таблице, которую я пытаюсь сгенерировать, чтобы показать несколько корзин для детали

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

Ответы [ 4 ]

2 голосов
/ 01 марта 2012

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

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

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

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

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

Обновление:

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

<!--- 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 (за исключением параметра group).

2 голосов
/ 01 марта 2012

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

1 голос
/ 01 марта 2012

Если ваш запрос содержит только строки для одной детали, функция 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, просто соберите отображение part / 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 голосов
/ 01 марта 2012

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

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

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

array_to_string(array_agg(binnum),' ')
...