2017-06-29 4 views
0

Je voudrais définir des éléments imbriqués à l'intérieur de la structure. Voici un exemple de mon code actuel:Structure de ColdFusion éléments imbriqués?

<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#"> 

Le code ci-dessus utilise une certaine logique pour manipuler les données. Voici exemple de ma sortie après que je largue 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 

À l'avant, je dois mettre tous les champs qui ont lettre « z » devant « hs » être mes données pour attribut title. En raison de ce que je veux organiser ma structure pour ressembler à ceci:

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

Comme une note de côté, j'ai essayé de définir des variables imbriquées dans ma structure. Quelque chose comme ceci: Ce <cfset qryRecs[columnName].value =UserInfo[columnName][CurrentRow]> jette une erreur:

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

Je ne sais pas si je besoin d'une structure plus pour achive que. Aussi, je ne suis pas sûr de la meilleure façon d'organiser ce genre de structure. Si vous avez des suggestions ou des exemples s'il vous plaît faites le moi savoir. Je vous remercie!

+0

En ce qui concerne l'erreur, vous avez probablement besoin de deux lignes de code. Un pour créer la structure intégrée; qryRecs [columnName] = {} puis un pour assigner une valeur à la variable dans la structure; qryRecs [columnName] .value = quelque chose. Vous devrez peut-être vérifier l'existence de la structure pour la première partie. Je voudrais pouvoir donner un exemple de code qui n'était pas la réponse ... Si vous pensez que cela va répondre à la question, je vais donner un exemple dans une réponse. –

+0

Si vous pouvez donner un exemple ce serait génial. Je vous remercie. –

Répondre

1

Cet extrait de code n'est pas une réponse complète mais devrait vous aider dans les structures d'imbrication avec les touches Valeur/Titre.

<!--- 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]>