A database driven epidemiological questionnaire

During a past project I moved from a paper-based questionnaire directly to a database version. This has the advantage of generating at the same time an online version (with some interface scripts) and an offline version (by using a serial paper printing).

The whole package is written in standard HTML with some Cold Fusion(R) extension (where you need the Railo(R) or Blue Dragon(R) interpreter too).

Download (md5:1922125540), create a datasource “aerzte” and attached the included Access(R) database. Then run the following script in your browser.

frage.cfm

  1:
  2:
  3:
  4:
  5:
  6:
  7:
  8:
  9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 62:
 63:
 64:
 65:
 66:
 67:
 68:
 69:
 70:
 71:
 72:
 73:
 74:
 75:
 76:
 77:
 78:
 79:
 80:
 81:
 82:
 83:
 84:
 85:
 86:
 87:
 88:
 89:
 90:
 91:
 92:
 93:
 94:
 95:
 96:
 97:
 98:
 99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
195:
<CFINCLUDE TEMPLATE="top.cfm">

<CFSET #cookie_id#=3>

<CFSET #group#=1>
<CFIF #ParameterExists(URL.page)#>
    <CFIF #IsNumeric(URL.page)#>
        <CFSET #group#=#URL.page#>
    </CFIF>
<CFELSE>
    <CFABORT>
</CFIF>

<CFOUTPUT>
<div id="subnav">
<h3 class="selected">=#cookie_id#</h3>
<ul>
    <li <CFIF #group# is 1>class=selected</CFIF>>
<a href=frage.cfm?page=1>Block 1</a></li>
    <li <CFIF #group# is 2>class=selected</CFIF>>
<a href=frage.cfm?page=2>Block 2</a></li>
    <li <CFIF #group# is 3>class=selected</CFIF>>
<a href=frage.cfm?page=3>Block 3</a></li>
</ul>
</div>
</CFOUTPUT>

<!--- ------------------------------------------ --->

<div id="content" class="afternav">

<CFQUERY NAME="Get" DATASOURCE="aerzte">
SELECT qry.*
FROM qry
WHERE qry.group=#group# AND qry.active=1
ORDER BY qry.id ASC;
</CFQUERY>

<CFQUERY NAME="Already" DATASOURCE="aerzte">
SELECT qry_answer.*
FROM qry_answer
WHERE qry_answer.partcp_id=#cookie_id# AND qry_answer.active=1;
</CFQUERY>

<CFSET #error#="">
<CFSET #blacklist#= "#chr(59)#,#chr(34)#,#chr(39)#,%22,--">

<CFOUTPUT QUERY="Get">
    <CFIF #PARAMETEREXISTS(fieldnames)#>
        <CFIF #ReFindNoCase(qryvar,fieldnames)# is not 0>
            <CFSET #sc#=#Evaluate("FORM.#qryvar#")#>
            <CFLOOP index="i" list="#blacklist#">
                <CFIF #Find(i,sc)# is not 0>
                    <CFSET #msg# = "not allowed">
                    <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
                </CFIF>
            </CFLOOP>
            <CFIF #sc# is "" AND #qryvar# is not "terminator">
                <CFSET #msg# = "missing">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #Find("int",qrytype)# is not 0 AND NOT #Isnumeric(sc)#>
                <CFSET #msg# = "not numeric">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #Find("varchar",qrytype)# is not 0 AND NOT #IsSimpleValue(sc)#>
                <CFSET #msg# = "not character">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #Find("datetime",qrytype)# is not 0 AND NOT #IsDate(sc)#>
                <CFSET #msg# = "not a date">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #GetToken(valid,1,":")# is "range">
                <CFIF #sc# lt #GetToken(valid,2,":")# OR #sc# gt #GetToken(valid,3,":")#>
                    <CFSET #msg# = "out of range ">
                    <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
                </CFIF>
            </CFIF>
        <CFELSE>
            <CFSET #msg#="missing">
            <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
        </CFIF>
    </CFIF>
</CFOUTPUT>

<!--- ------------------------------------------ --->

<CFIF #error# is not "" OR NOT #PARAMETEREXISTS(fieldnames)#>

    <CFOUTPUT>
    <FORM method=POST action="frage.cfm?page=#URL.page#">
    
    Block #group#<BR>
    </CFOUTPUT>
    
    <table width=400 border=0 bgcolor="lightyellow">
    
    <CFOUTPUT QUERY="Get">
    <tr><td colspan=3><hr size=1></td></tr>
    <tr>
    <td width=200>#text#</td>
    <td width=200 align=right <CFIF ListContains(error,qryvar,"|") gt 0>bgcolor=orange</CFIF>>
    
    <CFSET #ar#=""> 
    <CFIF #ListFind(ValueList(Already.qry_id),id)# gt 0>
        <CFSET #ar#=#ListGetAt(ValueList(Already.response),ListFind(ValueList(Already.qry_id),id))#>
    </CFIF>

    <CFIF #PARAMETEREXISTS(fieldnames)#>
        <CFIF #ReFindNoCase(qryvar,fieldnames)# is not 0>
            <CFSET #ar#=#Evaluate("FORM.#qryvar#")#>
        </CFIF>
    </CFIF>
    <CFIF #www# is "radio">
        <CFLOOP INDEX="i" LIST="#response#" DELIMITERS=":">
            <CFSET #s#="">
            <CFIF #i# is #ar#>
                <CFSET #s#="checked">
            </CFIF>
            <input type="radio" #s# name="#qryvar#" value="#i#">#i# 
        </CFLOOP>
    <CFELSEIF #www# is "select">
        <select name=#qryvar# size=3 multiple>
        <CFLOOP INDEX="i" LIST="#response#" DELIMITERS=":">
            <CFSET #s#="">
            <CFIF #i# is #ar#>
                <CFSET #s#="selected">
            </CFIF>
            <option #s# value="#i#">#i#</option>
        </CFLOOP>
        </select>
    <CFELSEIF #www# is "checkbox">
        <CFLOOP INDEX="i" LIST="#response#" DELIMITERS=":">
            <CFSET #s#="">
            <CFIF #i# is #ar#>
                <CFSET #s#="checked">
            </CFIF>
            <input type="checkbox" #s# name=#qryvar# value=#i#>#i# 
        </CFLOOP>
    <CFELSEIF #www# is "text">
        <INPUT type=text NAME=#qryvar# VALUE="#ar#" align=right>
    <CFELSEIF #www# is "textarea">
        <textarea name=#qryvar# rows=1 wrap="soft">#ar#</textarea>
    <CFELSEIF #www# is "password">
        <INPUT TYPE=password NAME=#qryvar# VALUE="">
    <CFELSEIF #www# is "hidden">
        <INPUT TYPE=hidden NAME=#qryvar# VALUE="hidden">
    </CFIF>
    <CFIF ListContains(error,qryvar,"|") gt 0>
        <BR>#GetToken(GetToken(error,ListContains(error,qryvar,"|"),"|"),2,":")#
    </CFIF>
    </td>
    
    </tr>
    
    </CFOUTPUT>
    
    <tr>
    <td colspan=2 align=right><input type=submit value="weiter &gt;&gt;&gt;"</td>
    </tr>
    
    </table>
    </FORM>

<CFELSE>

    <CFTRANSACTION>
    <CFIF #ListLen(ValueList(Already.qry_id))# gt 0>
        <CFQUERY NAME="Save" DATASOURCE="aerzte">
            UPDATE qry_answer
            SET qry_answer.active=0
            WHERE qry_answer.qry_id IN (#ReReplaceNoCase(ValueList(Get.id),",{1,20}",",","ALL")#) AND qry_answer.partcp_id=#cookie_id#;
        </CFQUERY>
    </CFIF>

    <CFOUTPUT QUERY="Get">
        <CFQUERY NAME="Save" DATASOURCE="aerzte">
            INSERT INTO qry_answer (qry_id,partcp_id,response,active,date_entry)
            VALUES (#id#,#cookie_id#,'#Evaluate("FORM.#qryvar#")#',1,'#ACTIME#');
        </CFQUERY>
    </CFOUTPUT>
    </CFTRANSACTION>

    <CFIF #PARAMETEREXISTS(fieldnames)#>
        <CFIF #ReFindNoCase("terminator",fieldnames)# is not 0>
            done
        <CFELSE>
            <CFLOCATION URL="frage.cfm?page=#int(group+1)#">
        </CFIF>
    </CFIF>
</CFIF>
    
<CFINCLUDE TEMPLATE="bottom.cfm">