2012-04-25 71 views
0

請忽略此職位。我在這裏更清楚地說明了我的問題: Error with CFLoop When Entries Are Missing缺少條目的CFLoop錯誤

我正在運行下面的CFLoop代碼。

<cfset data = queryNew("sid,firstname,lastname,age","integer,varchar,varchar,integer")> 
<cfloop index="x" from="1" to="50"> 
    <cfset queryAddRow(data)> 
    <cfset querySetCell(data,"sid",x)> 
    <cfset querySetCell(data,"firstname","#first[x]#")> 
    <cfset querySetCell(data,"lastname","#last[x]#")> 
    <cfset querySetCell(data,"age","#studentage[x]#")> 
</cfloop> 

<cfoutput query="data"> 
    #sid# - #firstnamet# #lastname# - #age#<br /> 
</cfoutput> 

變量first[x]last[x],和studentage[x]正在從外部數據源拉出,與X是循環索引。請注意,CFLoop有50個條目。

當有數據可用時,代碼工作得很好。但是,當缺少數據時,代碼會中斷。我的意思是,如果條目11沒有爲first[x]變量列出的名稱,我會得到一條沿"Element first is undefined. The error occurred on line 5

(第5行是名字條目)的錯誤。

發生這種情況時,我想從結果中省略條目11(以及導致錯誤的所有其他條目),並防止顯示錯誤。我怎樣才能做到這一點?

澄清:請假定數據已定義。自從我使用外部數據源以來,它變得有點毛毛。但我所說的是參賽作品1到10出現。當它的條目11輪到時,這是錯誤出現的時間。

+0

定義的第一個,最後一個學生變量在哪裏?在我看來,您正在創建一個包含50行相同數據的查詢。另外,您正在循環查看「數據」查詢,但顯示的是第一個,最後一個和學生變量,而不是查詢中名稱,姓氏和年齡的實際列。 – 2012-04-25 16:58:45

+0

好吧,我看到發生了什麼。您正試圖填充查詢w /未定義的變量。錯誤發生在queryoutCell調用firstname而不在cfoutput的行中。在查詢中沒有任何數據,它沒有任何關係,它必須確保你沒有定義「first」,「last」或「studentage」,但你試圖使用它們的值填充查詢。 – 2012-04-25 17:01:02

+0

感謝您的回覆肖恩。這些變量是定義的,我只是沒有包含上面的代碼片斷。因此,我所說的是,例如,條目1到10將顯示,但是條目11將缺少名字,然後會彈出CF錯誤。 – Mike 2012-04-25 17:04:13

回答

1

在循環中使用外部數據庫的記錄數應該可以防止錯誤發生。

<cfloop index="x" from="1" to="#ExternalDatabaseQuery.RecordCount#"> 

一個更好的解決方案,假設你在內存中有查詢,將使用查詢查詢。

<cfquery dbtype='query' name='data'> 
SELECT SID, First AS FirstName, Last AS LastName, Age AS StudentAge 
FROM ExternalDatabaseQuery 
</cfquery> 
+0

感謝這一點,但我沒有使用數據庫。我的外部數據源是一個XML提要。我之前曾嘗試過類似#ExternalDatabaseQuery.RecordCount#的方法,但問題是前10個條目中有名字,姓氏和學生年齡,但是當我到達條目11時,會有姓氏,年齡,但沒有名字。然後,條目12再次具有所有信息,但CFLoop由於缺少名字而在條目11處卡住 – Mike 2012-04-25 17:22:10

+0

檢查變量的存在,然後。可以檢查每個變量,甚至可以在未定義時填入空白等。很多選項取決於您如何繼續。 – Busches 2012-04-25 17:30:20

+0

另外,如果您沒有使用實際的數據庫,那麼您希望優化原始問題,因爲您說您正在使用外部數據庫,而事實上您正在循環一些完全不同的內容。 – Busches 2012-04-25 17:35:00

1

邁克,道歉,如果我誤解了你的後面,但似乎有些基本條件可以完成這項工作。下面的代碼編輯只是一個關於如何去做的建議(當然,您的完整代碼庫可能會指示稍微不同的東西)。

<cfset data = queryNew("sid,firstname,lastname,age","integer,varchar,varchar,integer")> 
<cfloop index="x" from="1" to="50"> 
    <cfif isDefined("first[x]") AND isDefined("last[x]") AND isDefined("studentage[x]")> 
    <cfset queryAddRow(data)> 
    <cfset querySetCell(data,"sid",x)> 
    <cfset querySetCell(data,"firstname","#first[x]#")> 
    <cfset querySetCell(data,"lastname","#last[x]#")> 
    <cfset querySetCell(data,"age","#studentage[x]#")> 
    </cfif> 
</cfloop> 

<cfoutput query="data"> 
    #sid# - #firstnamet# #lastname# - #age#<br /> 
</cfoutput> 

這裏的主要問題(也許這對你來說不是問題)是,這將輸出50 - 錯誤。所以,如果有3個錯誤(即沒有找到數據),你將有47個輸入輸出,而不是50個。如果這是一個問題,請添加註釋...有一些替代方法可以確保您始終有50個項目輸出。

+0

對不起,這是我的錯。我已經給你一個感謝的upvote並做了一個更好的例子,請看這裏:http://stackoverflow.com/questions/10321272/error-with-cfloop-when-entries-are-missing – Mike 2012-04-25 18:08:12

+0

不用擔心,邁克!將檢查出新的問題。 – 2012-04-25 18:26:21