机房收费系统之下机完整版

来源:互联网 发布:淘宝店铺收藏图片 编辑:程序博客网 时间:2024/05/05 11:56

 

  前篇博客只是简单的说了下,机房收费系统下机的简单思路,下面来正式的介绍下整个流程。


image


分析


  由于下机的时候需要涉及到两个表中的数值——StudentInfo表和OnlineInfo表,那么我们的思路就是如何能够简化查

询的操作。

  

 学生表中包含的学生的静态信息,而上机信息表中则包含了有关学生上机的所有的信息。


 流程

 

  1.更新学生下机信息

  2.触发器触发后,会自动的更新学生的消费时间,消费金额并更新学生余额

  3.两张表联合查询有关界面上的所有信息

  4.为所有的文本框赋值


注意:其实最有意思的就是触发器的使用了,由于引用了触发器省了很多不必要的麻烦


代码如下

U层

 Private Sub btnOff_Click(sender As Object, e As EventArgs) Handles btnOff.Click        '用来验证学生卡号是否存在        Dim BLL_StuInfo As New BLL.B_StuInfo   '定义B层用户记录的对象        Dim En_stuinfo As New Entity.En_StuInfo   '实例化实体层用户信息表对象        '用来验证学生是否正在上机        Dim Bll_IsOnline As New BLL.B_OnlineInfo        Dim En_Online As New Entity.OnlineInfo        '用来判断输入文本不能为空        If txtCardId.Text = "" Then            MsgBox("卡号不能为空!")            txtCardId.Focus()  '该文本框获得焦点            Exit Sub        End If        '为学生卡号赋值        En_stuinfo.En_stuID = txtCardId.Text        '判断学生卡号是否存在        If BLL_StuInfo.BLL_VerifyStu(En_stuinfo) = False Then            txtCardId.Focus()  '该文本框获得焦点            Exit Sub        End If        En_Online.En_stuID = txtCardId.Text        If Bll_IsOnline.StuIsOnline(En_Online) = False Then            MsgBox("此用户还未上机")            txtCardId.Focus()  '该文本框获得焦点            Exit Sub        End If        '开始更新下机记录        En_Online.En_offTime = TimeOfDay   '下机日期        En_Online.En_offDate = Today  '下机时间        '开始更新下机记录        Bll_IsOnline.AddOffInfo(En_Online)        '当更新完下机记录后,触发器会自动的更新学生的余额        '直接提取记录即可        Dim StuInfo As New DataTable        StuInfo = BLL_StuInfo.BLL_CheckMoney(En_stuinfo)        '写入学生固定信息        txtStuNumber.Text = StuInfo.Rows(0).Item(1)        txtName.Text = StuInfo.Rows(0).Item(2)        txtDepartment.Text = StuInfo.Rows(0).Item(3)        txtSex.Text = StuInfo.Rows(0).Item(4)        txtType.Text = StuInfo.Rows(0).Item(0)        txtStillBill.Text = StuInfo.Rows(0).Item(5)        '继续写入下机记录        StuInfo = Bll_IsOnline.WriteOnlineInfo(En_Online)        txtOnlineDate.Text = StuInfo.Rows(0).Item(1).ToString        txtOnlineTime.Text = StuInfo.Rows(0).Item(0).ToString        txtOffDate.Text = StuInfo.Rows(0).Item(3).ToString        txtOffTime.Text = StuInfo.Rows(0).Item(2).ToString        txtConsumeTime.Text = StuInfo.Rows(0).Item(4)        txtconsumeMoney.Text = StuInfo.Rows(0).Item(5)        MsgBox("下机成功")    End Sub

B层

    ''' <summary>    ''' 更新下机信息    ''' </summary>    ''' <param name="En_StuId"> 传递的实体层的参数</param>    ''' <remarks></remarks>    Sub AddOffInfo(ByVal En_StuId As Entity.OnlineInfo)        ID_StuOnlineInfo = sqlFactory.OnlineInfo  '实例化一个下机对象        ID_StuOnlineInfo.AddOffInfo(En_StuId)  '调用D层方法,更新下机信息    End Sub

D层

    ''' <summary>    ''' D层添加下机信息    ''' </summary>    ''' <param name="En_StuInfo"></param>    ''' <remarks></remarks>    Public Sub AddOffInfo(En_StuInfo As Entity.OnlineInfo) Implements IDAL.I_OnlineInfo.AddOffInfo        Dim strConn As String        '传递的参数        Dim paras As SqlParameter() = {New SqlParameter("@stuid", En_StuInfo.En_stuID), _                                        New SqlParameter("@offlineTime", En_StuInfo.En_offTime.ToString), _                                        New SqlParameter("@offlineDate", En_StuInfo.En_offDate.ToString)}        Dim sqlHelper As New sqlHelper        strConn = "pro_StuOffOnlineInfo"   '存储过程名字        '调用sqlhelper执行更新操作        sqlHelper.ExecAddDelUpdate(strConn, CommandType.StoredProcedure, paras)    End Sub

触发器

alter trigger tgr_UpdateOfflineon onlineInfofor update--插入触发as--定义变量declare @regulareUser float,@instantUser float,@atleastTime float,@prepareTime float,@stuid char(11),@consumeTime float,@money float,@atleastMoney floatselect @regulareUser =RegularUser,@instantUser =instantUser,@atleastTime=atleastTime,@prepareTime =preparetime,@atleastMoney=AtLeastMoneyfrom BasicData --计算出学生上机消费时间select @stuid=stuid,@consumeTime= datediff(minute,onlineTime ,offTime ) from inserted --开始判断学生上机花费的时间--begin...and操作封装计算学生余额操作beginif @consumeTime -@prepareTime <0 set @money=0elseif @consumeTime -@prepareTime -@atleastTime <0set @money=@atleastMoney elseset @money=@instantUser/60 * @consumeTime end--最后更新学生余额操作update StudentInfo set money =money-@money where stuid=@stuid --更新消费金额和消费时间信息update OnlineInfo set consumeMoney=@money,consumeTime=@consumeTime where offtime=(select max(offTime) as offTime from OnlineInfo  where stuId=@stuid) and offDate=(select max(offDate) as offTime from OnlineInfo where <a target=_blank href="mailto:stuId=@stuid">stuId=@stuid</a>)


小结

由于引用了触发器,使得下机的时候特别的方便,只需要添加下机信息即可,并且如果所有人强制下机的话,也只要更新下机信息即可。所有的关于学生下机消费信息的算法,全部封装到触发器中。小编不才,上述的触发器也耦合度太大,也正在优化中。具体的思路是,可以把不同类型用户的计算金额的算法封装成数据库中不同的函数,在触发器中调用即可。

  

 

3 0
原创粉丝点击