2011-06-17 2 views
5

私は構造体として行を渡す関数でクエリから行を処理したいと思います。CFML - 構造体へのクエリ行

私もこのようにそれを設定することができ

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

理想的

... ...

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

が、私はしたくありません。私は行を抽出する簡単な方法を見つけることができませんでしたが、私は頼むと思った。

答えて

3

Ben Nadel氏は、クエリを構造体に変換するサンプルUDFを提供するブログ記事を投稿しました。オプションの行引数を受け取り、そのクエリの単一の行を構造体にすることができます。見てくださいhere

+1

私はこれ以前に出くわした、私は、CFMLが過去5年間にこの分野でいくつかの進歩を遂げていることを考えました。は、ハックせずに利用できるように見えます。 – Daniel

+0

私は、それがどのようにしてコア言語で役に立つのかよく分かりません。構造体としてクエリ行を必要とすることを思い出していません。単一の行をすばやくループして構造体を作成するのが簡単であり、UDFが存在するという事実を考慮すると、言語への不必要な追加と思われます。 –

3

これはコメントなしベンのサイトからクラス

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

    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> 

使い方です...

<!--- 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

は、単一の行の

<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

Adob​​e ColdFusionには、という名前の関数が追加されましたは、問合せの行を構造体に変換します。

補遺

この関数は、ColdFusion 9およびそれ以前では使用できません。

0

別の解決策は、次のようになります。

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]#'); 
} 
関連する問題