【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《客房管理系统设计》,欢迎阅读!
客房管理系统设计
在当今经济和商务往来交往日益频繁的状况下,宾馆服务行业正面临客流量骤增的压力。越来越多的宾馆饭店都认识到传统的管理方法已经不能适合当今社会的需要,必须借助先进的计算机信息技术对宾馆服务进行管理。“客房管理系统”可以说是整个宾馆计算机信息管理的中心子系统,因为宾馆最主要的功能就是为旅客提供客房。设计客房管理这样一个系统,可以涉及到大多数SQL Server数据库的重要数据库对象、重要功能和特性,比如:视图、触发器和存储过程等。由此,通过这个课程设计可以加深对这些SQL Server数据库知识的学习、理解,积累在实际工程应用中运用各种数据库对象的经验,使学生掌握使用应用软件开发工具开发数据库管理系统的基本方法。
本课程设计的主要目的是学习和练习SQL Server数据库的实际应用。
1.系统功能设计
1).数据录入功能
在本系统中提供客人信息登记功能。可以录入客人的姓名、性别、年龄、身份证号码、入住时间、预计入住天数、客房类别、客房号、离店时间以及缴纳押金金额等信息。在客人退房时,系统根据输入的离店时间及客房单价自动计算客人住宿费金额。 2).数据查询功能
系统需要提供以下查询功能:
① 查某类客房的入住情况及空房情况,显示所有该类客房空房数目和客房号。 ② 根据客人姓名信息查询客人信息;根据客房号查询入住客人的信息。 ③ 查询某个客人住宿费用情况,显示客人缴纳押金金额,实际入住天数、客房价格、实际住宿费、住宿费差额及余额等信息。 ④ 查询所有入住时间达到或超过预计入住天数的客人。 3).数据统计功能
① 统计一段时间内各种客房的入住情况。 ② 统计全年各月份的客房收入。 ③ 统计一段时间内各类客房的入住率。
2.数据库设计
1). 数据库与数据表设计 2). 数据完整性设计 ① 主键约束、非空值约束
② CHECK约束 离店时间>入住时间 ③ 使用缺省值 入住时间、预计入住天数 ④ 惟一约束 客房类别 ⑤ 外键约束
⑥ 规则 身份证长度 15 OR 18 3). 视图、触发器和存储过程设计 1、客人选择客房处理
客人来到饭店入住前要做的第一件事是选择合适的客房,客人将告知饭店服务员自己需要的客房类型,服务员在系统中选择指定的客房类型后系统将现实所有空余的该类型客房,并显示该类型客房价格供客人参考选择。这个处理过程可以通过一个存储过程来实现。
在这个存储过程中,需要的输入参数是客房类型,输出的结果集是所有这种客房类型的空房记录和价格。定义这个存储过程名为SelRoom,定义输入的参数名为RoomType,定义输出的价格参数名为RoomPrice。根据存储过程的创建语法,编写SelRoom的实现代码如下:
create procedure selroom @roomtype char(2),
@roomPrice smallmoney output as
select 客房号 from 客房信息
where (客房类型编号=@roomtype) and (客房状态='N') select @roomprice=价格 from 客房类型 where 客房类型编号=@roomtype
在上面的代码中包含了两个Select语句,第一个SELECT语句从客房信息表中选择了所有客房类型为输入参数指定类型并且客房状态为“空”(N)的客房号,并将所有记录作为结果集返回;第二个SELECT语句从客房类型中取得了制定客房类型的价格,作为输出参数Roomprice返回。
2、客人入住登记处理
客人入住登记操作完成后,入住的客房状态应该及时做相应的改变,并记录客人的序号供以后查询。这一功能可以使用触发器来自动进行:因为进行客人入住登记操作是在客人信息表中添加一条新记录,所以可以为客人信息表设计一个INSERT触发器,当客人信息执行INSERT操作后自动更改客房信息相应客房记录的数据。
定义这个触发器名称为client_insert 。其实现代码如下:
create trigger client_insert on dbo.客人信息 for insert as
update 客房信息
set 客房状态='F',客房信息.入住客人序号=B.序号 from 客房信息 AS A,inserted as B WHERE A.客房号=b.客房号
3、客人离店退房处理
客人在离店退房时,服务员输入客人的退房时间,然后计算出客人的住宿费用,以便于客人结帐。同时,系统应该将客人所退房的状态更改为“空”,以便于再次接待下一位客人入住。这一功能也可以通过一个触发器来实现。为客人信息表设计一个名为client_update的UPDATE触发器,当系统对客人信息的离店时间进行UPDATE操作后,将会自动触发它。该触发器将自动取得当前所退客房的单价,并根据客人入住的天数计算出客人的住宿费用,将费用值写入住宿费
列,最后触发器将客房信息的相应客房记录的客房状态和入住序号更新,即将客房状态置为空房,并清除对于该客人的入住标识信息。 下面是client_update触发器的定义代码:
create trigger client_update on dbo.客人信息 for update as
if update(离店时间) /*只有对离店时间列进行更改时才处理*/ begin /*求出客人所住客房的单价*/ declare @price smallmoney
set @price=(select 价格 from 客房类型 right join 客房信息 on
客房类型.客房类型编号=客房信息.客房类型编号 right join 客人信息 on 客房信息.客房号=客人信息.客房号
where 客人信息.序号 in(select 序号 from inserted)) /*求客人住宿费并更改住宿费列*/ update 客人信息
set 住宿费=@price*datediff(day,b.入住时间,b.离店时间) from 客人信息 as a,inserted as b where a.序号=b.序号
/*更新客房信息相应客房的状态*/ update 客房信息
set 客房状态='N',入住客人序号='' from 客房信息 ,inserted
where 客房信息.入住客人序号=inserted.序号 end
在上面的代码中,首先定义了一个变量@price,然后通过一个右联合直接得到当前客人所住客房的单价。在第二段语句中,使用SQL函数DATEDIFF求得客人入住时间和退房时间之差,求出入住天数,乘以@price变量就得到了客人
最终的住宿费用。值得注意的是:UPDATE触发器可以使用inserted表和deleted表,这里必须使用inserted表,它的离店时间才识最新更改的离店时间,如果使用deleted表,将得不到正确的结果。
最后,触发器对客房信息表中入住序号为当前客人的入住序号的记录的客房状态列和入住序号列进行了更新。
4、客人信息查询处理
在实际应用中,经常会有这样的要求:服务员需要通过客人的部分资料查询客人的全部信息以及客人住在哪一个客房。由于需要通过输入查询条,才能得到结果集,所以可以设计一个带输入参数的存储过程来实现。定义一个名为spClientInfo的存储过程,该存储过程以客人姓名(@ClientName)作为输入参数,存储过程返回到查询到的结果集。 spClientInfo的定义代码如下:
create procedure spClientInfo @ClientName varchar(8)='%' as
select * from 客人信息
where 姓名 like @clientname+'%'
在上面的代码中,想spClientInfo传入客人姓名参数。在WHERE子句中使用LIKE,并在参数前、后添加“%”,使得该存储过程具有模糊查询的功能。比如,@ClientName参数中只输入客人的姓,就可以查询到所有该姓氏的客人信息。
5、查询客人住宿费用的处理
在本系统的功能需求中要求能够查询客人住宿费用的详细情况,包括客人入住时交付的押金金额、客人住宿天数、客房价格、客人住宿费金额、住宿费和押金差额等信息。实现该功能可以通过一个存储过程,以客人序号为输入参数,输出上面要求的各种信息数值。设计一个名为spClientCost的存储过程,定义代码
如下:
create procedure spClientCost @ClientId char(9) as
declare @clientPrice smallmoney declare @clientDays smallint declare @clientCost smallmoney declare @clientBalance smallmoney select @clientPrice=(
select 价格 from 客房类型 right join 客房信息 on 客房信息.客房类型编号=客房类型.客房类型编号 right join 客人信息
on 客人信息.客房号=客房信息.客房号 where 客人信息.序号=@clientId),
@clientDays=(datediff(day,入住时间,getdate())), @clientCost=(@clientPrice*@clientDays), @clientBalance=(押金金额-@clientCost) from 客人信息 where 序号=@clientId
select 押金金额,@clientPrice as 价格,
@clientDays as 天数,@clientCost as 住宿费,@clientBalance as 余额 from 客人信息 where 序号=@clientId
在上面代码中,首先定义了4个变量,分别是:@clientPrice,@clientDays,@clientCost,@clientBalance,它们分别表示:客人入住房间的单价客人住宿的时间,客人的住宿费用和客人所缴纳押金与住宿费用的差额。第一个SELECT
语句起赋值作用,分别把各个表达式的结果赋值给各个变量。第二个SELECT语句是一个选择,将客人信息表的押金金额以及前面求得的各个变量值作为存储过程的结果集返回。
6、查询住宿时间到期的客人
客房管理服务员通常根据客人入住时登记的预住天数收取相应押金,当客人住宿时间达到预住天数时就应该通知客人,以便客人补交押金或退房。系统为管理服务员提供这样的查询功能,可以显示出所有住宿时间达到预住日期的客人信息。完成这个功能只需要在表中选择入住天数大于等于预住天数的记录,而不需要输入参数,所以,可以使用一个视图来实现这一查询功能。 定义视图的名称为vClient_Day,定义代码如下:
create view dbo.vClient_Day as
select 序号,姓名,客房号,预计入住天数,入住时间,datediff(day,入住时间,getdate()) as 入住天数 from dbo.客人信息
where (离店时间 is null) and (datediff(day,入住时间,getdate())>=预计入住天数)
代码中使用DATEDIFF函数求得入住日期与当前日期之间的天数,即客人实际住宿天数。所有住宿天数大于或等于预住天数,并且离店时间为NULL 的客人记录都将成为结果集中的记录。
7、客房销售统计
作为一个简单的客房管理系统,应该提供给管理者一定的统计数据。系统中最基本的统计数据就是各种类型客房在一定时间段内的销售收入情况。设计一个存储过程,以管理人员输入的统计起始日期和终止日期作为输入参数,在这段时期内所有类型客房的销售收入、销售次数(客人入住次数)为结果集。这个存储过程名为spRoomSale,两个输入参数分别为@StartDate,@EndDate。设计代码
如下:
create procedure spRoomSale @StartDate smalldatetime, @EndDate smalldatetime as
select 客房类型编号,客房类型,(select sum(住宿费) from 客人信息 left join 客房信息
ON 客人信息.客房号=客房信息.客房号 where (客人信息.入住时间 between @startdate and @enddate)
and (客房类型.客房类型编号=客房信息.客房类型编号)) as 销售额, (select count(客人信息.序号) from 客人信息
left join 客房信息 on 客人信息.客房号=客房信息.客房号 where (客人信息.入住时间 between @startdate and @enddate) and (客房类型.客房类型编号=客房信息.客房类型编号)) as 消费次数 from 客房类型
代码中使用了两个SELECT子查询,分别求得起始日期与终止日期之间、客房类型为当前客房类型的所有住宿费用总和(客房销售收入 sale)及客房销售次数 salenum。然后这两个值作为新的列与客房类型的客房类型编号、客房类型名称列一起作为结果集。注意BETWEEN的用法。
8、统计某年份每月的客房销售数据
饭店管理人员常常需要比较一年中各个月份的客房销售收入,并把它制作成表格。实现这一功能可以使用一个存储过程以输入一个年度作为参数,产生该年度12个月份的销售收入统计。定义该存储过程名为spMonthSum,输入参数为@thisYear,实现代码如下:
create procedure spMonthSum
@thisyear char(4) as
select datepart(mm,入住时间) as 月份,Sum(住宿费) as 营业额 from 客人信息
where datepart(yyyy,入住时间)=@thisyear group by datepart(mm,入住时间)
注意上面的代码中如何使用GROUP BY子句来实现统计功能。代码中还使用了日期函数DATEPART和求和函数SUM。
⑨ 统计一段时间内各类客房的入住率。
本文来源:https://www.wddqxz.cn/da341923753231126edb6f1aff00bed5b8f37374.html