SQL课程设计VB 客房管理系统.docx
《SQL课程设计VB 客房管理系统.docx》由会员分享,可在线阅读,更多相关《SQL课程设计VB 客房管理系统.docx(40页珍藏版)》请在冰豆网上搜索。
SQL课程设计VB客房管理系统
课程设计示例——客房管理系统设计
一、课程设计的目的和意义
在当今经济和商务交往日益频繁的状况下,宾馆服务行当正面临客流量骤增的压力。
越来越多的宾馆饭店都认识到传统的管理方法已经不能适合当今社会的需要,必须借助先进的计算机信息技术对宾馆服务进行管理。
“客房管理系统”可以说是整个宾馆计算机信息管理系统的中心子系统,因为宾馆最主要的功能就是为旅客提供客房。
设计客房管理这样一个系统,可以涉及到大多数SQLServer数据库的重要数据库对象、重要功能和特性,比如:
视图、触发器和存储过程等。
由此,通过这个课程设计可以加深对这些SQLServer数据库知识的学习、理解,积累在实际工程应用中运用各种数据库对象的经验,使学生掌握使用应用软件开发工具开发数据库管理系统的基本方法。
在实用性方面,客房管理系统是很普遍的一种应用,选择该系统作为课程设计也可以为学生以后可能遇到的实际开发提供借鉴。
二、系统需求分析及功能设计(此部分是重点设计内容,要求按步骤进行设计——系统需求分析、系统功能设计)(该示例在此处省略了“系统需求分析”部分,各组同学们在设计时不能省略)
系统功能是在实际开发设计过程中经过调研、分析用户需求,和用户一起共同确定下来的,是系统为满足用户需求所应完成的功能。
本课程设计模拟一个小型客房管理系统。
本系统要求实现以下主要功能:
1、数据录入功能:
在本系统中提供客人信息登记功能。
可以录入客人的姓名、性别、年龄、身份证号码、家庭住址、工作单位、来自地的地名、入住时间、预计入住天数、客房类别、客房号、离店时间以及缴纳押金金额等信息。
在客人退房时,系统根据输入的离店时间以及客房单价自动计算客人住宿费金额。
2、数据查询功能
系统需要提供以下查询功能:
1)查某类客房的入住情况及空房情况,显示所有该类客房空房数目和客房号。
2)根据客人姓名、来自地的地名、工作单位或家庭住址等信息查询客人信息;根据客房号查询入住客人的信息。
3)查询某个客人住宿费用情况,显示客人缴纳押金金额、实际入住天数、客房价格、实际住宿费、住宿费差额及余额等信息。
4)查询所有入住时间达到或超过预计入住天数的客人。
3、数据统计功能
1)统计一段时间内各类客房的入住情况。
2)统计全年各月份的客房收入。
3)统计一段时间内各类客房的入住率。
三、数据库设计(此部分是重点设计内容,要求按步骤进行设计——概念结构设计、逻辑结构设计、物理结构设计)(该示例在此处省略了“概念结构设计”及“逻辑结构设计”部分,各组同学们在设计时不能省略)
数据库设计是根据系统功能的要求和数据规模规划数据库服务器选型、数据表结构定义、分配数据库服务器端的功能实现以及创建数据库对象。
1、数据库与数据表设计
分析前面的系统功能要求,需要一个表来存储和管理客人信息,使系统能够接受客人入住时输入的各项数据,以实现数据录入、查询或统计客人信息等功能。
客人是本系统的第一个实体。
为了能实现查询和统计客房入住情况等功能,必须有一个表来存储和管理所有客房的信息,包括客房的类型、客房号、是否入住客人等。
客房是本系统的第二个实体。
一般来说,客房价格是以客房的类型来制定的。
为了保证系统数据库最小的数据冗余和数据完整性,需要建立一个表来记录各种客房类型的信息。
它主要为各种查询和统计功能提供客房价格数据。
它与客房表是一对多的关系,在客房价格变动时,只需要在客房类型表中更改。
综上所述,在客房管理(KFGL)数据库中需要建立3个数据表:
客人信息数据表、客房信息数据表和客房类型数据表。
(1)客人信息数据表定义
根据系统功能要求,客人信息表需要能接受客人登记入住和离店时输入的所有信息.还必须包括客人最终的住宿费金额,因为住宿费金额是统计客房收入的基本数据。
客人信息表的结构定义如表1所示。
表1客人信息数据表定义
列名
数据类型大小空值键说明
cId
int4主键(标识列)序号
cName
char8姓名
cSex
bit1性别
cAge
tinyint1√年龄
cPNum
char18身份证号码
cAdd
varchar50√家庭住址
cWork
varchar50√工作单位
cFrom
char10来自地的地名
cInTime
smalldatetime4入住时间
cDay
Tinyint1预计入住天数
rNum
char5客房号
cOutTime
smalldatetime4√离店时间
cDeposit
smallmoney4√押金金额
cCost
smallmoney4√住宿费
其中,cId(序号)是表的主键,唯一标识一个入住的客人。
设计时定义它为标识列,系统自动地产生连续的永不重复的序列号。
rNum(客房号)在客人信息表中是外键,它是客房信息表的主键,唯一标识一个房间。
通过它,系统将引用到客房类型、客房单价等信息。
客人信息表取名为tblClient。
(2)客房信息数据表定义
客房信息表中应该记录每一个客房的信息和状态,系统查询这些信息并决定客人能否入住。
每个客房的类型决定了客房的价格,可供客人入住时选择房间及离店时结算住宿费用。
客房数据表的定义如表2所示。
表2客房信息数据表定义
列名
数据类型大小空值键说明
rNum
rStats
rType
cID
char5主键客房号
char1客房状态
char2客房类型编号
char9√入住客人序号
其中,rNum(客房号)是该表的主键,唯一标识一个客房房间。
它将作为客人信息表的外键,保证客人信息表的参照完整性。
rStats表示房间的状态,设定其值为“N”时,表示客房没有入住客人;值为“F”时,表示客房以有客人入住;值为“P”时,表示客房被预定。
rType表示客房的类型,它是该表的一个外键,来自下面将要说明的客房类型数据表。
cId将记录入住客人的序号,在客房信息表中增加这一列时,虽然增加了数据冗余,但可以在查询房间中入住客人信息时,提高系统的性能。
因为客房信息表的记录数相对固定,相比之下,增加这个冗余的列对于整个系统来说是有利的。
客房信息表取名为tblRoom。
(3)客房类型数据表定义
客房类型主要描述客房的服务标准和收费价格,这些信息如果包含进每个客房的记录中,将会使客房信息表产生较大的数据冗余,特别在客房数量大的情况下。
此外,如果客房信息表的每条记录都包括价格信息,那当某种类型的客房价格变动时,用户就不得不对客房信息表中的记录逐一进行修改。
客房类型数据表的定义如表3-3所示。
表3-3客房类型数据表定义
列名
数据类型大小空值键说明
rType
rName
rPrice
char2主键客房类型编号
char10客房类型名称
smallmoney4该类型客房价格
其中,rType表示客房类型的编号,作为该表的主键,唯一标识某一类客房。
它将作为客房信息表的外键,保证客房信息表数据的完整性。
客房类型数据表取名为tblRoomType。
(4)根据上面三个数据表的设计,可执行下面的步骤创建数据表
1)在服务器计算机上安装MSSQLServer2000。
2)打开企业管理器,在本地服务器上创建新的数据库KFGL。
3)展开KFGL数据库,单击“表”,按照设计,创建表tblClient、tblRoom和tblRoomType
2、数据完整性设计
设计好表的结构后,需要根据实际应用和操作规则为表制定一系列约束和规则,从而达到保证数据完整性原则的目的。
约束
(1)主键约束、非空值约束
在三个表的设计中已经规定了每个表的主键列、非空列,这些规定都是在实际应用环境中所必需的。
比如tblRoom表中定义了房间号rNum为主键,则在表tblRoomr中Num必须是唯一的——一个饭店不可能出现两个房间号码相同的客房;客房类型Type和客房状态rStats不能为空值,因为rType是辨别客人入住客房中类、住宿费用结算的依据,所以不能为空值;rStats是辨别客人能否入住的依据,所以也不能为空值。
(2)CHECK约束
对于tblClient表,应该建立一个检查约束,即所有客人的离店时间都不可能小于入住时间。
按下列步骤创建这个约束:
1)打开企业管理器,展开服务器,展开“数据库”,展开“KFGL”数据库,单击“表”。
2)用鼠标右键单击“tblClent”表,选择“设计表”,系统将弹出“设计表”对话窗口。
3)用鼠标右键单击此窗口的上方窗格,单击“CHECK约束”,单击“新建”按钮,在“约束表达式”文本框中输入表达式:
([cOutTime]>=[cInTime])。
4)选择“对INSERT和UPDATE操作强制约束”复选框,单击“关闭”按钮,完成CHECK约束创建操作。
(3)使用缺省值
可以将三个数据表中所有货币类型的列都定义为缺省值,特别是指定了“非空”约束的列。
tblClient表的预住天数cDay的默认值可定义为1,而客人入住时间cInTime的缺省值应该就是添加客人记录的时间(除非是客房预定,在本系统中暂不考虑客房预定),所以可以设定缺省值为“(GETDATE)”。
(4)唯一约束
除了每个表的主键需定义为唯一外,对于tblRoomType的客房类型名rName,也应该定义为唯一的名称。
因为在系统功能需求中,要求按客房类型对数据进行统计,如果在统计结果中只显示客房类型编号,用户就必须记忆那种类型是什么编号,这样很不直观。
所以应按照相关的SQLServer数据库教材中建立唯一约束的方法进行创建。
(5)外键约束
在数据表设计中已经讨论了各个表的外键,这里以tblClient为例说明创建步骤,tblRoom和tblroomType表可以按照相同的步骤进行操作。
1)打开企业管理器,展开服务器,展开“数据库”,展开“KFGL”数据库,单击“表”。
2)用鼠标右键单击此“tblClient”表,选择“设计表”,系统将弹出“设计表”对话窗口。
3)用鼠标右键单击此窗口的上方窗格,单击“关系”,在“主键表”下拉框中选择“tblRoom”
4)在“外键表”中选择“tblClient”。
5)在“主键表”和“外键表”下方的窗格中都选择列名“rNum”,表明tblRoom表中的主键“rNum”就是tubClient表中的外键。
选择“对INSERT和UPDAET操作强制约束”复选框,表明以后对tblClient表中的rNum所有的添加和更新操作都会检查在tblRoom表中是否存在与此相应的rNum。
单击“关闭”按钮,完成创建操作。
(6)规则
为了检查tblClinent表中输入的身份证号码cPNum是有效位数(我国身份证号码有旧的15位数字和18位数字两种),可以创建一个规则邦定到该列,在数据操作时进行检查。
规则的定义语句为:
(LEN(@CardNum)=15)OR(LEN(@CardNum)=18)
创建和绑定的方法及步骤请参见教材中的相关内容。
(7)标识列
在设计客人信息表tblClient时,我们把客人序号cId定义为标识列,使其在添加记录时自动产生序列号,并且每个序号唯一地标识一次客人入住信息。
完成数据完整性设计后,登入模拟数据。
3、视图、触发器和存储过程设计
定义了系统需要的数据库和表的结构后,下面进一步分析整个客房管理系统中的业务流程。
在这里,需要确定哪些业务处理和数据处理的功能使用MSSQLServer来实现,那些数据处理的功能由应用程序实现,从而设计特定的视图、触发器或存储过程。
下面将讨论系统需要设计并创建的视图、触发器和存储过程。
(1)客人选择客房处理
客人来到饭店入住前要做的第一件事是选择合适的房间,客人将告知饭店服务员自己需要的客房类型,服务员在系统中选择指定的客房类型后系统将显示所有的空余的该类型房间,并显示该类型客房价格供客人参考选择。
这个过程可以通过一个存储过程来实现。
在这个存储过程中,需要的输入参数是客房类型,输出的结果集是所有这种客房类型的空房记录和价格。
定义这个存储过程为SelRoom,定义输入的参数名为RoomType,定义输出的价格参数名为RoomPrice。
根据存储过程的创建语法,编写SelRoom的实现代码如下:
CREATEPROCEDURESelRoom
@RoomTypechar
(2)
@RoomPricesmallmoneyOUTPUT
AS
SELECTrNUMFROMtblRoom
WHERE(rType=@RoomType)AND(rStats=‘N’)
SELECT@RoomPrice=rpriceFROMtblRoomType
WHERErType=@RoomType
GO
在上面的代码中包含了两个SELECT语句,第一个SELECT语句从tblRoom表中选择了所有客房类型为输入参数指定类型并且客房状态为“空”(N)的客房号,并将所有记录作为结果集返回;第二个SELECT语句从tblRoomType中取得了指定客房类型的价格,作为输出参数RoomType返回。
(2)客人入住登记处理
客人入住登记操作完成后,入住的客房状态应该及时做相应的改变,并记录客人的序号供以后查询。
这一功能可以使用触发器来自动进行:
因为进行客人入住登记操作是在客人信息表tblClient中添加一条新的记录,所以可以为tblClient设计一个Insert触发器,当tblClient执行Insert操作后自动更改tblRoom相应客房记录的数据。
定义这个触发器名称为client-insert。
其实现代码如下:
CREATETRIGGERclient-insertON[dbo].[tblClent]
FORINSERT
AS
UPDATEtblRoom
SETrStats=‘F’,cId=b.cId
FROMtblRooma,insertedb
WHEREa.rNum=b.rNum
(3)客人离店退房处理
客人在离店退房时,服务员输入客人的退房时间,然后要计算出客人的住宿费用,以便于客人结帐。
同时,系统应该将客人所退客房的状态更改为“空”,以便于接待下一个客人入住。
这一功能也可以通过一个触发器来实现。
为tblClient表设计一个名为client-update的UPDATE触发器,当系统对tblClient的cOutTime(退房时间)进行UPDATE操作后,将会自动触发它。
该触发器将自动取得当前所退房的单价,并根据客人入住天数计算出客人的住宿费用,把费用值写入cCost列,最后触发器将tb1Room相应客房记录的rStats和cId更新,即将客房状态置为空房,并清除对应于该客人的入住标识信息。
下面是client-update触发器的定义代码:
CREATETRIGGERclient-updateON[dbo].[tblClient]
FORUPDATE
AS
IFUPDATE(cOutTime)/*只有对cOutTime列进行更改时才处理*/
BEGIN
/*求出当前客人诉诸客房的单价*/
DECLARE@pricesmallmoney
SET@price=(SELECTrPriceFROMtblRoomTypeRIGHTJOINtblRoom
ONtblRoom.rType=tblRoomType.rType
RIGHTJOINtblClient
ONtblClient.rNum=tblRoom.rNum
WHEREtblClient.cIdIN(SELECTcIdFROMinserted))
/*求客人住宿费并更改cCost列*/
UPDATEtblClient
SETcCost=@price*DATEDIFF(DAY,b.cInTime,b.cOutTime)
FROMtblClienta,inseretedb
WHEREa.cId=b.cId
/*更新tblRoom相应客房的状态*/
UPDATEtblRoom
SETrStats=‘N’,cId=’’
FROMtblRooma,insteredb
WHEREa.cId=b.cId
END
在上面的代码中,首先定义了一个变量@price,然后通过一个右连接直接得到当前客人所住客房的单价。
在第二段语句中,使用SQL函数DATEDIFF求得客人入住时间和退房时间之差,求出入住天数,乘以@price变量就得到了客人最终的住宿费用。
值得注意的是:
UPDATE触发器可以使用inserted表和deleted表,这里必须使用inserted表,它的cOutTime才是最新更改的退房时间,如果使用deleted表,将得不到正确的结果。
最后,触发器对tblRoom表中的cId为当前客人cId的记录的rStats烈和cId列进行了更新。
(4)客人信息查询处理
在实际应用中,经常会有这样的要求:
服务员需要通过客人的部分资料查询客人的全部信息以及客人住在哪一个客房。
由于需要通过输入查询条件,才能得到结果集,所以可以设计一个带输入参数的存储过程来实现。
定义一个名为spClientInfo的存储过程,该存储过程以客人姓名(@ClientName)、单位(@ClientWork)、家住地址(@ClientAdd),及来自地的地名(@ClientForm)等作为输入参数,存储过程返回查询到的结果集。
spClientInfo的定义代码如下:
CREATEPROCEDUREspClientInfo
@ClientNamevarchar(8)=’%’,
@ClientWorkvarchar(50)=’%’,
@ClientAddvarchar(50)=’%’,
@ClientFromvarchar(10)=’%’,
AS
SELECT*FROMtblClient
WHERE
((cNameLIKE@ClientName+’%’)AND
(cWorkLIKE’%’+@ClientWork+’%’)AND
(cAddLIKE’%’+@ClientAdd+’%’)AND
(cFromLIKE@ClientFrom+’%’))
GO
在上面的代码中,向spClientInfo传入四个参数,依次是:
客人姓名、客人工作单位、客人家庭住址和客人来自地的地名。
在WHERE子句中使用LIKE,并在参数前、后添加“%”,使得该存储过程具有模糊查询的功能。
比如,@ClientName参数中输入客人的姓,就可以查询到所有该姓氏的客人信息。
4个参数可以同时给出,也可以只输入一个参数,但是参数的位置顺序不能改变。
(5)查询客人住宿费用的处理
在本系统的功能需求中要求能够查询客人住宿费用的详细情况,包括客人入住时交付的押金金额、客人住宿天数、客房价格、客人住宿费金额、住宿费与押金差额等信息。
实现该功能可以通过一个存储过程,以客人序号为输入参数,输出上面要求的各种信息数值。
设计一个名为spClientCost的存储过程,定义代码如下:
CREATEPROCEDUREspClientCost
@ClientIdchar(9)
AS
DECLARE@ClientPricesmallmoney
DECLARE@ClientDayssmallint
DECLARE@ClientCostsmallmoney
DECLARE@ClientBalancesmallmoney
SELECT
@ClientPrice=(
SELECTrPriceFROMtblRoomTypeRIGHTJONEtblRoom
ONtblRoom.rType=tblRoomType.rType
RIGHTJOINtblClient
ONtblClient.rNum=tblRoom.rNum
WHEREtblClient.cId=@ClientId
),
@ClientDays=(DATEDIFF(DAY,cInTime,GETDATE())
@ClientCost=(@ClientPrice*@ClientDays),
@ClientBalance(cDeposit-@ClientCost)
FORMtblClient
WHEREcId=@Client
SELECTcDeposit,@ClientPriceascRoomPrice,
@ClientDayascDays,@ClientCostascCCost,
@ClientBalanceascBalance
FROMtblClient
WHEREcId=@ClientId
GO
在上面的代码中,首先定义了4个变量,分别是:
@ClientPrice、@ClientDays@ClientCost、@ClientBalance,它们分别表示:
客人入住房间的单价、客人入住的时间、客人的住宿费用和客人所缴纳押金与住宿费用的差额。
第一个SELECT语句起赋值作用,分别把各个表达式的结果赋值给各个变量。
第二个SELECT语句是一个选择,将tblClient表的cDeposit以及前面求得的各个变量值作为存储过程的结果集返回。
(6)查询住宿时间到期的客人
客房管理服务员通常根据客人入住时登记的预住天数收取相应的押金,当客人住宿时间达到预住天数时就应该通知客人,以便客人补交押金或退房。
系统为管理服务员提供这样的查询功能,可以显示出所有入住时间达到预住日期的客人信息。
完成这个功能只需要在表中选择入住天数大于等于预住天数的记录,而不需要输入参数,所以,可以使用一个视图来实现这一查询功能。
定义视图的名称为vClient_Day,定义代码如下:
CREATEVIEWdbo.vClient_Day
AS
SELECTcid,cName,rNum,cFrom,cDay,cInTime,
DAYEDIFF(DAY,cInTime,GETDATE())AscPDay
FORMdbo.tblClient
WHERE(cOutTimeISNULL)AND(DATEDIFF(DAY,cInTime,GETDATE())>=cDay)
代码中使用DATEDIFF函数求得cInTime与当前日期之间的天数,即客人实际住宿天数。
所有住宿天数大于或等于预住天数cDay,并且离店时间cOutTime为NULL的客人记录都将成为结果集中的记录。
(7)客房销售统计
作为一个简单的客房管理系统,应该提供给管理者一定的统计数据。
系统中最基本的统计数据就是各种类型客房在一定时间段内的销售收入情况。
设计一个存储过程,以管理人员输入的统计起始日期和终止日期作为输出参数,在这段时间内所有类型客房的销售收入、销售次数(客人入住次数)为结果集。
这个存储过程名为spRoomSale,两个输入参数分别为@StartDate和@EndDate。
设计代码如下:
CREATEPROCEDUREspRoomSale
@StartDatesmalldatetime,
@EndDatesmalldatetime
AS
SELECTrtype,rname
(SELECTSUM(cCost)FROMtblClient
LEFTJOINtblRoom