2017-06-29 275 views
0

我想在结构中设置嵌套元素。这里是我当前的代码示例:ColdFusion结构嵌套元素?

<cfset fnResults = StructNew()> 
<cfset dateList = "HD_DATE1,HD_DATE2,HD_DATE3,HD_DATE4" /> 
<cfset servicesEquipment = { 
    1="Strongly Agree", 
    2="Agree", 
    3="Don't Know", 
    4="Disagree", 
    5="Strongly Disagree" 
}> 
<cfset isActive = { 
    1="Yes ", 
    0="No " 
}> 

<cfquery name="UserInfo" datasource="TestDB"> 
    SELECT TOP 1 
     hd_yn1, 
     hd_active, 
     hd_date1, 
     hd_status, 
     hd_age1, 
     hd_date2, 
     hd_age2, 
     hd_date3, 
     hd_date4, 
     hd_age3, 
     hd_deg1, 
     hd_deg2, 
     hd_toner, 
     hd_cfgr, 
     hd_deg4, 
     hd_deg5, 
     hd_tonel, 
     hd_cfgl, 
     hd_hri, 
     hd_comment, 
     hd_rear, 
     hd_lear, 
     hd_tosound, 
     LTRIM(RTRIM(si_last)) + ', ' + LTRIM(RTRIM(si_first)) AS hd_staff, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_YN1' AND tm_code = hd_yn1) AS zhd_yn1, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_STATUS' AND tm_code = hd_status) AS zhd_status, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_AGE' AND tm_code = hd_age1) AS zhd_age1, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_AGE' AND tm_code = hd_age2) AS zhd_age2, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_AGE' AND tm_code = hd_age3) AS zhd_age3, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HEAR_IND' AND tm_code = hd_hri) AS zhd_hri, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HEAR_LOSS' AND tm_code = hd_deg1) AS zhd_deg1, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HEAR_LOSS' AND tm_code = hd_deg4) AS zhd_deg4, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HEAR_TYPE' AND tm_code = hd_deg2) AS zhd_deg2, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HEAR_TYPE' AND tm_code = hd_deg5) AS zhd_deg5, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_TONE' AND tm_code = hd_toner) AS zhd_toner, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_TONE' AND tm_code = hd_tonel) AS zhd_tonel, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_CFG' AND tm_code = hd_cfgr) AS zhd_cfgr, 
     (SELECT TOP 1 tm_name FROM hmMaster WHERE tm_tblid = 'HD_CFG' AND tm_code = hd_cfgl) AS zhd_cfgl 
    FROM userRec WITH (NOLOCK) 
     LEFT OUTER JOIN staffInfo 
      ON si_staff = hd_staff 
    WHERE hd_userid = '10051989' 
</cfquery> 

<cfset fnResults.recordcount = UserInfo.recordcount> 

<cfif UserInfo.recordcount EQ 0> 
    <cfset fnResults.message = "No records were found."> 
<cfelse> 
    <cfloop query="UserInfo"> 
     <cfset qryRecs = StructNew()> 
     <cfloop array="#UserInfo.getColumnList()#" index="columnName"> 
      <cfif listContains(dateList, columnName, ",")> 
       <cfset qryRecs[columnName] = URLEncodedFormat(Trim(DateFormat(UserInfo[columnName][CurrentRow],'mm/dd/yyyy')))> 
      <cfelseif columnName EQ 'hd_active'> 
       <cfset qryRecs[columnName] = URLEncodedFormat((structKeyExists(isActive, LossInfo[columnName][CurrentRow]))? isActive[UserInfo[columnName][CurrentRow]]:"No ")> 
      <cfelseif columnName EQ 'hd_tosound'> 
       <cfset qryRecs[columnName] = URLEncodedFormat((structKeyExists(servicesEquipment, UserInfo[columnName][CurrentRow]))? servicesEquipment[UserInfo[columnName][CurrentRow]]:"")> 
      <cfelse> 
       <cfset qryRecs[columnName] = URLEncodedFormat(Trim(UserInfo[columnName][CurrentRow]))> 
      </cfif> 
     </cfloop> 
    </cfloop> 

    <cfset fnResults.data = qryRecs> 
</cfif> 

<cfdump var="#fnResults#"> 

上面的代码使用一些逻辑来操作数据。这里是我后倾fncResults比如我的输出:

DATA  
struct 
HD_ACTIVE No%20 
HD_AGE1  [empty string] 
HD_AGE2  [empty string] 
HD_AGE3  36 
HD_CFGL  MMO 
HD_CFGR  MMO 
HD_COMMENT Test 
HD_DATE1 09%2F22%2F1993 
HD_DATE2 [empty string] 
HD_DATE3 [empty string] 
HD_DATE4 [empty string] 
HD_DEG1  II 
HD_DEG2  MM 
HD_DEG4  MM 
HD_DEG5  UU 
HD_HRI NN 
HD_LEAR  [empty string] 
HD_REAR  [empty string] 
HD_STAFF [empty string] 
HD_STATUS PESS 
HD_TONEL ALL 
HD_TONER ALL 
HD_TOSOUND [empty string] 
HD_YN1 Y 
ZHD_AGE1 [empty string] 
ZHD_AGE2 [empty string] 
ZHD_AGE3 36 
ZHD_CFGL MIDDLE 
ZHD_CFGR Mild 
ZHD_DEG1 Mild 
ZHD_DEG2 Unknown 
ZHD_DEG4 Mild 
ZHD_DEG5 Unknown 
ZHD_HRI  None 
ZHD_STATUS Maybe 
ZHD_TONEL All 
ZHD_TONER All 
ZHD_YN1  Did Not 
RECORDCOUNT  1 

在前端我必须设置有字母“Z”中的“HS”面前,给我title属性数据的所有领域。正因为如此我想我的组织结构看起来像这样:

DATA  
    struct 
    HD_ACTIVE Value: No%20 Title: This is test 
    HD_AGE3  Value: 36 Title: Years 
    HD_COMMENT Value: Test Title: Test 

作为一个方面说明我已经试过在我的结构来设置嵌套变量。事情是这样的:<cfset qryRecs[columnName].value =UserInfo[columnName][CurrentRow]>这引发错误:

Element HD_YN1 is undefined in a CFML structure referenced as part of an expression. 

我不知道如果我需要为了一个更结构才达到这一点。另外我不确定组织这种结构的最佳方式是什么。如果您有任何建议或例子,请让我知道。谢谢!

+0

关于错误,您可能需要两行代码。一个创建嵌入式结构; qryRecs [columnName] = {},然后在结构体中为变量赋值; qryRecs [columnName] .value =东西。您可能需要检查第一部分的结构是否存在。希望我能给出一个不是答案的代码示例...如果您认为这将回答这个问题,我将在答案中提供一个示例。 –

+0

如果你可以提供很棒的例子。谢谢。 –

回答

1

此代码段不是一个完整的答案,但应该可以帮助您使用Value/Title键嵌套结构。

<!--- in order to nest structs, the 'nesting' parent structs must be created before assigning values to them ---> 
<cfif NOT structKeyExists(qryRecs, "columnName")> 
    <cfset qryRecs[columnName] = structNew()> 
</cfif> 
<!--- qryRecs[columnName] now exists as a struct so 'Value', 'Title', etc. keys can be added to it ---> 
<cfset qryRecs[columnName].value = UserInfo[columnName][CurrentRow]>