一个页面完成一个任务

上一节的统计任务,我们使用了两个页面,页面"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


本页地址:http://www.foxtable.com/mobilehelp/topics/0024.htm