Dostal jsem od jednoho čtenáře dotaz, zda by nebylo možné určovat dobu působnosti ankety. Možné to je - při její tvorbě se určí datum počátku a konce ankety. Otevřením stránky s anketou se zobrazí právě ta anketa, do jejíž intervalu nastavených dvou dat spadá datum návštěvy.
Tato změna vyžaduje několik úprav. V tabulce ank_otazky se pole zobrazovat nahradí poli start a konec:
| Název pole |
Datový typ |
| idankety |
automatické číslo - primární klíč |
| jmeno |
text |
| otazka |
text |
| start |
datum/čas |
| konec |
datum/čas |
Druhá tabulka, ank_odpovedi, zůstane beze změny.
Další úpravou projde hlavní stránka ankety, anketa.asp. Zde se změní způsob vybíraní aktivní ankety. Místo porovnávaní pole zobrazovat se bude
zkoumat, zda datum návštěvy spadá do intervalu dat anket. V případě, že tomu tak je, příslušná anketa se návštěvníkovi zobrazí. Pro porovnávání dvou dat je ve VBScriptu určena funkce DateDiff:
DateDiff ( interval, datum1, datum2)
interval - udává, v čem se má rozdíl počítat (ve dnech, v rocích atp.). My budeme rozdíl počítat ve dnech, proto zadáme hodnotu "d".
datum1 a datum2 - data, která chceme porovnávat
|
Pokud je první datum menší (dřívější) než druhé, funkce vrací kladnou hodnotu, pokud je větší (pozdější), tak zápornou. SQL kód, pomocí kterého vybereme aktivní anketu, proto bude vypadat takto:
|
SELECT * FROM ank_otazky WHERE DateDiff('d',start,Date())>=0 AND DateDiff('d',konec,Date())<=0
|
V první podmínce, DateDiff('d',start,Date())>=0, vrátí funkce DateDiff číslo větší než nula (nebo rovno), pokud je datum zpracování - návštěvy (funkce Date()) větší než datum v poli start (nebo rovno). U druhé podmínky je to obdobné.
<%
response.expires =
-1000 Set conn =
Server.CreateObject("ADODB.Connection")
conn.open "ankety"
' vybrání anktivní ankety
Set rs = conn.Execute("SELECT otazka, idankety FROM ank_otazky WHERE DateDiff('d',start,Date())>=0 AND DateDiff('d',konec,Date())<=0")
' Místo: Set rs =
conn.Execute("SELECT idankety, otazka FROM ank_otazky WHERE zobrazovat =
1")
...
|
Hlavní soubor administrační části, aadmin.asp, se úpravě také nevyhne. Na pohled největší změnou bude zrušení formuláře na vybírání aktivní ankety (a s tím pochopitelně i zpracovacího kódu tohoto formuláře):
Dále se při výpisu anket do tabulky přidají dva sloupce, Start a Konec, a sloupec odkazující na stránku edit.asp:
Do Until rs.EOF
Response.write "<tr><td>" & rs("idankety") & "</td>"
Response.write "<td>" & rs("jmeno") & "</td>"
Response.write "<td>" & rs("otazka") & "</td>"
Response.write "<td>" & rs("start") & "</td>"
Response.write "<td>" & rs("konec") & "</td>" Response.write"<td><ahref='delete.asp?id=" & rs("idankety") & _
"'>Vymaž</a></td>"
Response.write"<td><ahref='edit.asp?id=" & rs("idankety") & _
"'>Edit</a></td></tr>"
rs.MoveNext
Loop
|
Na stránce edit.asp bude
moci administrátor změnit data startu a konce ankety. Může tak například znovu spustit již některou starší anketu, či jinou zase trochu oddálit (obrázek):
<%
response.buffer =
true Set conn =
Server.CreateObject("ADODB.Connection")
conn.open "ankety"
' Editační část...
If len(Request.QueryString("id"))>0 Then
intID = Request.QueryString("id")
Set ank = conn.execute("SELECT * FROM ank_otazky WHERE idankety=" & intID)
Set odp =
conn.execute("SELECT * FROM ank_odpovedi WHERE idankety=" & intID)
%>
<html>
<head>
<title>Edit</title>
</head> <body><br><formaction="edit.asp?update=<%= intID %>" method="post">
<table>
<tr><td width="125"><b>Název ankety</b></td><td><%= ank("otazka") %></td></tr>
<tr><td><b>Odpovědi</b></td><td>
<%
Do While NOT odp.EOF
response.write odp("odpoved") & " "
odp.MoveNext
Loop
%>
</td></tr>
<tr><td><b>Start</b></td><td><input type="text" name="start"></td></tr>
<tr><td><b>Konec</b></td><td><input type="text" name="konec"></td></tr>
<tr><td><input type="submit" value="Odeslat"></td></tr>
</table>
</form>
</body>
</html>
<%
Set ank = Nothing
Set odp =
Nothing
' Změna dat v databázi
ElseIf len(Request.QueryString("update"))>0 Then
dtmStart = Request.Form("start")
dtmKonec = Request.Form("konec")
' Kontrola, zda datum ukončení je pozdější než datum startu...
If DateDiff("d",dtmStart,dtmKonec)>0 Then
conn.execute("UPDATE ank_otazky SET start = '" & dtmStart & "', konec = '" & dtmKonec & "' WHERE idankety = " & Request.QueryString("update"))
Else
response.redirect "edit.asp?id=" & Request.QueryString("update")
End If
response.redirect "aadmin.asp"
Else
response.redirect "aadmin.asp"
End If
conn.close
Set conn = Nothing
%>
|
Posledními soubory, které se upraví, jsou soubory na přidávání nových anket. V souboru nova.asp se doplní dvě nová vstupní pole, Start a Konec:
...
<tr><td width="150">Název ankety</td><td><input type="text" name="jmeno" maxlength= "20"value=<%= request.querystring("jmeno") %>></td></tr>
<tr><td>Otázka</td><td><input type="text" name= "otazka"value=<%= request.querystring("otazka") %>></td></tr>
<tr><td>Počet odpovědí</td><td><input type="text" name="pocet" maxlength="2" size= 1value=<%= request.querystring("pocet") %>></td></tr>
<tr><td>Start</td><td><input type="text" name= "start"value=<%= request.querystring("start") %>></td></tr>
<tr><td>Konec</td><td><input type="text" name= "konec"value=<%= request.querystring("konec") %>></td></tr>
...
|
V souboru nova2.asp se při počáteční kontrole posílaných dat zjistí, zda je první datum menší než druhé (nebo rovno), a přidají se dvě skrytá pole, která tato data budou uchovávat:
...
If ... And DateDiff("d",request.form("start"),request.form("konec"))>=0
...
<input type= "hidden"value='<%= request.form("pocet") %>' name="pocet">
<input type="hidden" value='<%= request.form("jmeno") %>' name="jmeno">
<input type="hidden" value='<%= request.form("otazka") %>' name="otazka">
<input type= "hidden"value='<%= request.form("start") %>' name="start"> <input type=
"hidden"value= '<%= request.form("konec") %>' name="konec">
...
|
A konečně v posledním souboru, nova3.asp, se musí změnit SQL kód, který vkládá anketu do databáze (pole zobrazovat -> start a konec):
...
conn.execute("INSERT INTO ank_otazky(jmeno, otazka, start, konec) VALUES('" & request.form("jmeno") & "', '" & request.form("otazka") & "', '"
& request.form("start") & "', '" & request.form("konec") & "')")
...
|
Tím máme tuto verzi anketního systému hotovu. Můžete si
vybrat variantu z minulého dílu, kde aktivní anketu nastavujete formulářem,
anebo dnešní, jež zobrazí aktuální anketu sama dle zadaných dat...
Liška Adam
|