我循环查询以创建零件编号列表以填充零件编号列表:
<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输出页面,但不在我试图生成的电子表格中以显示部件的多个分档
生成的电子表格每个部分只包含一个bin,而不包含多个bin的部分。
答案 0 :(得分:2)
你正在重新发明轮子。 valuelist(getparts.binnum)会在没有所有循环和检查的情况下为您提供列表。或者至少你可以使用“listAppend()”来避免所有逗号检查:)
答案 1 :(得分:2)
我认为(如果我理解你的逻辑)你试图做的只是Coldfusion中的一行代码:
<cfset binList = ValueList(getParts.binnum) />
在进一步查看代码后,看起来您正在将列表嵌入到Array中,然后将该数组转换为列表。如果你有一个以逗号分隔的列表,然后将其粘贴在另一个逗号分隔列表的中间,它们将被解释为单个元素而不是集合。
如果您将分隔符更改为逗号以外的其他内容,请查看会发生什么情况,以免它与较大的列表混淆:
<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(减去组参数)以获得内部分组。
答案 2 :(得分: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,只需在Struct:
中收集零件/ 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>
然后在制作阵列时从结构中拉出bin列表:
<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] />
您可能需要处理零件没有分档的情况 - 这将抛出结构键异常。
答案 3 :(得分:0)
您没有说明您正在使用的数据库平台,但您可以使用SQL中的聚合函数来完成同样的技巧。例如,在MySQL中:
SELECT partnum, GROUP_CONCAT(DISTINCT binnum SEPARATOR ' ')
FROM Parts
GROUP BY partnum
PostgreSQL中存在类似的功能:
array_to_string(array_agg(binnum),' ')