- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的情况。
我必须处理一些遗留代码。此代码返回一个查询对象,我必须向其追加一些行。基本上,我需要将 1 行复制 N 次(N 不是常数),然后手动调整一些数据。
现在,至少在 IMO 看来,我所做的确实不是正确的做事方式。我宁愿返回一个不需要在 CF 端修改的查询对象,并在数据库上生成正确的数据集。但是,唉,我无法访问原始查询:(
所以这是我的破解方法。我决定编写一个复制查询行的通用函数,然后在附加副本后我可以手动设置我需要的任何单元格。
请看下面:
private function duplicateQueryRow(
required query originalQuery,
required numeric rowNum
) {
queryAddRow(arguments.originalQuery, 1);
for (local.i = 1; local.i LTE listLen(originalQuery.columnList); local.i += 1) {
columnName = listGetAt(originalQuery.columnlist, i);
querySetCell(originalQuery, columnName, originalQuery[columnName][rowNum], originalQuery.recordcount);
}
}
问题:
假设某些列为 NULL。例如,假设列 ACOLUMN 的值在第 5 行为 NULL。当我这样做时,由于 CF 不处理 NULL,最后一行的 ACOLUMN 值将为“”。现在如果我做 select distinct ACOLUMN from QUERY_NAME
我将获得第 5 行和自 NULL <> [empty string]
以来的最新行.
我确实有一个解决方案,它在下面:
private function duplicateQueryRow(
required query originalQuery,
required numeric rowNum
) {
queryAddRow(arguments.originalQuery, 1);
for (local.i = 1; local.i LTE listLen(originalQuery.columnList); local.i += 1) {
columnName = listGetAt(originalQuery.columnlist, i);
if (originalQuery[columnName][rowNum] NEQ "") {
querySetCell(originalQuery, columnName, originalQuery[columnName][rowNum], originalQuery.recordcount);
}
}
}
目前可行,因为 NULL 不会被复制,但我只是不确定这是正确的....
想知道是否有人有更好的解决方案?或者至少看看这个函数是否有问题。我想的要求是对于给定查询和要复制的 rowNumber 的函数将返回查询,并在末尾包含查询的 rowNumber 行的副本。
提前致谢!
最佳答案
Or at the least see if something might be problematic with this function.
想到的一个明显问题是它不区分实际的空字符串和 null。因此,根据该逻辑,包含实际空字符串的列将被视为 null
。
我环顾四周,不幸的是找不到任何适合这种情况的内置函数。我以为IsNull
可能会这样做,但它似乎没有按照您预期的方式处理查询列。如果您传入查询列:
isNull( queryName["columnName"][ rowNumber ] )
.. 它总是返回“NO”。很可能是因为查询引用的计算结果为空字符串,而不是实际值,即 null
。
但是,您可以使用一些未记录 的功能。 (我通常不会推荐它,但在这种情况下我看不到任何替代方案)。 CF 查询对象有一个名为 getField(rowIndex, columnIndex)
的内部方法,它返回基础查询值。如果您使用该值,而不是使用关联数组表示法获得的值,它应该保留空值。
targetRow = queryAddRow(originalQuery, 1);
columnNames = originalQuery.getColumnList();
// note: colIndex refers to the position within the original SQL
for (colIndex = 1; colIndex <= arrayLen(columnNames); colIndex++) {
realValue = originalQuery.getField( sourceRow, columnIndex );
originalQuery[ columnNames[colIndex] ][ targetRow ] = realValue;
}
关于coldfusion - 复制数据时querySetCell为NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16844270/
我正在尝试使用 QuerySetCell 来更改查询对象中特定列的值,并且一直收到此错误: Column names must be valid variable names. They must s
我是一名优秀的程序员,十分优秀!