《世界杯彩票竞猜系统》设计报告

  1. 文档介绍
    1. 文档目的

足球彩票节是由爱彩网在2014年巴西世界杯前夕发起的彩民网上盛筵,从2014年6月3日开幕,至世界杯结束闭幕,此节日长达41天。节日期间爱彩网不间断推出众多促销活动惠及球迷和彩民,同时为世界杯助力造势。因此,建立一套基于计算机环境的技术先进、高效稳定、安全可靠的世界杯彩票竞猜测评系统是完全有必要的。

世界杯彩票竞猜系统的目的是自动分析、计算、统计、管理历届每次比赛数据,减少人工操作,降低计算失误,提高工作效率,减少彩民买彩票的不确定性,使买彩票变得系统化、自动化。

与传统的彩票凭运气相比,计算机不但能发挥计算机方便、快捷的功能,而且可以节省大量的资源费用等,更方便灵活操作,而且方便管理,增加世界杯彩票竞猜的稳定性,有效防止世界杯彩票竞猜的过大的风险,使世界杯彩票竞猜更加合理、更趋于高获奖率。因此开发一套比较成熟的世界杯彩票竞猜系统很有必要。

  1. 文档范围

本文档适用于项目开发的设计阶段,在项目开发阶段可按照本文档检验数据库的实施情况。

  1. 读者对象

 《世界杯彩票竞猜系统(Word Cup Football lottery ticket System)》的读者对象包括从事DBMS、面向对象编程、高校教务人员行业的工作者,高校中信息专业、计算机专业、管理专业、软件工程专业等有数据库课程的本科生、硕士生,深入学习SQLServer-数据库的读者,深入学习对象-关系数据库的读者,也可以作为数据库课程的参考资料。

本文档面向具有数据库开发使用经验的开发者中那些希望获得锻炼和提升的人。

  1. 参考文献

[1]张海藩.软件工程导论[M].北京:清华大学出版社.1998年

[2]郑人杰,殷人昆.软件工程概论[M].北京:清华大学出版社.2001年

[3]Katharine Whitehead.基于组件开发[M].北京:人民邮电出版社.2003年

[4]熊春荣,学校学生信息管理系统的设计与实现[J].玉林师范学院学报,2006年

[5]萨师煊,王珊.数据库系统概论(第三版)[M],高等教育出版社,2000年

[6]邵维忠,杨芙清著.面向对象的系统分析.北京:清华大学出版社,1998年

[7]张友生等编著.《软件体系结构》.北京:清华大学出版社,2006年

[8]吴洁明,袁山龙编著.软件工程应用实践教程.北京:清华大学出版,

2003年

  1. 术语与缩写解释

缩写、术语

解 释

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),如果一个并发调度的结果与一个串行调度等价,则称此调度是是可串行化调度

  1. 系统环境说明

数据库服务器选择Lenovo,操作系统使用windows7,数据库选用SQLServer。

程序设计语言为Delphi 7。Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语(Object-Oriented Language),当今世界上最快的编辑器和最为领先的数据库技术。

系统的硬件要求为微型计算机,8M以上的内存,500M以上的外存。

  1. 需求分析
    1. 功能需求分析

本系统主要进行学生的世界杯彩票竞猜综合成绩考核和班委对学生情况的管理记相关的活动。主要包含如下功能模块:

  1. 学生系统管理模块 该模块提供学生进行学生信息查询。实现学生的个人信息管理。方便了学生管理以及成绩考核查询,世界杯彩票竞猜。更能实现效率。
  2. 班委系统管理模块 该模块提供学生班委进行学生信息更改。实现班委的班级信息管理。方便了班委管理和成绩考核查询,世界杯彩票竞猜更改。更能实现效率。
    1. 非功能需求分析
  3. 技术需求 系统的学生、班委和教师组件要求运行在用windows操作系统的笔记本或台式机上。服务器组件要求必须使用C语言编写,并且相互之间使用组件交互标准CORBA(公用对象请求代理结构)或SOAP(缉拿的那对象访问协议)进行通信。
  4. 性能需求 系统的学生、班委和教师部分要求在所有的屏幕上都是半秒的响应时间,而服务器组件可能需要在同样的响应时间内支持上千个并发的学生教师操作。 3、可用性需求 基于web的界面符合整个组织范围内的图形设计准则,像菜单布局和格式、色彩设计、组织标志的使用规范化。 4、可靠性需求 当服务出现损耗或出现不正当处理、以及错误检测和恢复将会自动根据程序要求来进行自我修复和改进。
  5. 安全需求 对该系统输出的访问会受限于学生和教师,一些来自不属于学校的外人的访问需要得到授权,而其他的一些访问只是来自该机构的本地网络。该校可能需要喜爱通过Internet传送数据的时候要使用到加密技术,并且通过用户名和密码机制来控制对数据库服务器的访问。
    1. 数据库的命名规则

    (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)。

    1. 逻辑结构设计

    VS表

VS(队名,巴西,墨西哥,......,阿尔及利亚) result表

result(场次,主场,客场,主场分数,客场分数) team表

team(队名,组别)

  1. 物理结构设计

(1)主要是设计表结构。一般地,实体对应于表,实体的属性对应于表的列,实体之间的关系成为表的约束。逻辑设计中的实体大部分可以转换成物理设计中的表,但是它们并不一定是一一对应的。 (2)对表结构进行规范化处理(第三范式)。

  1. 表汇总

表名 功能说明 VS 记录预测分差 team 记录队伍的队名和组别 result 记录比赛比分结果

  1. 表VS

表名 VS 列名 数据类型(精度范围) 空/非空 约束条件 队名 Nvarchar(255) 非空 主键 巴西 Float 可以为空 无 墨西哥 Folat 可以为空 无 …… …… …… …… 阿尔及利亚 Float 可以为空 无 补充说明 记录预测分差

  1. 表team

表名 team 列名 数据类型(精度范围) 空/非空 约束条件 队名 Nvarchar(255) 非空 主键 组别 Nvarchar(255) 非空 无 补充说明 记录队伍的队名和组别

  1. 表result

表名 result 列名 数据类型(精度范围) 空/非空 约束条件 场次 Float 非空 主键 主场 Nvarchar(255) 非空 无 客场 Nvarchar(255) 非空 无 主场分数 Float 非空 无 客场分数 Float 补充说明 记录比赛比分结果

  1. 数据保护设计

提高软件系统的安全性应当从"管理"和"设计"两方面着手。这里仅考虑数据库的安全性设计。

  1. 防止用户直接操作数据库的方法

该系统用户帐号全部由系统管理员管理,在数据库中,对组和用户访问数据库权限的设置工作,只能通过管理员完成。设置的权限包括:"打开/运行",读取设计、修改设计、管理、读取数据,更新数据、插入数据和删除数据用户只能用通过认证的帐号登陆到应用软件,通过应用软件访问数据库,而没有其他途径操作数据库,且用户的操作权限有限,不能任意修改数据库中的关键数据,只能对数据进行读取和输入等常规操作,因能能很好的保护数据库的数据。 1.用户权限控制 给每个用户角色限制权限,不同的角色拥有不同的权限,用户只能行使自己权限范围内的权限,如普通用户只能查看自己的借阅记录不能任意修改,而管理员和超级管理员则可以修改用户的借阅记录,通过角色,权限等的一系列授予和回收操作可以有效的进行用户的权限控制,从而防止用户恶意操作、篡改数据库信息。 2.数据库登录设密 给数据库设置登录账号和密码,只有拥有直接访问数据库权限的用户在键入正确的账号和密码后才能通过软件登录到数据库进行操作,可防止用户恶意操作数据库。 3.限制操作系统存取权限 使用数据库系统是依存在操作系统之上的,如果操作系统被人侵入,那么通过修改配置文件等一系列方法,数据库的安全性也将荡然无存,所以对于安全性高的数据库,可以通过限制操作系统的存取权限来提高数据库的安全性。

  1. 用户帐号密码的加密方法

使用MD5加密方法对用户账号密码进行加密。 MD5方法采用单项加密的加密方法,即只能对数据进行加密,而不能对加密后的数据进行解密,这样经过MD5算法处理的账号和秘密存储在数据库中即使被人恶意获取到,也不可能知道密码的具体数据,即做到了对账号密码的更强的保护。

  1. 角色与权限

确定每个角色对数据库表的操作权限,如创建、检索、更新、删除等。每个角色拥有刚好能够完成任务的权限,不多也不少。在应用时再为用户分配角色,则每个用户的权限等于他所兼角色的权限之和。 角色 可以访问的表与列 操作权限 用户 result 增改查 VS 改查 team 查

  1. 实施与优化

在数据库的设计过程中经常要添加、删除数据库对象,这会使数据库内部留有许多碎片,不能有效地利用磁盘空间,文件会逐渐增大。这有点象文件系统经过多次的增删操作,会导致文件碎片,浪费磁盘空间,而且读写效率降低。可以用 Access 提供的工具来压缩数据库,它将重新安排数据库文件在磁盘中保存的位置,并释放磁盘空间,通常文件的容量会缩小成原来的几分。 分析并优化数据库的"时-空"效率,尽可能地"提高处理速度"并且"降低数据占用空间"。 (1)分析"时-空"效率的瓶颈,找出优化对象(目标),并确定优先级。 (2)当优化对象(目标)之间存在对抗时,给出折衷方案。 (3)给出优化的具体措施,例如优化数据库环境参数,对表格进行反规范化处理等。 优先级 优化对象(目标) 措施 高 数据库索引 根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量 高 数据库碎片 定期整理数据库产生的碎片,提高数据库的性能 高 数据库缓存 优化数据库缓存方案 高 数据库对象 优化数据库对象的放置策略,尽量让数据库对象均匀地把数据分布在系统的磁盘中,平衡I/O访问,避免I/O瓶颈。

  1. 运行管理与维护说明
    1. 数据库的转储和恢复

    DBA(即本系统的管理员)要针对不公的应用要求制定不同的转储计划,定期对数据库和日志文件进行备份,以保证数据库中数据在遭到破坏后能及时进行恢复。

    1. 维护数据库的完整性与安全性

    DBA应采取有效的措施保护数据不受非法盗用和遭到任何破坏

    1. 通过权限管理、口令、跟踪及审计来保证数据库的安全。
    2. 通过行政手段,建立一定规章制度以确保数据库的安全
    3. 数据库应备有多个副本并保存在不同的安全地点
    4. 采取有效的措施防止病毒入侵,当出现病毒后应及时查杀
    5. 监测并改善数据库性能

    DBA需要随时观察数据库的动态变化,并在数据库出现错误、故障或产生不适应情况时能够随时采取有效措施保护数据库

    1. 数据库的重组和重构
    2. 因为不断的删除会造成磁盘区内碎块的增多从而影响I/O速度,所以应该适时的进行数据库的重组和重构

数据库备份方案 添加任务计划,定期定时运行备份批处理命令,实现自动备份。 设计一个物理备份和逻辑备份相结合的数据库备份方案,以保证数据的完整性和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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券