2011-03-21 1 views
2

누군가가 나에게 잘못 생각하고 있음을 알 수 있습니다.빈 값으로 배열을 반복 할 때 요소가 정의되지 않은 오류가 발생했습니다.

배열을 반복하고 값을 출력하고 있습니다 .... 간단히 말해서. 그러나 필드가 비어 있으면 Element <VARIABLE> is undefined in <INDEX>이됩니다.

예.

<cfloop array="#allocationDetails.offerings#" index="myIndex"> 
#myIndex.name# 
#myIndex.number# 
#myIndex.somefield# 
</cfloop> 

필드가 값이 없을 때까지 제대로 작동합니다. 예 myIndex.somefield가 나는 오류 얻을 비어 : 나는 다음 IsDefined ("myIndex.somefield") 또는 structKeyExists 같은 검사에서 필드 출력 래핑 경우

"Element somefield is undefined in myIndex"

을 (myIndex를, "somefield") 등, 그들은 true를 반환 하지만 필드 값을 출력하려고하면 "somefield myIndex에서 요소가 정의되지 않았습니다."라는 오류가 발생합니다.

또한 myIndex.somefield에서 cfdump를 시도하고 같은 오류가 발생합니다.

나는 이것이 아주 기본적인 일이라고 생각 했겠지만, 왜 이것이 오류가되는지 알 수 없다. 나는 정말 분명한 것을 놓치고 있는가?

도움 주셔서 감사합니다.

건배 마크

+0

당신이 당신의 배열 #의 allocationDetails.offerings 번호를 생성하는 코드를 게시 할 수 있습니까? – Leigh

+0

안녕하세요, 죄송하지만 아니요. 이것은 웹 서비스 호출에서 나온 결과 세트 일뿐입니다. – tHeSmUrF

+0

그러면 반환 된 객체가 생각한 것과 다를 수 있습니다. wsdl을 보지 않고 말하기가 어렵습니다. '# myIndex #'('myIndex.somefield'가 아님)을 덤프하십시오. 구조이고 키에 포함 된 키는 무엇입니까? – Leigh

답변

1

이 완전히 테스트되지 않은,하지만 당신이 뭔가를 시도?

<cfloop array="#allocationDetails.offerings#" index="myIndex"> 
    <cfparam name="myIndex.name" default="" /> 
    <cfparam name="myIndex.number" default="" /> 
    <cfparam name="myIndex.somefield" default="" /> 
    #myIndex.name# 
    #myIndex.number# 
    #myIndex.somefield# 
</cfloop> 
+0

죄송합니다. Steve, 조금 전에 cfparam을 사용해 보았는데 동일한 오류가 발생했습니다. – tHeSmUrF

+0

cfloop 어레이가 CF9에 도입되었습니다. – HPWD

0

# allocationDetails.offerings #을 덤프하고 출력을 확인하십시오.

기본적으로 배열을 반복합니다. 따라서 각 지수 값의 결과를 볼 수 있습니다.

또한 바보 일 수도 있지만 때때로 작동합니다. allocationDetails.offerings을 변수에 할당 한 다음 해당 변수를 반복합니다.

<cfset some_var = allocationDetails.offerings /> 
<cfloop array="#some_var#" index="indexNow"> 
. 
. 
</cfloop> 

마지막 또한 myIndex에서 다른 이름으로 인덱스 변수를 변경.

+0

안녕하세요, 위 코드를 다른 코드와 동일하게 사용하십시오 (동일한 오류). 건배 – tHeSmUrF

4

색인에 대한 배열 요소가 없을 수 있습니까? 예를 들면 : 당신이 그것을 통해 반복하려고하면

<cfscript> 
    myArr = ArrayNew(1); 
    myArr[1] = 'xx'; 
    myArr[2] = 'yy'; 
    myArr[4] = 'zz'; 
</cfscript> 

당신이 ArrayIsDefined 체크 추가 할 수 있습니다

<cfloop array="#myArr#" index="myIndex"> 
    <cfif ArrayIsDefined(myArr, myIndex)> 
     #myIndex# 
    </cfif> 
</cfloop> 

그렇지 않은 경우, 다음 항상 노력 잡으려고 :

<cfloop array="#myArr#" index="myIndex"> 
    <cftry> 
     #myIndex# 
     <cfcatch type="any"> 
      Error or default variable setting here 
     </cfcatch> 
    </cftry> 
</cfloop> 
1

당신이 경우 ColdFusion 9를 사용하면 얻지 못하는 오류가 정의되지 않았거나 webservice 호출에서 NULL 값이 반환되었습니다. 대신이 시도 :

<cfif StructKeyExists(myIndex, "somefield") AND NOT IsNull(myIndex.somefield)> 
    #myIndex.somefield# 
</cfif> 
+0

안녕하세요 Dan, 저는 CF8에서이 기간 동안 CF9 기계에 문제가 없다는 것을 발견했습니다. isDefined와 isNull 모두 CF9에서 예상대로 작동합니다. 그러나 프로젝트 시간 제약으로 인해 CF8에서이 작업을 수행해야합니다. – tHeSmUrF

0
<cfscript> 
    allocationDetails.offerings = ArrayNew(1); 
    allocationDetails.offerings[1] = {name = 'a', number = 1 , somefield = "somevalue"}; 
    allocationDetails.offerings[2] = {name = 'a', number = 2 , somefield = "somevalue"}; 
    allocationDetails.offerings[4] = {name = 'c', number = 3 , somefield = "somevalue"}; 
</cfscript> 
<cfoutput> 
<cfloop array="#allocationDetails.offerings#" index="myIndex"> 
    <cfparam name="myIndex.name" default="" /> 
    <cfparam name="myIndex.number" default="" /> 
    <cfparam name="myIndex.somefield" default="" /> 
    #myIndex.name# : #myIndex.number# : #myIndex.somefield#<br> 
</cfloop> 
</cfoutput> 

스티브 솔루션은 잘 작동합니다.

0

와우, 정말 나 혼란 스럽네.

#StructKeyList(myIndex)# 

그것은 예상대로 모든 필드 이름을 포함하는 myIndex에서 사용 가능한 키의 목록을 뱉어 : (웹 서비스 배열을 반복 내 실제 코드의) 루프에서

내가 좋아하는 뭔가를 사용하는 경우 존재하지만 비어있는 필드를 포함합니다.

따라서 StructKeyExists (myIndex, "somefield") 또는 isDefined ("myIndex.somefield")와 같은 검사는 키가 존재하기 때문에 true를 반환합니다. 하지만 필드 myIndex.somefield를 출력하려고하면 myIndex 오류에서 somefield가 정의되지 않습니다. 나는 이것이 왜 문제인지 이해하지 못한다. 나는 또한 사용하려고했지만 그게 아무것도 (내 배열에)하고있는 것 같지 않습니다.

예제 배열과 루프에서 이전 단계를 모두 시도해도 예상대로 작동하면. 웹 서비스의 결과에 위의 내용을 시도 할 때 문제가 발생합니다.

웹 서비스 레코드 세트 (CF8)를 다룰 때 누구도이 문제를 보았습니까?

이제 작업 해결 방법에 대해 ... 작동하는 제안 (감사합니다. Leigh)은 myIndex.somefield를 사용하는 것이 아니라 웹 서비스에서 getSomeField 메소드를 호출하고 그 결과를 사용하는 것입니다 (값이 비어있는 경우에도 작동 함) .

난 그냥 그 작업 다음 IsDefined에서 인덱스 이름을 떨어지고있다 (어떤 이유가)도, 그래서 대신하려고 다른 것은 : 다시

isDefined(“somefield”) 

:

isDefined(“myIndex.somefield”) 

내가 사용하는 CF9 관련 코드를 StructKeyExists, IsDefined 또는 IsNull을 사용하여 CF9에서 실행하면 예상대로 작동하기 때문에 CF8 관련 문제인 것으로 보입니다.

+0

연관 배열 표기법, 즉'myIndex [ 'someField']'를 사용하면 어떤 차이가 있습니까? 나는 지수를 떨어 뜨리는 것에 신경을 쓰지 않을 것입니다. 그렇게 할 때, CF 참조는 어떤 변수입니까? 'someField'는 # variables # scope에 상주합니까? 반복 할 때마다 올바른 값을 포함합니까? – Leigh

+0

@Leigh - 위와 같은 시도를했지만 이제 얻습니다. Element UnitName은 class class au.edu.nsw.det.tipa.beans.webService.xsd.Offering의 Java 객체에서 정의되지 않았습니다 (예제와 관련하여 UnitName은 someField 및 오퍼링은 myIndex입니다.) 나는이 모든 것이 널과 비어 있지 않은 값을 중심으로 돌아가고 있기 때문에 isDefined와 cfparam 등의 태그가 예상대로 작동하지 않는 이유가 무엇인지 결정했습니다. 저는 오늘 아침에 CF9 용으로 개발해야 할 작업을 결정했습니다. 나는이 코드 외에도 몇 가지 다른 문제가 있습니다. 이 모든 도움에 감사드립니다. – tHeSmUrF

+0

예, 오류는 원래 오류와 본질적으로 같습니다. 나는 그것이 효과가 있다고 생각하지 않았다. 그러나 그것은 발사의 가치가 있었다. CF9와 같은 소리가이 문제를 해결하는 길입니다. – Leigh

0

나는 비슷한 것을하고있었습니다. 정의되지 않은 값을 가질 수있는 배열의 평균값을 원했습니다. 나는 이것을하기 위해 마침내 두 가지 다른 방법을 찾았다.

<cffunction name="ArrayAvg2"> 
    <cfargument name="theArray" required="true"> 
    <cfset sum=0> 
    <blockquote> 
    <cfloop from=1 to="#ArrayLen(theArray)#" index="i"> 
    <cfif ArrayIsDefined(theArray, i)> 
     <cfoutput>theArray[#i#] = #theArray[i]#</cfoutput> 
     <cfset sum += theArray[i]> 
    <cfelse> 
     Undefined 
    </cfif> 
    <br/> 
    </cfloop> 
    </blockquote> 

    <cfreturn sum> 
</cffunction> 

<cffunction name="ArrayAvg3"> 
    <cfargument name="theArray" required="true"> 
    <cfset sum=0> 
    <blockquote> 
    <cfloop from=1 to="#ArrayLen(theArray)#" index="arrayElement"> 
    <cfif ArrayIsDefined(theArray, arrayElement)> 
     <cfoutput>theArray[#arrayElement#] = #theArray[arrayElement]#</cfoutput> 
     <cfset sum += theArray[arrayElement]> 
    <cfelse> 
     Undefined 
    </cfif> 
    <br/> 
    </cfloop> 
    </blockquote> 

    <cfreturn sum> 
</cffunction> 

<cfset testArray=ArrayNew(1)> 
<!--- no testArray[2] ---> 
<cfset testArray[1]=10> 
<cfset testArray[3]=30> 

testArray = <cfdump var="#testArray#"> 
<br/> 
ArrayAvg2 = <cfdump var="#ArrayAvg2(testArray)#"> 
<br/> 
ArrayAvg3 = <cfdump var="#ArrayAvg3(testArray)#"> 

이 정보가 도움이되기를 바랍니다.

(BTW, 내가 ColdFusion에서와 noobie, 그래서 당신은 아무것도 내가 잘못 볼 경우 알려!)하자

관련 문제