Coldfusion 将查询元素列表添加到单个数组元素

Coldfusion 将查询元素列表添加到单个数组元素,coldfusion,Coldfusion,我正在循环查询以创建零件号列表,以填充零件号列表: <cfset binlist = "" > <cfset a = 1 /> <cfloop query="getParts"> <cfif a > <cfset binlist = getParts.binnum> <cfset a = 2 > <cfelse> <cfset binl

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

<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输出页面中工作,但在我试图生成的电子表格中不工作,该电子表格用于显示零件的多个箱子


生成的电子表格每个零件仅包含一个箱子,而对于具有多个箱子的零件不包含多个箱子。

您正在重新发明轮子。valuelist(getparts.binnum)将提供您的列表,而无需所有循环和检查。或者至少您可以使用“listAppend()”来避免所有的逗号检查:)

您正在重新发明轮子。valuelist(getparts.binnum)将提供您的列表,而无需所有循环和检查。或者至少可以使用“listAppend()”来避免所有的逗号检查:)

我认为(如果我理解您的逻辑),您试图做的只是Coldfusion中的一行代码:

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

进一步查看代码后,看起来您正在将列表嵌入到数组中,然后将数组转换为列表。如果你有一个逗号分隔的列表,然后把它放在另一个逗号分隔的列表中间,它们将被解释为单个元素而不是集合。

查看如果将分隔符更改为逗号以外的字符,以避免与较大的列表混淆,会发生什么情况:

<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(减去group参数)来获得内部分组。

我认为(如果我理解您的逻辑),您试图做的只是Coldfusion中的一行代码:

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

进一步查看代码后,看起来您正在将列表嵌入到数组中,然后将数组转换为列表。如果你有一个逗号分隔的列表,然后把它放在另一个逗号分隔的列表中间,它们将被解释为单个元素而不是集合。

查看如果将分隔符更改为逗号以外的字符,以避免与较大的列表混淆,会发生什么情况:

<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(减去group参数)来获得内部分组。

如果查询仅包含单个零件的行,则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, ",")) />

听起来您很难按部分将查询划分为多个集合。因此,如果不使用Query of Query(QoQ),ValueList可能无法为您实现这一点。如果您已经在使用分组的cfoutput,只需在结构中收集part/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] />


您可能需要处理零件没有BIN的情况—这将引发结构键异常。

如果查询只包含单个零件的行,则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, ",")) />

听起来您很难按部分将查询划分为多个集合。因此,如果不使用Query of Query(QoQ),ValueList可能无法为您实现这一点。如果您已经在使用分组的cfoutput,只需在结构中收集part/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] />


您可能需要处理部件没有BIN的情况—这将引发结构键异常。

您没有说明您使用的是什么数据库平台,但您可以使用SQL中的聚合函数来完成同样的操作。例如,在MySQL中:

SELECT partnum, GROUP_CONCAT(DISTINCT binnum SEPARATOR ' ')
FROM Parts
GROUP BY partnum
PostgreSQL中也存在类似的函数:

array_to_string(array_agg(binnum),' ')

您并没有说您使用的是什么数据库平台,但您可以使用SQL中的聚合函数来实现同样的技巧。例如,在MySQL中:

SELECT partnum, GROUP_CONCAT(DISTINCT binnum SEPARATOR ' ')
FROM Parts
GROUP BY partnum
PostgreSQL中也存在类似的函数:

array_to_string(array_agg(binnum),' ')

我不明白你到底想干什么?此外,如果可以用html显示代码,则可以使用cfcontent作弊并将html发送到excel。此外,如果您还想在循环中执行其他逻辑,您可以使用ValueList()或ListAppend()简单地检查初始逻辑。不过,感谢您的响应,Bush,binnum并没有局限于特定部分。我不明白您到底想做什么?此外,如果可以用html显示代码,则可以使用cfcontent作弊并将html发送到excel。此外,如果您还想在循环中执行其他逻辑,您可以使用ValueList()或ListAppend()简单地检查初始逻辑。不过,感谢您的响应,Bush,binnum并不局限于特定部分。哈哈。。。你赢了我!我的想法完全正确。哈。。。你赢了我!我的想法完全正确。谢谢你,马克。我已经试过了,但它似乎是拉每一个箱子,而不是限制特定零件的箱子。我正在尝试:
您的