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

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

分析

由于下机的时候需要涉及到两个表中的数值——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 [email protected] <0 

set @money=0

else

if @consumeTime [email protected] [email protected] <0

set @[email protected] 

else

set @[email protected]/60 * @consumeTime 

end

--最后更新学生余额操作

update StudentInfo set money [email protected] where [email protected]
--更新消费金额和消费时间信息

update OnlineInfo set [email protected],[email protected] where offtime=(select max(offTime) as offTime from OnlineInfo  where [email protected]) and offDate=(select max(offDate) as offTime from OnlineInfo where <a target=_blank href="mailto:[email protected]">[email protected]</a>)

小结

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

机房收费系统之下机完整版,布布扣,bubuko.com

时间: 2024-10-29 22:21:45

机房收费系统之下机完整版的相关文章

机房收费系统上下机之观察者模式的尝试

如果读者想在本篇文章中看到观察者模式的巧妙应用,大概有些不可能了.因为这里我只是想把自己的一种思路展现给大家,然后和大家探讨. 背景: 在敲机房收费系统的过程中,都是别人说可能会用到什么模式,然后自己针对这些模式进行思考,然后去模仿书中的例子去用. 这不,师姐说上下机这里能用观察者模式,然后我就琢磨了一番,只是收获不是很丰硕,貌似也和师姐讲课中的设想不一样. 我在琢磨使用观察者模式时,已经把系统中和上下机有关的功能实现了.只是在写代码的过程中发现,每次下机,都需要先把正在上机的卡的上机信息查出来

机房收费系统学生下机结账小结

这几天一直在考虑机房收费系统学生下机操作.学生下机,一则须要加入学生下机记录信息:还须要计算学生在整 个上机过程中所花费的金额,而且更新学生剩余金额.那么如何做在性能上或者扩展上更好一些呢? 操作 1.加入学生下机信息 2.计算学生上机时间 3.依据上机时间来计算学生所花费的金额 4.更新学生的剩余金额 设计模式 在通过学生上机时间来计算学生所花费的金额这步操作上,须要进行一些条件分支语句的推断.由于上机时间被分为 了三部分:准备时间.至少上机时间.上机时间.所以在步骤3中有大量的条件分支语句,

有关机房收费系统学生下机的思考

?? 所谓的专家,就是在一个非常小的领域把全部的错误都犯过的人 ---------题记 做机房收费系统也有一段时间了,眼下已经进行到学生下机操作了. 由于学生下机操作时.须要依据不同用户的类别.来进行对应的结账服务.于是乎就想到了曾经学习到的设计模式,那么针对这个问题.能够用到那些模式呢?小编在这里总结一下.(可能有些模式过于勉强,但这都无所谓,学习的真谛就在于此,不断的反复和实验) --------------------------------------------------------

机房收费系统——视图的运用

对于视图在一年前的数据库学习和自考中就学到了,那时只是理论学习,这次在机房收费系统重构中亲自实践,加深了对视图的理解. 定义: 从数据库系统外部来看,视图是用户从一个特定的角度来查看数据库中的数据.从数据库系统内部来看,视图是由SELECT语句组成的查询定义的虚拟表,在数据库中并不真实存在.好比在提高班有学术部,安全部,纪律部等等,这些部门就是视图,需要给哪个部门开会就通知哪个部门.这些部门的人都是提高班各个期的(基本表),并且每个人都是独一无二的. 操作: 由于视图只是存储的SQL Selec

VB.NET版机房收费系统---导出Excel表格

datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,可以显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件非常简单和直观,大多数情况下,只需要设置DataSource属性即可,在绑定到包含多个列表或表的数据库源时,只需将DataMember属性设置为绑定的列表或表的字符串即可.机房收费系统多次用到数据表格的显示,并且导出为Excel表格,第一次机房收费系统是用VB版本的,她导出Excel的方法如下: 打开VB-工程-应用-勾选M

VB.NET版机房收费系统---异常处理

异常处理,英文名为Exceptional Handling, 那时年少,还记得那年一起学习过的VB6.0的时候,常常使用ONError的错误语句.与传统VB6.0中的OnError语句相比.NET平台的异常处理机制更加灵活,而且使用更加方便.是代替日渐衰落的Error Code方法的新法,提供Error Code 所未能具体的优势.异常处理巧妙又不失完美的分离了接收和处理错误代码.这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解. 异常处理(又称为错误处理)功能提供了

VB.NET版机房收费系统---七仙女之系统登录

VB.NET第一版机房收费系统,告一段落,验收的时候,问题也是大大的存在,没有用上设计模式,什么触发器,存储过程,都没有用上,看看其她小伙伴的,七层实现登录?那是什么东东,相比较我的三层而言,多了两倍还加个一,通过查资料,看博客,憋了好几天,终于,憋出了一个七仙女---七层实现系统登录,七个女儿,各司其职,完美配合,衍生出众多美丽的故事. 从三层猛地跳到七层,有种穿越的感觉,说白了就是不会,又是想逃避的感觉,可是人生在世,有的事情不能随着自己的性子来,喜欢了就去做,不喜欢,就不做,没办法,就一直

VB.NET版机房收费系统---外观层如何写

外观设计模式,<大话设计模式>第103页详细讲解,不记得这块知识的小伙伴可以翻阅翻阅,看过设计模式,敲过书上的例子,只是学习的第一步,接着,如果在我们的项目中灵活应用,把设计模式用出花儿来,才是王道,有人总说,纸上得来终觉浅,绝知此事要躬行,可是真到了躬行的时候,总是行不通,语言倒不过来,设计模式是C#语言的,机房收费是VB.NET版本的,书上的模式和机房联系不起来,不知道怎么应用,没办法,憋呗,看博客,问人,上网查资料,就这样,憋出一个外观,虽不太完美,但却异常宝贵,因为那是我纠结好长时间从

机房收费系统重构(五)—登陆窗口完整版

     在上上篇.<机房收费系统重构(3)>.中主要是介绍了自己关于DAL层,工厂层.以及接口层,还有实体层的理解.可是好多读者再问我.你的代码呢,我在这解释一下.就是我仅仅是写出关于那几部分的理解,并没有写贴出代码让大家研究的.可是不能顺应民心的文章不是好文章,所以我在这篇文章中,将机房收费登录中七层中全部的代码,贴出来供大家拍砖斧正.还有最后我在谈谈针对BLL层和外观层的理解.      首先我所说的七层是针对UI层,外观层,BLL层,DAL层,工厂层,实体层,接口层七层组成.