2012-03-08 13 views
6

Moim celem jest właśnie wyprowadzić dane kolumny określone w "fieldList".Uzyskiwanie złożonego błędu obiektu podczas próby wyprowadzenia wartości zapytania

otrzymuję następujący błąd:

Complex object types cannot be converted to simple values. The expression has requested a variable or an intermediate expression result as a simple value, however, the result cannot be converted to a simple value. Simple values are strings, numbers, boolean values, and date/time values. Queries, arrays, and COM objects are examples of complex values. The most likely cause of the error is that you are trying to use a complex value as a simple one. For example, you might be trying to use a query variable in a cfif tag. The error occurred on line 20.

gdy próbuje wykonać następujące czynności:

<cfquery datasource="retailers" name="myQuery"> 
Select * FROM retailer 
WHERE retailer_id = '#url.id#' 
</cfquery> 

<cfset fieldList = "company,phone,phone_secondary,fax,email,website"> 
<cfloop list="#fieldList#" index="i">  
#myQuery[i]# 
</cfloop> 

nie powinno działać bez dając mi błąd? Czuję, że po prostu przeoczam coś prostego, nie mogę znaleźć nigdzie odpowiedzi.

+0

Wyjaśnienie: czy próbujesz wyświetlić listę nazw kolumn z wyniku zapytania? Czy po prostu chcesz zrobić najbardziej oczywiste - to znaczy: zapętlić wyniki zapytania (tj. Wszystkie wiersze danych) i wyprowadzić je. Pytam, ponieważ nie mówisz konkretnie o tym, * czego potrzebujesz *, a kod (jak napisano) mógłby potencjalnie pójść w jedną stronę. –

Odpowiedz

8

Ok, widzę, że poprawiona początkowego kodu, więc oto moja odpowiedź:

jesteś zapętlenie nad listą kolumn, i próbuje ocenić każdą kolumnę jakby to jest pojedynczym elementem struct.

Zapytanie jest jednak nieco inne: jest dostępne jako seria struktur, które z kolei są tablicami - każdego wiersza danych, które powracają z zapytania.

Jeśli chcesz wstawić wszystkich wierszy danych, nie znając kolumny do góry przód (lub przekazując je w dynamicznie jak jesteś sugerując w kodzie powyżej), spróbuj tego:

<cfoutput query="myQuery"> 
    <cfloop list="#myQuery.ColumnList#" index="thisColumn"> 
    #myQuery[thisColumn][myQuery.CurrentRow]# 
    </cfloop> 
</cfoutput> 

Ta wola zapewni ci potrzebne wyjście. Zewnętrzny wynik z atrybutem zapytania spowoduje zapętlenie wszystkich wierszy otrzymanych danych. Następnie dla każdego wiersza pętli nad listą kolumn generowanych przez zapytanie, a dla każdej kolumny, wyprowadź dane, określając wiersz za pośrednictwem myQuery.CurrentRow, który jest automatycznie iterowany za pośrednictwem zewnętrznego wyjścia.

ja też poświęcić chwilę teraz opowiadają, że starają się trzymać z dala od pętli wewnątrz pętli, a wyjście tylko twoje wartości wyraźnie:

<cfoutput query="myQuery"> 
    #company# #phone# 
</cfoutput> 

Używając tej składni jest nieco mniej kosztowny niż wspomnianej pętli w pętli.

+0

Bardzo szczegółowa i wspaniała odpowiedź! Dzięki Shawn, bardzo docenione! – timsayshey

Powiązane problemy