标签:
目录
足球彩票节是由爱彩网在2014年巴西世界杯前夕发起的彩民网上盛筵,从2014年6月3日开幕,至世界杯结束闭幕,此节日长达41天。节日期间爱彩网不间断推出众多促销活动惠及球迷和彩民,同时为世界杯助力造势。因此,建立一套基于计算机环境的技术先进、高效稳定、安全可靠的世界杯彩票竞猜测评系统是完全有必要的。
世界杯彩票竞猜系统的目的是自动分析、计算、统计、管理历届每次比赛数据,减少人工操作,降低计算失误,提高工作效率,减少彩民买彩票的不确定性,使买彩票变得系统化、自动化。
与传统的彩票凭运气相比,计算机不但能发挥计算机方便、快捷的功能,而且可以节省大量的资源费用等,更方便灵活操作,而且方便管理,增加世界杯彩票竞猜的稳定性,有效防止世界杯彩票竞猜的过大的风险,使世界杯彩票竞猜更加合理、更趋于高获奖率。因此开发一套比较成熟的世界杯彩票竞猜系统很有必要。
本文档适用于项目开发的设计阶段,在项目开发阶段可按照本文档检验数据库的实施情况。
《世界杯彩票竞猜系统(Word Cup Football lottery ticket System)》的读者对象包括从事DBMS、面向对象编程、高校教务人员行业的工作者,高校中信息专业、计算机专业、管理专业、软件工程专业等有数据库课程的本科生、硕士生,深入学习SQLServer-数据库的读者,深入学习对象-关系数据库的读者,也可以作为数据库课程的参考资料。
本文档面向具有数据库开发使用经验的开发者中那些希望获得锻炼和提升的人。
[1]张海藩.软件工程导论[M].北京:清华大学出版社.1998年
[2]郑人杰,殷人昆.软件工程概论[M].北京:清华大学出版社.2001年
[3]Katharine Whitehead.基于组件开发[M].北京:人民邮电出版社.2003年
[4]熊春荣,学校学生信息管理系统的设计与实现[J].玉林师范学院学报,2006年
[5]萨师煊,王珊.数据库系统概论(第三版)[M],高等教育出版社,2000年
[6]邵维忠,杨芙清著.面向对象的系统分析.北京:清华大学出版社,1998年
[7]张友生等编著.《软件体系结构》.北京:清华大学出版社,2006年
[8]吴洁明,袁山龙编著.软件工程应用实践教程.北京:清华大学出版,
2003年
缩写、术语 |
解 释 |
SPP |
精简并行过程,Simplified Parallel Process |
SD |
系统设计,System Design |
1:1联系 |
如果实体集E1中的每个实体最多只能和实体集E2中的一个实体有联系,反之亦然,好么实体集E1对E2的联系称为"一对一联系",记为"1:1" |
1:N联系 |
如果实体集E1中每个实体与实体集E2中任意个(零个或多个)实体有联系,而E2中每个实体至多和E1中的一个实体有联系,那么E1对E2的联系是"一对多联系",记为"1:N" |
M:N联系 |
如果实体集E1中每个实体与实体集E2中任意个(零个或多个)实体有联系,反之亦然,那么E1对E2的联系是"多对多联系",记为"M:N" |
SQL数据库 |
SQL(Structured Query Language),即‘结构式查询语言‘,采用英语单词表示和结构式的语法规则。一个SQL数据库是表的汇集,它用一个或多个SQL模式定义 |
DD |
数据字典(Data Dictionary),数据库系统中存放三级结构定义的数据库称为数据字典。(通常DD还存放数据库运行时的统计信息) |
集中式DBS |
是指数据库中的数据集中存储在一台计算机上,数据的处理集中在一台计算机上完成 |
函数依赖 |
FD(function dependency),设有关系模式R(U),X,Y是U的子集,r是R的任一具体关系,如果对r的任意两个元组t1,t2,由t1[X]=t2[X] 导致t1[Y]=t2[Y],则称X函数决定Y,或Y函数依赖于X,记为X→Y。X→Y为模式R的一个函数依赖 |
1NF |
第一范式。如果关系模式R的所有属性的值域中每一个值都是不可再分解的值,则称R是属于第一范式模式。如果某个数据库模式都是第一范式的,则称该数据库存模式属于第一范式的数据库模式 |
2NF |
第二范式。如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称是第二范式模式;如果某个数据库模式中每个关系模式都是第二范式的,则称该数据库模式属于第二范式的数据库模式。(注:如果A是关系模式R的候选键的一个属性,则称A是R的主属性,否则称A是R的非主属性。) |
3NF |
第三范式。如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。如果某个数据库模式中的每个关系模式都是第三范式,则称为3NF的数据库模式 |
BCNF |
BC范式。如果关系模式R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R是BCNF的模式 |
4NF |
第四范式。设R是一个关系模式,D是R上的多值依赖集合。如果D中成立非平凡多值依赖X→→Y时,X必是R的超键,那么称R是第四范式的模式 |
最小依赖集 |
如果函数集合F满足以下三个条件:(1)F中每个函数依赖的右部都是单属性;(2)F中的任一函数依赖X→A,其F-{X→A}与F是不等价的;(3)F中的任一函数依赖X→A,Z为X的子集。(F-{X→A}∪{Z→A}与F不等价。则称F为最小函数依赖集合,记为Fmin |
串行调度 |
事务的依次执行称为串行调度 |
并发调度 |
利用分时的方法,同时处理多个事务,称为事务的并发调度 |
可串行化调度 |
对于事务集(T<1>,T<2>,…,T),如果一个并发调度的结果与一个串行调度等价,则称此调度是是可串行化调度 |
数据库服务器选择Lenovo,操作系统使用windows7,数据库选用SQLServer。
程序设计语言为Delphi 7。Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语(Object-Oriented Language),当今世界上最快的编辑器和最为领先的数据库技术。
系统的硬件要求为微型计算机,8M以上的内存,500M以上的外存。
本系统主要进行学生的世界杯彩票竞猜综合成绩考核和班委对学生情况的管理记相关的活动。主要包含如下功能模块:
该模块提供学生进行学生信息查询。实现学生的个人信息管理。方便了学生管理以及成绩考核查询,世界杯彩票竞猜。更能实现效率。
该模块提供学生班委进行学生信息更改。实现班委的班级信息管理。方便了班委管理和成绩考核查询,世界杯彩票竞猜更改。更能实现效率。
系统的学生、班委和教师组件要求运行在用windows操作系统的笔记本或台式机上。服务器组件要求必须使用C语言编写,并且相互之间使用组件交互标准CORBA(公用对象请求代理结构)或SOAP(缉拿的那对象访问协议)进行通信。
系统的学生、班委和教师部分要求在所有的屏幕上都是半秒的响应时间,而服务器组件可能需要在同样的响应时间内支持上千个并发的学生教师操作。
基于web的界面符合整个组织范围内的图形设计准则,像菜单布局和格式、色彩设计、组织标志的使用规范化。
当服务出现损耗或出现不正当处理、以及错误检测和恢复将会自动根据程序要求来进行自我修复和改进。
对该系统输出的访问会受限于学生和教师,一些来自不属于学校的外人的访问需要得到授权,而其他的一些访问只是来自该机构的本地网络。该校可能需要喜爱通过Internet传送数据的时候要使用到加密技术,并且通过用户名和密码机制来控制对数据库服务器的访问。
(1)表的命名:以名词和名词短语;
(2)列的命名:采用有意义的命名,能表达其表示的内容的名词短语;
(3)视图与存储均与表的命名类似。
数据库涉及字符规则
采用26个英文字母(区分大小写)和0 -9这十个自然数,加上下划线_组成,共63个字符。不能出现其他字符(注释除外)。
数据库对象命名规则
数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。对象名字由前缀和实际名字组成,长度不超过30。
前缀:使用小写字母。如:
表 |
tb |
视图 |
vi |
存储过程 |
sp |
函数 |
fn |
实际名字
实际名字尽量描述实体的内容,由单词或单词组合,每个单词的首字母大写,其他字母小写,不以数字和_开头。因此,如合法的对象名字类似如下。
表 |
tbUser_Info、tbMessage_Detail |
视图 |
vi_MessageList |
存储过程 |
sp_MessageAdd |
数据库表命名规则
字段由前缀和实际名字组成。实际名字中首单词一个系统尽量采取同一单词。
前缀:使用小写字母tb,如表示表。
例如:tbMember tbMember_Info t bForum_Board tbForum_Thread1
字段命名规则
数字、字符、日期/时间、lob(大对象)、杂项,字段由表的简称、下划线,实际名字加后缀组成。
后缀:使用小写字母,代表该字段的属性。
例如: User_Idint User_Namestr User_RegDatedtm
视图命名规则
字段由前缀和实际名字组成,中间用下划线连接。
前缀:如使用小写字母vi,表示视图。
例如:vi_User vi_UserInfo
存储过程命名规则
字段由前缀和实际名字组成,中间用下划线连接。
前缀:如使用小写字母sp,表示存储过程。
例如:sp_User
SQL语句规则
所有SQL语句的关键词全部大写或首字母大写,比如SELECT,UPDATE,FROM,ORDER,BY等。
数据库设计人员根据需求文档,创建与数据库相关的那部分实体关系图(ERD)。如果采用面向对象方法(OOAD),这里实体相当于类(class)。
VS表
VS(队名,巴西,墨西哥,......,阿尔及利亚)
result表
result(场次,主场,客场,主场分数,客场分数)
team表
team(队名,组别)
(1)主要是设计表结构。一般地,实体对应于表,实体的属性对应于表的列,实体之间的关系成为表的约束。逻辑设计中的实体大部分可以转换成物理设计中的表,但是它们并不一定是一一对应的。
(2)对表结构进行规范化处理(第三范式)。
表名 |
功能说明 |
VS |
记录预测分差 |
team |
记录队伍的队名和组别 |
result |
记录比赛比分结果 |
表名 |
VS |
||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
队名 |
Nvarchar(255) |
非空 |
主键 |
巴西 |
Float |
可以为空 |
无 |
墨西哥 |
Folat |
可以为空 |
无 |
…… |
…… |
…… |
…… |
阿尔及利亚 |
Float |
可以为空 |
无 |
补充说明 |
记录预测分差 |
表名 |
team |
||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
队名 |
Nvarchar(255) |
非空 |
主键 |
组别 |
Nvarchar(255) |
非空 |
无 |
补充说明 |
记录队伍的队名和组别 |
表名 |
result |
||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
场次 |
Float |
非空 |
主键 |
主场 |
Nvarchar(255) |
非空 |
无 |
客场 |
Nvarchar(255) |
非空 |
无 |
主场分数 |
Float |
非空 |
无 |
客场分数 |
Float |
||
补充说明 |
记录比赛比分结果 |
提高软件系统的安全性应当从"管理"和"设计"两方面着手。这里仅考虑数据库的安全性设计。
该系统用户帐号全部由系统管理员管理,在数据库中,对组和用户访问数据库权限的设置工作,只能通过管理员完成。设置的权限包括:"打开/运行",读取设计、修改设计、管理、读取数据,更新数据、插入数据和删除数据用户只能用通过认证的帐号登陆到应用软件,通过应用软件访问数据库,而没有其他途径操作数据库,且用户的操作权限有限,不能任意修改数据库中的关键数据,只能对数据进行读取和输入等常规操作,因能能很好的保护数据库的数据。
1.用户权限控制
给每个用户角色限制权限,不同的角色拥有不同的权限,用户只能行使自己权限范围内的权限,如普通用户只能查看自己的借阅记录不能任意修改,而管理员和超级管理员则可以修改用户的借阅记录,通过角色,权限等的一系列授予和回收操作可以有效的进行用户的权限控制,从而防止用户恶意操作、篡改数据库信息。
2.数据库登录设密
给数据库设置登录账号和密码,只有拥有直接访问数据库权限的用户在键入正确的账号和密码后才能通过软件登录到数据库进行操作,可防止用户恶意操作数据库。
3.限制操作系统存取权限
使用数据库系统是依存在操作系统之上的,如果操作系统被人侵入,那么通过修改配置文件等一系列方法,数据库的安全性也将荡然无存,所以对于安全性高的数据库,可以通过限制操作系统的存取权限来提高数据库的安全性。
使用MD5加密方法对用户账号密码进行加密。
MD5方法采用单项加密的加密方法,即只能对数据进行加密,而不能对加密后的数据进行解密,这样经过MD5算法处理的账号和秘密存储在数据库中即使被人恶意获取到,也不可能知道密码的具体数据,即做到了对账号密码的更强的保护。
确定每个角色对数据库表的操作权限,如创建、检索、更新、删除等。每个角色拥有刚好能够完成任务的权限,不多也不少。在应用时再为用户分配角色,则每个用户的权限等于他所兼角色的权限之和。
角色 |
可以访问的表与列 |
操作权限 |
用户 |
result |
增改查 |
VS |
改查 |
|
team |
查 |
在数据库的设计过程中经常要添加、删除数据库对象,这会使数据库内部留有许多碎片,不能有效地利用磁盘空间,文件会逐渐增大。这有点象文件系统经过多次的增删操作,会导致文件碎片,浪费磁盘空间,而且读写效率降低。可以用 Access 提供的工具来压缩数据库,它将重新安排数据库文件在磁盘中保存的位置,并释放磁盘空间,通常文件的容量会缩小成原来的几分。
分析并优化数据库的"时-空"效率,尽可能地"提高处理速度"并且"降低数据占用空间"。
(1)分析"时-空"效率的瓶颈,找出优化对象(目标),并确定优先级。
(2)当优化对象(目标)之间存在对抗时,给出折衷方案。
(3)给出优化的具体措施,例如优化数据库环境参数,对表格进行反规范化处理等。
优先级 |
优化对象(目标) |
措施 |
高 |
数据库索引 |
根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量 |
高 |
数据库碎片 |
定期整理数据库产生的碎片,提高数据库的性能 |
高 |
数据库缓存 |
优化数据库缓存方案 |
高 |
数据库对象 |
优化数据库对象的放置策略,尽量让数据库对象均匀地把数据分布在系统的磁盘中,平衡I/O访问,避免I/O瓶颈。 |
DBA(即本系统的管理员)要针对不公的应用要求制定不同的转储计划,定期对数据库和日志文件进行备份,以保证数据库中数据在遭到破坏后能及时进行恢复。
DBA应采取有效的措施保护数据不受非法盗用和遭到任何破坏
DBA需要随时观察数据库的动态变化,并在数据库出现错误、故障或产生不适应情况时能够随时采取有效措施保护数据库
数据库备份方案
添加任务计划,定期定时运行备份批处理命令,实现自动备份。
设计一个物理备份和逻辑备份相结合的数据库备份方案,以保证数据的完整性和0损失恢复。
逻辑备份:
星期一 完全备份 在00:00时备份
星期二 增量备份 在00:00时备份
星期三 增量备份 在00:00时备份
星期四 增量备份 在00:00时备份
星期五 累积备份 在00:00时备份
星期六 增量备份 在00:00时备份
星期日 增量备份 在00:00时备份
分析:每天在00:00时备份是因为在这个时段的访问量相对很少,星期一完全备份可以将数据库中的信息全部备份,而之后的几天采用增量备份可以减少备份量,加快备份速度。在在星期五选择累计备份,是考虑到数据库出错时恢复的考虑,当数据库在某一周有错误时,可以直接恢复到星期五的数据,而不用一天一天的按增量备份的数据恢复。
物理备份:
备份方法 |
备份频率 |
备份时间 |
备份目的 |
备注 |
本地热备 |
1次/天 |
00:00 |
保留最近一周的备份数据 |
|
本地冷备 |
1次/一月 |
每周星期五下午 |
保留数据库全部数据 |
|
异地导出备份 |
1次/天 |
12:00 |
保留最近一周的备份数据 |
具体代码:
Unit1
1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, bsSkinCtrls, bsSkinData, BusinessSkinForm; 8 9 type 10 TForm1 = class(TForm) 11 bsBusinessSkinForm1: TbsBusinessSkinForm; 12 bsSkinData1: TbsSkinData; 13 bsCompressedStoredSkin1: TbsCompressedStoredSkin; 14 bsSkinButton1: TbsSkinButton; 15 bsSkinButton2: TbsSkinButton; 16 bsSkinButton3: TbsSkinButton; 17 procedure bsSkinButton1Click(Sender: TObject); 18 procedure bsSkinButton2Click(Sender: TObject); 19 procedure bsSkinButton3Click(Sender: TObject); 20 private 21 { Private declarations } 22 public 23 { Public declarations } 24 end; 25 26 var 27 Form1: TForm1; 28 29 implementation 30 31 uses Unit2, Unit3, Unit4; 32 33 {$R *.dfm} 34 35 procedure TForm1.bsSkinButton1Click(Sender: TObject); 36 begin 37 self.Hide; 38 form2.Show; 39 end; 40 41 procedure TForm1.bsSkinButton2Click(Sender: TObject); 42 begin 43 self.Hide; 44 form3.Show; 45 end; 46 47 procedure TForm1.bsSkinButton3Click(Sender: TObject); 48 begin 49 self.Hide; 50 form4.Show; 51 end; 52 53 end.
Unit2:
1 unit Unit2; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, bsSkinData, BusinessSkinForm, StdCtrls, bsSkinCtrls, bsSkinBoxCtrls, 8 DB, ADODB, Grids, DBGrids; 9 10 type 11 TForm2 = class(TForm) 12 bsBusinessSkinForm1: TbsBusinessSkinForm; 13 bsSkinComboBox1: TbsSkinComboBox; 14 bsSkinComboBox2: TbsSkinComboBox; 15 Label1: TLabel; 16 Label2: TLabel; 17 ADOQuery1: TADOQuery; 18 DBGrid1: TDBGrid; 19 DataSource1: TDataSource; 20 ADOQuery2: TADOQuery; 21 bsSkinButton1: TbsSkinButton; 22 procedure FormCreate(Sender: TObject); 23 procedure bsSkinComboBox1Change(Sender: TObject); 24 procedure bsSkinComboBox2Change(Sender: TObject); 25 procedure bsSkinButton1Click(Sender: TObject); 26 private 27 { Private declarations } 28 public 29 { Public declarations } 30 end; 31 32 var 33 Form2: TForm2; 34 35 implementation 36 37 uses Unit1; 38 39 {$R *.dfm} 40 41 procedure TForm2.bsSkinButton1Click(Sender: TObject); 42 begin 43 self.Close; 44 form1.show; 45 end; 46 47 procedure TForm2.bsSkinComboBox1Change(Sender: TObject); 48 begin 49 bsSkinComboBox2.Items.Clear; 50 adoquery1.Active:=false; 51 adoquery1.SQL.Clear; 52 adoquery1.SQL.Add(‘select * from team where 组别=‘‘‘+bsskincombobox1.Text+‘‘‘‘); 53 adoquery1.Active:=true; 54 adoquery1.First; 55 while not adoquery1.Eof do 56 begin 57 bsSkinComboBox2.Items.Add(adoquery1.fieldByName(‘队名‘).AsString); 58 adoquery1.Next; 59 end; 60 end; 61 62 procedure TForm2.bsSkinComboBox2Change(Sender: TObject); 63 begin 64 adoquery2.Close; 65 adoquery2.SQL.Clear; 66 adoquery2.SQL.Add(‘select * from result where 主场=:a or 客场=:a‘); 67 adoquery2.Parameters.ParamByName(‘a‘).Value:=bsSkinComboBox2.Text; 68 adoquery2.Open; 69 DBGrid1.Columns.Items[0].Width:=64; 70 DBGrid1.Columns.Items[1].Width:=64; 71 DBGrid1.Columns.Items[2].Width:=64; 72 DBGrid1.Columns.Items[3].Width:=64; 73 DBGrid1.Columns.Items[4].Width:=64; 74 end; 75 76 procedure TForm2.FormCreate(Sender: TObject); 77 begin 78 79 bsSkinComboBox1.Items.Add(‘A组‘); 80 bsSkinComboBox1.Items.Add(‘B组‘); 81 bsSkinComboBox1.Items.Add(‘C组‘); 82 bsSkinComboBox1.Items.Add(‘D组‘); 83 bsSkinComboBox1.Items.Add(‘E组‘); 84 bsSkinComboBox1.Items.Add(‘F组‘); 85 bsSkinComboBox1.Items.Add(‘G组‘); 86 bsskinComboBox1.ItemIndex:=0; 87 end; 88 89 end.
Unit3:
1 unit Unit3; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, bsSkinCtrls, bsSkinBoxCtrls, StdCtrls, Mask, DB, ADODB, ExtCtrls, 8 Buttons, bsSkinData, BusinessSkinForm; 9 10 type 11 TForm3 = class(TForm) 12 GroupBox2: TGroupBox; 13 GroupBox1: TGroupBox; 14 Label1: TLabel; 15 Label2: TLabel; 16 Label3: TLabel; 17 Label4: TLabel; 18 Label5: TLabel; 19 Label6: TLabel; 20 bsSkinEdit1: TbsSkinEdit; 21 bsSkinEdit2: TbsSkinEdit; 22 bsSkinComboBox1: TbsSkinComboBox; 23 bsSkinComboBox2: TbsSkinComboBox; 24 bsSkinComboBox3: TbsSkinComboBox; 25 bsSkinComboBox4: TbsSkinComboBox; 26 ADOQuery1: TADOQuery; 27 ADOQuery2: TADOQuery; 28 SpeedButton1: TSpeedButton; 29 bsBusinessSkinForm1: TbsBusinessSkinForm; 30 ADOQuery3: TADOQuery; 31 bsSkinEdit3: TbsSkinEdit; 32 Label7: TLabel; 33 bsSkinButton1: TbsSkinButton; 34 procedure FormCreate(Sender: TObject); 35 procedure bsSkinComboBox1Change(Sender: TObject); 36 procedure bsSkinComboBox3Change(Sender: TObject); 37 procedure Button1Click(Sender: TObject); 38 procedure SpeedButton1Click(Sender: TObject); 39 procedure bsSkinButton1Click(Sender: TObject); 40 private 41 { Private declarations } 42 public 43 { Public declarations } 44 end; 45 46 var 47 Form3: TForm3; 48 49 implementation 50 51 uses Unit1; 52 53 {$R *.dfm} 54 55 procedure TForm3.bsSkinButton1Click(Sender: TObject); 56 begin 57 self.Hide; 58 form1.Show; 59 end; 60 61 procedure TForm3.bsSkinComboBox1Change(Sender: TObject); 62 begin 63 bsSkinComboBox2.Items.Clear; 64 adoquery1.Active:=false; 65 adoquery1.SQL.Clear; 66 adoquery1.SQL.Add(‘select * from team where 组别=‘‘‘+bsskincombobox1.Text+‘‘‘‘); 67 adoquery1.Active:=true; 68 adoquery1.First; 69 while not adoquery1.Eof do 70 begin 71 bsSkinComboBox2.Items.Add(adoquery1.fieldByName(‘队名‘).AsString); 72 adoquery1.Next; 73 end; 74 end; 75 76 procedure TForm3.bsSkinComboBox3Change(Sender: TObject); 77 begin 78 bsSkinComboBox4.Items.Clear; 79 adoquery2.Active:=false; 80 adoquery2.SQL.Clear; 81 adoquery2.SQL.Add(‘select * from team where 组别=‘‘‘+bsskincombobox3.Text+‘‘‘‘); 82 adoquery2.Active:=true; 83 adoquery2.First; 84 while not adoquery2.Eof do 85 begin 86 bsSkinComboBox4.Items.Add(adoquery2.fieldByName(‘队名‘).AsString); 87 adoquery2.Next; 88 end; 89 end; 90 91 procedure TForm3.Button1Click(Sender: TObject); 92 begin 93 self.Close; 94 form1.show; 95 end; 96 97 procedure TForm3.FormCreate(Sender: TObject); 98 begin 99 bsSkinComboBox1.Items.Add(‘A组‘); 100 bsSkinComboBox1.Items.Add(‘B组‘); 101 bsSkinComboBox1.Items.Add(‘C组‘); 102 bsSkinComboBox1.Items.Add(‘D组‘); 103 bsSkinComboBox1.Items.Add(‘E组‘); 104 bsSkinComboBox1.Items.Add(‘F组‘); 105 bsSkinComboBox1.Items.Add(‘G组‘); 106 bsskinComboBox1.ItemIndex:=0; 107 bsSkinComboBox3.Items.Add(‘A组‘); 108 bsSkinComboBox3.Items.Add(‘B组‘); 109 bsSkinComboBox3.Items.Add(‘C组‘); 110 bsSkinComboBox3.Items.Add(‘D组‘); 111 bsSkinComboBox3.Items.Add(‘E组‘); 112 bsSkinComboBox3.Items.Add(‘F组‘); 113 bsSkinComboBox3.Items.Add(‘G组‘); 114 bsskinComboBox3.ItemIndex:=0; 115 end; 116 117 procedure TForm3.SpeedButton1Click(Sender: TObject); 118 var num:integer; grade1,grade2:real; 119 begin 120 adoquery3.Close;//是否已经有该场次 121 adoquery3.SQL.Clear; 122 adoquery3.SQL.Add(‘select * from result where 场次=:a‘); 123 adoquery3.Parameters.ParamByName(‘a‘).Value:=bsSkinedit3.Text; 124 adoquery3.Open; 125 if adoquery3.RecordCount=0 then 126 begin 127 adoquery3.Close; //没有则插入 128 adoquery3.SQL.Clear; 129 adoquery3.SQL.Add(‘insert result values(:a,:b,:c,:d,:e)‘); 130 adoquery3.Parameters.ParamByName(‘a‘).Value:=bsSkinedit3.Text; 131 adoquery3.Parameters.ParamByName(‘b‘).Value:=bsskincombobox2.Text; 132 adoquery3.Parameters.ParamByName(‘c‘).Value:=bsskincombobox4.Text; 133 adoquery3.Parameters.ParamByName(‘d‘).Value:=bsSkinedit1.Text; 134 adoquery3.Parameters.ParamByName(‘e‘).Value:=bsSkinedit2.Text; 135 adoquery3.ExecSQL; 136 137 138 adoquery3.Close;//查询该两支球队历届比过多少次 139 adoquery3.SQL.Clear; 140 adoquery3.SQL.Add(‘select count(*) as c1 from result where (主场=:a and 客场=:b) or (主场=:b and 客场=:a)‘); 141 adoquery3.Parameters.ParamByName(‘a‘).Value:=bsskincombobox2.Text; 142 adoquery3.Parameters.ParamByName(‘b‘).Value:=bsskincombobox4.Text; 143 adoquery3.open; 144 num:=adoquery3.FieldByName(‘c1‘).AsInteger; 145 if num<>1 then //如果插入的新比赛为不是第一场比赛 146 begin 147 adoquery3.Close;//搜索平均分差记录。记录由矩阵表示,每列为个个主场的比赛情况,每行为客场 148 adoquery3.SQL.Clear; 149 adoquery3.SQL.Add(‘select ‘+bsskincombobox2.Text+‘ as gg from VS where 队名=:c‘); 150 adoquery3.Parameters.ParamByName(‘c‘).Value:=bsskincombobox4.Text; 151 adoquery3.open; 152 grade1:=strtofloat(adoquery3.FieldByName(‘gg‘).asstring ); //取出原始平均分差 153 154 grade1:=(grade1*(num-1)+strtoint(bsSkinedit1.Text)-strtoint(bsSkinedit2.Text))/num; 155 { 更新grade1。算法:gradeOld为原始平均分差; gradeNew为更新后的平均分差 156 num ;为插入一场新比赛后的两队比赛场数; 157 n1 为新比赛主场得分 ;n2 为新比赛客场得分 158 则: 159 gradeNew=(gradeOld*(num-1)+n1-n2))/num } 160 161 adoquery3.Close; //将主客场交换时候的平均差分也进行更新 162 adoquery3.SQL.Add(‘select ‘+bsskincombobox4.Text+‘ as grade from VS where 队名=:c‘); 163 adoquery3.Parameters.ParamByName(‘c‘).Value:=bsskincombobox2.Text; 164 adoquery3.open; 165 grade2:=adoquery3.FieldByName(‘grade‘).AsFloat; 166 167 grade2:=(grade2*(num-1)-strtoint(bsSkinedit1.Text)+strtoint(bsSkinedit2.Text))/num; 168 end 169 else 170 begin //如果插入的新比赛为是第一场比赛 171 grade1:=strtoint(bsSkinedit1.Text)-strtoint(bsSkinedit2.Text); 172 grade2:=strtoint(bsSkinedit2.Text)-strtoint(bsSkinedit1.Text); 173 end; 174 175 176 177 adoquery3.Close; //grade1写回数据库 178 adoquery3.SQL.Clear; 179 adoquery3.SQL.Add(‘update VS set ‘+bsskincombobox2.Text+‘=‘+floattostr(grade1)+‘ where 队名=:c‘); 180 adoquery3.Parameters.ParamByName(‘c‘).Value:=bsskincombobox4.Text; 181 adoquery3.ExecSQL; 182 183 184 adoquery3.Close; //grade2写回数据库 185 adoquery3.SQL.Clear; 186 adoquery3.SQL.Add(‘update VS set ‘+bsskincombobox4.Text+‘=‘+floattostr(grade2)+‘ where 队名=:c‘); 187 adoquery3.Parameters.ParamByName(‘c‘).Value:= bsskincombobox2.Text; 188 adoquery3.ExecSQL; 189 190 application.MessageBox(‘插入成功‘,‘提示信息‘,64); 191 end 192 else application.MessageBox(‘已经有该场次成绩‘,‘提示信息‘,64); 193 194 195 196 end; 197 198 end.
Unit4:
1 unit Unit4; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, StdCtrls, Buttons, bsSkinCtrls, bsSkinBoxCtrls, Mask, bsSkinData, 8 BusinessSkinForm, DB, ADODB; 9 10 type 11 TForm4 = class(TForm) 12 bsBusinessSkinForm1: TbsBusinessSkinForm; 13 GroupBox1: TGroupBox; 14 Label1: TLabel; 15 Label2: TLabel; 16 bsSkinComboBox1: TbsSkinComboBox; 17 bsSkinComboBox2: TbsSkinComboBox; 18 GroupBox2: TGroupBox; 19 Label4: TLabel; 20 Label5: TLabel; 21 bsSkinComboBox3: TbsSkinComboBox; 22 bsSkinComboBox4: TbsSkinComboBox; 23 SpeedButton1: TSpeedButton; 24 ADOQuery1: TADOQuery; 25 ADOQuery2: TADOQuery; 26 Label3: TLabel; 27 Label6: TLabel; 28 Label7: TLabel; 29 bsSkinButton1: TbsSkinButton; 30 ADOQuery3: TADOQuery; 31 procedure Button1Click(Sender: TObject); 32 procedure bsSkinComboBox1Change(Sender: TObject); 33 procedure FormCreate(Sender: TObject); 34 procedure bsSkinComboBox3Change(Sender: TObject); 35 procedure bsSkinButton1Click(Sender: TObject); 36 procedure SpeedButton1Click(Sender: TObject); 37 private 38 { Private declarations } 39 public 40 { Public declarations } 41 end; 42 43 var 44 Form4: TForm4; 45 46 implementation 47 48 uses Unit1; 49 50 {$R *.dfm} 51 52 procedure TForm4.bsSkinButton1Click(Sender: TObject); 53 begin 54 self.Close; 55 form1.Show; 56 end; 57 58 procedure TForm4.bsSkinComboBox1Change(Sender: TObject); 59 begin 60 bsSkinComboBox2.Items.Clear; 61 adoquery1.Active:=false; 62 adoquery1.SQL.Clear; 63 adoquery1.SQL.Add(‘select * from team where 组别=‘‘‘+bsskincombobox1.Text+‘‘‘‘); 64 adoquery1.Active:=true; 65 adoquery1.First; 66 while not adoquery1.Eof do 67 begin 68 bsSkinComboBox2.Items.Add(adoquery1.fieldByName(‘队名‘).AsString); 69 adoquery1.Next; 70 end; 71 end; 72 73 procedure TForm4.bsSkinComboBox3Change(Sender: TObject); 74 begin 75 bsSkinComboBox4.Items.Clear; 76 adoquery2.Active:=false; 77 adoquery2.SQL.Clear; 78 adoquery2.SQL.Add(‘select * from team where 组别=‘‘‘+bsskincombobox3.Text+‘‘‘‘); 79 adoquery2.Active:=true; 80 adoquery2.First; 81 while not adoquery2.Eof do 82 begin 83 bsSkinComboBox4.Items.Add(adoquery2.fieldByName(‘队名‘).AsString); 84 adoquery2.Next; 85 end; 86 end; 87 88 procedure TForm4.Button1Click(Sender: TObject); 89 begin 90 self.Close; 91 form1.Show; 92 end; 93 94 procedure TForm4.FormCreate(Sender: TObject); 95 begin 96 bsSkinComboBox1.Items.Add(‘A组‘); 97 bsSkinComboBox1.Items.Add(‘B组‘); 98 bsSkinComboBox1.Items.Add(‘C组‘); 99 bsSkinComboBox1.Items.Add(‘D组‘); 100 bsSkinComboBox1.Items.Add(‘E组‘); 101 bsSkinComboBox1.Items.Add(‘F组‘); 102 bsSkinComboBox1.Items.Add(‘G组‘); 103 bsskinComboBox1.ItemIndex:=0; 104 bsSkinComboBox3.Items.Add(‘A组‘); 105 bsSkinComboBox3.Items.Add(‘B组‘); 106 bsSkinComboBox3.Items.Add(‘C组‘); 107 bsSkinComboBox3.Items.Add(‘D组‘); 108 bsSkinComboBox3.Items.Add(‘E组‘); 109 bsSkinComboBox3.Items.Add(‘F组‘); 110 bsSkinComboBox3.Items.Add(‘G组‘); 111 bsskinComboBox3.ItemIndex:=0; 112 end; 113 114 procedure TForm4.SpeedButton1Click(Sender: TObject); 115 var grade:integer; 116 begin 117 adoquery3.Close;//搜索平均分差记录。 118 adoquery3.SQL.Clear; 119 adoquery3.SQL.Add(‘select ‘+bsskincombobox2.Text+‘ as grade from VS where 队名=:a‘); 120 adoquery3.Parameters.ParamByName(‘a‘).Value:=bsskincombobox4.Text; 121 adoquery3.open; 122 grade:=Trunc(0.5+adoquery3.FieldByName(‘grade‘).AsFloat); 123 124 label6.Caption:=‘‘; 125 if grade=0 then 126 label7.Caption:=‘平‘ 127 else if grade>0 then 128 begin 129 label6.Caption:= bsskincombobox2.Text; 130 label7.Caption:=‘赢 ‘+floattostr(grade)+‘ 球‘; 131 end 132 else if grade<0 then 133 begin 134 label6.Caption:= bsskincombobox4.Text; 135 label7.Caption:=‘赢 ‘+floattostr(0-grade)+‘ 球‘; 136 end; 137 138 139 end; 140 141 end.
标签:
原文地址:http://www.cnblogs.com/xiaoyesoso/p/4356346.html