如何重新排序struct列?

时间:2010-09-20 21:12:56

标签: data-structures coldfusion

我正在尝试按特定顺序显示CFQuery的结果。该命令将在数据库中维护,以便可以对其进行操作,并且每个表的列数未知。表中的最后一行是“ColumnOrder”:每列都有一个数字来指定它的排序顺序,0表示“不显示”。我试图通过循环说“y”从1到maxCols进行排序:

0)y = 1到maxCols

1)在 sortColumn 结果集中,使用y查找相应的KEY

2)在 产品 结果集中,从相应的KEY中找到值

3)将所述值插入tempStruct [y]

4)循环。

我正试图使用​​structFindKey()。这是我的代码:

<CFQUERY name="qParts" datasource="Pascal">         
    SELECT * FROM Turbos WHERE PartNumber LIKE <cfqueryparam cfsqltype="cf_sql_char" maxlength="30" value="%#mfr#%"> ORDER BY #sort# ASC 
</CFQUERY>
<cfquery name="qPartsOrder" datasource="Pascal">
    SELECT * FROM Turbos WHERE PartNumber = 'ColumnOrder'
</cfquery>

<cfset tempStruct=structnew()>
        <cfloop index="columnOrder2" from="1" to="#ListLen(qPartsOrder.ColumnList, ',')#">
            <cfdump var="#StructFindKey(qPartsOrder, columnOrder2)#">
            <cfset tempStruct[columnOrder2] = StructFindKey(#qPartsOrder#, "#columnOrder2#")>
            <cfset currentCol = "#ListGetAt(qParts.columnList, columnOrder2, ',')#">
            <cfoutput>#qParts[currentCol][qParts.currentrow]# <br/></cfoutput>
        </cfloop>
<cfdump var="#tempstruct#">

该行

<cfdump var="#StructFindKey(qPartsOrder, columnOrder2)#">

投掷一个BLANK !!错误信息,所以我无法调试它,我被卡住了。

任何和所有的帮助将不胜感激(是的我必须使用 SELECT * ,这是一个通用的产品显示页面,用于显示数据库中的所有信息,除了一些由零表示在订单栏中,记得吗?)。

2 个答案:

答案 0 :(得分:2)

我不是100%确定我理解你要解决的问题。一种非常规的建立数据库的方式加剧了这种情况。

首先,如果你不幸运,你可能会遇到一个记录在案的错误,即使用cfqueryparam标签会引发Value cannot be converted to requested type的错误,尽管我不知道当前版本是否仍会发生这种情况ColdFusion(8 +)。

在任何情况下,即使您不知道最终会使用多少个列,您也可以手动选择所有表格的列:

SELECT partNumber, secondColumn, thirdColumn, ... , nthColumn
FROM Turbos

这通常比仅使用SELECT *更可取,但如果您习惯频繁地向表中添加/删除列,则会出现一些问题。

除非您有充分理由需要使用Struct,否则应使用Array。在Arrays执行时,结构不存储订购信息。以下是对qParts中的记录进行排序的一种方法:

<cfset RecordsArray=ArrayNew(2)>
<cfset ColumnIndex=StructNew()>
<cfloop list="#qPartsOrder.ColumnList#" index="order_column">
    <cfset ColumnIndex[order_column]=val(qPartsOrder[order_column][1])>
</cfloop>
<cfloop query="qParts">
    <cfloop list="#qPartsOrder.ColumnList#" index="order_column">
        <cfif val(ColumnIndex[order_column])>
            <cfset RecordsArray[ColumnIndex[order_column]][qParts.CurrentRow]=qParts[order_column][qParts.CurrentRow]>
        </cfif>
    </cfloop>
</cfloop>

此代码的结果将是一个2D数组,第一个数字引用列索引,第二个索引指向记录行。

总而言之,我认为除非您无法控制数据库的结构,否则有一种更好的方法可以实现这一点,从您设置数据库的方式开始。查看一些假的样本数据以及更清楚地了解您要完成的内容真的很有帮助 - 例如,一旦您拥有这些有序字段,您将如何处理?

答案 1 :(得分:-1)

你试着使用StructSort吗?