将Query元素列表添加到单个Array元素

时间:2012-03-01 17:16:46

标签: coldfusion

我循环查询以创建零件编号列表以填充零件编号列表:

<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的部分。

4 个答案:

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