2012-03-01 127 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中顯示代碼,您可以使用cfcontent作弊併發送html到excel。 此外,你可以簡單地如果你的初始邏輯大量使用ValueList()或ListAppend()如果你想在循環內部做其他邏輯仍然。 – Busches 2012-03-01 17:28:03

+0

感謝Bushes的迴應,但是,binnum並沒有被限制在特定的部分。 – aparker81 2012-03-01 17:58:17

回答

2

我認爲(如果我理解你的邏輯)你所要做的僅僅是Coldfusion中的一行代碼:

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

在觀看你的代碼。此外,它看起來像你嵌入列表到一個數組,然後將數組轉換到一個列表。如果你有一個以逗號分隔的列表,然後將它粘在另一個以逗號分隔的列表的中間,它們將被解釋爲單個元素而不是集合。

看看你改變你的分隔符逗號以外的東西,這樣它不會混淆較大的名單會發生什麼:

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

更新:

OK,我看你有沒有零件分組問題。讓我更新我的解決方案:

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

哈...你打敗我吧!我的想法確切。 – bpanulla 2012-03-01 17:46:38

+0

偉大的思想,你知道。 ;) – 2012-03-01 17:49:29

2

您正在重新發明輪子。 valuelist(getparts.binnum)會給你的清單沒有所有的循環和檢查。或者至少你可以使用「listAppend()」來避免所有逗號檢查:)

+0

謝謝,馬克。我已經嘗試過,但它似乎是拉動每個垃圾箱,而不是將垃圾箱限制到特定的partnums。我想: ' ' – aparker81 2012-03-01 17:52:32

+0

上面的代碼不會限制它們......循環代碼只是將部分num添加到手動創建的列表中。如果您想快速簡單地過濾零件數量,請嘗試使用查詢查詢:在中選擇從getParts中選擇partnum,其中partnum <>''OR ...在此處添加條件 – 2012-03-01 18:02:51

+0

查看我更新的答案。 – 2012-03-01 18:08:41

1

如果您的查詢僅包含單個零件的行,那麼ValueList()函數可能是此處的方法。您可能需要使用不同的分隔符爲你的bin目錄,讓他們從陣列中,你傳遞給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, ",")) /> 

它還聽起來像您無法分割你的查詢到套部分。因此,如果不使用查詢查詢(QoQ),ValueList將不會爲您做。如果您已經使用分組CFOUTPUT,僅僅收取了部分/ binlist映射在一個結構:

<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),' ')