2012-02-07 2 views
1

В попытке создать таблицу, которая генерируется из нескольких запросов, следующий код генерирует только одну строку данных, а не всю таблицу:Создание таблиц из нескольких запросов

<cfset filenametouse = 'Usage_Report' /> 
<cfset theDir = GetDirectoryFromPath(GetCurrentTemplatePath()) /> 
<cfset theFile = theDir & filenametouse & ".xls" /> 

<cflock name="fileActionSentItems" type="exclusive" timeout="30" throwontimeout="true"> 
    <cfset SpreadsheetObj = spreadsheetNew()> 
    <cfset fcol = {}> 
    <cfset fcol.dataformat = "@"> 

    <cfset SpreadsheetAddRow(SpreadsheetObj, "Part Number, Description, Allocated, On Hand, Pending Receipt, Job Count, Qty Needed, Qty Issued, Order Count, Qty Ordered, Qty Shipped")> 

    <cfoutput> 
      <cfset SpreadsheetAddRows(SpreadsheetObj,"#getParts.partnum#, #getParts.partdescription#, #getParts.allocated#, #getParts.onhand#, #receiptdata.recqty#, #jobdata.JobCount#, #jobdata.QtyNeeded#, #jobdata.qtySent#, #orderdata.ordercount#, #orderdata.ordered#, #orderdata.shipqty#")> 
    </cfoutput> 

    <cfset SpreadsheetFormatColumn(SpreadsheetObj,fcol,11)> 
    <cfspreadsheet action="write" filename="#theFile#" name="SpreadsheetObj" sheetname="Sheet1" overwrite="true" /> 
</cflock> 

В spreadsheetAddRows не создавать Зону данные для заполнения строк. Что я не делаю правильно?

ответ

1

Вам нужно передать объект запроса, а не одну строку данных.

<cfset SpreadsheetAddRows(SpreadsheetObj, getParts) > 

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

+0

Это помогает, но последние 7 столбцов получают данные из запросов, кроме деталей. Как их включить? – aparker81

+1

Почему бы просто не сделать JOIN и не вытащить все значения, необходимые в одном запросе? Вы можете вывести их отдельно, дважды позвонив «SpreadsheetAddRows», один раз с каждым запросом -ИЛИ -Стереть два запроса вместе, но только в том случае, если два запроса имеют одинаковое количество записей - в том же порядке. В противном случае результаты могут быть смещены. – Leigh

+1

... или выполнить запрос запросов для получения всех данных в одном объекте запроса. – ale

0

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

Создайте еще один запрос, содержащий все, что вы хотите в таблице с queryNew()

<cfset newQuery = queryNew("partNo,desc,allocated,onHand,rendingReceipt,jobCount,qtyNeeded,qtyIssued,orderCount,qtyOrdered,qtyShipped","varchar,varchar,varchar,varchar,varchar,varchar,integer,integer,integer,integer,integer,integer,integer,integer") /> 

... и т.д., назначая клетки, как вы идете. Если у вас есть полный объект запроса, то вы можете добавить, что spreadsheetAddRows (spreadsheetObj, NewQuery) />

Если вы нашли создание таблицы, чтобы быть слишком медленным, вы можете проверить POI Utility в http://www.bennadel.com/projects/poi-utility.htm Не как конфигурируемый как параметры электронных таблиц, но быстрее для некоторых рабочих нагрузок.

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