学生上机管理及考勤系统 网络 软件实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软 件 实 验 报 告
题目: 题目:学生上机管理及考勤系统
日期: 日期:2004 年 10 月 24 日
第 1 页 共 21 页
1
目录: 目录:
一:系统结构图------------------------------------第 3 页 系统结构图 第 二:功能模块及其划分简介和同学的分工 第 3 页 功能模块及其划分简介和同学的分工---第 和同学的分工 各功能模块详细说明-------------------------第 3 页 三: 各功能模块详细说明 第
(一) 刷卡模拟机-------------------------------------------第 (二) 通信机-------------------------------------------------第 (三) 客户查询机-------------------------------------------第 (四) 客户设置机-------------------------------------------第
3页 5页 9页
12 页
四:数据库表--------------------------------------第 19 页 数据库表 第 五:心得体会和意见、建议--------------------第 20 页 心得体会和意见、建议 第
一:系统结构简图: 系统结构简图
第 2 页 共 21 页 2
系统设置一个管理中心和若干台放置在远端的刷卡机 (用一台 PC 机模拟) 如图所示。
, 客户机
以太网
客户机
服务器
以太网 物管中心 通信客户机 RS-232 刷卡机
返回目录
二:功能模块及其划分简介 功能模块及其划分简介
1、 刷卡模拟机:模拟刷卡动作把卡号发送给通信客户机,同时接收通信客户机返回 、 刷卡模拟机:
的相关信息并显示。
2、 客户通信机:接收卡号后判断是否有效,并根据判断发相关信息给刷卡机(如卡 、
号,机房号,机器号,上机密码) 。
学生卡有效时存卡号、机房号、机号、上机时间等信息 到学生上机信息表中。
删除上机预约表中的相关项。
修改学生信息表中的次数。
修改电脑表 中的是否使用项 。
3、 服务器 、
:共四张表
information 存储学生上机卡号、机房号、机号、上机时间;
xuesheng 存储学生的基本信息:姓名、卡号、班级、宿舍电话、手机号;diannao 表存储机 房号,机号,是否被预订,是否完好;yuyue 表存储卡号,机房号,机号,预约时间。
4、 客户查询机 、 5 、客户设置机
:可按卡号,姓名,班级,上机次数查询学生基本情况。
:分电脑情况设置,学生情况设置,预约。
电脑情况设置进行新机
加入,原机器各信息修改和机器的删除。
学生情况设置进行学生的加入、删除和基本信息的 修改。
预约为学生上机预约。
6、 同学间分工 : 杜英芳负责刷卡机和通信机,刘倩、熊杰、邹雯珠负责客户查询 、 机和客户设置机,张雪负责数据库的建立和设置。
返回目录
三:各功能模块说明
(一) :刷卡模拟机的设计 1、 、 2、 、 完成的功能 实现步骤:
模拟刷卡动作把卡号发送给通信客户机,同时接收通信客户机返回的相关信息并显示。
界面设计上只有一个 combobox,一个 Listbox、button 和串行口控件,combobox 用于输 入卡号,原来用的是 edit 控件但在测试时为了方便就改成 combobox。
它的 items 设了九个
第 3 页 共 21 页 3
从 01062201 至 01062209,也可自己输入其它号码,进行动作模拟。
Button 是退出按钮。
然后在各控件中添加代码: 界面的初始化是我们仿照老师给的程序 copy 过来的和退出按钮的代码都不存在什么问 题。
procedure TForm1.FormCreatfe(Sender: TObject); begin if Not MSComm1.PortOpen then begin MSComm1.PortOpen:=True; MSComm1.DTREnable:=True; MSComm1.RTSEnable:=True; end; MSComm1.RThreshold := 1; end; procedure TForm1.Button3Click(Sender: TObject); begin MSComm1.PortOpen:=False; close; end; 这一段代码是模仿老师的模版做的都没什么问题。
procedure TForm1.MSComm1Comm(Sender: TObject); var ReceBuf:string; begin
第 4 页 共 21 页 4
ReceBuf := Trim(MSComm1.Input); ListBox1.Items.Add(ReceBuf); end; 这用于选择固定的几个卡号,不必要每次输入一长串数字,完全是出于省事。
procedure boBox1Select(Sender: TObject); begin if MSComm1.PortOpen then begin MSComm1.Output:=ComboBox1.Text; ListBox1.Clear; end else Messagedlg('通信端口 1 未打开!',mtError,[mbok],0); end; 这个函数用于自己输入其它号码进行测试,按回车触动。
procedure boBox1KeyPress(Sender: TObject; var Key: Char); begin if key=#13 then if MSComm1.PortOpen then begin MSComm1.Output:=ComboBox1.Text; ListBox1.Clear; end else Messagedlg('通信端口 1 未打开!',mtError,[mbok],0); end;
3、 、
感受 整个设计没难度,但因为是第一次使用 delphi 在做的时候都模仿了老师的程 序。
返回目录
(二) :通信机的设计
1 、完成功能 接收到刷卡机发出的卡号后判断是否有效,并根据判断,发相关信息给刷卡机。
学生 卡有效时,存卡号、机房号、机号、上机时间等信息到 information 表中。
无效时发“无效 卡号”或“日期不对” 。
没有效的学生卡号是指:非本系统允许的卡;是本系统的卡但未预 约本次上机。
多次预约但都没上机的我们没做出来。
因为我们的预约表是一天为一张表,同 时搜索几张表不会。
2、设计步骤 界面设计时用了 DBGrid,DataSource,ADOCommand,2 个 ADODataSet,1 个 button 和一个 label 。
在这些控件设置时最难的是和数据库连接了,都是同学间相互教会的。
第 5 页 共 21 页
5
添加代码时对初始化不是很清楚,后来在老师的讲解下能理解了配置文件。
procedure TForm1.FormCreate(Sender: TObject); var strpath:string; //配置文件路径 strsyspara:Tinifile; //系统特殊数据存放文件 begin strpath := ExtractFilePath(Application.ExeName); strsyspara := Tinifile.Create(strpath+'shenchang_CONFIG.INI'); if NOT FileExists(strpath+'shenchang_CONFIG.INI') then begin showmessage('警告:系统配置文件不存在!'); Bresult:=False; Exit; end; g_connection:=TADOConnection.Create(nil); g_connection.ConnectionString:=strsyspara.ReadString('system','connectionstring',''); g_connection.LoginPrompt := False; g_connection.Open; self.ADODataSet1.Connection := g_Connection; self.ADOCommand1.Connection := g_Connection; if Not MSComm1.PortOpen then begin
第 6 页 共 21 页 6
MSComm1.PortOpen:=True; MSComm1.DTREnable:=True; MSComm1.RTSEnable:=True; end; MSComm1.RThreshold := 1; end; 通信机在串行口接收到数据时,就开始判断,如果接收缓存区有数据,取出收到的卡号 搜索预约表, 如果表中有这项则在通信机上显示出来, 再取出预约表中时间项和今天的时间 判断如果一样就返回给刷卡机上机的房间号、 机号和上机密码。
如果不同则返回 “日期不对” 。
如果在预约表中搜索不到就就返回“卡号无效” 。
在调程序时 DateToStr()加入时程序运行 不起来,所以就设置了时间值 strDate=’2004-10-24’。
在返回上机密码时要搜索 diannao 表读 出它的上机密码,发出。
然后在 information 表中 insert 这次上机的信息,有卡号、房间号、 机号和上机时间。
再 UpDate xuesheng 表中的上机次数用于查询机。
UpDatediannao 表中的 预约项把原来的非空机改为空机。
Delete yuyue 表中的这次上机项。
procedure TForm1.MSComm1Comm(Sender: TObject); var ReceBuf:string; strSql,strsqa:string; CardN:string; password:string; id,RN,HN,strDate,strTime,date:string; begin ReceBuf := Trim(MSComm1.Input); CardN:=ReceBuf; if CardN<>'' then begin // strDate:= DateToStr(Date()); strDate:='2004-10-21'; strTime:= TimeToStr(Time()); strSql:='select * from dbo.yuyue Where ltrim(id)='; strSql:= strSql+''''+CardN+''''; self.ADODataSet1.Active:=False; mandText:=strSql; self.ADODataSet1.Active:=True; if (self.ADODataSet1.FieldByName('id').AsString<>'')then begin date:=VarToStr(self.ADODataSet1.FieldByName('shijian1').AsString); if strcomp(PChar(date),PChar(strDate))=0 then begin CardN:='卡号: '; MSComm1.Output:=CardN ; strSql:=Trim(self.ADODataSet1.FieldByName('id').AsString); MSComm1.Output:=strSql ; id:=strSql;
第 7 页 共 21 页 7
strSql:='机房号:'; MSComm1.Output:=strSql ; strSql:=Trim(self.ADODataSet1.FieldByName('RoomNumber').AsString); MSComm1.Output:=strSql; RN:=strSql ; strSql:=' '; MSComm1.Output:=strSql ; strSql:='主机号: '; MSComm1.Output:=strSql ; strSql:=Trim(self.ADODataSet1.FieldByName('HostNumber').AsString); MSComm1.Output:=strSql ; HN:=strSql; strSql:=' '; MSComm1.Output:=strSql ; strSql:='密码: '; MSComm1.Output:=strSql ; strSqa:='select * from dbo.diannao Where RoomNumber='; strSqa:= strSqa+''''+RN+''''; strsqa:=strsqa+'and HostNumber='+''''+HN+''''; self.ADODataSet2.Active:=False; mandText:=strSqa; self.ADODataSet2.Active:=True; password:=Trim(self.ADODataSet2.FieldByName('password').AsString); MSComm1.Output:=password ; strSql:='Insert into Information(id,RoomNumber,HostNumber,SDate,STime)'; strSql:=strSql + 'Values('; strSql:=strSql +''''+ id +''''+ ','; strSql:=strSql + '''' + RN + '''' + ','; strSql:=strSql + '''' + HN + '''' + ','; strSql:=strSql + '''' + strDate + '''' + ','; strSql:=strSql + '''' + strTime + '''' + ')'; mandText:=strSql; self.ADOCommand1.Execute; strSql:='UPDATE xuesheng SET times=times+' + IntToStr(1); strSql:=strSQL + ' WHERE id=' + '''' + id + ''''; mandText:=strSQL; self.ADOCommand1.Execute; strSql:='DELETE from yuyue WHERE id=' + '''' + id + ''''; //删除在预约表中的 记录 mandText:=strSQL; self.ADOCommand1.Execute;
第 8 页 共 21 页 8
strSql:='UPDATE diannao SET book=0' ; strSql:=strSQL + ' WHERE RoomNumber='; strSql:= strSql+''''+RN+''''; strsql:=strsql+'and HostNumber='+''''+HN+''''; mandText:=strSQL; self.ADOCommand1.Execute; strsql:=''; end else strSql:='日期不对'; MSComm1.Output:=strSql ; exit; end else strSql:='无效卡号'; MSComm1.Output:=strSql ; exit; end; end; 3、感受 通信机做的很累,主要是在和数据库连接方面不会,一开始对命令都不会用 但在以后的几天中开始慢慢明白了, 也能根据要求自己添加代码了。
在开始时程序只能运行 一次第二次运行时就不对了, 找了半天也找不出错误的地方, 后来在老师的帮助下发现要先 判断缓存区是否不空,才运行下面的代码。
在这个方面我们花了很多的精力。
返回目录
(三) :客户查询机
1、完成功能: 管理人员可以通过客户机上的操作界面查询、统计某个学生及某班学生的上机出勤情 况,能根据上机次数查出缺勤较多的同学。
2、实现步骤: (1) .设计应用程序界面。
首先运行 Delphi7 程序。
由于题目要求可以查出学生的基本 信息及根据上机次数查出缺勤较多的学生, 并且我们的数据库中学生信息设置包括姓名、 卡 号、班级、宿舍电话、手机号码及上机次数,所以选择四个 Label,四个 Edit 框,分别根据 姓名、卡号、班级和上机次数来查找。
两个 Button,分别为查询和退出。
一个 DBGrid 框, 用于显示学生基本信息。
还有一个 DataSource 数据源,用于将 DBGrid 和数据库中的学生信 息设置表相连, 以及一个 ADODataSet 数据集, 用于将从数据库中读取的信息显示到 DBGrid 框中去。
将这些控件置于 Form 界面上,并根据需要排列好。
(2)设置控件属性。
. 包括从 Caption 或 Text 中改变其标题。
重点是 DBGrid、 DataSource、 ADODataSet 的属性设置。
其中 DBGrid1 的 DataSource 属性设置为 DataSource1,而 DataSet 设置为 ADODataSet1, 并更改 DataSet 中的 ConnectionString, 将其服务器设置成我们组所用 的服务器,并将其数据库设置成我们设置的数据库 student,从 WindowsNT 登录。
其次对 ADODataSet1 的属性进行设置,仅需对它的 ConnectionString 的属性进行设置,设置内容与
第 9 页 共 21 页 9
DBGrid1 相同。
最后对 DataSource1 的属性进行设置,包括将 DataSet 设置为 ADODataSet1, 和对 ConnectionString 进行设置,内容同上。
(3) .用 Pascal 语言对各种控件进行编程。
首先进行 Form 的初始化。
包括对配置文件 的设置,根据老师的模板,这点我们很快就完成了。
开始对各控件进行程序设计。
主要程序 都是在“查询”按钮部分。
程序如下: procedure TForm1.Button1Click(Sender: TObject) ; var Buffer:string; strSql:string; CardNumber:string; Name:string; classroom:string; //nCount:integer; begin CardNumber:=Trim(edit2.Text); Name:=Trim(Edit1.Text); Buffer:=Trim(edit4.Text); classroom:=Trim(edit3.Text); if Buffer<>'' then begin strSql:='select * from dbo.xuesheng Where times<='; strSql:=strSql+''''+Buffer+''''; self.ADODataSet1.Active:=False; mandText:=strSql; self.ADODataSet1.Active:=True; CardNumber:=''; Name:='';
第 10 页 共 21 页 10
classroom:='';
edit4.Text:='';
end;
if CardNumber<>'' then begin
strSql:='select * from dbo.xuesheng Where id='; strSql:=strSql+''''+CardNumber+'''';
self.ADODataSet1.Active:=False;
mandText:=strSql;
self.ADODataSet1.Active:=True;
if (self.ADODataSet1.Eof=false) then begin Name:='';
classroom:='';
Buffer:='';
edit2.Text:='';
end
else showmessage('无此卡号');
Name:='';
classroom:='';
Buffer:='';
edit2.Text:='';
end;
if Name<>'' then begin
strSql:='select * from dbo.xuesheng Where name='; strSql:=strSql+''''+Name+'''';
self.ADODataSet1.Active:=False;
mandText:=strSql;
self.ADODataSet1.Active:=True;
if (self.ADODataSet1.Eof=false) then begin CardNumber:='';
classroom:='';
Buffer:='';
edit1.Text:='';
end
else showmessage('无此姓名');
CardNumber:='';
classroom:='';
Buffer:='';
edit1.Text:='';
end;
if classroom<>'' then begin
strSql:='select * from dbo.xuesheng Where class='; strSql:=strSql+''''+classroom+'''';
self.ADODataSet1.Active:=False;
mandText:=strSql;
self.ADODataSet1.Active:=True;
if (self.ADODataSet1.Eof=false) then begin
CardNumber:='';
Name:='';
Buffer:='';
edit3.Text:='';
end
else showmessage('无此班级');
CardNumber:='';
Name:='';
Buffer:='';
edit3.Text:='';
end;
end;
完成的功能为:输入卡号,就根据卡号查询学生基本信息,输入姓名就跟据姓名查询,输入班级就跟据班级查询,输入上机次数就将上机次数小于输入次数的学生的基本信息输出。
若查不到,则返回相应的信息。
其原理为:首先从Edit.Text中将输入赋给相应的变量。
由于我们的数据表多将Field设置为字符串,因此可以将输入直接赋给变量,但遇到非字符串变量则将输入转变为变量对应类型。
其次将strSql设为字符串类型,并将SQL语言转化为字符串形式赋给strSql。
然后将数据集关闭,将strSql赋给mandText,最后将数据集打开。
这时ADODataSet1可以发送SQL语言至SQL Server对数据库中的学生信息表进行查询,并可将查询结果直接显示在DBGrid1中。
由于我们将数据库student中学生基本信息表的所有Field都列在了DBGrid1中,所以不需要对ADODataSet1进行显示哪个Field的设置。
程序中条件语句if (self.ADODataSet1.Eof=false)是判断是否查找到记录。
EOF是布尔类型,true表示记录指针指在最后一个记录,通常表示未找到,而false表示未指在最后一个记录上,意味着有这条记录。
一旦执行查询即将其它变量清空,并将Edit.Text 置空。
比如用卡号查询,按下查询键后,即将姓名、班级、上机次数的变量置空,并将其Text清空。
如此可以方便下次的查询,简化条件语句,即条件语句只要一个非空条件,而不用对多个非空条件语句进行与操作。
3、遇到的问题:
这个应用程序的实现是比较简单的。
只要按照老师给的管理机模型就可以完成基本功能,只要再补充完善一下效果就不错。
但也是遇到一些问题。
主要问题是将空’’写为空格’‘,使得查询时出现问题。
比如说一开始设计时若用卡号查询就不能用名字查询,用了名字就不能用卡号。
用了条件语句也是这个问题。
后来经老师提醒,才知道问题所在,还是对语言不太熟悉。
还有配置文件中未将目录改为数据库,造成运行时总是出现命令错误。
返回目录(四)客户设置机
1、完成功能:
(1)、管理员可以通过客户机上的操作界面设置学生的基本信息:姓名、卡号、班级、宿舍电话、手机号等。
可以设置计算机的基本信息:机号、机房号、上机密码、是否完好等。
(2)、管理人员可以通过客户机上的操作界面完成学生上机预约。
2、实验步骤:
(1).设计应用程序界面。
根据题目要求可以对学生基本信息、计算机基本信息、预约进行操作,因此我们选择多页面PageControl控件。
点击右键选择new Page即可增加新页面。
按我们的题目分学生基本信息设置、计算机基本设置、预约设置三个页面。
首先进行计算机基本信息设置。
根据题目要求和数据库中diannao表的设置,我们设置了主机号、机房号、密码和电脑情况的设置,并增添增加、修改、删除和退出的按钮。
在学生基本信息设置页面中我们也是根据题目和数据库中xuesheng表进行有关设置,按钮也包括增加、修改、删除和退出。
而在预约页面中,我们的构思是输入卡号和日期即可进行预约。
最后增添数据集ADODataSet、DataSource和ADOCommand。
其中ADODataSet用于查询,而ADOCommand 用于写入数据库。
(2).设置控件属性。
包括从Caption或Text中改变其标题。
重点是ADOCommand、DataSource、ADODataSet的属性设置。
其中DataSource 的DataSet设置为ADODataSet1,并更改DataSet中的ConnectionString,将其服务器设置成我们组所用的服务器,并将其数据库设置成我们设置的数据库student,从WindowsNT登录。
其次对ADODataSet1的属性进行设置,仅需对它的ConnectionString的属性进行设置,设置内容与DataSource 1相同。
最后对ADOCommand1的属性进行设置,对ConnectionString进行设置,内容同上。
对电脑进行设置
对学生情况设置
进行预约设置
(3).用Pascal语言对各种控件进行编程。
首先进行Form的初始化。
包括对配置文件的设置。
然后对各控件进行程序设计。
在学生基本信息设置页面和计算机基本信息设置页面中其添加、修改和删除功能是类似的。
现以学生基本信息设置为例说明。
添加按钮对应的程序如下:
procedure TForm1.Button1Click(Sender: TObject);
var
strSql:string;
strSqa:string;
name:string;
id:string;
classroom:string;
telephone:string;
handset:string;
begin
name:=Edit1.Text;
id:=Edit2.Text;
classroom:=Edit3.Text;
telephone:=Edit4.Text;
handset:=Edit5.Text;
strSqa:='select * from dbo.xuesheng Where id=';
strSqa:=strSqa+''''+id+'''';
self.ADODataSet1.Active:=False;
mandText:=strSqa;
self.ADODataSet1.Active:=True;
if (self.ADODataSet1.Eof=true) then begin
strSql:='Insert into xuesheng(id,name,class,telephone,handset,times)';
strSql:=strSql + 'Values(';
strSql:=strSql +''''+ id +''''+ ',';
strSql:=strSql + '''' + name + '''' + ',';
strSql:=strSql + '''' + classroom + '''' + ',';
strSql:=strSql + '''' + telephone + '''' + ',';
strSql:=strSql + '''' + handset + '''' + ',';
strSql:=strSql + '''' + IntToStr(0) + '''' + ')';
mandText:=strSql;
self.ADOCommand1.Execute;
showmessage('添加成功!');
end
else Messagedlg('记录已经存在!',mtError,[mbok],0);
end;
完成的功能为:根据Label的提示,输入学生基本情况后可以将该学生的基本情况写入数据库student中xuesheng信息表中,并提示添加成功。
若该卡号已经存在,则弹出警告说明记录已经存在。
其原理为:首先从Edit.Text中将输入赋给相应的变量。
由于我们的数据表多将Field设置为字符串,因此可以将输入直接赋给变量,但遇到非字符串变量则将输入转变为变量对应类型。
其次将strSql设为字符串类型,并将SQL语言转化为字符串形式赋给strSql。
然后将数据集关闭,将strSql赋给mandText,最后将数据集打开。
这时ADODataSet1可以发送SQL语言至SQL Server对数据库中学生信息表的卡号
进行查询。
显然学生信息表中卡号应该是主键,即卡号是唯一的,所以仅需对卡号进行查询。
程序中条件语句if (self.ADODataSet1.Eof=false)是判断是否查找到记录。
EOF是布尔类型,true表示记录指针指在最后一个记录,通常表示未找到,而false表示未指在最后一个记录上,意味着有这条记录。
若未找到则对数据库写入。
将strSql赋给mandText,然后执行这条语句,即可将数据添加进数据表,同时显示“添加成功”。
若已存在这条记录,则显示“记录已经存在”,不作任何操作。
在信息设置中我们仅设置了五项,而在信息表中还包括上机次数这一栏,由于输入的学生是新增的,因此我们用常量“0”直接写入。
修改按钮对应的程序如下:
procedure TForm1.Button2Click(Sender: TObject);
var
strSql:string;
strSqa:string;
name:string;
id:string;
classroom:string;
telephone:string;
handset:string;
begin
name:=Edit1.Text;
id:=Edit2.Text;
classroom:=Edit3.Text;
telephone:=Edit4.Text;
handset:=Edit5.Text;
strSqa:='select * from dbo.xuesheng Where id=';
strSqa:=strSqa+''''+id+'''';
self.ADODataSet1.Active:=False;
mandText:=strSqa;
self.ADODataSet1.Active:=True;
if (self.ADODataSet1.Eof=false ) then begin
strSql:='Update xuesheng SET name='+''''+name+''''+',';
strSql:=strSql+'class='+''''+classroom+''''+',';
strSql:=strSql+'telephone='+''''+telephone+''''+',';
strSql:=strSql+'handset='+''''+handset+''''+','+'times='+IntToStr(0);
strSql:=strSql+'where id='+''''+id+'''';
mandText:=strSql;
self.ADOCommand1.Execute;
showmessage('修改记录成功!');
end
else Messagedlg('找不到记录!',mtError,[mbok],0);
end;
完成的功能为::根据Label的提示,输入学生基本情况后可以将对改学生的基本信息进行设置,并提示“修改成功”,若该记录不存在,则提示“找不到记录”。
函数体与添加是一样的,只是SQL语言不同,将Insert语句换成Update,并且是在记录存在的情况下。
这样
即可对数据表进行相应的修改。
删除按钮的程序如下:
procedure TForm1.Button3Click(Sender: TObject);
var
strSql:string;
strSqa:string;
name:string;
id:string;
classroom:string;
telephone:string;
handset:string;
begin
name:=Edit1.Text;
id:=Edit2.Text;
classroom:=Edit3.Text;
telephone:=Edit4.Text;
handset:=Edit5.Text;
strSqa:='select * from dbo.xuesheng Where id=';
strSqa:=strSqa+''''+id+'''';
self.ADODataSet1.Active:=False;
mandText:=strSqa;
self.ADODataSet1.Active:=True;
if (self.ADODataSet1.Eof=false ) then begin
strSql:='delete from xuesheng where id='+''''+id+'''';
mandText:=strSql;
self.ADOCommand1.Execute;
showmessage('删除记录成功!');
end
else Messagedlg('找不到记录!',mtError,[mbok],0);;
end;
完成的功能为:删除输入的学生对应的学生信息,若输入学生信息不存在,则弹出警告信息说明记录不存在。
同理,函数体是一样的,只是SQL语句换成Delete。
这样即可将数据表中对应的记录进行删除操作。
在电脑基本信息设置中完成的功能是一样的,只是SQL语句和操作的数据表不同而已。
在预约页面中,所使用的函数是一样的,只是在操作中逻辑性略复杂了些。
“确定”按钮的程序如下:
procedure TForm1.Button9Click(Sender: TObject);
var
strSql:string;
strSqa:string;
HostNumber:string;
RoomNumber:string;
book:integer;
id:string;
time:TDateTime;
begin
id:=Edit10.Text;
time:=StrToDateTime(edit13.text);
strSqa:='select * from dbo.diannao Where book=0';
strSqa:=strSqa+'and situation=1';
self.ADODataSet1.Active:=False;
mandText:=strSqa;
self.ADODataSet1.Active:=True;
if (self.ADODataSet1.Eof=false) then begin
strSql:='Insert into yuyue(id,RoomNumber,HostNumber,shijian1)';
strSql:=strSql + 'Values(';
strSql:=strSql +''''+id+''''+ ',';
strSql:=strSql+''''+self.ADODataSet1.FieldByName('RoomNumber').AsString+
'''' + ',';
strSql:=strSql+''''+self.ADODataSet1.FieldByName('HostNumber').AsString+''''
+ ',';
strSql:=strSql + '''' +DateTimeToStr(time)+''''+')';
mandText:=strSql;
self.ADOCommand1.Execute;
strSql:='Update diannao set book=1 where RoomNumber=';
strSql:=strSql+''''+self.ADODataSet1.FieldByName('RoomNumber').AsString+
'''';
strSql:=strSql+'and
HostNumber='+''''+self.ADODataSet1.FieldByName('HostNumber').AsString+''
'' ;
mandText:=strSql;
self.ADOCommand1.Execute;
showmessage('预约成功');
end
else Messagedlg('机器已满,欢迎下次光临!',mtError,[mbok],0);
end;
完成的功能为:输入卡号和日期后按确定,则程序将对电脑基本信息表中未预约和电脑情况良好的电脑进行查询,若有则将查到的第一台计算机给该学号的学声,没有这样的记录则弹出警告。
其原理为:首先对电脑基本信息表进行查找,只要存在未预约和情况良好的电脑就返回给数据集。
然后将该电脑的主机号及机房号以及输入的卡号和日期添加到预约表中。
最后将电脑基本信息表中对应主机的预约情况置1,表示已经预约。
其关键语句为self.ADODataSet1.FieldByName(' ').AsString,这个语句将保存找到的数据集中第一个记录对应Field中的数据。
这样我们可以对几张不同的表进行设置。
3、遇到的问题
总体来说,这个应用程序的设置还是比较简单的,相对于查询来说,只是语句多用了一条写入的语句,逻辑上稍微复杂了些。
当然问题还是有一些,不过都是些小问题,写下来还是比较顺利的。
印象比较深刻的是在一个SQL语言中的修改命令中,忘了将where条件语句加入,导致所有记录都变了。
返回目录
四:数据库表
一、服务器说明:
数据库名:student
其中包括四张表分别为:
1、xuesheng
记录学生基本信息。
建表思想:可以分别根据上机卡号、姓名、班级,查询学生的基本信息,统计某个班级的所有信息,并且通过编写设置程序添加、修改、删除学生信息;可以根据上机次数(times)查找上机次数少于一定值的全部学生。
当某同学刷卡时,根据卡号在表中查找此项,如有此卡号,则卡号有效,并且把相应的times+1,即纪录了上机次数;没有此卡号,则向通讯机返回卡号无效信息。
在设置过程中,若出现要添加的项已经存在,或者药删除的项不存在,则返回警告信息;成功则返回成功信息。
2、yuyue
记录电脑预约情况。
建表思想:可以通过编写设置程序实现上机的提前预约,输入卡号和时间,在电脑基本信息表(diannao)中找到第一个未被预约(即book=0)并且情况完好(即situation=1)的主机,分配给预约者;把预约事项写入表中,并且在电脑基本信息表中修改book的值,使之为1,则表示此机已经被预约。
当预约者上机刷卡时,从表中删除此项。
并且把电脑基本信息表中修改book的值,使之为0,则表示此机未被预约。
若所有的电脑均被预约了,则返回警告信息。
3、diannao
记录电脑基本情况。
建表思想:可以通过编写设置程序实现电脑基本信息的添加、修改、删除;book=0表示电脑未被预约,book=1表示电脑已经被预约;situation=1表示电脑完好可以上机,situation=0表示电脑存在故障不能上机;管理员可以通过设置制定上机密码,可修改。
在设置过程中,若出现要添加的项已经存在,或者药删除的项不存在,则返回警告信息;成功则返回成功信息。
当有学生刷卡上机时(此学生没有预约时),在表中查找一台情况完好的计算机,分配给他,并且返回机房号、主机号、上机密码;学生登陆时要键入上机密码。
4、Information
记录每次上机情况。
可以通过此表了解学生每次上机的时间和主机号。
返回目录
五:心得体会和意见建议
(一)心得体会:
这次软件实习可以说“历经艰辛”。
我们原先对于Delphi和SQL Server 可以说完全没有概念,刚一开始做的时候,简直无从下手,忙的焦头烂额,却没有什么进展。
后来翻了大量的参考资料(印象中实验桌上除电脑就是书),问了老师n多问题,加上自己慢慢摸索,现在已经有了很大进步。
虽然辛苦但是当作出一种功能的时候那种兴奋之情真是无法形容,心里有很大的成就感,连以前的累苦都不知道抛到哪去了。
通过这次实习,我们对Delphi 和SQL Server 有了很大的认识,以前就学过数据库,但只是理论上学习,离实际应用还是有很大的差别。
Delphi就更别说了,以前连碰都没有碰过,也不知道长什么样子,更别提使用了,而且Delphi使用的是Pascal语言,我们也从未接触过,相当于学习一种新语言。
但现在实习完,我们感觉虽不能说是应用自如,至少有了基本概念,对如何操作、如何使用都有了相当的了解,对基本的函数、操作过程、原理也掌握了不少。
这是我们这次生产实习最大的收获。
在这次实习中,我们体会到“人多力量大”。
倒不是说人越多越好,关键在于大家分工合作要配合好。
一开始,我们是一个人负责一台机子,但是难易有别。
后来基本上是两拨人,一拨负责数据库查询和写入,一拨人负责前置机和通信机。
这样有了分工,又有合作,效率高,效果好,速度快。
另外,我们解决问题的能力也有了相当大的提高。
面对从未接触的应用软件,遇到问题是无法避免的。
一开始,只能模仿老师的程序,根本不知道是什么意思,看参考资料是我们最常用的手段了,有些功能我们也是模仿了书中的源代码,当然随着不断的使用,这些源代码,我们对其都基本上了解了。
起初,我们一旦碰到参考资料没有的或者不明白的,或者调试时出现了问题简直不知所措,只能问老师。
看多了老师对程序的调试,我们也渐渐学会断点调试。
看问题出在哪,是程序问题还是联机问题,抑或是逻辑问题。
这令我们解决问题的能力也逐步提高。
最后,我们觉得要完成一个系统必须要有一个好的规划,不论是程序设置还是人员分配都需要事先计划好。
我们一开始的计划比较笼统,造成后面有些变动,倒没有导致什么前功尽弃的问题,只是有些麻烦。
虽然结果不严重,但若遇到完全自己设计的系统,则事先良好的计划是必不可少的。
(二)对该系统的改进意见:
尽管基本功能都完成了,老师也给予了很好的评价,但是整个系统还是有需要改进的地方。
比如我们可以增加对预约情况的查询,预约后可显示预约情况。
另外,在设置中,所有项都不能置空,否则出错,这点也可以改进。
比如卡号未填时可弹出消息“信息不足”,若手机号未填则将该项置空等等,即系统的容错性应该可以更好。
还有对时间的预约只能对当天进行预约等问题。