前篇博客只是简单的说了下,机房收费系统下机的简单思路,下面来正式的介绍下整个流程。
分析
由于下机的时候需要涉及到两个表中的数值——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_UpdateOffline on onlineInfo for update--插入触发 as --定义变量 declare @regulareUser float,@instantUser float, @atleastTime float,@prepareTime float,@stuid char(11), @consumeTime float,@money float,@atleastMoney float select @regulareUser =RegularUser,@instantUser =instantUser,@atleastTime=atleastTime,@prepareTime =preparetime,@atleastMoney=AtLeastMoney from BasicData --计算出学生上机消费时间 select @stuid=stuid,@consumeTime= datediff(minute,onlineTime ,offTime ) from inserted --开始判断学生上机花费的时间 --begin...and操作封装计算学生余额操作 begin if @consumeTime -@prepareTime <0 set @money=0 else if @consumeTime -@prepareTime -@atleastTime <0 set @money=@atleastMoney else set @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>)
小结
由于引用了触发器,使得下机的时候特别的方便,只需要添加下机信息即可,并且如果所有人强制下机的话,也只要更新下机信息即可。所有的关于学生下机消费信息的算法,全部封装到触发器中。小编不才,上述的触发器也耦合度太大,也正在优化中。具体的思路是,可以把不同类型用户的计算金额的算法封装成数据库中不同的函数,在触发器中调用即可。