机械 模具 夹具 数控 车床 工艺 液压 汽车 电机 升降台 控制 Proe CAD 建模 减速器 机械手 齿轮 故障 诊断 自动化 电气 监控 组态 电源 发电 水电 电站 单片机 PLC MATLAB 路径 盘算机 Android Linux 电子 通讯 治理系统 网站 ASP JSP PHP Java Asp.net 论坛 进销存 图书 考试 Web 购物 点餐 生意营业 平台 网络妄想 设置 C++ C# 土木 修建 施工 结构 框架 桥梁 水利 公路 隧道 造价 给水 教学楼 办公楼 水库 重力坝 化工 合成 工段 物流 仓储 包装 开题 使命书 外文 文献 翻译 答辩 名堂 课程
 首 页 机械结业设计 电子电气结业设计 盘算机结业设计 土木匠程结业设计 视觉转达结业设计 免费结业设计 牛牛棋牌下载 结业论文范文 结业设计论文流程 
垫片
您现在所在的位置:澳门牛牛平台 >>免费结业设计 >> 文章内容
垫片
   我们提供全套结业设计论文服务,联系   625110801   
图书客栈治理系统的设计
文章泉源:mog-net.com   宣布者:结业设计网站   宣布时间:2008-09-16 09:20:22   阅读:59649

摘 要
    本系统主要完成对图书客栈的库存治理,包罗图书入库、出库、库存,员工信息,供应商信息以及密码治理等六个方面。系统可以完成对种种信息的浏览、查询、添加、删除、修改、报表等功效。
    系统的焦点是入库、库存和出库三者之间的联系,每一个表的修改都将联动的影响其它的表,当完成入库或出库操作时系统会自动地完成库存的修改。查询功效也是系统的焦点之一,在系统中即有单条件查询和多条件查询,也有准确查询和模糊查询,系统不仅有静态的条件查询,也有动态天生的条件查询,其目的都是为了利便用户使用。系统有完整的用户添加、删除和密码修改功效,并具备报表打印功效。
系统接纳Microsoft Office中的Access 2000来设计数据库,并使用当前优异的开发工具—Delphi 6.0 ,它有着最为无邪的数据库结构,对数据库应用有着优异的支持。
    论文主要先容了本课题的开发配景,所要完成的功效和开发的历程。重点的说明晰系统设计的重点、设计头脑、难点手艺息争决方案。

要害字:数据库,SQL语言,Delph 6,数据库组件,客栈治理

目 录

第一章 弁言 ……………………………………………………………………………1
1.1 课题泉源 ……………………………………………………………………1
1.2 开发工具的选择 ……………………………………………………………2
1.3 所做的主要事情 ……………………………………………………………3
第二章 数据库概论 ……………………………………………………………………4
2.1 数据库的生长 ………………………………………………………………4
2.1.1 数据库的生长 …………………………………………………………4
2.1.2 数据库阶段的特点 ……………………………………………………5
2.1.3 数据库手艺 ……………………………………………………………6
2.2 数据库理论基础 ……………………………………………………………7
2.2.1 数据库模子 ……………………………………………………………7
2.2.2 数据库系统结构 ……………………………………………………10
2.2.3 数据的自力性 ………………………………………………………11
2.2.4 范式 …………………………………………………………………11
2.3 SQL语言基础 ……………………………………………………………13
2.3.1 SQL简介 ……………………………………………………………13
2.3.2 SQL查询 ……………………………………………………………13
2.3.3 SQL数据更新 ………………………………………………………14
第三章数据库开发工具 ……………………………………………………………16
3.1 Delphi 6.0 简介 ……………………………………………………………16
3.2 Delphi 6.0 控件 ……………………………………………………………17
3.2.1 ADO数据会见组件 …………………………………………………17
3.2.2 数据控制类DataControl ……………………………………………18
3.2.3 数据会见类DataAccess ……………………………………………18
3.2.4 SQL语言在Delphi中的应用 ………………………………………19
3.3 Access 简介 ………………………………………………………………21
第四章 系统总体设计 ………………………………………………………………23
4.1 系统需求剖析 ……………………………………………………………23
4.2 系统提要设计 ……………………………………………………………25
4.2.1 系统结构设计 ………………………………………………………25
4.2.2 数据库设计 …………………………………………………………27
4.2.2.1 ER图设计 ……………………………………………………27
4.2.2.2 数据库表格设计………………………………………………29
4.3系统详细设计………………………………………………………………34
第五章 系统应用法式设计 …………………………………………………………37
5.1 系统窗体模块组成…………………………………………………………37
5.2 数据模块窗体设置…………………………………………………………38
5.3 主窗体功效模块的实现……………………………………………………39
5.4 入库、出库窗体模块的实现………………………………………………43
5.5 查询功效的实现……………………………………………………………51
5.6 系统上岸窗体模块的实现…………………………………………………52
5.7 用户治理功效的实现………………………………………………………54
5.7.1 用户治理主窗体 ……………………………………………………54
5.7.2 密码修改窗体模块的实现 …………………………………………54
5.7.3 用户注册窗体模块的实现 …………………………………………55
5.7.4 用户注销窗体模块的实现 …………………………………………57
竣事语 …………………………………………………………………………………59
致谢 ……………………………………………………………………………………60
参考文献 ………………………………………………………………………………61
第一章 引 言
  §1.1 课题泉源

    随着社会经济的迅速生长和科学手艺的周全前进,盘算机事业的飞速生长,以盘算机与通讯手艺为基础的信息系统正处于蓬勃生长的时期。随着经济文化水平的显著提高,人们对生涯质量及事情情形的要求也越来越高。书籍做为人类的精神食粮,在现代社会中越来越受到重视,大量的书籍泛起在市场上,人们有了种种各样差异的选择。与此同时,为了治理大量的图书,图书客栈也大量的泛起,客栈的治理问题也就提上了日程。随着图书的大量增添,其治理难度也越来越大,怎样优化客栈的一样平常治理也就成为了一个通俗化的课题。
    在盘算机飞速生长的今天,将盘算机这一信息处置赏罚利器应用于客栈的一样平常治理已是势必所然,而且这也将为客栈治理带来亘古未有的改变,它可以带来意想不到的效益,同时也会为企业的飞速生长提供无限潜力。接纳盘算机治理信息系统已成为客栈治理科学化和现代化的主要标志,它给企业治理来了显着的经济效益和社会效益。主要体现在:
    极大提高了客栈事情职员的事情效率,大大镌汰了以往入出存流程繁琐,杂乱,周期长的误差。基于客栈治理的周全自动化,可以镌汰入库治理、出库治理及库存治理中的误差,可以节约不少治理开支,增添企业收入。客栈的治理的操作自动化和信息的电子化,周全提高了客栈的治理水平。随着我国刷新开放的一直深入,经济飞速的生长,企业要想生涯、生长,要想在强烈的市场竞争中立于不败之地,没有现代化的治理是万万不行的,客栈治理的周全自动化、信息化则是其中极其主要的部门。为了加速客栈治理自动化的法式,提高客栈的治理营业处置赏罚效率,建设客栈治理系统已变得十分心要。入库、库存、出库照旧现在企业图书客栈治理的通例基本模式,虽然,最近又泛起了许多新的治理模式,如:基于零库存头脑的沃尔玛特治理方式,但这些新的头脑在中国大部门企业的治理中照旧难以实现的。以是怎样设计好客栈治理系统,尽可能地镌汰客栈治理的重复性和低效性就成为当前最为主要的问题。图书客栈治理的焦点是入库、库存和出库之间的联系,如那里置赏罚好三者之间的关系是系统最为要害的部门。另外,员工信息和供应商信息治理也是客栈治理中一个必不行少的部门,它提供着与入库和出库相关的地一些信息,使得整个系统越发完整,越发适用。通过对客栈治理一样平常事情的详细视察,搜集了大量的资料,从系统结构的组织,功效的实现,手艺的要求以及可行性等多方面举行思量,以为本课题是一个顺应现今图书客栈治理需求的盘算机信息治理系统,具有一定的现实开发价值和使用价值。
  §1.2 开发工具的选择
    自Java降生以来,随着Internet手艺的普及和应用需求的转变,以第四代语言为主的应用开发产物发生了较大的转变,它们不仅已成为人们开发应用的开发工具,而且许多产物已生长成为一种强有力的应用开发情形。这些新型的开发工具通常以一种集成软件包的形式提供应开发职员,被称为Studio(事情室)或Suite(法式组)。例如,微软的Visual Studio 6.0,Borland公司的Delphi 6.0等数据库辅助开发工具。
    现在,市场上可以选购的应用开发产物许多,盛行的也有数十种。现在在我国市场上最为盛行、使用最多、最为先进的可用作企业级开发工具的产物有:
Microsoft公司的Visual Basic 6.0版
Microsoft公司的Visual C 6.0版
Borland公司的Delphi 6.0版
    在现在市场上这些众多的法式开发工具中,有些强调程语言的弹性与执行效率;有些则着重于可视化法式开发工具所带来的便利性与效率的得高,各有各的优点和特色,也知足了差异用户的需求。然而,语言的弹性和工具的便利性是密不行分的,只有便利的工具,却没有弹性的语言作支持,许多特殊化的处置赏罚行动必须要泯灭数倍的时光来处置赏罚,使得原来所标榜的效率提高的优点失去了作用;相反,若是只强调程语言的弹性,却没有便利的工具作配合,会使一些纵然很是简朴的界面处置赏罚行动,也会严重地铺张法式设计师的名贵时间。
    而Delphi是一个很是理想选择。Delphi 6 是操作系统中快速应用开发情形的最新版本。它也是当前Windows平台上第一个周全支持最新Web服务的快速开发工具。无论是企业级用户,照旧小我私人开发者,都能够使用Delphi 6 轻松、快捷地构建新一代电子商务应用。Delphi 6 是惟一支持所有新泛起的工业尺度的RAD情形,包罗XML(扩展标志语言)/XSL(可扩展样式语言),SOAP(简朴工具存取协议)和WSDL(Web服务器形貌语言)等。
    Delphi 6 是可视化的快速应用法式开发语言,它提供了可视化的集成开发情形,这一情形为应用法式设计职员提供了一系列无邪而先进的工具,可以普遍地用于种类应用法式设计。在Delphi 6 的集成开发情形中,用户可以设计法式代码、运行法式、举行法式错误的调试等,可视化的开发要领降低了应用法式开发的难度。Delphi的基础编程语言是具有面向工具特征的Pascal语言,即Object Pascal 。Object Pascal具有代码稳固、可读性好、编译速率快等优点,并将面向工具的看法移植到了Pascal语言中,使这种基础语言有了新的生长空间。使用Delphi 6.0 ,我们险些可以作任何事情,还可以撰写种种种类型的应用法式,动态链接库(DLL)、CON、或CORBA工具,CGI/ISAPI法式,Microsoft Back Office应用法式。法式的规模小到简朴的小我私人数据库应用,大到重大的企业的多条理漫衍式系统,都可以使用Delphi举行开发,其友好的集成开发界面,可视化的双向开发模式,优异的数据库应用支持高效的法式开发和法式运行,备受宽大法式开发职员的好评。尤其是Delphi对数据库应用的强盛支持,大大提高了数据库应用软件开发的效率,缩短了开发周期,深受宽大数据库应用法式设计职员的喜欢。Delphi为数据库应用开发职员提供了富厚的数据库开发组件,使数据库应用开发功效更强盛,控制更无邪,编译后的法式运行速率更快。
  §1.3 本文所做事情
    弁言部门先容了本系统的课题泉源以及对数据库开发工具的选择。
    第二章先容了数据库的生长,关系数据库,数据库系统结构,并系统先容了SQL语言,为设计和明确应用法式做了铺垫。
    第三章系统先容了Delphi 6.0及其部门控件,SQL语言在Delphi 6.0中的应用,以及Access等。
第四章是本文的主体,凭证软件工程的要求,从需求剖析最先,经由提要设计最后到详细设计,完成对整个系统的设计。
    第五章凭证第四章的设计效果使用Access 2000和Delphi 6.0举行了详细的窗体和应用法式设计。
总结部门先容了设计体会和编程体会,并指出了系统设计中的不足和刷新的偏向

第二章 数据库概论
  §2.1 数据库的生长
    数据库处置赏罚在信息系统的研究中一直是很是主要的主题,然而,近年来,随着World Wide Web(WWW)的猛增及Internet手艺的迅速生长,使得数据库手艺之时成为最热门手艺之一。数据库手艺能使Internet应用逾越具有早期应用特点的简朴的宣布。同时,Internet手艺提供了一种向用户宣布数据库内容的尺度化的会见要领。这些手艺没有脱离经典数据库手艺的要求。它们只是加重了数据库手艺的主要性。
数据库的设计和开发及包罗艺术有包罗工程。明确用户的需求,然后,把它们转变为有用的数据库设计是一个艺术历程。把设计转变为现实的数据库,而且这些数据库带有功效完整、高效能的应用,是一个工程历程。
数据库的目的是资助人们跟踪事务。经典的数据库应用涉及诸如订单、主顾、事情、员工、学生、电话之类的项,或其它数据量较大、需要密起关注的事务。最近,由于数据库的普及,数据库手艺已经被应用到了新的领域,诸如用于Internet的数据库或用于公司内联网的数据库。数据库也被越来越多地应用于天生和维护多媒体应用法式上。
盘算机的数据处置赏罚应用,首先要把大量的信息以数据形式存放在存储器中。存储器的容量、存储速坦率接影响到数据治理手艺的生长。从1956年生产出第一台盘算机到现在,存储器的生长,为数据库手艺提供了优异的物质基础。
使用盘算机以后,数据处置赏罚的速率和规模,无论是相对于手工方式,照旧机械方式,都有无可相比的优势。通常在数据处置赏罚中,盘算是较量简朴的而数据的治理却较量重大。数据治理是指数据的网络、整理、组织、存储、维护、检索、传送等操作,这部门操作是数据处置赏罚营业的基本环节,而且是任何数据处置赏罚营业中必不行少的共有部门。数据治理手艺的优劣,将直接影响数据处置赏罚的效率。
2.1.1 数据库的生长
数据治理手艺的生长,与硬件(主要是外存)、软件、盘算机应用的规模有亲近的联系。数据治理手艺的生长经由三个阶段:人工治理阶段、文件系统阶段和数据库阶段。
人工治理阶段和文件系统阶段都有着相当多的缺陷,诸如数据冗余性 ,数据纷歧致性以及数据联系弱等等。也正是由于这些缘故原由,促使人们研究新的数据治理手艺,从而发生了数据库手艺。
20世纪60年月末发生的三件大事,条理模子IMS系统的推出、关于网状模子DBTG陈诉的揭晓以及关于关系模子论文的一连揭晓标志着数据治理手艺进入数据库阶段。进入70年月以后,数据库手艺获得迅速生长,开发了许多有用的产物并投入运行。数据库系统战胜了文件系统的缺陷,提供了对数据更高级更有用的治理。
当进入数据库阶段后,随着数据治理规模一再扩大,数据量急剧增添,为了提高效率,最先时,人们只是对文件系统加以扩充,在应用文件中建设了许多辅助索引,形成倒排文件系统。但这并不能最终解决问题。在20世纪60年月末,磁盘手艺取得主要希望,具有数百兆容量和快速存取的磁盘陆续进入市场,成本也不高,为数据库手艺的发生提供了优异的物质条件。
2.1.2 数据库阶段的特点
(1)镌汰数据的重复(Redundancy can be reduced)
当在一个非数据库系统当中,每一个应用法式都有属于他们自己的文件,由于无法有系统建设的数据,因此经常会造成存储数据的重复与铺张。例如:在一家公司当中,人事治理法式与人为治理法式或许都市使用到职员与部门的信息或文件,而我们可以运用数据库的要领,把这两个文件整理起来,以镌汰多余的数据,太过地占用存储空间。
(2)阻止数据的纷歧致(Inconsistency can avoid)
本项的特色,可以说是延伸前项的一个特点,要说明这样的一个征象,我们可以从下面这个实例来看:若是在统一家公司当中,职员甲在筹谋部门事情,且职员甲的纪录同时被存放在数据库的两个地方,而数据库治理系统却没有对这样主要的情形加以控制,当其中一条数据库被修改时,便会造成数据的纷歧致,可是,对于一个健全的数据库治理系统而言,将会对这样的情形加以控制,但有时并不需要刻意消除这种情形,应当视该数据库的需求与效率来决议。
(3)数据共享(Data shared)
对于数据共享的意义,并不是只有针对数据库设计的应用法式,可以使用数据库中的数据,对于其他撰写好的应用法式,同样可以对相同数据库当中的数据举行处置赏罚,进而到达数据共享的目的。
(4)强化数据的尺度化(Standard can be enforced)
由数据库治理系统,对数据做出统筹性的治理,对于数据的名堂与一些存储上的尺度举行控制,云云一来,对于差异的情形的数据交流(Data Interchange)上将有很大的资助,也能提高数据处置赏罚的效率。
(5)实践清静性的治理(Security restriction can be applied)
通过对数据库完整的权限控制,数据库治理者可以确认所有可供用户存取数据的正当途径渠道,而且可以事先对一些较主要或要害性的数据举行清静检查,以确保数据存取时,能够将任何不妥损毁的情形降至最低。
(6)完整性的维护(Integrity can be maintained)
所谓完整性的问题,就是要确认某条数据在数据库当中,是准确无误的。正如(2)所述,若是无法控制数据的纷歧致性,便会发生完整性不足的问题,以是,我们会发现,当数据重复性高的时间,数据不完整的情形也会增添,虽然,若是数据库的功效完整,将会大大地提高数据完整性,也会增添数据库的维护能力与维护轻盈性。
(7)需求冲突会获得平衡(Conflicting requirements can be balance)
在一个较大型的企业当中,用户差异的需求,往往会造成系统或数据库在设计上的困扰,可是一个合适的数据库系统,可以通过数据库治理员的治理,将会有用地整理各方面的信息,对于一些较主要的应用法式,可以适时地提供较快速的数据存取要领与名堂,以平衡多个用户在需求上的冲突。
上述七个方面组成了数据库系统的主要特征。这个阶段的法式和数据间的联系可用下图体现:
2.1.3 数据库手艺
从文件系统生长到数据库系统是信息处置赏罚领域的一个重大转变。在文件系统阶段,人们关注的中央问题是系统功效的设计,因而法式设计处于主导职位,数据只起着听从法式需要的作用。在数据库方式下,信息处置赏罚看法已为新系统所取代,数据占有了中央位置。数据结构的设计成为信息系统首先体贴的问题,而使用这些数据的应用法式设计则退居到以既定的数据结构为基础的外围职位。
现在天下上已有数百万个数据库系统在运行,其应用已经深入到人类社会生涯的各个领域,从企业治理、银行营业、资源分配、经济展望一直到信息检索、档案治理、普查统计等。并在通讯网络基础上,建设了许多国际性的联机检索系统。我国20世纪90年月初在天下规模内装备了12个以数据库手艺为基础的大型盘算机系统,这些系漫衍在邮电、计委、银行、电力、铁路、气象、民航、情报、公安、军事、航天和财税等行业。
数据库手艺还在一直的生长,而且一直地与其它盘算机手艺相互渗透。数据库手艺与网络通讯手艺相团结,发生了漫衍式数据库系统。数据库手艺与面向工具手艺相团结,发生了面向工具数据库系统。
在数据库手艺中有四个名词,其看法应该分清。
(1)数据库(database,DB):DB是统一治理的相关数据的荟萃。DB能为种种用户共享,具有最小冗余度,数据间联系亲近,而又有较高的数据自力性。
(2)数据库治理系统(Database Management System,DBMS):DBMS是位于用户与操作系统之间的一层数据治理软件,为用户或应用法式提供会见DB的要领,包罗DB的建设、查询、更新及种种数据控制。DBMS总是基于某种数据模子,可以分为条理型、网状型、关系型和面向工具型DBMS。

(3)数据库系统(Database System,DBS):DBS是实现有组织地、动态地存储大量关联数据,利便多用户会见的盘算机软件、硬件和数据资源组成的系统,即接纳了数据库手艺的盘算机系统。
(4)数据库手艺:这是一门研究数据库的结构、存储、治理和使用的软件学科。数据库手艺是操作系统的文件系统基础上生长起来的。而DBMS自己要在操作系统的支持下才气事情。数据库不仅用到数据结构的知识,而且富厚了数据结构的内容。在关系数据库中要用到荟萃论、数理逻辑的理论。因此,数据库手艺是一门综合性较强的学科。
§2.2数据库理论基础
2.2.1 数据库模子
从20世纪50年月中期最先,盘算机的应用由科学研究部门逐步扩展到企业、行政部门。至60年月,数据处置赏罚成为盘算机的主要应用。数据库手艺作为数据治理手艺,是盘算机软件领域的一个主要分支,发生于60年月末。现已形成相当规模的理论系统和适用手艺。
模子是对现实天下的抽象。在数据库手艺中,我们用模子的看法形貌数据库的结构与语义,对现实天下举行抽象,体现实体类型及实体间联系的模子称为“数据模子” 。
现在普遍作用的数据模子可分为两种类型。
一种是自力于盘算机系统的模子,完全不涉及信息在系统中的体现,只是用来形貌某个特定组织所体贴的信息结构,这类模子称为“看法数据模子” 。要领模子用于建设信息天下的数据模子,强调其语义表达功效,应该看法简朴、清晰,易于用户明确,它是现实天下的第一层抽象,是用户和数据库设计职员之间举行交流的工具。这一其中著名的模子是“实体联系模子” 。
另一种数据模子是直接面向数据库的逻辑结构,它是现实天下的第二层抽象。 这类模子涉及到盘算机系统和数据库治理系统,又称为“结构数据模子” 。例如,条理、网状、关系、面向工具等模子。这类模子有严酷的形式化界说,以便于在盘算机系统中实现。
(1)条理模子。用树型结构体现实体类型及实体间联系的数据模子。树的结点是纪录类型,每个非根结点有且只有一个父结点。上一层纪录类型和下一层纪录类型间联系是1∶N联系。
条理模子的特点是纪录之间的联系通过指针实现,查询效率较高。但条理模子有两个弱点:一是只能体现1∶N联系,虽然有多种辅助手段实现了M∶N联系,但都较重大,用户不易掌握,二是由于树型结构条理顺序的严酷和重大,引起数据的查询和更新操作也很重大,因此,编写应用法式也很重大。
(2)网状模子。用有向图结构体现实体类型及实体间联系的数据模子。。1969年DBTG陈诉提出的数据模子是网状模子的主要代表。有向图中的结点是纪录类型,有向边体现从箭尾一端的纪录类型到箭头一端的纪录类型间联系是1∶N联系。
网状模子的特点:纪录之间联系通过指针实现,M∶N联系也容易实现(每个M∶N联系可拆成两个1∶N联系),查询效率较高。网状模子的弱点是编写应用法式较量重大,法式员必须熟悉数据库的逻辑结构。由于条理系统和网状系统的应用法式体例较量重大,因此,从20世纪80年月中期起,其市场已被关系系统所取代。可是使用这两种模子建设起的许多数据库仍然在正常运转,只是在外层加了个关系数据库语言的接口。网状模子有许多乐成的产物,20世纪70年月的产物大部门网状系统,例如,Honeywell公司的IDS/Ⅱ、HP公司的IMAGE/3000、Burroughs公司的DMSⅡ、Umivac公司的DMS1100、Cullinet公司的IDMS、Cimcom公司的TOTAL等
(3)关系模子。关系模子的主要是用二维表格结构表达实体集,用外键体现实体间联系。关系模子是由若干个关系模式组成的荟萃。关系模式相当于前面提到的纪录类型,它的实例称为关系,每个关系现实上是一张二维表格。
关系模子和条理、网状模子的最大判别是用要害码而不是用指针导航数据,表格简朴用户易懂,编程时并不涉及存储结构,会见手艺等细节。关系模子是数学化模子。SQL语言是关系数据库的尺度化语言,已获得了普遍的应用。20世纪70年月对关系数据库的研究主要集中在理论和实验系统的开发方面。80年月初才形成产物,但很快获得普遍的应用和普及,并最终取代了条理、网状数据库产物。现在市场上典型的关系DBMS产物有DB2、ORACLE、SYBASE、INFORMIX和微机型产物Foxpro、Access等。
关系模子和网状、条理模子的最大区别是:关系模子用表格数据而不是通过指针链来体现和实现实体间联系。关系模子的数据结构简朴、易懂。只需用简朴的查询语句就可对数据库举行操作。
关系模子是数学化的模子,可把表格看成一个荟萃,因此荟萃论、数理逻辑等知识可引入到关系模子中来。关系模子已是一个成熟的有前途的模子,已获得普遍应用。
(4)面向工具模子。现在,关系数据库的使用已相当普遍,可是,现实天下中仍然存在着许多含有重大数据结构的应用领域,例如,CAD数据、图形数据等,而关系模子在这方面的处置赏罚能力就显得力有未逮。因此,人们需要更高级的数据库手艺来表达这类信息。面向工具的看法最早泛起在法式设计语言中,随后迅速渗透到盘算机领域的每一个分支。面向工具数据库是面向工具看法与数据库手艺相团结的产物。
面向工具模子能完整地形貌现实天下的数据结构,具有富厚的表达能力,但模子相对较重大,涉及的知识面也广,因此面向工具数据库尚未到达关系数据库那样的普及水平。

2.2.2 数据库系统结构
数据库的系统结构分三级:内部级(internal),看法级(conceptual)和外部级(external)。这个三级结构有时也称为“三级模式结构”,或“数据抽象的三个级别”,最早是在1971年通过的DBTG陈诉中提出,厥后收入在1975年的美国ANSI/SPARC陈诉中。虽然现在DBMS的产物多种多样,在差异的操作系统支持下事情,可是大多数系统在总的系统结构上都具有三级模式的结构特征。从某个角度看到的数据特征称为“数据视图”(data view)。
外部级最靠近用户,是单个用户所能看到的数据特征。单个用户使用的数据视图的形貌称为“外模式”。
看法级涉及到所有用户的数据界说,是全局的数据视图。全局数据视图的形貌称为“看法模式”。
内部级最靠近于物理存储装备,涉及到现实数据存储的结构。物理存储数据视图的形貌称为“内模式”。
数据库的三级模式结构是数据的三个抽象级别。它把数据的详细组织留给DBMS去做,用户只要抽象地处置赏罚数据,而不必体贴数据在盘算机中的体现和存储,这样就减轻了用户使用系统的肩负。
三级结构之间往往差异很大,为了实现这三个抽象级此外联系和转换,DBMS在三级结构之间提供两个条理的映象(mappings):外模式/模式映象,模式/内模式映象。此处模式是看法模式的简称。
2.2.3 数据的自力性
由于数据库系统接纳三级模式结构,因此系统具有数据自力性的特点。在数据库手艺中,数据自力性是指应用法式和数据之间相互自力,不受影响。数据自力性分成物理数据自力性和逻辑数据自力性两级。
(1)物理数据自力性
若是数据库的内模式要举行修改,即数据库的存储装备和存储要领有所转变,那么模式/内模式映象也要举行相当的修改,使看法模式尽可能保持稳固。也就是对内模式的修改只管不影响看法模式,虽然,对于外模式和应用法式的影响更小,这样,我们称数据库到达了物理数据自力性。
(2)逻辑数据自力性
若是数据库的看法模式要举行修改,譬如增添纪录类型或增添数据项,那么外模式/模式映象也要举行响应的修改,使外模式尽可能保持稳固。也就是对看法模式的修改只管不影响外模式和应用法式,这样,我们称数据库到达了逻辑数据自力性。
现有关系系统产物均提供了较高的物理自力性,而对逻辑自力性的支持尚有欠缺,例如,对外模式的数据更新受到限制等。
2.2.4 范式
建设起一个优异的数据指标系统,是建设数据结构和数据库的最主要的一环。一个优异的数据指标系统是建设DB的须要条件,但不是充实条件。我们完全可以以为所建指标系统中的一个指标类就是关系数据库中的一个基本表,而这个指标类下面的一个个详细指标就是这个基本表中的一个字段。但若是直接凭证这种方式建库显然还不能算最佳。对于指标系统中数据的结构在建库前还必须举行规范化的重新组织。
在数据的规范化表达中,一样平常将一组相互关联的数据称为一个关系(relation),而在这个关系下的每个数据指标项则被称为数据元素(data element),这种关系落实到详细数据库上就是基本表,而数据元素就是基本表中的一个字段(field)。规范化表达还划定在每一个基本表中必须界说一个数据元素为要害字(key),它可以唯一地标识出该表中其它相关的数据元素。在规范化理论中表是二维的,它有如下四个性子:
在表中的恣意一列上,数据项应属于统一个属性(如图中每一列都存放着差异条约纪录的统一属性数据)。
表中所有行都是不相同的,不允许有重复组项泛起(如图中每一行都是一个差异的条约纪录)。
在表中,行的顺序无关紧要(如图中每行存的都是条约纪录,至于先放哪一个条约都没关系)。
在表中,列的顺序无关紧要,但不能重复(如图中条约号和条约名谁先谁后都没关系,但二者不行重复或同名)。
在对表的形式举行了规范化界说后,数据结构尚有五种规范化界说,命名为规范化模式,称为范式。在这五种范式中,一样平常只用前三种,对于常用系统就足够了。而且这五种范式是“向上兼容”的,即知足第五范式的数据结构自动知足一、二、三、四范式,知足第四范式的数据结构自动知足第一、二、三范式,……,依此类推。
第一范式(first normal form,简称1st NF)就是指在统一表中没有重复项泛起,若是有则应将重复项去掉。这个去掉重复项的历程就称之为规范化处置赏罚。在本文所讨论的开发要领里,1st NF现实上是没有什么意义的。由于我们按规范化建设的指标系统和表的历程都自动保证了所有表都知足1st NF。
第二范式(second normal form,简称 2nd NF)是指每个表必须有一个(而且仅一个)数据元素为主要害字(primary key),其它数据元素与主要害字逐一对应。例如,在图l9.7中若是我们将条约号界说为主要害字(其它数据元素中的纪录数据都有可能重名,故不能作为主要害字),故只要知道了一个条约纪录的条约号,就可以唯一地在统一行中找到该条约的任何一项详细信息。通常我们称这种关系为函数依赖(functional depEndence)关系。即表中其它数据元素都依赖于主要害字,或称该数据元素唯一地被主要害字所标识。
第三范式(third normal form,简称 3rd NF)就是指表中的所有数据元素不光要能够唯一地被主要害字所标识,而且它们之间还必须相互自力,不存在其它的函数关系。也就是说对于一个知足了 2nd NF的数据结构来说,表中有可能存在某些数据元素依赖于其它非要害宇数据元素的征象,必须加以消除。
为防止数据库泛起更新异常、插入异常、删除异常、数据冗余太大等征象,关系型数据库要只管按关系规范化要求举行数据库设计。


§2.3 SQL语言基础
2.3.1 SQL简介
用户对数据库的使用,是通过数据库治理系统提供的语言来实现的。差异的数据库治理系统提供差异的数据库语言。关系数据库治理系统险些都提供关系数据库尺度语言——SQL。
SQL 的全称是Structured Query Language,即结构化查询语言。SQL语句可以从关系数据库中获得数据,也可以建设数据库、增添数据、修改数据。1986年ANSI接纳SQL语言作为关系数据库系统的尺度语言,后被国际化尺度组织(ISO)接纳为国际尺度。SQL语言使用利便、功效富厚、精练易学,是操作数据库的工业尺度语言,获得普遍地应用。例如关系数据库产物DB2、ORACLE等都实现了SQL语言。同时,其它数据库产物厂家也纷纷推出各自的支持SQL的软件或者与SQL的接口软件。这样SQL语言很快被整个盘算机界认可。
SQL语言是一种非历程化语言,它一次处置赏罚一个纪录荟萃,对数据提供自动导航。SQL语言允许用户在高层的数据结构上事情,而差池单个纪录举行操作。SQL语言不要求用户指定数据的存取要领,而是使用查询优化器,由系统决议对指定数据存取的最快速手段。当设计者在关系表上界说了索引时,系统会自动使用索引举行快速检索,用户不需知道表上是否有索引或者有什么类型的索引等细节。
SQL语言可以完成许多功效,例如:
● 查询数据
● 在数据库表格中插入、修改和删除纪录
● 建设、修改和删除数据工具
● 控制对数据和数据工具的存取
● 确保数据库的一致性和完整性等
2.3.2 SQL查询
数据查询是关系运算理论在SQL语言中的主要体现,SELECT 语句是SQL查询的基本语句,当我们在对一个数据库进种种各样的操作时,使用的最多的就是数据查询,在以SQL为基础的关系数据库中,使用的最多的就是SELECT查询语句。
SELECT语句的完整句法如下:
SELECT 目的表的列名或列表达式序列
FROM 基本表和(或)视图序列
[WHERE 行条件表达式]
[GROUP BY 列名序列]
[HAVING 组条件表达式]
[ORDER BY列名 [ASC│DEAC]…]
我在SELECT语句中还使用了大量的保留字和通配符以举行种种各样的条件查询。在系统中有大量的查询按钮,其使用了大量的查询语句,而且这些查询语句大部门使用的是模糊查询,以是大量的使用了模式匹配符LIKE(判断值是否与指定的字符通配名堂相符)。在包罗LIKE的查询语句中可以使用两个通配符:%(百分号):与零个或多个字符组成的字符串匹配;_(下划线):与单个字符匹配。系统中的条件判断往往包罗多个条件,这时就需要使用逻辑运算符NOT、AND、OR(用于多条件的逻辑毗连),谓词ALL以及保留字DISTINCT等等。做为SELECT语句尚有许多的使用要领,这里就不再叙述。
2.3.3 SQL数据更新
使用数据库的目的是为了有用地治理数据,而数据的插入、删除和修改则是必不行少的一个功效。在本系统中就大量地使用了数据插入、删除和修改这三种操作,现做一个简朴地先容。
●数据插入
往数据库的基本表中插入数据使用的是INSERT语句,其方式有两种:一种是元组值的插入,另一种是查询效果的插入。在本系统中使用的是前一种方式,其句法如下:
INSERT INTO 基本表名(列表名)VALUES(元组值)
●数据删除
往数据库的基本表中删除数据使用的是DELETE语句,其句法如下:
DELETE FROM 基本表名 [WHERE 条件表达式]
在些作一点说明,删除语句现实上是“SELECT * FROM 基本表名 [WHERE 条件表达式]”和DELETE操作的团结,每找到一个元组,就把它删除。此外,DELETE语句只能从一个基本表中删除元组,WHERE子句中条件可以嵌套,也可以是来自几个基本表的复合条件。
●数据修改
当需要修改基本表中元组的某些列值时,可以用UPDATE语句实现,其句法如下:
UPDATE基本表名
SET列名=值表达式[,列名=值表达式…]
[WHERE条件表达式]
在Delphi中使用SQL语句是很利便的,一样平常来说,都是通过TQuery组件来使用SQL语言的。有一点要举行说明,虽然通过TQuery组件来使用SQL语言很利便,但思量到自己对差异组件的明确水平、小我私人习惯以及其它各个方面,在本系统中我接纳的是ADO组件来对数据库举行操作。最简朴的要领好比在TADOQuery组件的SQL属性中就可以键入SQL语句,至于详细的使用要领在后面举行先容。


第三章 数据库开发工具
§3.1 Delphi 6.0 简介
Delphi类可以简陋地分成两部门:一部门是组件类,这些组件类通常以某种方式泛起在组件面板上,当用户从组件面板上点取一个类的图标后,在法式中就自动天生了该类的工具(非可视组件除外);另一部门是功效类,这此功效类的工具通常泛起在法式代码中,起着不行取代的作用,可是这些功效类在组件面板上是找不到的。在Delphi中,每一个类的祖先都是Tobject类,整个类的条理结构就像一棵倒挂的树,在最顶层的树根即为Tobject类。这样,凭证面向工具编程的基本头脑,就使得用户可用Tobject类这个类型取代任何其它类的数据类型。现实上在Delphi的类库中,Tobject类派生出了为数相当众多的子类,它们形成了一个重大的系统,通常情形下,若是不自行开发组件,就不必相识整个类的系统结构,只用到类条理树的叶结点就足够了。
通常做过法式开发的人都知道从来没有单纯的数据应用法式,也就是说,数据库应用法式必须和用户界面(可以是图形界面,也可以是下令接口)元素相团结,只讲界面或只讲数据库自己都构不成数据库应用法式,因而用Delphi 6.0开发数据库应用法式就隐含着界面开发。Delphi6中的VCL组件可用图3-1来说明。组件在Delphi法式的开发中是最显眼的角色。各人知道,在编写法式时一样平常都最先于在组件面板上选择组件并界说组件间的相互作用。但也有一些组件不在组件面板上,例如Tform和Tapplication(典型的非可视组件)。组件是Tcomponents派生出来的子类,可以流的形式存放在DFM文件中,具有事务和Publish属性。
窗口组件类是窗口化的可视化组件类,在Delphi的类库中占有最大的份额。在现实编程中,窗口组件类的工具都有句柄,可以接受输入焦点和包罗其它组件。
图形组件与窗口组件并列,是另一大类组件。图形组件不是基于窗口的,因而不能有窗口句柄,不能接受输入焦点和包罗其它组件。从图8-43中可以看出,图形组件的基类是TgraphicControl,在现实编程中,它们必须寄生于它们的宿主——窗口组件类的工具,由它们的拥有者认真其显示,而且它们还能触发一些和鼠标运动相关的事务。图形控件最典型的例子是Tlabel和TspeedButton。由此可以看出图形组件的功效很弱,有读者会问图形组件的用处何在呢?着实使用图形组件的最大利益在于节约资源,正是由于它们的功效较弱,以是使用的系统资源就要少。在一个应用法式中,若是能在不影响其功效的条件下合理大量地使用图形组件,将会大镌汰法式对系统资源的消耗。
非可视组件是与可视组件相并列的另一类组件,非可视组件在法式运行中是不行见的(除种种对话框组件之外,事实上有人以为对话框组件不能归入非可视组件,应该是另一种介于可视与非可视之间的组件)。
§3.2 Delphi 6.0 控件
用Delphi6开发数据库应用,重点是和种种数据库组件打交道,虽然也要使用其它的一些组件,现在就我在系统设计中所使用的主要组件给与简朴先容。
3.2.1 ADO数据会见组件
ADO数据工具(Active Data Objects)现实是一种提供会见种种数据类型的链接机制。ADO设计为一种极简朴的名堂,通过ODBC的要领同数据库接口中,可以使用任何一种ODBC数据源,即不止适合于SQL Server、Oracle、Access等数据库应用法式,也适合于Excel表格、文本文件、图形文件和无名堂的数据文件。ADO是基于OLE-DB之上的手艺,因此ADO通过其内部的属性和要领提供统一的数据会见接口要领。ADO使您的客户端应用法式能够通过OLE DB提供会见和操作在数据库服务器中的数据。ADO支持用于建设C/S和Web的应用法式的主要功效。其主要优点是易于使用、高速率、低内存支出和占用磁盘空间较少。ADO同时具有远程数据服务(RDS)功效,通过RDS可以在一次往返历程中实现将数据从服务器移动到客户端应用法式和Web页、在客户端对数据举行处然后将更新效果返回服务器的操作。
Delphi 6.0继续对Microsoft的ADO会见能力的支持。这种能力是通过一组新组件实现的,这些组件是在企业版的ADO组件页中,在组件面版的ADO页上可以找到这些组件。使用在前面章节提到的TdataSet抽象类,ADO组件可以不通过BDE而直接实现ADO毗连。这意味着只需要很少的代码就可以实现该毗连而且性能获得提高。
使用ADO数据会见组件,可以只使用ADO结构与数据库取得联系并对其中的数据举行操作,而在这些历程中完全不需要使用BDE。大多数的ADO毗连和数据集组件都是与基于BDE的毗连和数据集组件相类似的。TADOConnection组件与基于BDE的应用法式中的Tdatabase组件类似。TADOTable与Ttable,TADOQuery与Tquery,以及TADOStoreProc和TstoredProc之间都具有这种类似的对应关系。使用这些ADO组件的方式与我们常使用的数据会见组件(基于BDE)都有许多相同之处。TTADODataSet没有直接的BDE对应组件,但它提供了许多与Ttable和Tquery相同的功效。同样,TADOCommand也没有相对应的BDE组件,它是在Delphi/ADO情形中完成特定功效的组件。Delphi 6.0通过ADO数据聚会会议见组件,可以不借助BDE数据引擎而是通过微软的OLEDB来会见更为普遍的数据库中的数据。ADO数据聚会会议见组件与常用的数据会见组件是并列的关系。
在系统中我主要使用的是ADOTablet和ADOQuery两个组件。
3.2.2 数据控制类DataControl
数据控制类认真数据库数据的显示,并把用户对数据的修改传回。这里的绝大多数组件,如DBText, DBEdit, DBMemo, DBImage, DBListBox, DBComboBox, DBCheckBox, DBRadioGroup, DBLookupListBox, DBLookupCombox, DBCtrGrid的功效和对应的非数据感知组件相同,如TEdit框,TRadioGroups单选按钮组等,只不外在显示数据库数据时要用而已。
在系统中主要使用数据网格控件DBGrid和数据库导航器控件DBNavigator。
3.2.3 数据会见类DataAccess
数据库应用系统中数据会见是一个主要问题,包罗单用户和 C/S系统,都必须联系一些数据库和数据表文件。Delphi 6 提供了专门用于数据会见的基类控件。主要包罗数据源控件DataSource、客户数据集控件ClientDataSet、数据集提供器控件DataSetProvider等等。
Tdatabase:当一个基于BDE的数据库应用法式需要一个永世数据库毗连时,需要定制向一个数据库服务器的毗连时,需要事务控制和特殊的数据库别名时就得用到Tdatabase工具。特殊是当毗连到一个远程的SQL数据库服务器时,若是要使用BDE举行数据库事务处置赏罚,那么,TDatabase工具的威力就体现出来了。在一个应用法式中为每一个数据库毗连显示的声明Tdatabase工具要凭证需要而定,不是必须的。对一个数据库毗连,若是没有显示的声明并实例化TDatabase工具,系统就会发生一个带有默认属性的TDatabase工具。
TdataSource工具用于在DataSet工具(包罗Tquery,TstoredProc,Ttable等)和数据感知组件之间提供一个毗连的纽带,以便在窗体上显示数据库中的数据,在数据库中导航定位与编辑数据集中的数据。若是一个DataSet工具中的数据想在数据感知组件中显示和修改,它就必须和TdataSource工具相联系。同样,一个数据感知组件若是想和数据源相联系以便显示和使用数据,就必须以TDataSource工具为中介。
用Delphi6作数据库应用开发归纳综合来说如下:先使用数据存取组件和现实的数据库建设毗连,并用Tsession工具和Tdatabase工具治理这些毗连。然后以Tdatasource工具为中介,用数据感知组件向用户显示数据库的内容并接受用户的查询和修改等操作。
3.2.4 SQL语言在Delphi中的应用
在Delphi中使用SQL语言很是利便,一样平常来说,都是通过Tquery组件来使用SQL语言的。可以在TQuery组件的SQL属性中设置SQL语句。设计法式时,在该组件的属性对话框中选择SQL属性,单击带省略号的按钮,就可以打开String List Editor对话框,然后我们就可以在对话框中添加SQL语句。还可以使用Delphi的SQL Builder来自动天生SQL语句,这样可以阻止手工编写SQL而可能造成的语法错误。
静态SQL语句在法式设计时便已牢靠下来,它不包罗任何参数和变量。
动态SQL语句,也被称作参数化的语句,在其中央包罗着体现字段名或表名的参数,例如下面的语句是一条动态SQL语句:
Select * From Students Where StudentCode =: StudentCode;
其中的变量StudentCode即是一个参数变量,它由一个冒号指导,在法式运行历程中,必须要为该参数赋值,该条SQL语句才气准确执行,每次运行应用法式时可以为该参数变量赋予差异的值。为参数赋值有三种要领:
①凭证参数在SQL语句中泛起的顺序,设置TQuery部件的Params属性值为参数赋值。
②直接凭证SQL语句中各参数的名字,挪用ParamByName要领来为各参数赋值。
③将TQuery部件的DataSource属性设置为另一个数据源,这样将另一个数据源中与当前TQuery部件的SQL语句中的参数名相匹配的字段值赋给其对应的参数。使用这种要领也能实现所谓的毗连查询,建设主要—明细型数据库应用。
在法式运行历程中,要想设置TQuery部件的SQL属性,必须首先挪用Close要领,关闭TQuery部件,然后再挪用Clear要领扫除SQL属性中现存的SQL下令语句, 最后再挪用Add要领为SQL属性设置新的SQL下令语句。例如:
Query1.Close {关闭Query1)
Query1.SQL.Clear {扫除SQL属性中的SQL下令语句}
Query1.SQL.Add(‘Select * From Students‘);
Query1.SQL.Add(‘ Where Name ="Lucy" ‘);
在为TQuery部件设置SQL属性时挪用Close要领总是很清静的,若是TQuery部件已经被关闭了,挪用Close要领时不会发生任何影响。在应用法式中为SQL属性设置新的SQL 下令语句时,必须要挪用Clear要领以扫除SQL属性中现存的SQL下令语句,若是不挪用Clear要领,便挪用Add要领向SQL属性中设置SQL下令语句,那么新设置的SQL下令语句会追加在现存SQL下令语句后面, 在法式运行时经常会泛起出乎意料的查询效果甚至法式无法运行下去。
在这里要特殊注重的,一样平常情形下TQuery部件的SQL属性只能包罗一条完整的SQL语句,它不允许被设置成多条SQL语句。虽然有些数据库服务器也支持在TQuery部件的SQL属性中设置多条SQL语句,只要数据库服务器允许这样,我们在编程时可以为 SQL 属性设置多条SQL语句。
在为TQuery部件设置完SQL属性的属性值之后,也即编写好适当的SQL法式之后,可以有多种方式来执行SQL法式。
在设计历程中,设置完TQuery部件的SQL属性之后将其Active属性的值置为True, 这样便可以执行SQL属性中的SQL法式,若是应用中有与TQuery部件相连的数据浏览部件( 如TDDGrid TDBEdit等)那么在这些数据浏览部件中会显示SQL法式的执行效果。
在应用法式运行历程中,通过法式挪用TQuery部件的Open要领或ExecSQL 要领可以执行其SQL属性中的SQL法式。Open要领和ExecSQL要领是纷歧样的。Open要领只能用来执行SQL语言的查询语句(Select下令), 并返回一个查询效果集,而ExecSQL要领还可以用来执行其它常用的SQL语句(如INSERT, UPDATE, DELETE等下令),例如:
Query1.Open (这样会返回一个查询效果集)
若是挪用Open要领,而没有查询效果时,会堕落。此时应该挪用ExecSQL 要领来取代Open要领。如:
Query1.ExecSQL (没有返回效果)
虽然在设计应用法式时,法式设计职员是无法确定TQuery部件中的SQL 语句是否会返回一个查询效果的。对于这种情形应当用Try…Except模块来设计法式。在 Try 部门挪用Open要领,而在Except部门挪用ExceSQL要领,这样才气保证法式的准确运行。
Delphi中用ADOQuery来使用SQL语句同样十分利便。在ADOQuery组件中首先通过ConnectionString属性值来联接数据源,然后就通过双击SQL…属性值来写入SQL语句。在Delphi中挪用数据库,就可以挪用ADOQuery组件,通过修改其中的SQL…属性中的SQL语句来实现对数据库的各项操作。
值得注重的是,ADOQuery组件只有在激活的情形下才可以被准确地使用,这样就提出了一个问题,也就是说,在每次修改ADOQuery组件的SQL…属性时都必须先行举行关闭,待扫除掉SQL…中所有的SQL语句后才可以添加新的SQL语句。而且,在每一次修改完成以后,还应该记得重新将ADOQuery激活。其它的使用要领与TTQuery有许多的相似之处。
§3.3 Access 简介
建设一个数据库我们有多种选择,现在市场上有种种各样的数据库,而且每一种数据库都有其自身的特点,不能说哪一种更好,只能在其中寻找一种能更好地顺应系统需求、更好地知足用户的要求以及顺应开发职员的习惯。在本系统中,做为图书客栈治理系统是一个较量小的应用系统,它所发生和处置赏罚的数据量也较量小。因此,没有须要使用像SQL Server和Oracle这样的大型数据库。我首先想到的数据库是Borland公司的Paradox数据库。另外,Microsoft Office中的Access数据库在盘算机上的应用较量普及,是开发小型数据库系统的较量理想的选择,以是,在本系统中我选择了Access数据库。
Access做为一个数据库治理系统,它被集成在Microsoft Office中。Access数据库处置赏罚的基本结构,接纳关系型数据库模式。与其他的数据库系统相比,Access越发简朴易学,一个通俗的盘算机用户可以很快地掌握它。Access 2000的功效十分强盛,使用它可以利便地实现对信息生涯、维护、查询、统计、打印、交流、宣布,而且它可以十分利便地与Office其他组件交流数据,这些功效对一个一样平常用户而言已经足够了。
第四章 系统总体设计
软件系统的总体设计约莫要履历可行性剖析和项目开发妄想,需求剖析,提要设计,详细设计,编码,测试以及维护等七个阶段。可行性剖析和项目开发妄想在前面已经叙述,下面所要做的是举行软件需求剖析,提要设计和详细设计。编码历程将在下一节叙述,而测试和维护历程不在本文叙及。
§4.1 系统需求剖析
在经由前一阶段的剖析之后,我确定了我的开发课题为图书客栈治理。现在所要做的是要准确界说系统必须做什么以及系统必须具备的功效。
软件需求剖析中我接纳结构化剖析要领(Structured Analysis,简称SA),SA是面向数据流举行需求剖析的要领,像所有的软件剖析要领(如面向工具剖析要领、IDEF要领等等)一样,SA也是一种建模运动,它使用简朴易读的符号,凭证软件内部数据转达、变换的关系,自顶向下逐层剖析,描绘知足功效要求的软件模子。
在系统中我接纳数据流图(DFD)这种半形式化的形貌方式表达需求。它是一种功效模子,以图形的方式描绘数据在系统中流动和处置赏罚的历程,只反映系统必须完成的逻辑功效。它有四种基本图形符号:
◆ →:箭头,体现数据流;
◆ 〇:圆或椭圆,体现加工;
◆ ═:双杠,体现数据存储;
◆ □:方框,体现数据的源点或终点。
为了表达较为重大问题的数据处置赏罚历程,用一张数据流图是不够的,要凭证问题的条理结构举行逐步剖析,并以一套分层的数据流图反映这种结构关系。在这里我一共使用了三层数据流图,即顶层图,0层图和1层图(也是底层图)。
在多层数据流图中,顶层流图仅包罗一个加工,它代表被开发系统,它的输入流是该系统的输入数据了,输出流是该系统的输出数据;底层流图是指其加工不需要再做剖析的数据流图,中央层流图体现对其上层父图的细化,它的每一步加工可能继续细化成子图。
经由对系统的剖析首先获得系统的顶层DFD,如下:
一步细化获得系统的0层DFD,如下:

再进一步细化每一个数据加工功效,获得系统的1层DFD图。
在这里只给出有关入库治理和出库治理的1层数据流图,它们是系统的关鍵部门,也是主要的部门。通过以上对数据流图的剖析之后,我们已概略地相识了系统的功效和目的,接下来所要做的就是系统功效模块的划分和数据库的设计,也就是系统的提要设计。
§4.2 系统提要设计
在软件需求剖析阶段,搞清晰了软件“做什么”的问题,形成了目的系统的逻辑模子。现在我们所要做的就是要把软件“做什么”的逻辑模子变换为“怎么做”的物理模子,即着手实现软件的需求。首先,我们需要形貌的是系统的总的系统结构。
4.2.1 系统结构设计
系统的提要设计中最主要的就是系统的模块化。模块化是指解决一个重大问题时自项向下逐层把软件系统划分成若干个模块的历程。每个模块完成一个特定的功效,所有的模块按某种要领组织起来,成为一个整体,完成整个系统所要求的功效。
将系统划分为多个模块是为了降低软件系统的重大性,提高可读性、可维护性,但模块的划分不能是恣意的,应只管保持其自力性。也就是说,每个模块只完成系统要求的自力的子功效,而且与其他模块的联系最少且接口简朴,即只管做到高内聚低耦合,提高模块的自力性,为设计高质量的软件结构奠基基础。
在系统的提要设计中我接纳结构化设计(Structure Design,简称SD),SD以需求剖析阶段发生的数据流图DFD为基础,按一定的步骤映射成软件结构。我首先将整个系统化分为几个小问题,小模块,在系统中,我设计了用户治理、库存治理、入库治理、出库治理、员工治理和供应商治理6个小模块。然后,进一步细分模块,添加细节。好比,用户治理我又将其分为用户注册、用户注销、密码修改;库存治理分为库存纪录查询、库存纪录修改、库存纪录打印等等。
以下就是系统的结构图:(在这里为了表达利便我将结构图脱离来表达。)
在获得系统的第一层功效模块图后,经由进一步地细化,得一系统的子功效模块图:

4.2.2 数据库设计
在信息天下中,信息从客观事物出发流经数据库,通过决议机构最后又回到客观天下,信息的这一循环履历了三个领域:信息天下,数据天下,现实天下。现实天下的事物反映到人的头脑中,人的大脑对它有个熟悉历程,经太过析(选择、命名、分类等)进入信息天下。这些信息再进一步加工、编码,然后进数据天下,而软件系统的开发事情需要思量这两个方面的问题,也就是要思量系统开发所需要的数据,以及怎样对这些数据举行操作。这两个问题贯串了整个软件系统的开发历程,这也就是数据库的设计问题,软件设计的一个焦点。
4.2.2.1 ER图设计
在系统设计的最先,我首先思量的是怎样用数据模子来数据库的结构与语义,以对现实天下举行抽象。现在普遍使用的数据模子可分为两种类型,一种是自力于盘算机系统的“看法数据模子”,如“实体联系模子”;另一种是直接面向数据库逻辑结构的“结构数据模子”。在本系统中我接纳“实体联系模子”(ER模子)来形貌数据库的结构与语义,以对现实天下举行第一次抽象。ER模子直接从现实天下抽象出实体类型及实体间联系,然后用ER图来体现数据模子。它有两个显着的优点:靠近于人的头脑,容易明确;与盘算机无关,用户容易接受。但ER模子只能说明实体间语义的联系,不能进一步说明详细的数据结构,它只是数据库设计的第一步。

ER图是直观体现看法模子的工具,它有四个基本因素:
◆ 矩形框,体现实体类型(思量问题的工具)。
◆ 菱形框,体现联系类型(实体间的联系)。
◆ 椭圆形框,体现实体类型和联系类型的属性。对于要害码的属性,在属性名下齐整横线。
◆直线,联系类型与其涉及的实体类型之间以直线毗连。
本系统为图书客栈治理,主要治理图书的入库、出库以及库存等事项。客栈凭证需要可以查询图书供应商的信息,同时还需要相识在入库和出库中员工的加入情形。依据客栈治理的现真相形,思量了多方面的因素以后,确定系统的ER图如下:
(为了表达的利便,在这里我没有在一张图上表达出所有的关系,而是用一张总体ER图,和几张实体属性关系图来表达数据库的结构。)
在该数据库中,我设计了三个实体,划分是库存、员工和供应商以及两个联系类型入库和出库。在本系统中库存是焦点,也是基本,没有了库存其它的也就没有什么意义了。员工纪录的添加是思量到责任问题,也就是说,在客栈治理的现实运用中,泛起了责任不清的征象,特殊是由于客栈的收支图书数目都较量大时发生了一系列问题,以是在设计数据库时,我特殊思量到这一点,加入了员工纪录这一实体。供应商信息的添加主要出于对图书泉源问题的思索。通过添加供应商信息可以较量清晰地相识图书的进货渠道,从图书的质量到供应商的信誉都可以举行相识,同时可以为以后的图书进购提供一定有用的信息。
入库联系类型将库存信息、供应商信息和员工信息联系在一起,可以利便地实现三个实体之间的联接,而出库联系类型则将库存信息和员工信息较好地联接起,同时这两个联系类型又都具有各自特有的属性。
下面就是各实体及联系类型的属性图:(带#号的属性为要害字段)4.2.2.2 数据库表格设计
在完成系统的ER图之后,需要将ER模子转化为关系模子,也就是说,要设计出数据库所需要的表格。在这里,我选用的是关系数据库。由于关系数据库中的二维表格可以很清晰地形貌数据之间的联系。
在这里不得不提到一个看法——范式。着实在上一节的ER图设计中,已经运用了范式的头脑,不仅云云,在数据库的表格设计中更离不开范式的头脑,它是数据库设计的基础,若是不注重这个问题将会导致一系列问题的泛起。
我在系统中界说的表格都严酷地凭证范式的头脑和要求去完成,数据库中的所有表格都到达了三范式的要求。凭证系统ER图,针对本系统的特点,在对所搜集的数据举行规范化之后,界说了如下六张表格,划分是库存信息表,入库信息表,出库信息表,员工信息表,供应商信息表和密码信息表。通过对这六张表格的操作可以较好地完成系统设计的各项功效,六张表格之间有着差异水平的联系。(说明:在以下数据表中,K代表主键,#代表外键,字段值不为空。)
BookRecord 表(库存信息表)
字段名称 数据类型 说明
K BookID 数字 图书编号
BookName 文本 图书名
Author 文本 作者
Publisher 文本 出书社
PubDate 日期/时间 出书日期
Price 钱币 价钱
BookType 文本 图书类型
Number1 数字 库存数目
Addation 文本 备注
图4.13 库存信息表
库存信息表主要用于纪录客栈中现存放的所有图书的详细信息,包罗图书编号、书名、作者、出书社、图书类型等有关图书的种种信息,它即是该数据库的主表,也是系统主界面的主要内容。
在该表中图书编号是主键,它按图书入库的先后序次来编写,每当有图书入库,系统自动给出图书编号,这样我们按图书编号来查找图书是较量利便的。思量到编号较量难于影象,以是使用了出书社和图书类型两个字段,在系统中我提供了出书社和图书类型的分类查找,而且所有接纳自动天生,每当系统中有新的出书社类型和图书类型,弹出菜单会自动添中新类型,这样就可以较量利便地实现按出书社和按图书类型查找。此外,库存数目也是一个较量要害的字段,该字段是在系统初始化时就给定的,每当有图书入库或出库操作,系统就会自动修改图书的库存数目,以保持数据的一致性。做为备注有一点说明,我的数据库中备注的数据类型是文本,而不是备注类型,主要思量到该字段的长度并不大,而且在Delphi中文本数据类型的处置赏罚也较量利便一点。
Employee 表(员工信息表)
字段名称 数据类型 说明
K EmployeeID 数字 员工编号
EmployeeName 文本 员工姓名
Sex 文本 性别
BornDate 日期/时间 出生日期
Grade 文本 职称
WorkDate 日期/时间 事情日期
Telephone 文本 联系电话
Address 文本 联系地址
图4.14 员工信息表
员工信息表主要用于纪录有关员工的种种信息,包罗姓名、职称、出生日期、联系电话、联系地址等。它主要用来为系统提供员工的有关信息,由于在系统中,入库和出库操作均与员工有着一定的联系,在查询入库信息和出库信息时,有时需要查找有关此项纪录有关的员工信息,在系统中我是通过入库纪录与员工纪录(出库纪录和员工纪录)之间的联接查询来完成的。另外,作为一个客栈也有须要相识其所属员工的一些基本情形,以便查询。
Shopkeeper 表(供应商信息表)
字段名称 数据类型 说明
K ShopkeeperID 数字 供应商编号
ShopkeeperName 文本 供应商姓名
Address 文本 地址
PostNo 数字 邮编
OfficePhone 文本 办公电话
HomePhone 文本 住宅电话
Email 文本 E-mail
PayType 文本 付款方式
图4.15 供应商信息表
供应商信息表主要用于纪录有关供应商的种种信息,包罗姓名、地址、电话、付款方式等。它主要用来为系统提供供应商的有关信息,在系统中入库纪录是与供应商纪录相联系的,通过入库纪录可以查找相关的供应商信息。在供应商信息中,思量当现真相形,我特殊加入了Email和付款方式这两个字段,由于在当今信息天下中,多种多样的通讯方式和多种多样的付款方式是一定的,是数据库中必须与以纪录。

InRecord 表(入库信息表)
字段名称 数据类型 说明
K InID 数字 入库编号
# BookID 数字 图书编号
# EmployeeID 数字 员工编号
# ShopkeeperID 数字 供应商编号
Number 数字 入库数目
BuyDate 日期/时间 入库日期
图4.16 入库信息表

OutRecord 表(出库信息表)
字段名称 数据类型 说明
K OutID 数字 出库编号
# BookID 数字 图书编号
# EmployeeID 数字 员工编号
Number2 数字 出库数目
OutDate 日期/时间 出库日期
图4.17 出库信息表
入库信息表主要用于纪录有关入库的详细信息,包罗入库数目、入库日期以及图书、员工、供应商三方的编号,以便查询。出库信息表主要用于纪录有关出库的详细信息,包罗出库数目、出库日期以及图书、员工的编号。出库信息表和入库信息表一样,着实它们都属于联系类型,系统通过这两个表可以联接上其它的表为用户提供多种条件的联接查询。值得提出的一点是入库纪录和出库纪录的添加不仅仅是单表操作,由于它们都与库存纪录相联系,以是,无论您是添中入库纪录照旧添加出库纪录,都必须同时修改库存纪录,以保持数据的一致性,否则将引发系统堕落而这些我都让其在系统中自动完成。无论您是添加入库纪录,照旧添加出库纪录,系统都将自动修改库存中图书的数目,而且,在您出库的数目大于库存数目时,系统还会自动提醒错误,这样就可以防止一定错误的发生。
在入库信息表和出库信息表中我还界说了几个外键,它提供了一种体现几个关系联系的要领。好比,系统中通过在入库信息表中界说的外键 BookID、EmployeeID和ShopkeeperID可以将库存信息表、员工信息表和供应商信息表联系在一起,从而利便地实现联接查询,而且,引入外键的界说是实体完整性约束的一个主要方面。
Key 表(密码信息表)
字段名称 数据类型 说明
K KeyName 文本 用户姓名
KeyNo 文本 用户密码
图4.18 密码信息表
密码信息表主要用于纪录所有的用户名和用户密码。它是在用户上岸时用来确定用户和密码的准确性,以防止非法用户上岸。

通过以上设计已经完成了系统的提要设计,当我们有了系统的功效模块图和数据库之后,就需要着手去实现每一个模块,为每一个功效设计法式流程图,这也就是系统的详细设计。
§4.3 系统详细设计
在前面的提要设计中,已将系统划分为多个模块,并将它们凭证一定的原则组装起来,同时确定了每个功效及模块之间的外部接口。现在所要做的就是确定每个模块详细执行历程,也可以说是“历程设计”。
在处置赏罚历程设计时我接纳的是结构化法式设计(简称SP)要领。需要指出的是系统的详细设计并不是指详细的编法式,而是将提要设计阶段发生的系统功效模块图细化成很容易发生法式的图纸。因此详细设计的效果基本决议了最终法式的质量。为软件的质量,延伸软件的生涯期,软件的可测试性、可维护性提供主要的保障。详细设计的目的不仅是逻辑上准确地实现每个模块的功效,还应使设计出的处置赏罚历程清晰易读。
由前一阶段发生的系统功效模块图,我为系统的主要部门设计了如下法式流程图:通过以上步骤,基本上完成了对整个系统的总体设计,接下来所要做的就是软件的编码事情。系统总体设计的优劣直接影响着下一步事情,只有在这一阶段设计出好的模块图和法式流程图,才气更有利于编码,发生好的软件系统。


第五章 系统应用法式设计
§5.1 系统窗体模块组成
§5.2 数据模块窗体的设置
在编写数据库应用法式时,经常要遇到这样的情形,即许多几何组件、窗体同时会见相同的数据源,若是为每一个组件或者窗体都设置一个数据源将是十分耗时的工件,而且要保证这些数据源简直是相同的也需花一番功夫。那么,能不能将这些数据源集中治理,最好是做成一个统一的模块,需要时就将该模块引入而不必直接操作数据源自己呢?数据模块(DataModule)是解决这个问题最好的谜底。简朴说来,数据模块是用来集中治理数据源的一个窗体,该窗体可被需要的地方随时引入。
图5.2给出了本法式的数据模块(datamoduleform)窗体图,除报表窗体外所有的数据存取组件和数据源组件都在此数据模块中举行了界说。值得一提的是,设置了数据库Database组件,该组件引入了系统所需的唯一的数据库tsxs,Database组件的DatabaseName属性设置为tsckgl。tsxs数据库已在ODBC设置法式中举行了设置。其他的数据存取组件都是基于此数据库组件建设的,这样做的利益是,当数据库的别名或者其他信息改变之后,只需修改Tdatabase组件的AliasName属性即可。
另外,在本系统的数据模块窗体图中,我大多接纳的AODQuery组件而没有接纳BDE组,这主要是基于对ADO组件的相识。在Delphi的学习中我对ADO组件相识的越发清晰,使用也较BDE更为熟练,而且,ADO组件的功效也较BDE更为强盛,以是在这里大多接纳ADO组件来举行数据库联接。同时我也使用了BDE组件中的Table,由于在某些时间BDE有着其自身特有的优越性。 主窗体功效模块的实现
file://主窗体法式代码
public file://在法式的起始部门,界说快捷按钮点击事务
Procedure Popup1Handler(Sender:Tobject);
Procedure Popup2Handler(Sender:TObject);
**********************************************************************
procedure Tmainform.Popup1Handler(Sender: TObject);
begin file://快捷按钮1(点“按出书社分类”按钮发生)的点击事务
with datamoduleform.MainQuery do
begin file://打开数据模块窗体的MainQuery,对BookRecord表举行操作
close; file://关闭MainQuery
SQL.Clear; file://扫除SQL属性中的SQL下令语句
SQL.Add(‘select * from BookRecord where Publisher=:Pub‘); file://添加新的SQL语句
Parameters.ParamByName(‘Pub‘).Value:=(Sender as TMenuItem).Caption;
open; file://重新打开MainQuery
end;
end;
**********************************************************************
procedure Tmainform.SpeedButton1Click(Sender: TObject);
Var s1,s2,s3,s4,s5 :String; file://设立5个变量以利便实现模糊查询
begin file://主窗口库存查询按钮事务
with datamoduleform.MainQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord‘);
SQL.Add(‘where BookID Like :BookID and BookName Like :Name and Author Like :Author and Publisher Like :pub and BookType Like :BookType‘);
file://使用Like语句来实现模糊查询
if Edit1.Text<>‘‘ then s1:=‘%‘ Edit1.Text ‘%‘ else s1:=‘%‘;
Parameters.ParamByName(‘BookID‘).Value:=s1; file://给变量s1赋值
if Edit2.Text<>‘‘ then s2:=‘%‘ Edit2.Text ‘%‘ else s2:=‘%‘;
Parameters.ParamByName(‘Name‘).Value:=s2; file://给变量s2赋值
if Edit3.Text<>‘‘ then s3:=‘%‘ Edit3.Text ‘%‘ else s3:=‘%‘;
Parameters.ParamByName(‘Author‘).Value:=s3; file://给变量s2赋值
if Edit4.Text<>‘‘ then s4:=‘%‘ Edit4.Text ‘%‘ else s4:=‘%‘;
Parameters.ParamByName(‘Pub‘).Value:=s4; file://给变量s2赋值
if Edit5.Text <>‘‘ then s5:=‘%‘ Edit5.Text ‘%‘ else s5:=‘%‘;
Parameters.ParamByName(‘BookType‘).Value:=s5; file://给变量s2赋值
open;
if FieldValues[‘BookID‘]=NULL file://判断是否找到纪录
then begin
Messagedlg(‘没有找到你所需要的纪录!‘,mtInformation,[mbOK],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit4.Text:=‘‘;Edit5.Text:=‘‘;
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord‘); file://这里相当于一个刷新功效
open;
end;end;
end;
**********************************************************************
procedure Tmainform.SpeedButton3Click(Sender: TObject);
begin file://库存表刷新按钮事务
with datamoduleform.MainQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord‘);
open;
end;
end;
**********************************************************************
procedure Tmainform.SpeedButton11Click(Sender: TObject);
var PopupItem:TMenuItem;
begin file://自动天生快捷按钮1的内容
with datamoduleform.BookQuery do
begin file://从数据库中选择出书社类型
close;
SQL.Clear;
SQL.Add(‘select distinct Publisher from BookRecord‘);
open;
PopupMenu1:=TPopupMenu.Create(Self); file://自动天生快捷菜单
PopupMenu1.AutoHotkeys:=maManual; file://自界说热键
while Not Eof do
begin file://凭证出书社内容天生菜票据项
PopupItem:=TMenuItem.Create(Self);
PopupItem.Caption:=FieldByName(‘Publisher‘).AsString;
PopupMenu1.Items.Add(PopupItem);
PopupItem.onClick:=Popup1Handler; file://确定菜票据项的点击事务
Next;
end; end;
PopupMenu1.Popup(384,67); file://在指定位置显示快捷菜单1
end;
**********************************************************************
procedure Tmainform.FormActivate(Sender: TObject);
begin file://系统初始化,在进入mainform时自动添加数据源
mainform.DBGrid1.DataSource:=datamoduleform.MainSource;
mainform.DBNavigator1.DataSource:=datamoduleform.MainSource;
mainform.DBGrid2.DataSource:=datamoduleform.EmpSource;
mainform.DBNavigator2.DataSource:=datamoduleform.EmpSource;
mainform.DBGrid3.DataSource:=datamoduleform.ShopSource;
mainform.DBNavigator3.DataSource:=datamoduleform.ShopSource;
mainform.DBGrid4.DataSource:=datamoduleform.InSource;
mainform.DBNavigator4.DataSource:=datamoduleform.InSource;
mainform.DBGrid5.DataSource:=datamoduleform.OutSource;
mainform.DBNavigator5.DataSource:=datamoduleform.OutSource;
end;
**********************************************************************
procedure Tmainform.FormCreate(Sender: TObject);
begin file://系统初始化,界说界面巨细,以顺应差异分辩率
Width:=800;Height:=600;
end;
**********************************************************************
procedure Tmainform.Timer1Timer(Sender: TObject);
begin file://在状态栏显示时间
StatusBar1.Panels[2].Text:=DateToStr(Date);
StatusBar1.Panels[4].Text:=TimeToStr(Time);
end;
§5.4 入库、出库窗体模块的实现

图5。4 系统入库治理窗体

图5.5 系统出库治理窗体
procedure Tinoutform.SpeedButton4Click(Sender: TObject);
begin file://入库治理查找按钮事务
with datamoduleform.BookQuery do file://入库查询处置赏罚
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord where BookID=:BookID‘);
Parameters.ParamByName(‘BookID‘).Value:=Edit13.Text;
open;
if FieldValues[‘BookID‘]<>NULL
then
begin
Edit1.Text:=‘‘;
Edit1.ReadOnly:=true;Edit1.Color:=clMenu;
Edit6.Text:=FieldValues[‘BookName‘]; file://显示图书名
Edit6.ReadOnly:=true;Edit6.Color:=clMenu; file://设置显示框不行更改属性
Edit7.Text:=FieldValues[‘Author‘];
Edit7.ReadOnly:=true;Edit7.Color:=clMenu;
Edit8.Text:=FieldValues[‘Publisher‘];
Edit8.ReadOnly:=true;Edit8.Color:=clMenu;
Edit9.Text:=FieldValues[‘PubDate‘];
Edit9.ReadOnly:=true;Edit9.Color:=clMenu;
Edit10.Text:=FieldValues[‘Price‘];
Edit10.ReadOnly:=true;Edit10.Color:=clMenu;
Edit11.Text:=FieldValues[‘BookType‘];
Edit11.ReadOnly:=true;Edit11.Color:=clMenu;
Edit12.Text:=FieldValues[‘Number1‘];
Edit12.ReadOnly:=true;Edit12.Color:=clMenu;
If FieldValues[‘Addation‘]<>NULL
then Edit25.Text:=FieldValues[‘Addation‘]
else Edit25.Text:=‘‘;
Edit25.ReadOnly:=true;Edit25.Color:=clMenu;
end
else
begin file://在没有查找到的情形下,清空所有显示框
Edit1.ReadOnly:=false;Edit1.Text:=‘‘;Edit1.Color:=clMenu;
Edit6.ReadOnly:=false;Edit6.Text:=‘‘;Edit6.Color:=clMenu;
Edit7.ReadOnly:=false;Edit7.Text:=‘‘;Edit7.Color:=clMenu;
Edit8.ReadOnly:=false;Edit8.Text:=‘‘;Edit8.Color:=clMenu;
Edit9.ReadOnly:=false;Edit9.Text:=‘‘;Edit9.Color:=clMenu;
Edit10.ReadOnly:=false;Edit10.Text:=‘‘;Edit10.Color:=clMenu;
Edit11.ReadOnly:=false;Edit11.Text:=‘‘;Edit11.Color:=clMenu;
Edit12.ReadOnly:=false;Edit12.Text:=‘‘;Edit12.Color:=clMenu;
Edit25.ReadOnly:=false;Edit25.Text:=‘‘;Edit25.Color:=clMenu;
MessageDlg(‘没有找到你所需要的纪录!‘,mtInformation,[mbOK],0);
Edit13.Text:=‘‘;Edit13.SetFocus;
end;
end;
with datamoduleform.InQuery do file://自动入库编号的获取
begin
close;
SQL.Clear;
SQL.Add(‘select * from InRecord where InID>=All(select InID from InRecord)‘);
open; file://找到入库编号中最大的一个
Edit26.ReadOnly:=false;
Edit26.Text:=FieldValues[‘InID‘] 1; file://最大的入库编号加1形成新的入库编号
Edit26.ReadOnly:=true;Edit26.Color:=clMenu; file://设置编号的不行更改性
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton1Click(Sender: TObject);
var s:integer;
begin file://入库治理添加按钮事务
if Edit1.Text<>NULL
then MessageDlg(‘请输入完整的入库信息和图书信息,然后单击确定按钮。‘,
mtInformation,[mbok],0)
else begin
if (Edit2.Text=‘‘) or (Edit3.Text=‘‘) or (Edit4.Text=‘‘) or (Edit5.Text=‘‘)
then begin
MessageDlg(‘请输入完整的入库信息!‘,mtInformation,[mbok],0);
Edit2.SetFocus;
end
else begin
with datamoduleform.InQuery do file://将找到的图书信息显示
begin
close;
SQL.Clear;
SQL.Add(‘insert into InRecord values(:InID,:BookID,:EmpID,:ShopID,
:Number,:InDate)‘); file://向入库信息表中插入纪录
Parameters.ParamByName(‘InID‘).Value:=Edit26.Text; file://向Edit框取值
Parameters.ParamByName(‘BookID‘).Value:=Edit13.Text;
Parameters.ParamByName(‘EmpID‘).Value:=Edit2.Text;
Parameters.ParamByName(‘ShopID‘).Value:=Edit3.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit4.Text;
Parameters.ParamByName(‘InDate‘).Value:=Edit5.Text;
execSQL;
end;
Edit12.ReadOnly:=False;
S:=StrToInt(Edit12.Text) StrToInt(Edit4.Text); file://盘算入库后库存图书数目
Edit12.Text:=IntToStr(s); file://将修改后的库存图书数目显示
Edit12.ReadOnly:=true;
with datamoduleform.BookQuery do file://修改库存纪录中图书数目
begin
close;
SQL.Clear;
SQL.Add(‘update BookRecord set Number1=:Number where
BookID=:BookID‘);
Parameters.ParamByName(‘Number‘).Value:=s;
Parameters.ParamByName(‘BookID‘).Value:=Edit13.Text;
execSQL; file://提交SQL语句
MessageDlg(‘纪录已乐成添加!‘,mtInformation,[mbOK],0);
Edit13.SetFocus;
end;
end;
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton2Click(Sender: TObject);
begin file://入库治理确定按钮事务
if (Edit2.Text=‘‘) or (Edit3.Text=‘‘) or (Edit4.Text=‘‘) or (Edit5.Text=‘‘)
or (Edit6.Text=‘‘) or (Edit7.Text=‘‘) or (Edit8.Text=‘‘) or (Edit9.Text=‘‘)
or (Edit10.Text=‘‘) or (Edit11.Text=‘‘) or (Edit25.Text=‘‘)
then begin file://判断输入信息的完整性
MessageDlg(‘请输入所需的所有入库信息!‘,mtInformation,[mbok],0);
Edit2.SetFocus;
end
else
begin
with datamoduleform.InQuery do file://入库信息添加
begin
close;
SQL.Clear;
SQL.Add(‘insert into InRecord values(:InID,:BookID,:EmpID,:ShopID,
:Number,:InDate)‘); file://向入库信息表中插入纪录
Parameters.ParamByName(‘InID‘).Value:=Edit26.Text;
Parameters.ParamByName(‘BookID‘).Value:=Edit1.Text;
Parameters.ParamByName(‘EmpID‘).Value:=Edit2.Text;
Parameters.ParamByName(‘ShopID‘).Value:=Edit3.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit4.Text;
Parameters.ParamByName(‘InDate‘).Value:=Edit5.Text;
execSQL;
end;
with datamoduleform.BookQuery do
begin
close;
SQL.Clear; file://在完成入库信息的添加后,修改库存纪录
SQL.Add(‘insert into BookRecord values(:BookID,:BookName,:Author,
:Publisher,:PubDate,:Price,:BookType,:Number,:Addration)‘);
Parameters.ParamByName(‘BookID‘).Value:=Edit1.Text;
Parameters.ParamByName(‘BookName‘).Value:=Edit6.Text;
Parameters.ParamByName(‘Author‘).Value:=Edit7.Text;
Parameters.ParamByName(‘Publisher‘).Value:=Edit8.Text;
Parameters.ParamByName(‘PubDate‘).Value:=Edit9.Text;
Parameters.ParamByName(‘Price‘).Value:=Edit10.Text;
Parameters.ParamByName(‘BookType‘).Value:=Edit11.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit4.Text;
Parameters.ParamByName(‘Addration‘).Value:=Edit25.Text;
execSQL;
end;
MessageDlg(‘纪录添加乐成!‘,mtInformation,[mbok],0);
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton11Click(Sender: TObject);
begin file://新书入库按钮事务
Edit13.Text:=‘‘;Edit13.Color:=clMenu;
with datamoduleform.InQuery do file://自动入库编号的获取
begin
close;
SQL.Clear;
SQL.Add(‘select * from InRecord where InID>=All(select InID from InRecord)‘);
open;
Edit26.Text:=FieldValues[‘InID‘] 1;
Edit26.ReadOnly:=true;Edit26.Color:=clMenu;
end;
with datamoduleform.BookQuery do file://自动图书编号的获取
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord where BookID>=All(select BookID from BookRecord)‘); file://找到库存图书编号中最大的一个
open;
Edit1.ReadOnly:=false;
Edit1.Text:=FieldValues[‘BookID‘] 1; file://显示自动天生的图书编号
Edit1.ReadOnly:=true;Edit1.Color:=clMenu;
end;
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit4.Text:=‘‘;Edit5.Text:=‘‘;
Edit6.ReadOnly:=false;Edit6.Text:=‘‘;Edit6.Color:=clWindow;
Edit7.ReadOnly:=false;Edit7.Text:=‘‘;Edit7.Color:=clWindow;
Edit8.ReadOnly:=false;Edit8.Text:=‘‘;Edit8.Color:=clWindow;
Edit9.ReadOnly:=false;Edit9.Text:=‘‘;Edit9.Color:=clWindow;
Edit10.ReadOnly:=false;Edit10.Text:=‘‘;Edit10.Color:=clWindow;
Edit11.ReadOnly:=false;Edit11.Text:=‘‘;Edit11.Color:=clWindow;
Edit12.ReadOnly:=false;Edit12.Text:=‘‘;Edit12.Color:=clMenu;
Edit25.ReadOnly:=false;Edit25.Text:=‘‘;Edit25.Color:=clWindow;
end;
procedure Tinoutform.SpeedButton22Click(Sender: TObject);
var s:integer;
begin file://出库治理确定按钮事务
if (Edit24.Text=‘‘) or (Edit27.Text=‘‘) or (Edit28.Text=‘‘)
then begin
MessageDlg(‘请输入完整的出库信息!‘,mtInformation,[mbok],0);
Edit24.SetFocus;
end
else begin
if Edit27.Text>Edit21.Text file://检查出库数目是否小于库存数目
then begin
MessageDlg(‘库存中的图书数目不够!‘,mtInformation,[mbok],0);
Edit27.Text:=‘‘;Edit27.SetFocus;
end
else begin
with datamoduleform.OutQuery do
begin
close;
SQL.Clear;
SQL.Add(‘insert into OutRecord values(:OutID,:BookID,:EmpID,
:Number,:OutTime)‘); file://添加出库纪录
Parameters.ParamByName(‘OutID‘).Value:=Edit23.Text;
Parameters.ParamByName(‘BookID‘).Value:=Edit14.Text;
Parameters.ParamByName(‘EmpID‘).Value:=Edit24.Text;
Parameters.ParamByName(‘Number‘).Value:=Edit27.Text;
Parameters.ParamByName(‘OutTime‘).Value:=Edit28.Text;
execSQL;
end;
Edit21.ReadOnly:=False;
s:=StrToInt(Edit21.Text)-StrToInt(Edit27.Text); file://盘算出库后库存图书数目
Edit21.Text:=IntToStr(s); file://显示出库后库存图书数目
Edit21.ReadOnly:=True;
with datamoduleform.BookQuery do
begin file://修改库存图书数目
close;
SQL.Clear;
SQL.Add(‘update BookRecord set Number1=:Number where BookID=:BookID‘);
Parameters.ParamByName(‘Number‘).Value:=s;
Parameters.ParamByName(‘BookID‘).Value:=Edit14.Text;
execSQL;
end;
MessageDlg(‘出库纪录添加乐成!‘,mtInformation,[mbok],0);
Edit14.Text:=‘‘;Edit14.SetFocus;
end;
end;
end;
§5.5 查询功效的实现
查询功效包罗员工信息查询,供应商信息查询,入库信息查询和出库信息查询。由于每一个功效的实现都差不太多,而且其窗体也差不太多,以是在这里只给出员工信息查询窗体及其源代码。

图5.6 员工信息查询窗体
procedure Tfindempform.SpeedButton1Click(Sender: TObject);
Var s1,s2,s3 :String;
begin file://员工纪录查询窗体查找按钮事务
with datamoduleform.EmpQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from Employee‘);
SQL.Add(‘where EmployeeID Like :EmpID and EmployeeName Like :Name and Grade Like :Grade‘); file://实现模糊查询功效
if Edit1.Text<>‘‘ then s1:=‘%‘ Edit1.Text ‘%‘ else s1:=‘%‘;
Parameters.ParamByName(‘EmpID‘).Value:=s1;
if Edit2.Text<>‘‘ then s2:=‘%‘ Edit2.Text ‘%‘ else s2:=‘%‘;
Parameters.ParamByName(‘Name‘).Value:=s2;
if Edit3.Text<>‘‘ then s3:=‘%‘ Edit3.Text ‘%‘ else s3:=‘%‘;
Parameters.ParamByName(‘Grade‘).Value:=s3;
open;
if FieldValues[‘EmployeeID‘]<>NULL
then findempform.Close file://在找到纪录的情形下关闭查找窗口
else
begin
MessageDlg(‘没有找到你所需要的纪录!‘,mtInformation,[mbOK],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
close; SQL.Clear;
SQL.Add(‘select * from Employee‘); file://刷新员工信息窗口
open;
end; end;
end;
§5.6 系统上岸窗体模块的实现
由于系统上岸窗体中有一幅彩图,在这里未便给出,而只给出了系统的实现。
var keyname: string; file://界说了一个全局变量,在key2中有挪用
procedure Tkeyform.SpeedButton1Click(Sender: TObject);
var s:string; file://上岸窗口上岸按钮事务
begin
if (Edit1.Text=‘‘) then begin
MessageDlg(‘清输入上岸姓名和密码!‘,mtInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
datamoduleform.KeyTable.Active:=true;
if not datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判断上岸名是否存在
then begin
MessageDlg(‘上岸名错误,请重新输入!‘,mtInformation,[mbok],0);
Edit1.Text:=‘‘; Edit1.SetFocus;
end
else begin
with datamoduleform.KeyQuery do
begin
close; SQL.Clear;
SQL.Add(‘select * from Key where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
open;
s:=FieldValues[‘KeyNo‘];
end;
if s<>Edit2.Text file://判断上岸密码是否准确
then begin
MessageDlg(‘上岸密码错误,请重新输入!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘; Edit2.SetFocus;
end
else begin
keyname:=Edit1.Text;
keyform.Hide;
mainform.Show;mainform.WindowState:=wsMaximized;
end; end; end;
end;
§5.7 用户治理功效的实现
5.7.1 用户治理主窗体

图5.7 用户治理主窗体
5.7.2 密码修改窗体模块的实现

图5.8 密码修改窗体
procedure Tkey2form.SpeedButton1Click(Sender: TObject);
begin file://密码修改窗口修改按钮事务
if (Edit1.Text=‘‘)or(Edit2.Text=‘‘)or(Edit3.Text=‘‘)
then begin
MessageDlg(‘请输入完整的信息。‘,mtInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
if Not datamoduleform.KeyTable.Locate(‘KeyNo‘,Edit1.Text,[])
then begin
MessageDlg(‘原密码输入错误,不能修改新密码!‘,mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end
else begin
if Edit2.Text<>Edit3.Text
then begin
MessageDlg(‘两次密码输入差异,请重新输入新密码!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit2.SetFocus;
end
else begin file://在数据库中修改密码
with datamoduleform.KeyQuery do
begin
close; SQL.Clear;
SQL.Add(‘update key set KeyNo=:KeyNo where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=keyname;
Parameters.ParamByName(‘KeyNo‘).Value:=Edit2.Text;
execSQL;
MessageDlg(‘密码修改乐成!‘,mtInformation,[mbok],0);
key2form.Close;
end; end; end; end;
end;
5.7.3 用户注册窗体模块的实现

图5.9 用户注册窗体
procedure Tkey3form.SpeedButton1Click(Sender: TObject);
begin file://用户注删窗口注删按钮事务
if (Edit1.Text=‘‘)or(Edit2.Text=‘‘)or(Edit3.Text=‘‘)
then begin
MessageDlg(‘请输入完整的信息!‘,mtInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
if datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判断用户名是否存在,系统不允许用户名重复
then begin
MessageDlg(‘用户名已存在,请输入新的用户名和密码!‘,
mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end
else begin
if Edit2.Text<>Edit3.Text
then begin
MessageDlg(‘您输入的两个密码不相同,请重新输入!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit2.SetFocus;
end
else begin
with datamoduleform.KeyQuery do file://在数据库中添加该用户
begin
close;
SQL.Clear;
SQL.Add(‘insert into Key values(:KeyName,:KeyNo)‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
Parameters.ParamByName(‘KeyNo‘).Value:=Edit2.Text;
execSQL;
end;
MessageDlg(‘新用户添加乐成,您可以继续添加用户,或按“作废”退出。‘,mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end; end; end;
end;
5.7.4 用户注销窗体模块的实现

图5.10 用户注销窗体
procedure Tkey4form.SpeedButton1Click(Sender: TObject);
var s:string;
begin file://用户注销窗口注销按钮事务
if (Edit1.Text=‘‘)or(Edit2.Text=‘‘)
then MessageDlg(‘请输入完整的信息!‘,mtInformation,[mbok],0)
else begin
if Not datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判断用户名是否存在,用户名必须存在,才可以删除
then begin
MessageDlg(‘您所输入的用户名不存在,请重新输入或按“作废”退出。‘,
mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit1.SetFocus;
end
else begin
with datamoduleform.KeyQuery do
begin
close;
SQL.Clear;
SQL.Add(‘select * from Key where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
open;
s:=FieldValues[‘KeyNo‘];
end;
if s<>Edit2.Text file://判断该用户名下的密码是否准确
then begin
MessageDlg(‘您所输入的密码不准确,请重新输入或按“作废”退出。‘,
mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit2.SetFocus;
end
else begin file://从数据库中删除该用户
with datamoduleform.KeyQuery do
begin
close;
SQL.Clear;
SQL.Add(‘delete from Key where KeyName=:KeyName‘);
Parameters.ParamByName(‘KeyName‘).Value:=Edit1.Text;
execSQL;
end;
MessageDlg(‘用户已乐成删除,您可以继续删除用户,或按“作废”退出。‘,
mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit1.SetFocus;
end; end; end;
end;

竣事语
本系统是一个面向小型图书企业,具有一定适用性的数据库信息治理系统。它主要完成对图书客栈的一系列治理,包罗入库、出库、库存以及员工和供应商信息治理。本系统接纳当前盛行的面向工具的开发工具—Delphi来完成整个系统的设计,在数据库的设计上使用了Access的便利性和适用性。
本系统具有相当的适用功效。在查询方面,系统实现了多条件恣意字段的模糊查询,同时在分类查询上实现了动态天生,系统可以自动识别用户差异的输入。在图书入库、出库和库存三者之间建设了优异的链接关系,某一部门地修改均会自动引发系统对与其相关的部门举行连锁修改。在用户治理方面,系统较好地实现了用户注册,用户注销和密码修改等各项功效。
系统在设计历程中不行阻止地遇到了种种各样的问题,由于整个系统完全都是由小我私人设计的,有关Delphi许多细节问题都要靠自己去探索,加之本人水平有限,并没有完全地明确Delphi的强盛功效,而且还存在着许多不足之处。如:
※ 受开发条件和开发时间的限制,本系统只使用了当地数据库Access,它同应用法式处于统一系统中,能存储的数据量也有一定限制,并没有施展出Delphi其数据库方面的优势;
※ 报表打印功效尚不够周全完善,不能实现动态报表;
※ 在一些数据输入时没有实时的举行数据名堂校验,不能保证数据输入的绝对准确性。
※ 由于时间关系,系统功效实现不够完善,使用不是很利便,好比,没有实现多条纪录的连锁删除和添加以及数据的导入功效。
这些都是需要完善的地方,该系统离现实使用也尚有相当的距离,需要我举行一直地增补和完善。
通过本次结业设计我学到了不少新的工具,也发现了大量的问题,有些在设计历程中已经解决,有些尚有待以后逐步学习。只要学习就会有更多的问题,有更多的难点,但也会有更多的收获。

考 文 献
[1] 郑荣贵、黄平、谷会东,Delphi 6.0数据库开发与应用,中科多媒体电子出书社,2002
[2] 伍俊良,Delphi 6控件应用实例教程,北京希望电子出书社,2002
[3] 卢国俊,Delphi 6数据库开发,电子工业出书社,2002
[4] 边萌,Delphi 编程起步,机械工业出书社,2002
[5] 伍俊良,Delphi 6课程设计案例精编,中国水利水电出书社,2002
[6] 丁宝康,数据库原理,经济科学出书社,2000
[7] 陆丽娜,软件工程,经济科学出书社,2000

 

  全套结业设计论文现成制品资料请咨询 625110801      返回澳门牛牛平台 如转载请注明泉源于mog-net.com  


打印本页 | 关闭窗口
 上一篇文章:暂时没有

Email:biyeshejiba@163.com 在线QQ:   625110801 结业作品网站是国家工信部存案的正规学生结业作品网站  
本站结业设计结业论文资料均属原创者所有,仅供学习交流之用,请勿转载并做其他非法用途.若有侵占您的版权有损您的利益,请联系我们会连忙纠正或删除有关内容!