一个页面完成一个任务
上一节的统计任务,我们使用了两个页面,页面"saletj.htm"用于输入统计年月,页面"showtj.htm"用于显示统计结果。
如果你愿意的话,也可以只用一个页面"saletj.htm"来完成这个统计任务,从代码维护角度而言,我更愿意用一个页面处理一个任务。
知识准备
我们已经知道,HttpRequest事件有个e参数PostValues,用于获取用户通过表单提交的数据。
我们可以用一个隐藏的输入框,在这个输入框填入约定的数据,HttpRequest根据这个输入框的值,来执行相应的操作。
例如:
<input name='tj' id='tj' value='按年月统计' hidden>"
这里创建了一个名为"tj"的输入框,默认值是"按年月统计",这个输入框加上了hidden属性,所以在页面中并不会显示,用户不会感觉有什么变化。
在HttpRequest通过下面的代码,判断如果提交的页面名为tj的输入框,且他的值是"按年月统计",那么就进行统计并显示统计结果,否则生成年月输入页面:
Select
Case e.Path
Case "saletj.htm"
If
e.PostValues.ContainsKey("tj") AndAlso
e.PostValues("tj") = "按年月统计"
Then
'统计数据,并显示统计结果
Else
'生成年月录入界面
End
If
End
Select
我们也可以用更简单的方式来区分两个页面:
Select
Case e.Path
Case "saletj.htm"
If
e.PostValues.Count
> 0
Then
'统计数据,并显示统计结果
Else
'生成年月录入界面
End
If
End
Select
原理很简单,如果是直接访问saletj.htm,那么PostValues为空,其Count属性等于0,如果是通过表单的“开始统计”按钮访问saletj.htm,那么PostValues就会包括用户输入的值,其Count属性就会大于0。
最后别忘记修改表单定义语句,该语句之前是:
<form action='showtj.htm' enctype='multipart/form-data' method='post' id='form1' name='form1'>
我们需要改为:
<form action='saletj.htm' enctype='multipart/form-data' method='post' id='form1'
name='form1'>
完整的代码
下面是HttpRequest事件的完整代码,只使用一个页面完成和上一节完全相同的任务:
Select
Case e.Path
Case "saletj.htm"
If
e.PostValues.ContainsKey("tj") AndAlso e.PostValues("tj") = "按年月统计"
Then
Dim
y As
Integer = 0
Dim
m As
Integer = 0
Integer.TryParse(e.PostValues("year"),
y)
'获取用户输入的年
Integer.TryParse(e.PostValues("month"),
m)
'获取用户输入的月
If
y = 0
OrElse m = 0
Then
e.WriteString("请输入正确的年月!")
Else
Dim
fl As
String =
"d:\web\temp\" &
y &
m &
".htm"
'合成文件名
If
FileSys.FileExists(fl)
Then
'如果文件存在
Dim
ifo As
new FileInfo(fl)
'如果不是本月,或者文件创建时间在1个小时内,则发送文件后返回
If
y <> Date.Today.Year
OrElse m <>
Date.Today.Month
OrElse (Date.Now
- Ifo.LastWriteTime).TotalHours
< 1
e.WriteFile(fl)
Return
End
If
End
If
'根据输入的年月,统计各产品的销售数量
Dim
g As New
SQLGroupTableBuilder("统计表1",
"订单")
'这里使用后台统计,如果数据已经全部加载可以直接用GroupTableBuilder
'g.ConnectionName = "数据源"
'外部数据表的话要指定数据源名称
g.Groups.AddDef("产品")
g.Totals.AddDef("数量")
g.VerticalTotal
= True
g.Filter
= "Year(日期)
= "
& y
&
" And Month(日期)
= "
& m
'后台统计才可以使用这种表达式的哦
Dim
dt As
DataTable = g.Build(False)
'统计数据,将结果保存为网页,然后发送这个网页
Dim
sb As New
StringBuilder
sb.AppendLine(y
& "年"
& m
& "月各产品销售数量: <br/><br/>")
For
Each dr As
DataRow In
dt.DataRows
sb.AppendLine(dr("产品")
& ":"
& dr("数量")
& "<br/>")
Next
sb.AppendLine("<br/>")
sb.AppendLine("统计时间:"
& Date.Now)
'在网页显示统计时间,提醒用户这可能不是最新的结果
FileSys.WriteAllText(fl,
sb.ToString,
False, Encoding.UTF8)
'记得用UTF8格式保存网页
e.WriteFile(fl)
'发送保存的网页
End
If
Else
Dim
sb As
New StringBuilder
sb.AppendLine("<form
enctype='multipart/form-data' action='saletj.htm' method='post'
id='form1'
name='form1'>")
sb.AppendLine("请输入要统计的年月:</br></br>")
sb.AppendLine("<input
name='tj' id='tj' value='按年月统计'
hidden>")
'这个输入框不会显示,仅用于标记
sb.AppendLine("年:
<input type='number' name='year' id='year' min='1999' max='2018'><br/><br/>")
sb.AppendLine("月:
<input type='number' name='month' id='month' min='1' max='12'><br/><br/>")
sb.AppendLine("<input
Type='submit' name='Sumbit' id='Sumbit' value='开始统计'>")
sb.AppendLine("</form>")
e.WriteString(sb.ToString)
End
If
End
Select