3

我正在尝试仅向此输出添加某些行。目前,此输出添加了所有行,用于在末尾的 Total 行

<cfoutput query="qrySummary">

#numberFormat(ArraySum(ListToArray(ValueList(qrySummary.secThreeCount))), ",")#

这显然是所有 SecThreeCount 值的总和,但是如果我想从该列表中排除最后 2 行呢?

在冷融合中可能吗?

(如果这有所不同)>>所以有 13 行返回,我想要前 11 行并排除最后 2 行。

我知道我可以限制该查询的 SQL 返回以排除这 2 行,但我希望编写更少的代码并保持整洁。并了解是否可能:)

提前致谢。

4

3 回答 3

3

好吧,我认为如果您不需要这两行,则首先不应该返回它们。那将是最好的答案。从您的陈述“但我希望编写更少的代码”中,您在错误的地方进行了优化:不要为自己优化,而是为解决方案优化。

当我一直在为此测试代码时,Leigh 出现在我的身下,但这里有一个概念证明,使用subList()

numbers = queryNew("");
queryAddColumn(numbers, "id", "integer", [1,2,3,4,5,6]);
queryAddColumn(numbers, "maori", "varchar", ["tahi", "rua", "toru", "wha", "rima", "ono"]);

maori = listToArray(valueList(numbers.maori));
subset = maori.subList(2,5);

writeDump([numbers, subset]);

这将返回一个包含元素的数组["toru","wha","rima"]

于 2013-08-30T15:45:13.147 回答
1

如果您正在运行 CF10,则一种选择是使用ArraySlice。只获取前十一个元素,然后 apply arraySum

  <cfset allValues = ListToArray(ValueList(qrySummary.secThreeCount))>
  <cfset subTotal = arraySum( arraySlice(allValues, 1, 11))>

对于早期版本,有未记录的subList(...) 方法。它利用了 CF 数组是java.util.List底层对象这一事实,并用于List.subList(..)获取数组的子集。

于 2013-08-30T15:35:06.077 回答
1

另一种方法。您不想将最后 2 个元素的值相加,因此将它们从数组中删除:

<cfset values = ListToArray(ValueList(qrySummary.secThreeCount))>

<!--- delete the last element --->
<cfset arrayDeleteAt(values, arrayLen(values))>

<!--- delete the last element again --->
<cfset arrayDeleteAt(values, arrayLen(values))>

#numberFormat(ArraySum(values), ",")#

或者,鉴于您无论如何都在循环查询,您可以简单地将总数加起来(如果您在最后一行或倒数第二行,有一点逻辑就不会打扰)

于 2013-08-30T16:16:42.590 回答