1、经济管理学院实验报告姓 名 : 诸 男 班 级 : 11信 管 (1)班 学 号 : 2011333540114 实 验 成 绩 :课 程 名 称 : 信 息 系 统 开 发 平 台 课 程 设 计 指 导 教 师 :祝锡永实 验 名 称 : 信 息 系 统 开 发 平 台 课 程 设 计 2013年 1 月 24 日实 验 目 的 :1) 掌 握 基 于 win32和 C/S 结 构 的 信 息 系 统 基 本 构 成 及 其 架 构 的 知 识 , 与 软 件 设 计 和 软 件 实 现 相 关的 知 识 ; 同 时 具 备 自 主 学 习 和 掌 握 其 它 基 于 Win32和 c/s
2、结 构 的 信 息 系 统 开 发 工 具 的 能 力 。2) 掌 握 数 据 库 管 理 系 统 与 信 息 系 统 开 发 平 台 之 间 的 集 成 方 法 ; 具 备 综 合 运 用 数 据 库 应 用 和 信 息 系统 开 发 平 台 对 已 有 信 息 系 统 进 行 剖 析 的 能 力 ; 将 数 据 库 应 用 与 信 息 系 统 开 发 平 台 结 合 , 能 独 立 完 成 开 发管 理 信 息 系 统 。实 验 环 境 :;软件开发平台Delphi2010+数据库管理系统SQLServer2008等实 验 内 容 与 步 骤 :一 、 软 件 主 要 功 能 介 绍本 系
3、 统 全 名 叫 Z酒 店 信 息 管 理 系 统 , 主 要 是 提 供 给 酒 店 前 台 人 员 使 用 的 。 进 入 系 统 后主 界 面 的 显 示 主 要 是 四 部 分 , 其 中 业 务 中 心 包 括 : 前 台 中 心 , 客 务 中 心 , 预 订 管 理 ; 报 表中 心 包 括 房 费 日 报 表 ; 系 统 设 置 包 括 账 号 设 置 ; 个 人 中 心 包 括 修 改 密 码 。 其 中 业 务 中 心 是最 重 要 的 部 分 。 下 面 是 关 于 各 项 目 内 容 的 简 介 。1) 前 台 中 心功 能 较 多 , 主 要 有 4块 , 已 入 住
4、 包 括 查 看 和 退 房 、 已 预 定 包 括 查 看 和 更 改 、 未 入 住 包括 查 看 和 入 住 、 脏 房 包 括 查 看 和 更 改 。2) 客 务 中 心主 要 是 查 询 客 户 信 息3) 预 订 管 理主 要 是 进 行 预 订 和 查 询4) 报 表 中 心主 要 是 对 金 额 的 分 析 和 查 询5) 系 统 设 置主 要 是 员 工 信 息 的 查 看 和 增 删 改 。6) 个 人 中 心主 要 是 当 前 操 作 者 的 密 码 修 改 。二 、 数 据 库 设 计1. 建 立 数 据 库 的 SQL代 码数 据 库 名 称 : myhotel, 主
5、 要 包 含 9个 表 , 各 个 表 结 构 如 下 :1 建 房 间 表ifOBJECT_ID(rooms)isnotnulldroptableroomsgocreatetablerooms(roomidnvarchar(5)notnullprimarykeyclusteredcheck(roomidlikeA-Z0-90-90-9),categoryidnchar(1)notnull,floorsnchar(1)constraintck_rooms_floorscheck(floors0),isemptynchar(1)constraintdf_rooms_isemptydefault(
6、1),isusingnchar(1)constraintdf_rooms_isusingdefault(0),isdirtynchar(1)constraintdf_rooms_isdirtydefault(0)goinsertintoroomsvalues(A101,1,1,1,0,0)insertintoroomsvalues(A102,2,1,1,0,0)insertintoroomsvalues(B201,2,2,1,0,0)insertintoroomsvalues(B202,3,2,1,0,0)insertintoroomsvalues(C301,3,3,1,0,0)inserti
7、ntoroomsvalues(C302,4,3,1,0,0)go建 房 间 种 类 表ifOBJECT_ID(roomcategories)isnotnulldroptableroomcategoriesgocreatetableroomcategories(categoryidnchar(1)notnullprimarykey,categorynamenvarchar(20),unitpricemoneycheck(unitprice0)goinsertintoroomcategoriesvalues(1,标准单人间,100)insertintoroomcategoriesvalues(2,
8、标准双人间,150)insertintoroomcategoriesvalues(3,豪华单人间,150)insertintoroomcategoriesvalues(4,豪华双人间,200)go建 员 工 表ifOBJECT_ID(hotelemployees)isnotnulldroptablehotelemployeesgocreatetablehotelemployees(employeeidnvarchar(10)notnullprimarykeycheck(employeeidlikeFM0-90-90-9),employeenamenvarchar(20),sexnchar(1)
9、check(sexin(F,M),countrynvarchar(100),provincenvarchar(100),citynvarchar(100),addressnvarchar(100)goinsertintohotelemployeesvalues(F001,小 丹 ,F,中 国 ,浙 江 ,杭 州 ,西 湖 路 号 )insertintohotelemployeesvalues(F002,小 丽 ,F,中 国 ,浙 江 ,杭 州 ,西 湖 路 号 )insertintohotelemployeesvalues(F003,小 黄 ,F,中 国 ,江 苏 ,南 京 ,南 京 路 号
10、)insertintohotelemployeesvalues(M001,小 陈 ,M,中 国 ,上 海 ,宝 山 ,宝 山 路 号 )insertintohotelemployeesvalues(M002,小 吴 ,M,中 国 ,浙 江 ,杭 州 ,西 湖 路 号 )go建 客 户 表ifOBJECT_ID(hotelcustomers)isnotnulldroptablehotelcustomersgocreatetablehotelcustomers(customeridnchar(10)notnullprimarykey,customernamenvarchar(100),sexnch
11、ar(1)check(sexin(F,M),birthdatedatetime,countrynvarchar(100),provincenvarchar(100),citynvarchar(100),addressnvarchar(100),isvipnchar(1)constraintdf_hotelcustomers_isvipdefault(0)go建 订 单 表ifOBJECT_ID(hotelorders)isnotnulldroptablehotelordersgocreatetablehotelorders(orderidnchar(10)primarykey,orderdat
12、edatetime,customeridnchar(10),employeeidnvarchar(10)constraintfk_hotelorders_employeeidreferenceshotelemployees(employeeid)go建 订 单 详 细 表ifOBJECT_ID(hotelorderitems)isnotnulldroptablehotelorderitemsgocreatetablehotelorderitems(orderidnchar(10)primarykeyconstraintfk_hotelorderitems_orderidreferencesho
13、telorders(orderid),roomidnvarchar(5)constraintfk_hotelorderitems_roomidreferencesrooms(roomid),timeintcheck(time0),unitpricemoney,discountdecimalconstraintdf_hotelorderitems_discountdefault(0.12),amountascast(time*unitprice*(1-discount)asdecimal(12,2)go建 历 史 表ifobject_id(history)isnotnulldroptablehi
14、storygocreatetablehistory(customeridnchar(10)notnullprimarykey,customernamenvarchar(100),sexnchar(1)check(sexin(F,M),indatedatetime,offdatedatetime,countrynvarchar(100),provincenvarchar(100),citynvarchar(100),addressnvarchar(100),isvipnchar(1)constraintdf_history_isvipdefault(0)go建 定 金 表ifobject_id(
15、earnest)isnotnulldroptableearnestgocreatetableearnest(customeridnchar(10)notnullprimarykey,customernamenvarchar(100),roomidnvarchar(5)constraintfk_earnest_roomidreferencesrooms(roomid),emoneymoney)go建 预 订 表ifOBJECT_ID(reserve)isnotnulldroptablereservegocreatetablereserve(roomidnvarchar(5)constraintf
16、k_reserve_roomidreferencesrooms(roomid),customeridnchar(10),customernamenvarchar(100),intimedatetime,timeint)go三 、 程 序 功 能 、 实 现 界 面 及 其 代 码1. 数 据 模 块1) 功 能 介 绍 及 设 计 说 明 :数 据 连 接 和 全 局 变 量2) 程 序 运 行 界 面3) 程 序 代 码varDataModule2:TDataModule2;flag,f,f1,f2:integer;dl,roomid11,roomid1,r,r1,r2,r3,r4:stri
17、ng;r91:string;close3:integer;r10,r101:string;yd:integer;注 : 在 后 面 的 表 单 中 , 若 用 到 数 据 模 块 , 则 必 须 在 uses 中 添 加 数 据 模 块 的 文 件 名( unit2) 。2. 主 菜 单 程 序( 1) 、 主 页其 中 上 面 的 工 具 栏 依 次 为 主 页 、 前 台 中 心 、 客 务 中 心 、 预 订 管 理 、 锁 屏 离 开 , 为 快 捷键 , 方 便 操 作 员 操 作 。 点 击 前 四 个 为 直 接 跳 到 相 应 界 面 , 程 序 为 :/主 页 按 钮proc
18、edureTForm1.ToolButton1Click(Sender:TObject);vari,j:integer;s:string;begin/showmessage(inttostr(panel2.ControlCount);if(panel2.ControlCount1)thenbegin/释放原有窗体forj:=0topanel2.controlcount-2dobeginfori:=1topanel2.ControlCountdobegins:=lowercase(panel2.Controlsi.ClassName);/showmessage(s);/showmessage(i
19、nttostr(i);if(copy(s,1,5)=tform)thenbeginpanel2.Controlsi.Free;break;end;end;end;end;end;/其 余 三 个 按 钮procedureTForm1.ToolButton6Click(Sender:TObject);vari:integer;s:string;beginNewFormClass:=nil;NewForm:=TForm(application.FindComponent(lowercase(form客务中);ifNewFormnilthenbeginNewForm:=NewFormClass.Cr
20、eate(Self);NewForm.Hide;ifisshowmodal=1then NewForm.ShowmodalelsebeginNewForm.BorderStyle:=bsNone;NewForm.Parent:=panel2;NewForm.Align:=alclient;NewForm.Show;end;end;/锁 屏 离 开 按 钮procedureTForm1.ToolButton7Click(Sender:TObject);vari,j:integer;s:string;beginif(panel2.ControlCount1)thenbegin/释放原有窗体forj
21、:=0topanel2.controlcount-2dobeginfori:=1topanel2.ControlCountdobegins:=lowercase(panel2.Controlsi.ClassName);/showmessage(s);/showmessage(inttostr(i);if(copy(s,1,5)=tform)thenbeginpanel2.Controlsi.Free;break;end;end;end;end;form12.showmodal;end;/其 中 form12procedureTForm12.Button1Click(Sender:TObject
22、);vars,c:string;begins:=edit1.text;withadoquery1dobeginclose;sql.clear;sql.text:=selectcodefromhotelemployeeswhereemployeename=+dl+;open;c:=fieldbyname(code).asstring;end;ifs1)thenbegin/释放原有窗体fori:=1topanel2.ControlCountdobegins:=lowercase(panel2.Controlsi-1.ClassName);if(copy(s,1,5)=tform)thenbegin
23、panel2.Controlsi-1.Free;break;end;end;end;NewFormClass:=nil;NewForm:=TForm(application.FindComponent(lowercase(s1);ifNewFormnilthenbeginNewForm:=NewFormClass.Create(Self);NewForm.Hide;ifisshowmodal=1then NewForm.ShowmodalelsebeginNewForm.BorderStyle:=bsNone;NewForm.Parent:=panel2;NewForm.Align:=alcl
24、ient;NewForm.Show;end;end;end;end;( 2) 、 前 台 中 心1) 查 看 已 入 住 的 房 间procedureTForm前台中.Button3Click(Sender:TObject);vars,s1:string;i:integer;beginf:=1;withdbgrid1dobegincolumns.Clear;forI:=0to4docolumns.Add;columns0.Title.caption:=房间号;columns1.Title.caption:=房间类型;columns2.Title.caption:=客户名称;columns3.T
25、itle.caption:=性别;columns4.Title.caption:=入住日期;columns0.Width:=20*10;columns1.Width:=20*10;columns2.Width:=20*10;columns3.Width:=20*5;columns4.Width:=20*10;forI:=0to4docolumnsi.Title.Alignment:=tacenter;columns0.FieldName:=roomid;columns1.FieldName:=categoryname;columns2.FieldName:=customername;colum
26、ns3.FieldName:=sex;columns4.FieldName:=orderdate;end;s:=ifobject_id(y)isnotnulldroptabley;s:=s+selecta.roomid,categoryname,customername,sex,orderdateintoyfromroomsasa;s:=s+joinroomcategoriesasbona.categoryid=b.categoryid;s:=s+joinhotelorderitemsascona.roomid=c.roomid;s:=s+joinhotelordersasdonc.order
27、id=d.orderid;s:=s+joinhotelcustomersaseond.customerid=e.customeridwhereisusing=1;xx:=s;mandtext:=s;adocommand1.execute;withadotable1dobeginclose;tablename:=y;open;end;end;/其 中 双 击 DBGRID可 以 查 看 客 户 详 细 信 息 , 也 可 以 修 改procedureTForm前台中.DBGrid1DblClick(Sender:TObject);vars:string;beginiff=1thenbeginro
28、omid11:=trim(dbgrid1.SelectedField.Text);form5.showmodal;/datasource1.dataset:=adotable1;mandtext:=xx;adocommand1.execute;withadotable1dobeginclose;tablename:=y;open;end;end;end;/修 改 按 钮procedureTForm5.Button3Click(Sender:TObject);beginedit2.Enabled:=true;edit3.Enabled:=true;/edit4.Enabled:=true;edi
29、t5.Enabled:=true;combobox1.Enabled:=true;combobox2.Enabled:=true;combobox3.Enabled:=true;combobox4.Enabled:=true;combobox5.enabled:=true;end;/保 存 按 钮procedureTForm5.Button2Click(Sender:TObject);beginwithadoquery3dobeginclose;sql.text:=select*fromhotelcustomers;open;edit;fieldbyname(customername).ass
30、tring:=trim(edit2.text);fieldbyname(birthdate).asstring:=trim(edit5.text);fieldbyname(address).asstring:=trim(edit3.text);fieldbyname(sex).asstring:=trim(combobox1.text);fieldbyname(province).asstring:=trim(combobox2.text);fieldbyname(country).asstring:=trim(combobox3.text);fieldbyname(city).asstrin
31、g:=trim(combobox4.text);iftrim(combobox5.text)=否thenfieldbyname(isvip).asstring:=0elsefieldbyname(isvip).asstring:=1;post;end;showmessage(保存成功!);end;2) 退 房/退 房 按 钮 的 click事 件procedureTForm前台中.Button1Click(Sender:TObject);beginroomid1:=dbgrid1.selectedfield.text;form8.showmodal;mandtext:=xx;adocomman
32、d1.execute;withadotable1dobeginclose;tablename:=y;open;end;end;/结 账 表 单 的 代 码procedureTForm8.FormShow(Sender:TObject);vars,s1,s2,rdate,yf,dj:string;amount1,amount:integer;beginwithadoquery1dobeginclose;s:=selectcustomername,roomidfromhotelcustomersasajoinhotelordersasbona.customerid=b.customerid;s:=
33、s+joinhotelorderitemsasconb.orderid=c.orderidwhereroomid=+roomid1+;/roomid1是dbgrid选中行的房间编码sql.text:=s;open;s1:=fieldbyname(customername).asstring;s2:=fieldbyname(roomid).asstring;end;edit1.text:=s1;edit2.text:=s2;withadoquery1dobeginclose;sql.clear;sql.text:=select*fromy;open;rdate:=fieldbyname(orde
34、rdate).asstring;edit3.text:=rdate;datetimetostring(s,yyyy-mm-dd,now();/当前时间edit4.text:=s;end;d1:=strtoint(copy(edit3.text,9,2);/取出入住的日期d2:=strtoint(copy(edit4.text,9,2);/取出当前的日期withadoquery1dobeginclose;sql.clear;sql.text:=selectunitpricefromroomcategoriesasajoinroomsasbona.categoryid=b.categoryidwh
35、ereroomid=+roomid1+;open;s:=fieldbyname(unitprice).asstring;end;amount:=(d2-d1)*strtoint(s);/算出应收账款edit5.text:=inttostr(amount);withadoquery1dobeginclose;sql.clear;s:=selecta.customerid,sum(emoney)asdjfromearnestasajoinhotelcustomersasb;s:=s+ona.customerid=b.customerid wherea.customername=+s1+groupb
36、ya.customerid;sql.text:=s;open;dj:=fieldbyname(dj).asstring;/定金close;sql.clear;s:=selectb.customerid,sum(amount)asmfromhotelorderitemsasajoinhotelordersasbona.orderid=b.orderid;s:=s+joinhotelcustomersasconb.customerid=c.customeridwherecustomername=+s1+groupbyb.customerid;sql.text:=s;open;yf:=fieldby
37、name(m).asstring;/房钱end;amount1:=strtoint(dj)+strtoint(yf);/已付金额edit6.text:=inttostr(amount1);edit7.text:=inttostr(amount-amount1);/结账时应收金额end;3) 查 看 已 预 订 房 间procedureTForm前台中.Button7Click(Sender:TObject);vari:integer;s:string;beginwithdbgrid1dobegincolumns.Clear;forI:=0to3docolumns.Add;columns0.Ti
38、tle.caption:=房间号;columns1.Title.caption:=客户名称;columns2.Title.caption:=房间类型;columns3.title.caption:=入住时间;columns0.fieldname:=roomid1;columns1.fieldname:=customername;columns2.fieldname:=categoryname;columns3.fieldname:=intime;columns0.Width:=20*10;columns1.Width:=20*10;columns2.Width:=20*10;columns3.
39、Width:=20*10;forI:=0to3docolumnsi.Title.Alignment:=tacenter;end;s:=ifobject_id(yd)isnotnulldroptableyd;s:=s+selecta.roomidasroomid1,customername,categoryname,intimeintoydfromreserveasa;s:=s+joinroomsasbona.roomid=b.roomid;s:=s+joinroomcategoriesasconb.categoryid=c.categoryid;x3:=s;mandtext:=s;adocom
40、mand1.execute;withadotable1dobeginclose;tablename:=yd;open;end;end;4) 更 改 预 订 状 态跳 出 来 其 实 就 是 登 记 入 住 的 窗 口 , 稍 微 改 动 一 下 。procedureTForm前台中.Button8Click(Sender:TObject);beginyd:=1;r:=dbgrid1.selectedfield.text;form6.showmodal;mandtext:=x3;adocommand1.execute;withadotable1dobeginclose;tablename:=yd
41、;open;end;end;/其 中 form6procedureTForm6.FormShow(Sender:TObject);vars,s1,s2:string;i:integer;beginii:=0;edit1.SetFocus;f1:=0;edit1.Text:=;edit2.Text:=;edit3.Text:=;edit4.text:=;edit8.Text:=;edit10.Text:=;edit11.Text:=;edit12.Text:=;combobox3.Text:=;combobox4.Text:=;combobox1.items.add(M);combobox1.i
42、tems.add(F);combobox1.itemindex:=0;combobox5.clear;combobox5.Items.Add(会员);combobox5.items.add(非会员);combobox5.itemindex:=0;withadoquery1dobeginclose;sql.text:=select*fromDict_Countries;open;whilenoteofdobegins1:=fieldbyname(country).asstring;combobox2.Items.Add(s1);next;end;end;combobox2.ItemIndex:=
43、0;withdbgrid1dobegincolumns.Clear;forI:=0to3docolumns.Add;columns0.Title.caption:=房间号;columns1.Title.caption:=房间类型;columns2.title.caption:=价格;columns3.Title.caption:=楼层;columns0.fieldname:=roomid;columns1.fieldname:=categoryname;columns2.fieldname:=unitprice;columns3.fieldname:=floors;columns0.Width
44、:=131;columns1.Width:=131;columns2.Width:=131;columns3.width:=131;forI:=0to3dobegincolumnsi.Title.Alignment:=tacenter;columnsi.alignment:=taleftjustify;end;end;ifyd=0then/判断是直接登记还是由预订更改的begins:=ifobject_id(rz)isnotnulldroptablerz;s:=s+selectroomid,categoryname,unitprice,floorsintorzfromroomsasa;s:=s
45、+joinroomcategoriesasbona.categoryid=b.categoryidwhereroomid=+r+;mandtext:=s;adocommand1.execute;withadotable1dobeginclose;tablename:=rz;open;end;endelsebegins:=ifobject_id(yddj)isnotnulldroptableyddj;s:=s+selecta.roomid,categoryname,unitprice,floorsintoyddjfromreserveasa;s:=s+joinroomsasbona.roomid
46、=b.roomid;s:=s+joinroomcategoriesasconb.categoryid=c.categoryidwherea.roomid=+r+;mandtext:=s;adocommand1.execute;withadotable1dobeginclose;tablename:=yddj;open;end;withadoquery4dobeginclose;sql.clear;sql.text:=select*fromreservewhereroomid=+r+;open;edit1.text:=fieldbyname(customername).asstring;edit
47、2.text:=fieldbyname(customerid).asstring;end;end;/添加按钮procedureTForm6.Button1Click(Sender:TObject);beginform7.showmodal;iff1=1thenbeginwithadotable1dobeginappend;edit;fieldbyname(roomid).asstring:=r1;fieldbyname(categoryname).asstring:=r2;fieldbyname(unitprice).asstring:=r3;fieldbyname(floors).asstring:=r4;post;end;end;end;/添 加 窗 口 的 代 码procedureTForm7.Button1Click(Sender:TObject);beginr1:=adotable1.fieldbyname(roomid).asstring;r2:=adotable1.