2012-03-01 125 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),' ')