2

構造体の配列からクエリ オブジェクトを作成する必要があります。配列には約 200 個のキーがあり、配列内の構造は名前、サイズ、深さが異なります。1 つのノードは次のようになります。

ループしてクエリオブジェクトを作成する必要がある構造の配列

array[#i].adGroupId と array[#i#].userStatus に対しては既に正常に動作していますが、クエリに追加する前に構造値が存在するかどうかを確認する必要があります。たとえば、 criteria.text は常に構造内にあるとは限らないため、確認する必要がありますが、方法がわかりません。これまでのコードは次のとおりですが、常に criteria.text とbids.maxCpc.amount.microAmount をスキップします。

<cfset vColumns = "AdGroupID,KeywordText,Status,MaxCPC" />
<cfset vColumnValue = "AdGroupID,criterion.text,userStatus,bids.maxCPC" />
<cfset loopnum = 1>
<cfset myquery = QueryNew(vColumns) >
<cfloop array="#aKeywordsAll#" index="i">
    <cfset temp = QueryAddRow(myquery, 1)>
    <cfset loopNum2 = 1>
    <cfloop list="#vColumnValue#" index="j">                
        <cfif structKeyExists(aKeywordsAll[loopnum],j)>
            <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), aKeywordsAll[loopnum][j])>
        <cfelse>
            <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), "test")>
        </cfif>
        <cfset loopNum2++ />
    </cfloop>
    <cfset loopnum++ />
</cfloop>

作成されたクエリ オブジェクトを次に示します。「テスト」と表示されていますが、値が得られることを願っています:

私のクレイジーなループから作成されたクエリ オブジェクト

4

1 に答える 1

5

あなたの問題は、 StructKeyExists 関数が文字通り「criterion.text」という名前のキーを探していることです(たとえば)。これは、「criterion」という名前のキー内の「text」のキーではなく、可能です。あなたのために問題を解決するはずのUDFを作成しました:

 <cffunction name="StructGetByKeyList">
    <cfargument name="struct">
    <cfargument name="key">

    <cfset var result = "">

    <cfif StructKeyExists(struct,ListFirst(key,"."))>
        <cfif ListLen(key,".") GT 1>
            <cfreturn StructGetByKeyList(struct[ListFirst(key,".")],ListRest(key,"."))>
        <cfelse>
            <cfreturn struct[key]>
        </cfif>
    <cfelse>
        <cfreturn "">
    </cfif>
 </cffunction>

次に、structKeyExists(aKeywordsAll[loopnum],j) の代わりに Len(StructGetByKeyList(aKeywordsAll[loopnum],j)) を呼び出すことができます。

この行の場合:

 <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), aKeywordsAll[loopnum][j])>

これを使って:

 <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), StructGetByKeyList(aKeywordsAll[loopnum],j))>
于 2013-01-29T12:59:25.167 に答える