《工资管理系统论文.doc》由会员分享,可在线阅读,更多相关《工资管理系统论文.doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流工资管理系统论文.精品文档.XXXXXXXXXXX学院毕业论文Delphi在工资管理系统中的应用学生姓名 XXXXXXXXXXXXXXXXX指导教师 XXXXXXXXXXXXXXXXX专 业 XXXXXXXXXXXXXXXXX年 级 XXXXXXXXXXXXXXXXX完成日期 XXXXXXXXXXXX摘要 数据库支持是delphi编程环境中的关键部分,delphi6.0继续在这一方面发挥了强大的优势。本文是用delphi6.0所编成的工资管理系统,主要介绍了本课题的开发背景,所要完成的功能和开发的过程。重点的说明了系统设计的重点、设计思想、难
2、点技术和解决方案。关键字 : 数据库 delphi6.0 工资管理系统Abstract Data base is a key part to Delphi, Delphi 6.0 continue to develop the powerful superiority in this aspect.This thesis introduce the Wages of Management System , it usage Delphi 6.0 development tool,tell us the development background of the topic,the functi
3、on and the developing procedure of the system.It explain to the emphasis , the idea , the difficult technique and the settling plan of the system.Key word :Data base delphi6.0 the Wages of Management System目 录第1章 开发工资管理系统的问题41.1技术背景和需求分析 41.2本系统的目的和意义 4第2章 工资管理系统的分析与设计52.1系统的分析与概要设计52.2 连接数据库方面的问题 5
4、第3章 系统各模块详细设计及代码实现93.1 模块的开发环境的简介_Delphi 93.2 系统各模块的详细设计和代码实现 13毕业设计小结25参考文献 26第一章 开发工资管理系统的问题1.1技术背景和需求分析随着计算机技术的飞速发展,计算机在企业管理中应用的普及,利用计算机实现工资的数据库管理势在必行。人员方面:可随时通过工资管理员根据本人需要查阅工资情况,每月可以领取相应的工资报表,以进行检查和核实。财务人员方面:实现工资数据输入、查询、修改和打印的计算机化管理,减轻工作量,使工资管理更加的规范化。单位方面:实现财务管理系统的统一,开发完本系统后,可使财务管理更具有统一性,提高管理效率,
5、增强单位凝聚力。1.2本系统的目的和意义计算机的应用和普及,使我们可以应用计算机来进行管理,这样,面对大量的管理信息,我们不必再需要人为地管理,我们开发出工资管理软件就可以很轻松的进行管理。工资管理系统是一个协助各单位科学、全面、高效地进行工资管理的系统,在任何一个单位,工资管理是一件非常重要的财务工作,开发工资管理系统是一个通用的管理系统,它是办公自动化系统的基础,是应用计算机进行管理的一种方法。第二章 工资管理系统的分析与设计21系统的分析与概要设计 一个基本的工资管理系统有利于对工资进行方便的录入、查询、显示和打印帐单,不但可以提高工作效率,还可以提高单位人员的积极性,增强单位的活力。平
6、时在工资的统计和发放中难免会出现一些差错,既浪费人力又不能很好的提高计算的准确性。而工资的发放又有较强的时间限制。开发工资管理系统,用计算机来统计和计算工资,可以避免了许多人工发放时工资的差错,不仅可以保证计算的准确性,还可以对各种信息进行统计。其主要任务是用计算机对各种工资信息进行日常的管理,如查询、修改、增加、删除以及存储等,迅速准确地完成各种工资信息的统计和汇总工作,快速打印出工资报表。针对系统服务对象的具体要求,设计了本工资管理系统。通过对用户需求的分析,我们可以分析出工资管理系统大致可以分为5个模块:登录模块,工资录入模块,工资查询模块,工资帐单模块,工资报表模块。功能模块如下:工资
7、管理系统登录模块工资报表模块工资帐单模块工资查询模块工资录入模块本工资管理系统主要有以下几大功能:(1) 对人员的工资进行修改、录入。可以对人员的工资档案进行个别、部分和批量修改,同时,能对各人的工资进行便捷的录入。(2) 查询统计功能。要求即可以按照一定的查询方式进行,比如按照单位名称,姓名,职务,工资年份,工资月份等条件来进行查询统计。(3)数据帐单显示功能。要求能依次显示单位人员的工资发放情况,用表格的形式更加直观的列出每个人员一定时间的工资情况。(4) 报表打印功能。每月发放工资时,要求能够打印本月的工资单、随工资发给每个职工的工资单以及工资统计表。2.2连接数据库方面的问题 在数据库
8、应用程序中,Database控件是很有用的。它能够管理和操纵数据库的连撞,控制数据库连接的持续性,具有管理事务和申请更新数据的功能。本节将介绍DataBase控件,以及如何实现数据库的连接。221 Database控件 每个应用程序中的基于BDE的数据库的连接,都是通过一个Database组件进行的。用户可以特意地在设计期间创建Database控件,也可以在程序运行期间动态生成一临时的Database控件。很多情况下,其实并没有必要特意地使用Database控件。当应用程序试图打开一个数据库时,会自动创建一个临时的Database控件。当然,这个临时的Database控件只在数据库连接期间有效
9、,一旦关闭了数据库,这个临时的Database控件将被删除。临时数据库组件提供了对许多类型的数据库应用程序的支持,而不需要掌握数据库连接的细节。不过,两层或多层的ClientServer应用程序中,最好还是特意地使用Database组件。因为这样可以获得对数据库的更大范围的控制,包括以下各项: 创建永久数据库连接 用户自定义数据库服务器登录方式 控制事务以及定制事务的隔离标准 为应用程序创建BDE别名 在设计期加到窗体或数据模块上的Database控件,称为永久的Database控件,这是相对临时的Database控件而言的。使用永久的Database控件,可以建立永久的连接,具有管理事务的能
10、力,可以创建应用程序专用的BDE别名,还可以响应OnLogin事件。临时的Database控件的功能有某种程度的局限,它的某些关键属性受制于它所属的BDE会话期对象。例如,BDE会话期对象的KeepConnections属性决定了当所有数据集都关闭后,数据库是否继续维持在连接状态,而永久的Database控件的KeepConnections属性则不受BDE会话期对象的KeepConnections属性的影响。有时候,很难确定到底需要用几个Database控件,而不用临时的Database控件。这时候,就需要在运行期动态地创建Database控件。要在运行期动态地创建Database控件,首先要
11、声明一个Database类型的变量,然后调用Database的Create函数来创建Database的对象实例。2.2.2 连接控制 无论是永久的Database控件还是临时的Database组件,都可以通过它们的属性、方法和事件来控制有关连接数据库的行为,这也是使用Database控件的主要目的。下面详细分析常用的连接控制功能。 一般先要建立数据库组件的BDE会话期,所有的Database控件都必须指定一个所属的BDE会话期,这时就要用到两个属性,SessionName和Session。 SessionName属性用于指定一个BDE会话期的名称。设计时把一个Database组件放到窗体或数据
12、模块上时,它的SessionName属性自动设为Default,这是默认的BDE会话期的名称。如果已经在窗体或数据模块上放了若干个Session组件,就可以从一个下拉列表框中选择SessionName属性的值。 Session属性是只读的,用于返回Database控件所属的BDE会话期对象。如果SessionName属性设为空或Default,Session属性就返回默认的BDE会话期对象。当Session属性返回BDE会话期对象后,就可以访问Session的属性、方法和事件,即使不知道该BDE会话期对象的实际名称。1指定数据库控件的BDE别名 要指定一个数据库,就要用到AliasName属性
13、或DriverName属性。这两个属性是互斥的,设置其中一个,另一个就被清空。修改AliasName、DriverName、DatabaseName等属性之前都要先把Connected属性设为False,否则将触发异常。 AliasName属性用于指定一个数据库的别名,只能设成已有的BDE别名,如DBDEMOS、DefaultDB、IBLOCAL等。数据库的别名一般用SQL Explorer或BDE管理程序定义。不过,也可以用DatabaseName属性定义一个应用程序专用的别名。DatabaseName属性可以设为一个已有的BDE别名,对于Paradox和dBASE表来说,也可以设为表所在的
14、路径。 用DatabaseName属性定义的别名只限于在本应用程序中使用,它将出现在Table、Query、StoredProc控件的DatabaseName属性的下拉列表框中。 DriverName属性用来指定一个数据库驱动程序的类型,可以设为STANDARD(用于dBASE和Paradox)、MSSQL、1NTERBASE、ORACLE、SYBASE、INFormiX等。设置了DriverName属性后,还应设置Params属性指定连接参数。 数据库驱动程序其实是BDE别名的一个参数。因此,设置了AliasName属性后,DriverName就会自动清空。反之,设置了DriverName属
15、性后,AliasName属性也会自动清空。这样看来,DriverName属性似乎作用不大,只要设置AliasName属性就够了。不过,当DatabaseName属性定义一个应用程序专用的别名时,需要设置DriverName属性指定该别名使用的驱动程序。 设计时,要指定一个BDE别名或者数据库驱动程序,或者定义一个专用的别名,既可以在对象观察器中进行,也可以双击Database控件打开数据库属性编辑器,然后在Name框内设置DatabaseName属性的值:在AliasName框内设置Alias属性的值,在DriverName框内设置DriverName属性的值。也可以在运行期设置Databas
16、eName、AliasName或DriverName属性的值。例如,可以用文本框的文本作为数据库组件的本机别名,如下 所示: DatabaselDatabaseName:EditlText;2设置BDE别名的参数 要设置BDE别名的参数,如路径、服务器名、缓存长度、语言驱动程序、用户名、口令等,就要用到数据库组件的Params属性。 在设计期,要设置BDE别名的参数有以下3种方式: 使用SQLExplorer或BDEAdministrator来定义或修改别名以及参数。 在对象观察器中单击Params属性边上的按钮打开字符串列表编辑器,然后按格式输入参数的名称和值。 双击Database组件打开
17、数据库属性编辑器。单击Defaults按钮后Parameter overrides文本框内列出了与驱动程序所对应的默认参数,对于dBASE和Paradox来说,默认的参数主要是路径,对于远程服务器来说,默认的参数包括服务器名、用户名和口令、语言驱动程序等。 单击Clear按钮可以把Parameter overrides文本框的Params属性清空。可以直接在Parameteroverrides文本框内修改参数,也可以添加新的参数。要在运行期设置BDE别名的参数,就要用到TStrings对象。Params属性实际上是一个字符串列表,每个字符串的格式是“名称值”。程序示例如下: With Data
18、basel DO Begin ParamsClear;ParamsAdd(,UserNameSysdba,); ParamsAdd(,Password1234,); LoginPrompt:False; Open; End;2.23遍历一个数据库的所有数据集 Database控件的DataSets属性和DataSetCount属性配合起来可遍历一个数据库的所有数据集。 DataSets属性是一个数组,它的每一个元素都是一个活动的数据集,如Table、Query或StoredProc,每个数据集都可以通过序号来访问。 DataSetCount属性可返回DataSets数组中元素的个数,程序示例如
19、下: var I: Integer; begin for I:= 0 to DataSetCountl do if DataSets1 iS TTable then DataSets1CachedUpdates:=True; end;2. 2.4 Database与Session的关系 Database控件主要用来管理数据库的连接,而Session则用于对一个应用程序中的Database控件进行全局控制,包括临时的Database控件。 Session的方法针对所有的Database控件,它不考虑Database控件的状态。例如,Session 的DropConnections函数将关闭所有的
20、数据集,并断开所有的数据库,即使这些Database控件的KeepConnections属性设为True。而Database只能管理它所连接的数据库,例如, Database的CloseDataSets函数只关闭某个数据库的所有数据集,不关闭其他数据库的数据集。第三章 系统各模块详细设计及代码实现本系统结合单位实际的人事、财务制度,经过实际的需求分析,采用数据库功能强大的DDLPHI 6做为开发工具。Delphi是全新的可视化编程环境,为我们提供了一种方便、和快捷的Windows应用程序开发工具。它使用了微软视窗图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言
21、、当今世界上最快的编辑器、最为领先的数据库技术。整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,使用windows 2000作为开发平台,经测试,符合设计需要。3.1.1 Delphi的简介Delphi 6.0 具有以下特性:基于控件设计和可视化的开发环境以及面向对象的编程方法,使得程序开发者可以不用书写一行代码就能设计出满意的界面。高速的编译器生成更为短小的二进制代码,因而提高了运行效率、节约运行时间。强大的数据库支持,使程序开发人员只需通过数据库引擎工具而不用与数据库文件直接打交道,就可以操作和处理数据库文件。结构严谨、数据类型丰富、运行性能优越的Object Pascal语
22、言,是一种面向对象的结构化程序设计语言,具有自动的异常处理能力以及类的封装能力。这一切为Delphi6的易学易用性奠定了坚实的基础。Delphi6功能强大,使用诸如多媒体、网络等各种应用程序的开发。尤其在数据库方面更为突出,提供了更为先进的数据库引擎,最新的数据分析手段以及大量控件,适于开发各种结构的软件,如客户机/服务器型、浏览器/服务器型、双层、多层等。Delphi6 新的框架包括BizSnap、WebSnap和DataSnap,用户可以用它开发支持Web服务特性的服务器端和客户端应用程序,这一切是通过一套高度集成的可视化开发工具、先进的编译技术和可重用的控件完成的。3.1.2Delphi
23、的语言与函数 Delphi的编程语言即Object Pascal是在Pascal的基础上发展起来的,它融合了当今先进的面向对象的编程思想,并汲取了Windows图形化界面的精华,在其类库中封装了大量的基于Windows应用程序设计的类。应用程序设计的类。Object Pascal语言具有可读性好、编写容易的特点,这使得它很适合作为基础的开发语言,因此,Object Pascal成为Delphi这种先进开发环境的程序设计语言。在程序设计中,为了避免重复键入同样的代码,经常使用过程(Procedure)与函数(Function)。函数使用一个程序块,计算并返回一个指定类型的值给调用语句。而过程类似
24、于C语言的Void函数,不返回任何类型的值给调用语句。Delphi的运行库中包含许多过程与函数以供应用程序调用。在对象中说明的过程和函数称为方法(Method)。3.1.3 面向对象的编程在 Delphi中创建的每一个菜单和窗口都是一个模块称为对象(Object)。Delphi应用程序基本的构建块是用户所创建的对象,每一个对象都具有一些特性和行为(属性、事件和功能)利用诸如封装型、继承性和多态性这样的面向对象的编程技术。开发人员可以最有效利用所创建的每一个对象。使用应用程序具有可通用性可说扩展性和强有力的功能。DELPHI应用由一系列对象组成,包括有函数、菜单、函数、结构和数据窗口、用户对象、
25、用户事件等等,对象中又包含若干控件如命令按钮、单行编辑器等这些对象和控件都可在许多应用中重复使用。3.1.4 Delphi中所涉及到的数据库的简介SQL语言简介: SQL的全称是STRUCTURED QUERY LANGUAGE,即结构化查询语言。SQL语句可以从关系数据库中获得数据,也可以建立数据库、增加数据库、修改数据库。SQL语言可以完成许多功能,例如:查询数据,在数据库表格中插入、修改和删除记录,建立、修改和删除数据对象,控制对数据和数据对象的存取,确保数据库的一致性和完整性等。本系统中主要涉及到的SQL语句是SELECT语句。SELECT语句的一般格式:SELECTALL|DISTI
26、NCT目标列表达式别名,目标列表达式别名FROM表名或视图名别名,表名或视图名别名WHERE条件表达式GROUP BY列名1HAVING条件表达式ORDER BY列名2ASC|DESC;DELPHI中的SQL语句的使用:在DELPHI中使用SQL进行查询是非常方便的,一般说来,都是通过TQuery组件来使用SQL语言的。TQuery组件提供了用sql语句了检索物理数据库的表以及将数据送到物理的数据表中,它是数据工程(bde)和数据源之间的接口。一个查询组件封装一个sql语句,该语句在客户应用程序中可从一个或多个数据表中完成查询,插入,修改和删除数据。在运行是设置SQL语句,应遵循如下步骤:关闭
27、查询组件,如 QUERY1.CLOSE。调用SQL属性的CLEAR方法,删除当前的SQL语句。调用SQL属性的ADD方法,生成完整的SQL语句。打开查询。如QUERY1.OPEN。3.1.5 与数据库的连接性要进行数据库应用首先要解决数据源的问题,数据源通常是各种各样的数据库表格。 在利用可视化开发工具作数据库开发时,通常应用程序不能和数据源直接打交道,而要通过一些中介,这些中介就叫做数据库驱动器。一般而言,对应于一种数据库至少有一种数据库驱动器。随着数据库的种类的增多,也就逐渐地产生了形形色色的数据库驱动器,于是就出现了管理这些数据库驱动器的数据库引擎。Borland推出了一个数据库引擎(B
28、ORLAND DATABASE ENGINE),缩写为BDE,它能直接到其它类型的数据库,还能将应用从本地上传到客户机服务器系统,同时有很高的效率。DELPHI数据库应用程序是通过BDE来完成对数据库的访问。它能访问的数据可分为两大类,一类是本地数据,另一类是客户机服务器体系的异地数据,很显然我们要对数据库进行操作只需通过BDE就可以了。3.1.6 数据库引擎管理器简介 Delphi内置了数据库引擎(BorlandDatabaseEngine),利用它可以实现数据库应用程序与相应的数据库的连接,因此在Delphi中BDE数据库引擎非常重要。BDE为Delphi数据库应用程序访问各种数据库提供了
29、一致的接口。它具有以下一些特点: BDE为访问不同格式的数据库,如dBASE,Paradox,Access,FoxPro,SQLServer,Oracle以及任何符合ODBC(Microsoft Open DataBase Connectivity)的数据源提供了一致的API接口。这样,通过BDE访问任何一种格式的数据库,用户不必修改程序代码,只需在BDE中设置新的数据库的服务器名或者路径即可。 BDE非常适合开发大型的客户机朋艮务器应用程序,因为通过BDE不但可以访问本地数据库,如Paradox等,还可以访问远程的SQL数据库,如SQL Server,Oracle,Sybase,Inform
30、ix等。 BDE是一个基于驱动程序的体系结构,每一种数据库格式或者数据源都有一个单独的驱动程序,每一个驱动程序都支持与它相近的数据源,例如Paradox的驱动程序就可同时支持ParadoxforWindows70,Paradox50,Paradox40,Paradox35以及更早的版本。 BDE也是面向对象的结构,可以很方便地扩展和定制。如果要让BDE能访问一个新的数据库,只要在系统中安装新数据库的BDE驱动程序或者ODBC驱动程序就可以了。 BDE是32位的数据库引擎,支持多线程和有优先级的多任务处理,多个应用程序可以同时运行并访问同一个数据库。3.1.7 查询数据库 在这里介绍如何使用Qu
31、ery组件查询数据库,如何通过SQL语句检索、插入、更新和删除数据。SQL是符合工业标准的关系数据库语言,远程的基于服务器的数据库通常使用这一标准语言,如Sybase、Oracle、InterBase和MicrosoftSQL Server。如果相应Delphi版本含有SQL Links,则查询组件可以用于远程数据库,如Paradox、dBASE、FoxPro和Access以及符合ODBC的数据库。1. 有效地使用查询 要有效地使用查询,必须熟悉标准的SQL语言以及所使用的服务器对SQL-92的限制和扩展,同时还要熟悉BDE。查询桌面数据库和远程数据库有所不同,下面将详细介绍。 查询桌面数据库
32、 一个桌面开发者,应对数据表、记录和字段的概念有所了解,又能熟练使用Table控件访问数据集中的每一条记录和每一个字段。还可以使用Table的范围和过滤功能在数据集中选择一部分记录,前者用来选择一块连续的记录,这些记录的值在一个特定的范围内;后者用来选择非连续的记录,这些记录符合特定的条件。 查询类似于过滤,不同的是,查询要用到Query组件和SQL属性,有时候可能还要用到Params属性。从功能上讲,查询要比过滤复杂和强大些,这主要体现在以下两点: 查询可以同时对几个数据表进行操作。 查询结果中只包含部分字段,而过滤将返回所有字段。 查询也可以带参数,此时称为参数化查询。所谓参数,类似于变量
33、,它的实际的值由BDE在执行SQL语句之前赋值。参数化查询的好处是,不需要修改SQL语句,只要修改参数的值,就能执行不同的查询功能。大部分情况下,使用Query组件是为了在数据集中选择一部分字段和记录,但也可以使用SQL语句实现更新、插入和删除记录的功能,这是与Table控件的一个区别。2. 使用Ouery控件的一般步骤 在给出使用Query组件的步骤前,先列出该组件可以访问的数据库: Paradox或dBASE数据库。这是通过BDE内置的LocalSQL实现的,Local SQL是SQL-92标准的一个子集,支持大部分DML和DDL。 Local InterBase Server。这是通过I
34、nterBase引擎实现的。 远程数据库,如Oracle、Sybase、MS-SQL Server、InFormix、DB2和InterBase。 不过,要求Delphi必须安装相应的SQL Links驱动程序。不同服务器对标准SQL都有不同的限制和扩展,要查询远程数据库之前,必须先查阅它的有关文档。 Delphi6还支持异构查询,也就是说,可以同时查询几个不同类型的数据库。使用Query组件查询数据库的一般步骤是: (1)把一个Query组件放到数据模块上,设置它的DatabaseName属性,指定要访问的数据库。对于Paradox和dBASE来说,DatabaseName属性可以设为BDE
35、别名如DBEMOS、DefaultDD、IBLOCAL等,也可以是自定义的别名或者表所在的路径。对于SQL表来说,DatabaseName属性只能设为BDE别名。如果应用程序使用Database组件来连接数据库,DatabaseName属性也可以设为应用程序专用的别名。(2)设置SQL属性,指定要执行的SQL语句,还可以设置Params属性,为SQL语句设置参数。(3)把DataSource组件放到数据模块上,设置它的DataSet属性,指定Query控件。再把DBGrid组件放到窗体上,设置它的DataSource属性,指定DataSource组件。(4)执行SQL语句。要执行SQL语句有两
36、种方式:一是在设计期把Active属性设为True,程序启动时将自动执行SQL语句;另一种方式是在运行期调用Open或ExecSQL执行SQL语句。如果希望返回查询结果,调用Open;如果不需要返回查询结果,调用ExecSQL。在调用Open或ExecSQL之前,最好先调用Prepare通知服务器做好准备。执行SQL语句所返回的查询结果实际上是数据集中满足特定条件的记录所组成的子集数据库栅格中只显示符合特定条件的记录。3. 执行查询 指定了SQL语句并且提供了参数后,就可以查询了。如果是第1次执行查询,最好调用Prepare通知BDE或服务器做好准备,这样能加快查询的速度。 既可以在设计期执行
37、查询,也可以在运行期执行查询。 要在设计期执行查询,只要把Active属性设为True。不过,在设计期能执行的SQL句,仅限于SELECT语句,不能是INSERT、UPDATE或DELETE语句。 要在运行期执行查询,可以调用Open或ExecSQL函数。其中,Open适合于执行SELECT语句,而ExecSQL适合于执行INSERT、UPDATE或DELETE语句,后者不返回结果。在调用Open或ExecSQL之前,首先要调用Close,程序示例如下: CustomerQueryClose; CustomerQueryOpen; 如果在编程的时候无法确定是否要返回查询结果,可以用tryexc
38、ept结构把这两个过程都写进去。一般Open在try部分调用,而ExecSQL在except部分调用。这样,即使Open调用失败,也能执行到ExecSQL。程序示例如下: try Query2Open; except On E: Exception do if not (E is ENoResultSet) then raise; end; 前面多次提到,在执行查询前最好先调用Prepare。因为预先用Prepare能够改善应用程序的性能。程序示例如下: CustomerQueryClose; if not (CustomerQueryPrepared) then CustomerQueryP
39、repare; CustomerQueryOpen; 上述程序首先调用Close,然后检查Prepared属性,如果这个属性返回Tree,表示已经准备好;如果这个属性返回False,表示没有准备好,此时就要调用Prepare。4. 查询结果 默认情况下,查询结果是只读的。应用程序可以用数据控件显示询结果,但用户不能编辑数据。怎样才能使用户能够编辑数据呢? 首先,必须把Query控件的RequestLive属性设为True。不过,把RequestLive属性设为True并不能保证查询结果一定可以修改,因为这还取决于查询使用的是Local SQL还是与服务器相关的SQL。像查询Paradox或dB
40、ASE以及异构查询都是使用Local SQL,而查询远程服务器则使用与服务器相关的SQL。 即使RequestLive属性设为True,而且查询的是本地数据,但由于SELECT语句的文法不合适,BDE也将返回只读的查询结果。其实,在编辑数据之前,先要访问CanModify属性。只有当这个属性返回True时,才表示查询结果是可编辑的。3.2系统各模块的详细设计和代码实现3.2.1登录窗口设计打开delphi6.0主界面,新建一个form,将其命名为Gongziform,caption属性设为系统登录。然后加入四个speedbutton按钮,其caption属性分别设定为工资录入、工资查询、工资帐
41、单、工资报表,以完成系统规定的功能。再加入一个shape和label控件,将label控件的caption属性定为工资管理系统。为说明起见,加入一个statictext控件,属性设为请选择一项登录。最后分别加入两个label、edit、button控件。如下图所示:3.2.2功能说明用户登录时,可选择四项功能模块中的一项进行登录,输入正确的用户名和口令,点击登录按钮进入本系统。如输入有误,系统提示:“用户名或口令有误!请输入正确的用户名和口令!”3.2.3代码实现uses UInput, UQuery,UZhangdan,UBaobiao;procedure TGongziForm.MsgBo
42、x;beginMessageBox(Handle,错误的操作,请检查当前程序状态!,PChar(警告),MB_OK+MB_ICONWARNING);end;procedure TGongziForm.ExitButtonClick(Sender: TObject);begin if Application.MessageBox(确认要退出工资管理系统吗?,PChar(信息提示),MB_OKCANCEL+MB_ICONQUESTION)=IDOK then Close else Exit;end;procedure TGongziForm.FormClose(Sender: TObject; v
43、ar Action: TCloseAction);begin Action:=caFree; InputForm.Free; QueryForm.Free; ZhangdanForm.Free; BaobiaoForm.Free;end;procedure TGongziForm.UsernameEditEnter(Sender: TObject);begin UsernameEdit.Color:=clMoneyGreen;end;procedure TGongziForm.UsernameEditExit(Sender: TObject);begin UsernameEdit.Color:
44、=clWhite;end;procedure TGongziForm.PasswordEditEnter(Sender: TObject);begin PasswordEdit.Color:=clMoneyGreen;end;procedure TGongziForm.PasswordEditExit(Sender: TObject);begin PasswordEdit.Color:=clWhite;end;procedure TGongziForm.UsernameEditKeyPress(Sender: TObject; var Key: Char);begin if not(Key i
45、n0.9,#8) then begin Key:=#0; end; if Key=#13 then PasswordEdit.SetFocus;end;procedure TGongziForm.PasswordEditKeyPress(Sender: TObject; var Key: Char);begin if Key=#13 then LoginButton.SetFocus;end;procedure TGongziForm.SpeedButton1Click(Sender: TObject);begin SpeedButton1.Flat:=False; SpeedButton2.Flat:=True; SpeedButton3.Flat:=True; SpeedButton4.Flat:=True; UsernameEdit.Enabled:=True; PasswordEdit.Enabled:=True;end;procedure TGongziForm.SpeedButton2Click(Sender: TObject);begin SpeedButton1.Flat:=True; SpeedButton2.Flat:=False; SpeedButto