2011-06-17 10 views
5

Chciałbym obsłużyć wiersz z zapytania przez funkcję, w której przekazuję wiersz jako strukturę.CFML - wiersz zapytania do struktury

idealnie ...

<cfloop query="myquery"> 
#myfunction(#row#)# 
</cfloop> 

mogę ustawić go tak zbyt ...

<cfloop query="myquery"> 
#myfunction(#col1#,#col2#,#col3#,#col4#)# 
</cfloop> 

ale ja nie chcę. Nie byłem w stanie znaleźć prostego sposobu na wyodrębnienie szeregu, ale myślałem, że zapytam.

Odpowiedz

3

Ben Nadel opublikował post na blogu na ten temat, w którym podaje przykład UDF, który konwertuje zapytanie do struct, i akceptuje opcjonalny argument wiersza, który pozwala zamienić pojedynczy wiersz w tym zapytaniu na struct. Spójrz na here.

+1

natknąłem to wcześniej, pomyślałem CFML może mieć pewien postęp w tej dziedzinie w ciągu ostatnich 5 lat. Wygląda na to, że powinien być dostępny bez żadnych hacków. – Daniel

+0

Nie jestem pewien, jak użyteczne byłoby to w języku podstawowym. Nie przypominam sobie, żebym potrzebował wiersza zapytania jako struktury. Biorąc pod uwagę, jak łatwo jest przechodzić przez jeden wiersz i zapełniać strukturę, oraz fakt, że UDF istnieją, aby to zrobić, wydaje mi się, że byłoby to niepotrzebne uzupełnienie języka. –

3

Jest to klasa ze strony Bena bez uwag

<--- --------------------------------------------------------------------------------------- ---- 

    Blog Entry: 
    Ask Ben: Converting A Query To A Struct 

    Author: 
    Ben Nadel/Kinky Solutions 

    Link: 
    http://www.bennadel.com/index.cfm?event=blog.view&id=149 

    Date Posted: 
    Jul 19, 2006 at 7:32 AM 

---- --------------------------------------------------------------------------------------- ---> 


<cffunction name="QueryToStruct" access="public" returntype="any" output="false" 
    hint="Converts an entire query or the given record to a struct. This might return a structure (single record) or an array of structures."> 
    <cfargument name="Query" type="query" required="true" /> 
    <cfargument name="Row" type="numeric" required="false" default="0" /> 

    <cfscript> 
     var LOCAL = StructNew(); 
     if (ARGUMENTS.Row){ 
      LOCAL.FromIndex = ARGUMENTS.Row; 
      LOCAL.ToIndex = ARGUMENTS.Row; 
     } else { 
      LOCAL.FromIndex = 1; 
      LOCAL.ToIndex = ARGUMENTS.Query.RecordCount; 
     } 
     LOCAL.Columns = ListToArray(ARGUMENTS.Query.ColumnList); 
     LOCAL.ColumnCount = ArrayLen(LOCAL.Columns); 
     LOCAL.DataArray = ArrayNew(1); 
     for (LOCAL.RowIndex = LOCAL.FromIndex ; LOCAL.RowIndex LTE LOCAL.ToIndex ; LOCAL.RowIndex = (LOCAL.RowIndex + 1)){ 
      ArrayAppend(LOCAL.DataArray, StructNew()); 
      LOCAL.DataArrayIndex = ArrayLen(LOCAL.DataArray); 
      for (LOCAL.ColumnIndex = 1 ; LOCAL.ColumnIndex LTE LOCAL.ColumnCount ; LOCAL.ColumnIndex = (LOCAL.ColumnIndex + 1)){ 
       LOCAL.ColumnName = LOCAL.Columns[ LOCAL.ColumnIndex ]; 
       LOCAL.DataArray[ LOCAL.DataArrayIndex ][ LOCAL.ColumnName ] = ARGUMENTS.Query[ LOCAL.ColumnName ][ LOCAL.RowIndex ]; 
      } 
     } 
     if (ARGUMENTS.Row){ 
      return(LOCAL.DataArray[ 1 ]); 
     } else { 
      return(LOCAL.DataArray); 
     } 
    </cfscript> 
</cffunction> 

wykorzystanie ...

<!--- Convert the entire query to an array of structures. ---> 
<cfset arrGirls = QueryToStruct(qGirls) /> 

<!--- Convert the second record to a structure. ---> 
<cfset objGirl = QueryToStruct(qGirls, 2) /> 
13

znaleźć trochę bardziej eleganckie rozwiązanie patrząc, dla pojedynczego rzędu

<cfscript> 
    function GetQueryRow(query, rowNumber) { 
     var i = 0; 
     var rowData = StructNew(); 
     var cols = ListToArray(query.columnList); 
     for (i = 1; i lte ArrayLen(cols); i = i + 1) { 
      rowData[cols[i]] = query[cols[i]][rowNumber]; 
     } 
     return rowData; 
    } 
</cfscript> 
2

Adobe ColdFusion ma teraz funkcję o nazwie QueryGetRow, który konwertuje wiersz zapytania do struktury.

Uzupełnienie

Ta funkcja nie jest dostępna w ColdFusion 9 i wcześniej.

0

Innym rozwiązaniem byłoby:

function QueryToStruct(query){ 
    var cols = ListToArray(query.columnList); 
    var salida = query.map(function(v=0,i,a){ 
         return {'#cols[1]#':v}; 
        }); 
    return ValueArray(salida,'#cols[1]#'); 
} 
Powiązane problemy