• 1.33 MB
  • 2022-04-22 11:27:59 发布

毕业设计(论文)-VB6.0家庭财务管理系统.doc

  • 116页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'北京理工大学现代远程教育学院毕业设计(论文)摘要家庭财务管理系统是为了适应目前家庭理财管理的信息化需求而开发的软件,适用于个人和家庭进行财务管理。针对目前大多数家庭理财管理现状,成功的将企业计件工资、计时工资及固定工资等进行完美结合,可以根据各种计算方法任意选择搭配。解决了理财计算难、工作量大的问题,为用户提供的科学、简便、简洁、实用的工资管理新模式。家庭财务管理系统的实施可以减轻财务管理的工作量,避免财务管理的重复和失误,提高财务管理的效率。关键词:VISUALBASIC、控件、窗体、域全套源程序代码,联系153893706第116页 北京理工大学现代远程教育学院毕业设计(论文)目录摘要1ABSTRACT2目录3前言5第一章MIS的概念及解释61.1MIS对象61.1.1整体系统71.1.2组成分类71.2系统目标内容71.3MIS建设方法81.3.1系统分解81.3.2全面评估81.3.3逐步迫近81.4按计算机的特点组织系统8第二章数据库理论102.1设计原则102.2 设计方式112.2.1系统设计112.3设计步骤112.3.1数据库结构定义11第116页 北京理工大学现代远程教育学院毕业设计(论文)2.3.2数据表定义112.3.3存储设备和存储空间组织112.3.4数据字典设计122.4常见问题122.4.1链接关系的确定122.4.2确定单一的父子关系结构122.4.3数据资源安全保密属性132.5 数据库设计分析132.5.1数据组织的规范化形式132.5.2firstnormalform(1stNF)142.5.3secondnormalform(2ndNF)142.5.4thirdnormalform(3rdNF)14第三章使用ACCESS2000实现关系型数据库153.1数据库的概念153.2新建一个数据库153.3修改已建的数据库163.4实现数据库之间的联系16第四章系统开发环境164.1VisualBasic简介164.2实现关系型数据库实现174.3数据库引擎17第五章系统设计与实现184.1系统总体规划18第116页 北京理工大学现代远程教育学院毕业设计(论文)4.2系统功能184.3系统具体实现184.3.1数据输入184.3.2查询184.3.3信息浏览184.3.4报表输出184.4系统设计与实现184.4.1数据库设计184.4.2登陆界面设计194.4.3主界面设计224.4功能设计484.4.1记录模块484.4.2预定模块534.4.3折线图表模块574.4.4查询模块584.4.5帮助界面设计58第五章总结59参考资料59附录60第116页 北京理工大学现代远程教育学院毕业设计(论文)前言在计算机没有普及的是,人们在家庭财务管理中多采用手工记录,这种方法存在着记录效率低,可靠、安全、保密性差,缺少全系统统一的数据资源和规范的管理手段(执行记录、存档以及统计分析等),许多信息分散随意存放,缺少一致性、易于丢失、不易重复使用。管理信息系统(ManagementInformationSystems简称MIS)在现代社会已深入到各行各业,由于计算机技术的迅速发展和普及,MIS事实上已成为计算机MIS。第116页 北京理工大学现代远程教育学院毕业设计(论文)计算机应用已经渗透到日常工作的许多方面,无论是其自身还是所发挥的作用,计算机都标志着一种高科技、高效率和高水平。第一章MIS的概念及解释MIS是一个不断发展的新型学科,MIS的定义随着计算机技术和通讯技术的进步也在不断更新,在现阶段普遍认为MIS是由人和计算机设备或其他信息处理手段组成并用于管理信息的系统。1.1MIS对象信息是经过加工的数据,信息是对决策者有价值的数据。信息的主要特征是来源分散,数量庞大。信息来源于生产第一线,来源于社会环境,来源于市场,来源于行政管理等部门。信息具有时间性。信息的加工方式有多种形式。管理信息系统(ManagementInformationSystems简称MIS)在现代社会已深入到各行各业,由于计算机技术的迅速发展和普及,MIS事实上已成为计算机MIS。计算机应用已经渗透到日常工作的许多方面,无论是其自身还是所发挥的作用,计算机都标志着一种高科技、高效率和高水平。为了企业创先进、争一流,为了企业的明天,许多企业的领导已经或正准备投入高额资金,建立大规模的计算机管理信息系统(MIS)。第116页 北京理工大学现代远程教育学院毕业设计(论文)就系统开发的某一具体问题来说,主要是开发用于数据处理的程序,一般是比较容易实现的。因而很少出现因网络或程序调试不通而中止开发的情况,并且大都采用最新的、高性能的计算机软硬件平台,由优秀的计算机技术人员实施开发,但预期的目标常常难以达到。就从系统目标和内容的确立、开发过程的组织与控制、按计算机的特点组织系统等几个方面分析,强调MIS建设的同时面对用户和计算机系统两个方面,仅仅注重计算机技术和程序开发是不够的。实现管理信息化,未来企业别无选择。就像我们建设一个厂房,作为我们赖以从事生产工作的基础设施一样,企业管理信息化是在建设一个我们赖以从事管理工作的基础设施。我们可以回头看一下管理工具的发展,从算盘、传真机、计算机网络到财务软件,它们从辅助人们从事管理工作的简单工具,逐渐向具有部分智能化的方向发展,在每一个阶段都对管理工作的改进分别起到了十分重要的作用。1.1.1整体系统MIS是一个不断发展的新型学科,MIS的定义随着计算机技术和通讯技术的进步也在不断更新,在现阶段普遍认为MIS是由人和计算机设备或其他信息处理手段组成并用于管理信息的系统。系统是由相互联系、相互作用的若干要素按一定的法则组成并具有一定功能的整体。系统有两个以上要素,各要素和整体之间,整体和环境之间存在一定的有机联系。系统由输入、处理、输出、反馈、控制五个基本要素组成。信息系统是输入的数据,经过处理,输出的是信息的系统。1.1.2组成分类管理信息由信息的采集、信息的传递、信息的储存、信息的加工、信息的维护和信息的使用五个方面组成。第116页 北京理工大学现代远程教育学院毕业设计(论文)任何地方只要有管理就必然有信息,如果形成系统就形成MIS。计算机设备使MIS更有效,尤其是现代社会,MIS已和计算机设备不可分离,因此一般来说MIS就是计算机MIS。MIS包括计算机、网络通讯设备等硬件成份,包括操作系统、应用软件包等软件成份。并随着计算机技术和通讯技术的迅速发展还会出现更多的内容。计算机设备并不是MIS的必要条件。1.2系统目标内容MIS的建设中,系统的最终目标和内容常常难以确定。比如:设备管理系统,设备的种类成千上万,规格型号、归属部门、安装位置等千差万别。MIS要管理的内容、达到的效果及运行后的状态等涉及的内容很多,很难通过调研完全确定所有的内容。事实上,MIS建设和一般工程的根本区别就是不能在开发前完全确立系统的目标和内容,即不可能期望有一个详尽的设计去简单地、方便地组织和控制系统的建设,这是MIS建设的最大特点,也最易引起比较大的问题。1.3MIS建设方法MIS建设应从实际需要和可能出发,确立适度的开发目标和内容,使企业的决策者和系统的开发者都对系统建设心中有数,以便有效地安排和布署开发工作,并且在开发过程中逐步确立新的工作方式。系统的目标和内容涉及因素很多,而应考虑相应的策略和方法:1.3.1系统分解系统建设的规模一般较大,不易掌握和控制,可以将其分解为多个子系统,以降低系统的复杂性。原有方式总是按照工作相关的程度分为多个部门,因此,划分子系统是方便的,关键是要制定描述子系统间联系的约束规范,以此保证各子系统最终能形成一个统一的系统。1.3.2全面评估第116页 北京理工大学现代远程教育学院毕业设计(论文)对于各子系统,全面评估系统开发的目的、内容、效果、条件相运行后的维护扩展等因素,这些因素关系到系统建设的成败,应从实际需要和可能出发,要从大局着眼进行认真的分析。盲目求大求全就会导致图虚名而招实祸,达不到预期的效果。1.3.3逐步迫近在满足系统约束规范的基础上,用快速原形法开发各子系统。这样就不必首先进行详尽的需求分析,以完全掌握原有的方式,而是通过试运行把用户的需求不断吸收进去,让系统直接逼近开发目标。这样做有许多益处:可以降低开发者掌握原有系统的难度;可以更准确地了解用户的需求、确立新的工作模式;开发过程中,用户已经接受了新的系统。1.4按计算机的特点组织系统原有的方式一般是以适应人的工作特点逐步形成的,常常是分散的、不规范的、其处理过程也较长。而计算机系统适合处理大批量的、规范的数据,并且处理过程力求简明。按计算机的特点组织新的系统,不单单提供了数据的处理而且能使工作方式变得规范、简明。因此,MIS的开发不是在模拟原有的方式,而是根据计算机的特点重新设计出一种新的工作模式。实际工作中,对这一点常常比较忽视,甚至完全根据人工方式的特点设计计算机的功能。就象如果用工匠们手工生产方式设计汽车工业的生产线,实际上并不能真正提高效率一样,这样的MIS建设并不能发挥出应有的作用。第116页 北京理工大学现代远程教育学院毕业设计(论文)计算机系统的“基础结构”是对企业的数据进行总体的规划和组织,建立起统一的数据平台。以数据平台为中心,将系统开发划分为形成数据平台和由数据平台变换出结果两个部分,在整体上使系统结构简单明了。建立数据平台是面向计算机的有效方法,但不适于直接面对用户及其所使用的工作方式。作为—种开发方法,它适用于目标及所包含的数据内容明确的系统,如:民航及铁路售票系统。这种系统可以直接从组织数据入手实施开发。而对于目标及所包含的数据内容隐蔽的系统,如电厂的设备管理系统,首先要面对的是用户及其所使用的比较模糊的工作方式,对此开发人员在短期内完全掌握是不可能的。此时应采取分解的方式,通过试运行把用户的需求不断的吸收到系统中去。在这个过程中,开发者要注意以数据平台为中心建立起新的系统结构。MIS建设要实现以计算机系统为中心的新的工作方式,其结果无论是计算机系统内部还是人的工作都将是明确的、规范的。MIS建设面对的是原有方式和计算机系统两个截然不同的问题,决不能忽视和混淆。用计算机本身的技术方式去对待整个MIS建设是一种根本性的错误。信息技术正在全球引发一场革命,MIS建设是这场革命的重要内容,是今后企业实现科学化管理获取高效益的基础性工作。MIS建设要涉及用户、原有工作方式、计算机软硬件、程序开发等许多因素,这不是借助某项具体的、特定的技术所能完成的,本质上是一个系统性的问题。第二章数据库理论第116页 北京理工大学现代远程教育学院毕业设计(论文)成功的信息管理系统,是建立在许多条件之上的,而数据库是其中一个非常重要的条件和关键技术。信息管理系统所涉及的数据库设计分五个步骤:数据库需求分析、概念设计、逻辑设计、物理设计与加载测试。数据库需求分析的任务是将业务管理单证流化为数据流,划分主题之间的边界,绘制出DFD图,并完成相应的数据字典。概念设计的任务是从DFD出发,绘制出本主题的实体-关系图,并列出各个实体与关系的纲要表。逻辑设计的任务是从E-R图与对应的纲要表出发,确定各个实体及关系的表名属性。物理设计的任务是确定所有属性的类型、宽度与取值范围,设计出基本表的主键,将所有的表名与字段名英文化,实现物理建库,完成数据库物理设计字典。 加载测试工作贯穿于程序测试工作的全过程,整个录入、修改、查询、处理工作均可视为对数据库的加载测试工作。2.1设计原则要设计出一个好的信息管理系统数据库,除满足系统所要求的功能外,还必须遵守下列原则:1.基本表的个数越少越好。2.主键的个数越少越好。键是表间连接的工具,主键越少,表间的连接就越简单。3.字段的个数越少越好。4.所有基本表的设计均应尽量符合第三范式。第116页 北京理工大学现代远程教育学院毕业设计(论文)数据库的设计中,如何处理多对多的关系和如何设计主键,是两个有着较大难度、需要重点考虑的问题。下面我们着重从应用、数据库设计范式和查询优化等方面来分析本课题的系统关键技术和实现难点并加以解决。2.2 设计方式信息系统的主要任务是通过大量的数据获得管理所需要的信息,这就必须存储和管理大量的数据。因此建立一个良好的数据组织结构和数据库,使整个系统都可以迅速、方便、准确地调用和管理所需的数据,是衡量信息系统开发工作好坏的主要指标之一。2.2.1系统设计数据库设计主要是进行数据库的逻辑设计,即将数据按一定的分类、分组系统和逻辑层次组织起来,是面向用户的。数据库设计时需要综合企业各个部门的存档数据和数据需求,分析各个数据之间的关系,按照DBMS提供的功能和描述工具,设计出规模适当、正确反映数据关系、数据冗余少、存取效率高、能满足多种查询要求的数据模型。2.3设计步骤2.3.1数据库结构定义目前的数据库管理系统(DBMS)有的是支持联机事务处理CLTP(负责对事务数据进行采集、处理、存储)的操作型DBMS,有的可支持数据仓库、有联机分析处理CLAP(指为支持决策的制定对数据的一种加工操作)功能的大型DBMS,有的数据库是关系型的、有的可支持面向对象数据库。针对选择的DBMS,进行数据库结构定义。2.3.2数据表定义第116页 北京理工大学现代远程教育学院毕业设计(论文)数据表定义指定义数据库中数据表的结构,数据表的逻辑结构包括:属性名称、类型、表示形式、缺省值、校验规则、是否关键字、可否为空等。关系型数据库要尽量按关系规范化要求进行数据库设计,但为使效率高,规范化程度应根据应用环境和条件来决定。数据表设计不仅要满足数据存储的要求,还要增加一些如反映有关信息、操作责任、中间数据的字段或临时数据表。2.3.3存储设备和存储空间组织确定数据的存放地点、存储路径、存储设备等,备份方案,对多版本如何保证一致性和数据的完整性。数据使用权限设置:针对用户的不同使用要求,确定数据的用户使用权限,确保数据安全。2.3.4数据字典设计用数据字典描述数据库的设计,便于维护和修改。2.4常见问题为了更好地组织数据和设计出实际应用数据库,应该注意如下问题:规范化地重组数据结构:对数据进行规范化表达,这在后面将会具体讨论。关系数据结构的建立:在进行了数据基本结构的规范化重组后,还必须建立整体数据的关系结构。这一步设计完成后数据库和数据结构设计工作基本完成,只待系统实现时将数据分析和数据字典的内容代入到所设计的数据整体关系结构中,一个规范化数据库系统结构就建立起来了。建立关系数据结构涉及三方面内容:确定关联的关键指标项并建立关联表;确定单一的父系记录结构;建立整个数据库的关系结构。2.4.1链接关系的确定第116页 北京理工大学现代远程教育学院毕业设计(论文)在进行了上述数据规范化重组后,已经可以确保每一个基本数据表(我们简称为表)是规范的,但是这些单独的表并不能完整地反映事物,通常需要通过指标体系整体指标数据才能完整全面地反映问题。也就是说在这些基本表的各宇段中,所存储的是同一事物不同侧面的属性。那么计算机系统如何能知道哪些表中的哪些记录应与其它表中的哪些记录相对应,它们表示的是同一个事物呢?这就需要在设计数据结构时将这种各表之间的数据记录关系确定下来。这种表与表之间的数据关系一般都是通过主或辅关键词之间的连接来实现的。因为在每个表中只有主关键词才能唯一地标识表中的这一个记录值(因为根据第三范式的要求,表中其它数据字段函数都依赖于主关键词),所以将表通过关键词连接就能够唯一地标识出某一事物不同属性在不同表中的存放位置。2.4.2确定单一的父子关系结构所谓确定单一的父系关系结构就是要在所建立的各种表中消除多对多(以下用M:N来表示)的现象,即设法使得所有表中记录之间的关系呈树状结构(只能由一个主干发出若干条分支,而不能有若干条主干交错发出若干条分支状况)。所谓的“父系”就是指表的上一级关系表。消除多对多关系可以借助于E-R图的方法来解决,也可以在系统分析时予以注意,避免这种情况的发生。消除这种M:N情况的办法也很简单,只需在二表之间增加一个表,则原来M:N的关系就改成了M:1,1:N的关系了。2.4.3数据资源安全保密属性一般DBMS都提供给我们自己定义数据安全保密性的功能。系统所提供的安全保密功能一般有8个等级(0-7级),4种不同方式(只读、只写、删除、修改),而且允许用户利用这8个等级的4种方式对每一个表自由地进行定义。定义安全保密性的方法一般有如下几种:a.原则上所有文件都定义为4级,个别优先级特别高的办公室(终端或微机的入网账号)可定义高于4级的级别,反之则定义为低于4的级别。b.统计文件(表)和数据录入文件一般只对本工作站定义为只写方式,对其它工作站则定义为只读方式。第116页 北京理工大学现代远程教育学院毕业设计(论文)c.财务等保密文件一般只对中工作站(如财务科等)定义为可写、可改、可删除方式,对其它工作站则定义为只读方式,而且不是每个人都能读,只有级别相同和高级别者才能读。2.5 数据库设计分析建立起一个良好的数据指标体系,是建立数据结构和数据库的最重要的一环。一个良好的数据指标体系是建立DB的必要条件,但不是充分条件。我们完全可以认为所建指标体系中的一个指标类就是关系数据库中的一个基本表,而这个指标类下面的一个个具体指标就是这个基本表中的一个字段。但如果直接按照这种方式建库显然还不能算最佳。对于指标体系中数据的结构在建库前还必须进行规范化的重新组织。2.5.1数据组织的规范化形式在数据的规范化表达中,一般将一组相互关联的数据称为一个关系(relation),而在这个关系下的每个数据指标项则被称为数据元素(dataelement),这种关系落实到具体数据库上就是基本表,而数据元素就是基本表中的一个字段(field)。规范化表达还规定在每一个基本表中必须定义一个数据元素为关键字(key),它可以唯一地标识出该表中其它相关的数据元素。在规范化理论中表是二维的,它有如下四个性质:1.在表中的任意一列上,数据项应属于同一个属性(如图中每一列都存放着不同合同记录的同一属性数据)。2.表中所有行都是不相同的,不允许有重复组项出现(如图中每一行都是一个不同的合同记录)。3.在表中,行的顺序无关紧要(如图中每行存的都是合同记录,至于先放哪一个合同都没关系)。4.第116页 北京理工大学现代远程教育学院毕业设计(论文)在表中,列的顺序无关紧要,但不能重复(如图中合同号和合同名谁先谁后都没关系,但二者不可重复或同名)。在对表的形式进行了规范化定义后,数据结构还有五种规范化定义,定名为规范化模式,称为范式。在这五种范式中,一般只用前三种,对于常用系统就足够了。而且这五种范式是“向上兼容”的,即满足第五范式的数据结构自动满足一、二、三、四范式,满足第四范式的数据结构自动满足第一、二、三范式,……,依此类推。2.5.2firstnormalform(1stNF)指在同一表中没有重复项出现,如果有则应将重复项去掉。这个去掉重复项的过程就称之为规范化处理。在本文所讨论的开发方法里,1stNF实际上是没有什么意义的。因为我们按规范化建立的指标体系和表的过程都自动保证了所有表都满足1stNF。2.5.3secondnormalform(2ndNF)指每个表必须有一个(而且仅一个)数据元素为主关键字(primarykey),其它数据元素与主关键字一一对应。例如,如果我们将合同号定义为主关键字(其它数据元素中的记录数据都有可能重名,故不能作为主关键字),故只要知道了一个合同记录的合同号,就可以唯一地在同一行中找到该合同的任何一项具体信息。通常我们称这种关系为函数依赖(functionaldepEndence)关系。即表中其它数据元素都依赖于主关键字,或称该数据元素唯一地被主关键字所标识。2.5.4thirdnormalform(3rdNF)指表中的所有数据元素不但要能够唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其它的函数关系。也就是说对于一个满足了2ndNF的数据结构来说,表中有可能存在某些数据元素依赖于其它非关键宇数据元素的现象,必须加以消除。第116页 北京理工大学现代远程教育学院毕业设计(论文)为防止数据库出现更新异常、插入异常、删除异常、数据冗余太大等现象,关系型数据库要尽量按关系规范化要求进行数据库设计。第三章使用Access2000实现关系型数据库3.1数据库的概念数据库是一种存储数据并对数据进行操作的工具。数据库的作用在于组织和表达信息,简而言之,数据库就是信息的集合。计算机的数据库可以分为两类:非关系数据库(flat-file)和关系数据库(relational)。关系数据库中包含了多个数据表的信息,数据库含有各个不同部分的术语,象记录、域等。3.2新建一个数据库创建任何一个数据库的第一步是仔细的规划数据库,设计必须是灵活的、有逻辑的。创建一个数据库结构的过程被认为是数据模型设计。1.标识需要的数据;2.收集被标识的字段到表中;3.标识主关键字字段;4.绘制一个简单的数据图表;5.规范数据;6.标识指定字段的信息;7.创建物理表。3.3修改已建的数据库数据库的修改分为:添加、编辑和删除记录。这三种操作均可由VisualBasic创建的程序来完成,下面的章节将详细描述实现的具体方法。第116页 北京理工大学现代远程教育学院毕业设计(论文)3.4实现数据库之间的联系数据库之间的关系指明两个库之间共享一个共同的关键字值。一个连接是指一种虚拟的表,这种表是在当用户要求从相互关联的各个不同的表中获取信息时建立的,关键字段用于在相互连接的不同表中查找匹配的记录。一个更高级的连接形式称为自连接。这种连接是指一个表被连接到它自己的一个字段,或在不同的纪录中由重复数据的组合字段。数据库中有三种不同类型的关键字:主关键字、组合关键字和外关键字。在表中使用的关键字类型用于描述库表示什么以及在数据库中如何与其它的库建立关系。第116页 北京理工大学现代远程教育学院毕业设计(论文)第四章系统开发环境4.1VisualBasic简介VisualBasic6.0是Windows应用程序开发工具,使目前最为广泛的、易学易用的面向对象的开发工具。VisualBasic提供了大量的控件,这些控件可用于设计界面和实现各种功能,减少了编程人员的工作量,也简化了界面设计过程,从而有效的提高了应用程序的运行效率和可靠性。故而,实现本系统VB是一个相对较好的选择。4.2实现关系型数据库实现Access2000就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。Access的优点在于它能使用数据表示图或自定义窗体收集信息。数据表示图提供了一种类似于Excel的电子表格,可以使数据库一目了然。另外,Access允许创建自定义报表用于打印或输出数据库中的信息。Access也提供了数据存储库,可以使用桌面数据库文件把数据库文件置于网络文件服务器,与其他网络用户共享数据库。Access是一种关系数据库工具,关系数据库是已开发的最通用的数据库之一。如上所述,Access作为关系数据库开发具备了许多优点,可以在一个数据包中同时拥有桌面数据库的便利和关系数据库的强大功能。4.3数据库引擎在这里,JET数据库引擎提供了与数据库打交道的途径,我们是通过它以及VisualBasic来访问数据库并对其进行各种操作。VisualBasic、Access以及其他微软的软件产品都是通过共用JET数据库引擎,从而给用户提供了丰富的数据类型。第116页 北京理工大学现代远程教育学院毕业设计(论文)DATA控件在数据库中的信息与将信息显示给用户看的VisualBasic程序之间架起了一座桥梁。我们可以设置DATA控件的各个属性,告诉它要调用那个数据库的哪个部分。缺省情况下,DATA控件根据数据库中的一个或多个数据表建立一个dynaset-type(动态集合)类型的记录集合。一个记录集合是动态的也就意味着,当原来的数据表中的容改变了以后,该记录集合中的记录也会随之改变。DATA控件还提供了用来浏览不同记录的各种跳转按钮。将DATA控件放置在窗体中之后,我们还必须在该控件与要处理的数据库之间建立联系。第五章系统设计与实现4.1系统总体规划设计档案系统,需要运用窗体和控件、过程代码、数据库设计等许多知识。档案系统包括档案名称、档案说明、档案类型等。档案管理就是将上述信转变为计算机能接受的数据送入计算机,系统包括学生档案数据输入、信息查询、信息浏览及报表输出等功能。第116页 北京理工大学现代远程教育学院毕业设计(论文)4.2系统功能1.收入记录;2.查询;3.折线式图表;4.收支详情5.每月结算6.察看课程表。4.3系统具体实现4.3.1数据输入对财务信息信息的管理,包括家庭财务信息的输入、添加、删除和修改。4.3.2查询通过查询,将满足查询条件的信息显示在窗体上。4.3.3信息浏览将满足分析条件的数据在报表中显示出来。4.3.4报表输出可以将查询的结果数据通过报表输出,也可打印输出。4.4系统设计与实现系统设计包括数据库设计、登陆界面设计、主界面设计、菜单设计和功能设计。功能设计包括输入设计、查询等设计。原代码见附录。4.4.1数据库设计数据库采用Access数据库,使用VisData或在Access环境中创建数据库personal财务信息表(Zb)如下:第116页 北京理工大学现代远程教育学院毕业设计(论文)(图1)通过数环境设计器的查询设计窗口,将财务信息表(personal)中的字段添加到设计器中。4.4.2登陆界面设计登陆界面是用户进入系统前必须要验证身份的一个必要步骤。此界面由四个标签、一个文本框和两个按钮组成。登陆界面运行如下:(图2)实现代码:OptionExplicitPublicgrzbpassAsStringPrivateSubComca_Click()UnloadMeEndEndSubPrivateSubComok_Click()grzbpass=Text1.Text第116页 北京理工大学现代远程教育学院毕业设计(论文)IfLabel3.Visible=TrueThenIfText2.Text=Text3.TextThenDimiAsByte,pas(7)AsString,mwmw=""Fori=1ToLen(Text2.Text)pas(i-1)=Mid(Text2.Text,i,1)pas(i-1)=Chr(Asc(pas(i-1))+50+i*2)mw=mw+pas(i-1)NextiOpenApp.Path+"ok.pas"ForOutputAs#1Write#1,mwClose#1ElseMsgBox"两次输入的密码不相同,请重输。",48,"提示"Text3.Text=""WithText2.Text="".SetFocusEndWithExitSubEndIfEndIfUnloadMeEndSubPrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Line1.Visible=FalseLine2.Visible=FalseLine3.Visible=FalseLine4.Visible=FalseLine1.BorderColor=&H80000009Line2.BorderColor=&H80000008Line3.BorderColor=&H80000008Line4.BorderColor=&H80000009第116页 北京理工大学现代远程教育学院毕业设计(论文)EndSubPrivateSubLabel2_Click()IfModule1.mw<>Text1.TextThenMsgBox"请先输入正确的密码!"Text1.SelStart=0Text1.SelLength=8Text1.SetFocusElseLabel3.Visible=TrueLabel4.Visible=TrueLabel5.Visible=FalseText2.Visible=TrueText3.Visible=TrueText2.SetFocusEndIfEndSubPrivateSubLabel2_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1ThenLine2.BorderColor=&H80000009Line1.BorderColor=&H80000008Line4.BorderColor=&H80000008Line3.BorderColor=&H80000009EndIfEndSubPrivateSubLabel2_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Line1.Visible=TrueLine2.Visible=TrueLine3.Visible=TrueLine4.Visible=TrueEndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)4.4.3主界面设计主界面是用户打开系统首先见到的界面,也是进入其他模块的入口。主界面将常用菜单项设计为工具栏,在工具栏上有输入新增、修改、上下记录按钮、删除结算、帮助和退出等菜单。主界面运行如下:第116页 北京理工大学现代远程教育学院毕业设计(论文)(图3)整个主界面直观的显示了财务记录的基本信息。实现代码:OptionExplicitPublicmyyearAsStringPrivateSubMYHELP()Frmhelp.Show1EndSubPrivateSubvisok(testAsBoolean)"在某些功能启用时,另一些功能不允许用DimkkAsIntegerIftestThen第116页 北京理工大学现代远程教育学院毕业设计(论文)textfind.Enabled=TrueToolbar1.Buttons.Item(1).Visible=Truezj.Enabled=TrueToolbar1.Buttons.Item(3).Visible=Truesy.Enabled=TrueToolbar1.Buttons.Item(4).Visible=TrueXY.Enabled=TrueToolbar1.Buttons.Item(5).Visible=Truexg.Enabled=TrueToolbar1.Buttons.Item(7).Visible=FalseToolbar1.Buttons.Item(8).Visible=FalseSlirecon.Enabled=TrueForkk=10To16Toolbar1.Buttons.Item(kk).Visible=TrueNextkkxz.Enabled=Truecl.Enabled=TrueYJS.Enabled=TruePX.Enabled=TrueYD.Enabled=TrueSC.Enabled=TrueCX.Enabled=TrueEX.Enabled=Truedc.Enabled=TrueText1(0).Locked=TrueText1(1).Locked=TrueText1(2).Locked=TrueCombo1.Locked=TrueElsetextfind.Enabled=FalseToolbar1.Buttons.Item(1).Visible=Falsezj.Enabled=FalseToolbar1.Buttons.Item(3).Visible=Falsesy.Enabled=False第116页 北京理工大学现代远程教育学院毕业设计(论文)Toolbar1.Buttons.Item(4).Visible=FalseXY.Enabled=FalseToolbar1.Buttons.Item(5).Visible=Falsexg.Enabled=FalseToolbar1.Buttons.Item(7).Visible=TrueToolbar1.Buttons.Item(8).Visible=TrueSlirecon.Enabled=FalseForkk=10To16Toolbar1.Buttons.Item(kk).Visible=FalseNextkkxz.Enabled=Falsecl.Enabled=FalseYJS.Enabled=FalsePX.Enabled=FalseYD.Enabled=FalseSC.Enabled=FalseCX.Enabled=FalseEX.Enabled=Falsedc.Enabled=FalseText1(0).Locked=FalseText1(1).Locked=FalseText1(2).Locked=FalseCombo1.Locked=FalseEndIfEndSubPrivateSubmok()"前进,后退按钮在记录位不同时的不同状态DimlAsInteger,nAsInteger,bookAsVarianttextfind.Text=Format(Data1.Recordset.Fields(0),"yyyy-mm-dd")book=Data1.Recordset.BookmarkData1.Recordset.MoveFirstData1.Recordset.MoveLastData1.Recordset.Bookmark=bookn=Data1.Recordset.AbsolutePosition第116页 北京理工大学现代远程教育学院毕业设计(论文)l=Data1.Recordset.RecordCount-1SelectCasenCase0Toolbar1.Buttons.Item(3).Enabled=Falsesy.Enabled=FalseToolbar1.Buttons.Item(4).Enabled=TrueXY.Enabled=TrueCase1Tol-1Toolbar1.Buttons.Item(3).Enabled=TrueToolbar1.Buttons.Item(4).Enabled=Truesy.Enabled=TrueXY.Enabled=TrueCaselToolbar1.Buttons.Item(3).Enabled=TrueToolbar1.Buttons.Item(4).Enabled=FalseXY.Enabled=Falsesy.Enabled=TrueEndSelectIfl=0ThenToolbar1.Buttons.Item(3).Enabled=FalseToolbar1.Buttons.Item(4).Enabled=FalseEndIfSlirecon.Value=Data1.Recordset.AbsolutePositionLabel10.Caption=Str(Data1.Recordset.AbsolutePosition+1)EndSubPrivateSubdctable(tbAsString)"导出表为TEXT文件DimzbAsDatabaseDimreAsRecordsetDimrefieldAsByteDimrecountAsIntegerDimfilenumAsByteDimiAsIntegerSetzb=OpenDatabase(App.Path+"zb.mdb")Setre=zb.OpenRecordset(tb)第116页 北京理工大学现代远程教育学院毕业设计(论文)refield=re.Fields.Countre.MoveLastre.MoveFirstrecount=re.RecordCountfilenum=FreeFileOpenApp.Path+""+CStr(Date)+".txt"ForOutputAsfilenumSelectCaserefieldCase6Write#filenum,re.Fields(0).Name,re.Fields(1).Name,re.Fields(2).Name,re.Fields(3).Name,re.Fields(4).Name,re.Fields(5).NameCase15Write#filenum,re.Fields(0).Name,re.Fields(1).Name,re.Fields(2).Name,re.Fields(3).Name,re.Fields(4).Name,_re.Fields(5).Name,re.Fields(6).Name,re.Fields(7).Name,re.Fields(8).Name,re.Fields(9).Name,_re.Fields(10).Name,re.Fields(11).Name,re.Fields(12).Name,re.Fields(13).Name,re.Fields(14).NameEndSelectFori=0Torecount-1SelectCaserefieldCase6Write#filenum,CStr(re.Fields(0).Value),re.Fields(1).Value,re.Fields(2).Value,re.Fields(3).Value,CInt(re.Fields(4).Value),re.Fields(5).ValueCase15Write#filenum,CStr(re.Fields(0).Value),re.Fields(1).Value,re.Fields(2).Value,re.Fields(3).Value,re.Fields(4).Value,_re.Fields(5).Value,re.Fields(6).Value,re.Fields(7).Value,re.Fields(8).Value,re.Fields(9).Value,_re.Fields(10).Value,re.Fields(11).Value,re.Fields(12).Value,re.Fields(13).Value,re.Fields(14).ValueEndSelectre.MoveNextNextiClosefilenumMsgBox"数据已顺利导出,文件保存为"+App.Path+""+CStr(Date)+".txt。"+Chr(13)第116页 北京理工大学现代远程教育学院毕业设计(论文)+"请及时处理,因为当天若再有数据导出将会被覆盖!",48,"提示"EndSubPrivateSubcl_Click()IfNot(Month(Date)=12AndDay(Date)=31)ThenDimnAsIntegern=MsgBox("未到12月31日,如提前作年终处理,则使统计数据不准和这以后的数据当年度查不到!(除非在元旦前不输数据)"+Chr(13)+"你的确要作此处理吗?",36,"年终处理")Ifn=7ThenExitSubEndIfComzt_Click"整年处理DimiAsInteger,jAsInteger,SZAsSingleDimzbAsDatabaseDimreyearAsRecordsetDimreyzjAsRecordsetSetzb=OpenDatabase(App.Path+"zb.mdb")Setreyear=zb.OpenRecordset("year",dbOpenDynaset)"dbOpenDynaset类型才能用findreyear.FindFirst("年度=""+myyear+""")"在YEAR表中找当前年度的处理情况Ifreyear.NoMatch=TrueThen"若没有当前年度的记录则加入reyear.AddNewreyear.Fields(0)=myyearreyear.Updatereyear.FindFirst("年度=""+myyear+""")EndIfData2.Recordset.MoveLastData2.Recordset.MoveFirst"YZJ表移到头reyear.EditIfreyear.AbsolutePosition=0Then"如果是年度中的第一个记录reyear.Fields(1)=Data2.Recordset.Fields(1)"则用月表中的第一条记录的上月结余Else"若是其它年度记录则用上年度的结余reyear.MovePreviousSZ=reyear.Fields(4)reyear.MoveNextreyear.Edit第116页 北京理工大学现代远程教育学院毕业设计(论文)reyear.Fields(1)=SZEndIfFori=5Toreyear.Fields.Count-1SZ=0Forj=1ToData2.Recordset.RecordCountSZ=Data2.Recordset.Fields(i)+SZ"循环计算YZJ表中各项收支数值和并存入YEAR表中Data2.Recordset.MoveNextNextjreyear.Fields(i)=SZData2.Recordset.MoveFirstNextiData2.Recordset.MoveLastreyear.Fields(2)=0reyear.Fields(3)=0Fori=1To5reyear.Fields(2)=reyear.Fields(i+4)+reyear.Fields(2)"当年的收入reyear.Fields(3)=reyear.Fields(i+9)+reyear.Fields(3)"当年的支出Nextireyear.Fields(4)=reyear.Fields(1)+reyear.Fields(2)-reyear.Fields(3)"得到当年结余SZ=reyear.Fields(4)reyear.Updatereyear.FindFirst("年度=""+Trim(Str(Val(myyear)+1))+""")"当年处理完后,找下一年度的记录Ifreyear.NoMatch=TrueThenreyear.AddNew"没有则加入Elsereyear.EditEndIfreyear.Fields(0)=Trim(Str(Val(myyear)+1))"并且对year表中下一年度初始化reyear.Fields(1)=SZreyear.UpdateSetreyzj=zb.OpenRecordset("yzj",dbOpenDynaset)"打开含有每年收支数据的YZJ表(dbOpenDynaset类型才能用find)reyzj.FindFirst("year(年月)=""+Trim(Str(Val(myyear)+1))+""")第116页 北京理工大学现代远程教育学院毕业设计(论文)"查找下一年度的第一条记录Ifreyzj.NoMatch=TrueThenreyzj.AddNew"没找到则加入reyzj.Fields(0)=CDate(Trim(Str(Val(myyear)+1))+"-1-1")"时间定为一月Elsereyzj.Edit"有则修改EndIfreyzj.Fields(1)=SZ"YZJ表中的上月结余修改reyzj.UpdateSetreyzj=zb.OpenRecordset("xb",dbOpenDynaset)"打开含有每天收支数据的XB表(dbOpenDynaset类型才能用find)reyzj.FindFirst("year(收支日期)=""+Trim(Str(Val(myyear)+1))+""")"查找下一年度的第一条记录Ifreyzj.NoMatch=TrueThenreyzj.AddNew"没找到则加入reyzj.Fields(0)=CDate(Trim(Str(Val(myyear)+1))+"-1-1")"时间定为一月reyzj.Fields(1)=0reyzj.Fields(2)="其它收入"reyzj.Fields(3)="这条记录是程序自己加的,若本年中没有其它收支记录,请不要删除它,但可以修改."reyzj.Fields(4)=Falsereyzj.Update"加入一个0收入的记录使程序下次启动时不会测到最新年度记录数为0EndIfreyzj.Closereyear.FindFirst("年度=""+myyear+""")"回到刚处理的年度MsgBoxmyyear+"年度情况:"+Chr(13)+"去年结余:"+Str(reyear.Fields(1))+Chr(13)_+"当年收入:"+Str(reyear.Fields(2))+Chr(13)+"当年支出:"+Str(reyear.Fields(3))+Chr(13)_+"当年结余:"+Str(reyear.Fields(4))+Chr(13),48,myyear+"年度处理完毕"EndSubPrivateSubComauto_Click()第116页 北京理工大学现代远程教育学院毕业设计(论文)Frmadd.Show1Data2.RefreshEndSubPrivateSubCombo1_LostFocus()SelectCaseCombo1.TextCase"工资收入"Case"奖金收入"Case"福利收入"Case"打工收入"Case"其它收入"Case"生活支出"Case"娱乐支出"Case"学习支出"Case"投资支出"Case"其它支出"CaseElseMsgBox"您输入的收支类别不合程序要求,这可能会造成计算及查询的不正确!"+Chr(13)+"请点击右边的下拉箭头,并从中选择一个类别!",48,"类别错误"Combo1.SelStart=0Combo1.SelLength=Len(Combo1.Text)Combo1.SetFocusEndSelectEndSubPrivateSubComcancl_Click()OnErrorResumeNextData1.Recordset.CancelUpdateDimtAsBooleant=Truevisok(t)第116页 北京理工大学现代远程教育学院毕业设计(论文)CallmokEndSubPrivateSubcomedit_Click()DimtAsBooleant=Falsevisok(t)Data1.Recordset.EditEndSubPrivateSubcomlr_Click()Frmlr.Show1EndSubPrivateSubcomtable_Click()Frmpic.Show1EndSubPrivateSubComok_Click()OnErrorResumeNextData1.Recordset.UpdateDimtAsBooleant=Truevisok(t)CallmokEndSubPrivateSubComzt_Click()Dimsl(4)AsSingle,zc(4)AsSingle"sl(收入数组)zc(支出数组)DimzslAsSingle,zzcAsSingle"总收入支出Data1.Refresh"记录刷新(重新排序)第116页 北京理工大学现代远程教育学院毕业设计(论文)Data1.Recordset.MoveLastData1.Recordset.MoveFirstDimiAsInteger,jAsIntegerDimqmdateAsDate,qmjuAsSingle"前面日期和结余Forj=1To12Fori=0To4sl(i)=0zc(i)=0Nextizsl=0zzc=0Data1.Recordset.FindFirst"month(收支日期)="+Str(j)"查找i月份IfMonth(Data1.Recordset.Fields(0))<>jThen"如没有GoTolastEndIfDoWhileData1.Recordset.AbsolutePosition<>-1"是否到尾(不是最后一个记录)IfMonth(Data1.Recordset.Fields(0))=jThenSelectCaseData1.Recordset.Fields(2)"分类计算Case"工资收入"sl(0)=Data1.Recordset.Fields(1)+sl(0)Case"奖金收入"sl(1)=Data1.Recordset.Fields(1)+sl(1)Case"福利收入"sl(2)=Data1.Recordset.Fields(1)+sl(2)Case"打工收入"sl(3)=Data1.Recordset.Fields(1)+sl(3)Case"其它收入"sl(4)=Data1.Recordset.Fields(1)+sl(4)Case"生活支出"zc(0)=Data1.Recordset.Fields(1)+zc(0)Case"娱乐支出"zc(1)=Data1.Recordset.Fields(1)+zc(1)Case"学习支出"zc(2)=Data1.Recordset.Fields(1)+zc(2)Case"投资支出"第116页 北京理工大学现代远程教育学院毕业设计(论文)zc(3)=Data1.Recordset.Fields(1)+zc(3)Case"其它支出"zc(4)=Data1.Recordset.Fields(1)+zc(4)EndSelectData1.Recordset.MoveNext"测试下一个记录是否合适条件ElseExitDoEndIfLoopData1.RefreshFori=0To4zsl=zsl+sl(i)"总收入zzc=zzc+zc(i)"总支出NextiData2.Recordset.FindFirst"month(年月)="+Str(j)"查找统计表中的j月记录IfMonth(Data2.Recordset.Fields(0))<>jThen"没有Data2.Recordset.FindFirst"month(年月)="+Str(j-1)"查找统计表中的上一月记录qmdate=Data2.Recordset.Fields(0)qmju=Data2.Recordset.Fields(4)Data2.Recordset.AddNewData2.Recordset.Fields(0)=qmdate+32"Data2.Recordset.Fields(0)=CDate(Str(year(CDate(qmdate)))+"-"+Trim(Str(HScroll1.Value))+"-1")Data2.Recordset.Fields(1)=qmjuData2.Recordset.UpdateEndIfData2.Recordset.FindFirst"month(年月)="+Str(j-1)"查找统计表中的上一月记录IfData2.Recordset.NoMatchThen"本月就是第一条,找不到上月的qmju=Data2.Recordset.Fields(1)Elseqmju=Data2.Recordset.Fields(4)EndIf第116页 北京理工大学现代远程教育学院毕业设计(论文)Data2.Recordset.FindFirst"month(年月)="+Str(j)"查找统计表中的当月记录Data2.Recordset.EditData2.Recordset.Fields(1)=qmjuData2.Recordset.Fields(2)=zslData2.Recordset.Fields(3)=zzcData2.Recordset.Fields(4)=Data2.Recordset.Fields(1)+zsl-zzcFori=0To4Data2.Recordset.Fields(i+5)=sl(i)Data2.Recordset.Fields(i+10)=zc(i)NextiData2.Recordset.Updatelast:Nextjvisok(True)mokEndSubPrivateSubCX_Click()comlr_ClickEndSubPrivateSubData1_Error(DataErrAsInteger,ResponseAsInteger)"这就是放置错误处理代码的地方"如果想忽略错误,注释掉下面的行"如果想捕捉错误,在这里添加错误处理代码MsgBox"数据错误事件捕捉到错误:"&Error$(DataErr)Response=0"忽略错误EndSubPrivateSubCommand1_Click()Data1.Recordset.AddNew第116页 北京理工大学现代远程教育学院毕业设计(论文)Data1.Recordset(2)="工资收入"Data1.Recordset.UpdateData1.Recordset.MoveLastDimtAsBooleant=Falsevisok(t)Data1.Recordset.EditSlirecon.max=Data1.Recordset.RecordCount-1Slirecon.LargeChange=Int(Slirecon.max/10)+1Label9.Caption=Data1.Recordset.RecordCountEndSubPrivateSubCommand2_Click()OnErrorResumeNextIfData1.Recordset.RecordCount=1ThenDimzbAsDatabaseDimreyearAsRecordsetDimiAsInteger,nAsInteger"Data1.Recordset.DeleteMsgBox"你删除本年最后一条收支情况,程序将关闭!",48,"下次再来吧!"Setzb=OpenDatabase(App.Path+"zb.mdb")Setreyear=zb.OpenRecordset("year",dbOpenDynaset)n=reyear.RecordCountFori=1Ton+1reyear.Deletereyear.MoveFirstNextiSetreyear=zb.OpenRecordset("yzj",dbOpenDynaset)n=reyear.RecordCountFori=1Ton+1reyear.Deletereyear.MoveFirstNextiSetreyear=zb.OpenRecordset("autoadd",dbOpenDynaset)n=reyear.RecordCount第116页 北京理工大学现代远程教育学院毕业设计(论文)Fori=1Ton+1reyear.Deletereyear.MoveFirstNextiSetreyear=zb.OpenRecordset("xb",dbOpenDynaset)n=reyear.RecordCountFori=1Ton+1reyear.Deletereyear.MoveFirstNextiForm_Unload(0)ExitSubEndIfDimkoAsInteger,strsjAsString,bookAsVariantstrsj=Data1.Recordset.Fields(0)&""&Str(Data1.Recordset.Fields(1))&"元"&Data1.Recordset.Fields(3)&"的情况吗?"ko=MsgBox("的确要删除"+strsj,36,"删除记录")Ifko=vbYesThenko=Data1.Recordset.AbsolutePositionData1.Recordset.Delete"每作一次删除,AbsolutePosition=-1,当前无记录Data1.Refresh"记录刷新(重新排序)Data1.Recordset.MoveFirstData1.Recordset.MoveLastData1.Recordset.MoveFirstIfko0Then"若有预定reauto.MoveFirstDoWhilereauto.AbsolutePosition<>-1"寻找XB中最后一条符合某条预定条件的记录rexb.FindLast("autoadd=""+reauto.Fields(3)+"""+_"and收支金额="+Str(reauto.Fields(1))+_"and类别=""+reauto.Fields(2)+""")IfNot(rexb.NoMatch)Then"若XB中有这样一条由预定产生的记录audate=rexb.Fields(0)auto=Date-rexb.Fields(0)"今天距那天有多少天间隔ye1=Val(Mid(Format(Date,"yyyy-mm-dd"),1,4)):ye2=Val(Mid(Format(rexb.Fields(0),"yyyy-mm-dd"),1,4))mo1=Month(Date):mo2=Month(rexb.Fields(0))da1=Val(Mid(Format(Date,"yy-mm-dd"),7,2))da2=Val(Mid(Format(rexb.Fields(0),"yy-mm-dd"),7,2))autm=(ye1-ye2)*12+(mo1-mo2)Ifda10Then"已过了预定的日期rexb.AddNew"则增加一个预定记录rexb.Fields(0)=reauto.Fields(0)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateEndIfSelectCasereauto.Fields(3)Case"每天"Fori=1Toautorexb.AddNewrexb.Fields(0)=DateAdd("d",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=False第116页 北京理工大学现代远程教育学院毕业设计(论文)EndIfrexb.UpdateNextiCase"每周"Fori=1ToInt(auto/7)rexb.AddNewrexb.Fields(0)=DateAdd("ww",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiCase"每月"Fori=1Toautmrexb.AddNewrexb.Fields(0)=DateAdd("m",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiCase"每季"Fori=1ToInt(autm/3)第116页 北京理工大学现代远程教育学院毕业设计(论文)rexb.AddNewrexb.Fields(0)=DateAdd("m",i*3,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiCase"每年"Fori=1ToInt(autm/12)rexb.AddNewrexb.Fields(0)=DateAdd("yyyy",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiEndSelectEndIfreauto.MoveNextLoopEndIfDimreyearAsRecordset第116页 北京理工大学现代远程教育学院毕业设计(论文)Setreyear=zbauto.OpenRecordset("year")Ifrexb.RecordCount=0Then"没有任何记录,则是第一次使用Setreauto=zbauto.OpenRecordset("yzj",dbOpenDynaset)frmfirst.Show1Iffrmfirst.firdate=""ThenMsgBox"您什么都没有输入,下次在用吧。B-b!",48,"再见"CallForm_Unload(0)EndEndIfIfreyear.RecordCount=0Thenreyear.AddNewreyear.Fields(0)=Mid(Format(CDate(frmfirst.firdate),"yyyy-mm-dd"),1,4)"保证在YEAR表中有一个年度reyear.UpdateEndIfrexb.AddNewrexb.Fields(0)=CDate(frmfirst.firdate)rexb.Fields(1)=0rexb.Fields(2)="其它收入"rexb.Fields(3)="这是程序自己加的记录,你可以修改它."rexb.Fields(4)=Truerexb.Updatemyyear=Mid(Format(CDate(frmfirst.firdate),"yyyy-mm-dd"),1,4)rexb.CloseDimreyzjAsRecordsetSetreyzj=zbauto.OpenRecordset("yzj")reyzj.AddNewreyzj.Fields(0)=CDate(frmfirst.firdate)reyzj.Fields(1)=frmfirst.firmoneyreyzj.Updatereyzj.Close第116页 北京理工大学现代远程教育学院毕业设计(论文)reauto.CloseEndIfreyear.MoveLastmyyear=reyear.Fields(0)Me.Caption="小小收支薄-每日收支详情登记"+"("+myyear+"年度)"Data1.DatabaseName=App.Path+"zb.mdb"Data1.RecordSource="select*fromxbwhereyear(收支日期)=""+myyear+""orderby收支日期"Data1.RefreshData2.DatabaseName=App.Path+"zb.mdb"Data2.RecordSource="select*fromyzjwhereyear(年月)=""+myyear+""orderby年月"Data2.RefreshDimnAsIntegerData1.Recordset.MoveFirstDoData1.Recordset.MoveNextLoopUntilData1.Recordset.AbsolutePosition=-1"Data1.Recordset.RecordCount-1"是否到最后一个记录(不是检测记录末)IfData1.Recordset.RecordCount=1ThenToolbar1.Buttons.Item(4).Enabled=False"若此句放在前面recordcount为1,经movefirst记录移动后,得到recordcount正确值.Data1.Recordset.MoveFirst"设置标尺属性IfData1.Recordset.RecordCount>1ThenSlirecon.max=Data1.Recordset.RecordCount-1Slirecon.LargeChange=Int(Slirecon.max/10)+1ElseSlirecon.max=Data1.Recordset.RecordCountSlirecon.LargeChange=0EndIfLabel9.Caption=Str(Data1.Recordset.RecordCount)第116页 北京理工大学现代远程教育学院毕业设计(论文)Label10.Caption=Str(Data1.Recordset.AbsolutePosition+1)DimtAsBooleant=Truevisok(t)mokEndSubPrivateSubForm_Unload(CancelAsInteger)DimiAsInteger,jAsIntegerj=Forms.Count-1Fori=0TojUnloadForms(0)NextiEndSubPrivateSubHELP_Click()"MYHELPEndSubPrivateSubJS_Click()dctable("yzj")EndSubPrivateSubPX_Click()Command5_ClickEndSubPrivateSubSC_Click()Command2_ClickEndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubSlirecon_Change()"Debug.PrintSlirecon.ValueData1.Recordset.MoveFirstData1.Recordset.MoveSlirecon.ValuemokEndSubPrivateSubsy_Click()Command4_ClickEndSubPrivateSubSZ_Click()dctable("xb")EndSubPrivateSubText1_LostFocus(IndexAsInteger)IfNotIsDate(Text1(0).Text)ThenText1(0).SetFocusText1(0).SelStart=0Text1(0).SelLength=Len(Text1(0).Text)EndIfIfNotIsNumeric(Text1(1).Text)ThenText1(1).SetFocusText1(1).SelStart=0Text1(1).SelLength=Len(Text1(0).Text)EndIfEndSubPrivateSubtextfind_KeyPress(KeyAsciiAsInteger)IfKeyAscii=13ThenCalltextfind_LostFocusEndIfEndSubPrivateSubtextfind_LostFocus()第116页 北京理工大学现代远程教育学院毕业设计(论文)IfNotIsDate(textfind.Text)ThenWithtextfind.SelStart=0.SelLength=Len(.Text).SetFocusEndWithElseData1.Recordset.FindFirst"收支日期=CDate(""+textfind.Text+"")"IfData1.Recordset.NoMatchThenMsgBox"没有找到"+textfind.Text+"的收支情况!"+Chr(13)+Chr(13)+"将查找最接近的一个收支个记录。",48,"查找"Data1.Recordset.FindLast"收支日期<=CDate(""+textfind.Text+"")"EndIfEndIfCallmokEndSubPrivateSubToolbar1_ButtonClick(ByValButtonAsComctlLib.Button)SelectCaseButton.KeyCaseIs="add"Command1_ClickCaseIs="pre"Command4_ClickCaseIs="next"Command3_ClickCaseIs="edit"comedit_ClickCaseIs="ok"Comok_ClickCaseIs="cancel"Comcancl_ClickCaseIs="del"Command2_ClickCaseIs="js"第116页 北京理工大学现代远程教育学院毕业设计(论文)Comzt_ClickCaseIs="index"Command5_ClickCaseIs="find"comlr_ClickCaseIs="ctrl"Comauto_ClickCaseIs="table"comtable_ClickCaseIs="help"MYHELP"MsgBox"帮助尚未建立!",48,"sorry"CaseIs="about"Frmabout.Show1CaseIs="exit"UnloadfrmxbEndSelectEndSubPrivateSubWRITER_Click()Frmabout.Show1EndSubPrivateSubxg_Click()comedit_ClickEndSubPrivateSubXY_Click()Command3_ClickEndSubPrivateSubxz_Click()frmyear.Show1EndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubYD_Click()Comauto_ClickEndSubPrivateSubYJS_Click()Comzt_ClickEndSubPrivateSubzj_Click()Command1_ClickEndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)4.4功能设计4.4.1记录模块记录模块用来新增、修改、删除财务记录,并可实现月结算功能。(图4)实现代码:OptionExplicitPrivateSubComca_Click()UnloadMe第116页 北京理工大学现代远程教育学院毕业设计(论文)EndSubPrivateSubComok_Click()frmxb.myyear=Data1.Recordset.Fields(0)UnloadMeEndSubPrivateSubDBGrid1_RowColChange(LastRowAsVariant,ByValLastColAsInteger)Label2.Caption=Data1.Recordset.Fields(0)EndSubPrivateSubDBGrid1_Click()EndSubPrivateSubForm_Load()Data1.DatabaseName=App.Path+"zb.mdb"Label2.Caption=frmxb.myyearEndSub预定模块原代码OptionExplicitDimggzbAsDatabaseDimggyzjAsRecordsetPrivateSubComexit_Click()UnloadMeEndSubPrivateSubCommand1_Click()Textmon.Locked=FalseTextdate.Locked=False第116页 北京理工大学现代远程教育学院毕业设计(论文)Text2.Locked=False每月.Enabled=True工资收入.Enabled=TrueData1.Recordset.AddNewData1.Recordset.UpdateData1.Recordset.MoveLastEndSubPrivateSubCommand2_Click()IfData1.Recordset.RecordCount=0ThenMsgBox"没有记录,不能删除。",48,"你想干嘛"ExitSubEndIfIfData1.Recordset.RecordCount=1ThenData1.Recordset.DeleteUnloadMeExitSubEndIfData1.Recordset.DeleteData1.RefreshEndSubPrivateSubCommand3_Click()DimkoAsByteggyzj.MoveFirstggyzj.MoveCombo1.ListIndexggyzj.Editko=MsgBox("您要把"+Format(ggyzj.Fields(0),"yy-mm")+"的上月余额"+Trim(Str(ggyzj.Fields(1)))+"更改为元"+Text1.Text+"元吗?",36,"确认")Ifko=vbYesThenggyzj.Fields(1)=Val(Text1.Text)ggyzj.UpdateElseggyzj.CancelUpdate第116页 北京理工大学现代远程教育学院毕业设计(论文)EndIfEndSubPrivateSubForm_Activate()IfData1.Recordset.RecordCount=0ThenTextmon.Locked=TrueTextdate.Locked=TrueText2.Locked=True每月.Enabled=False工资收入.Enabled=FalseEndIfEndSubPrivateSubForm_Load()Setggzb=OpenDatabase(App.Path+"zb.mdb")Setggyzj=ggzb.OpenRecordset("yzj",dbOpenDynaset)DoWhileggyzj.AbsolutePosition<>-1Combo1.AddItem(Format(ggyzj.Fields(0),"yy-mm"))ggyzj.MoveNextLoopCombo1.ListIndex=0Data1.DatabaseName=App.Path+"zb.mdb"工资收入.AddItem"工资收入"工资收入.AddItem"奖金收入"工资收入.AddItem"福利收入"工资收入.AddItem"打工收入"工资收入.AddItem"其它收入"工资收入.AddItem"生活支出"工资收入.AddItem"学习支出"工资收入.AddItem"娱乐支出"工资收入.AddItem"投资支出"工资收入.AddItem"其它支出"第116页 北京理工大学现代远程教育学院毕业设计(论文)工资收入.Text="工资收入"每月.AddItem"每年"每月.AddItem"每季"每月.AddItem"每月"每月.AddItem"每周"每月.AddItem"每天"每月.Text="每月"EndSubPrivateSubForm_Unload(CancelAsInteger)ggzb.CloseEndSubPrivateSubText1_LostFocus()IfNotIsNumeric(Text1.Text)ThenWithText1.SelStart=0.SelLength=Len(Text1.Text).SetFocusEndWithMsgBox"您要填写数字",48,"提醒"EndIfEndSubPrivateSub工资收入_LostFocus()SelectCase工资收入.TextCase"工资收入"Case"奖金收入"Case"福利收入"Case"打工收入"Case"其它收入"Case"生活支出"Case"娱乐支出"Case"学习支出"Case"投资支出"第116页 北京理工大学现代远程教育学院毕业设计(论文)Case"其它支出"CaseElseMsgBox"您输入的收支类别不合程序要求,这可能会造成计算的不正确!"+Chr(13)+"请点击右边的下拉箭头,并从中选择一个类别!",48,"类别错误"工资收入.SelStart=0工资收入.SelLength=Len(工资收入.Text)工资收入.SetFocusEndSelectEndSubPrivateSub每月_LostFocus()SelectCase每月.TextCase"每年"Case"每季"Case"每月"Case"每周"Case"每天"CaseElseMsgBox"您输入的间隔不合程序要求,这可能会造成计算的不正确!程序默认是每月."+Chr(13)+"请点击右边的下拉箭头,并从中选择一个!",48,"类别错误"EndSelectEndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)4.4.2预定模块预定模块可以实现按日期自动添加固定记录功能。使用户不必为定期加入某项收入劳心运行效果图如下(图5)实现代码:OptionExplicitDimggzbAsDatabaseDimggyzjAsRecordset第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubComexit_Click()UnloadMeEndSubPrivateSubCommand1_Click()Textmon.Locked=FalseTextdate.Locked=FalseText2.Locked=False每月.Enabled=True工资收入.Enabled=TrueData1.Recordset.AddNewData1.Recordset.UpdateData1.Recordset.MoveLastEndSubPrivateSubCommand2_Click()IfData1.Recordset.RecordCount=0ThenMsgBox"没有记录,不能删除。",48,"你想干嘛"ExitSubEndIfIfData1.Recordset.RecordCount=1ThenData1.Recordset.DeleteUnloadMeExitSubEndIfData1.Recordset.DeleteData1.RefreshEndSubPrivateSubCommand3_Click()DimkoAsByteggyzj.MoveFirstggyzj.MoveCombo1.ListIndexggyzj.Edit第116页 北京理工大学现代远程教育学院毕业设计(论文)ko=MsgBox("您要把"+Format(ggyzj.Fields(0),"yy-mm")+"的上月余额"+Trim(Str(ggyzj.Fields(1)))+"更改为元"+Text1.Text+"元吗?",36,"确认")Ifko=vbYesThenggyzj.Fields(1)=Val(Text1.Text)ggyzj.UpdateElseggyzj.CancelUpdateEndIfEndSubPrivateSubForm_Activate()IfData1.Recordset.RecordCount=0ThenTextmon.Locked=TrueTextdate.Locked=TrueText2.Locked=True每月.Enabled=False工资收入.Enabled=FalseEndIfEndSubPrivateSubForm_Load()Setggzb=OpenDatabase(App.Path+"zb.mdb")Setggyzj=ggzb.OpenRecordset("yzj",dbOpenDynaset)DoWhileggyzj.AbsolutePosition<>-1Combo1.AddItem(Format(ggyzj.Fields(0),"yy-mm"))ggyzj.MoveNextLoopCombo1.ListIndex=0Data1.DatabaseName=App.Path+"zb.mdb"工资收入.AddItem"工资收入"工资收入.AddItem"奖金收入"工资收入.AddItem"福利收入"第116页 北京理工大学现代远程教育学院毕业设计(论文)工资收入.AddItem"打工收入"工资收入.AddItem"其它收入"工资收入.AddItem"生活支出"工资收入.AddItem"学习支出"工资收入.AddItem"娱乐支出"工资收入.AddItem"投资支出"工资收入.AddItem"其它支出"工资收入.Text="工资收入"每月.AddItem"每年"每月.AddItem"每季"每月.AddItem"每月"每月.AddItem"每周"每月.AddItem"每天"每月.Text="每月"EndSubPrivateSubForm_Unload(CancelAsInteger)ggzb.CloseEndSubPrivateSubText1_LostFocus()IfNotIsNumeric(Text1.Text)ThenWithText1.SelStart=0.SelLength=Len(Text1.Text).SetFocusEndWithMsgBox"您要填写数字",48,"提醒"EndIfEndSubPrivateSub工资收入_LostFocus()SelectCase工资收入.TextCase"工资收入"Case"奖金收入"第116页 北京理工大学现代远程教育学院毕业设计(论文)Case"福利收入"Case"打工收入"Case"其它收入"Case"生活支出"Case"娱乐支出"Case"学习支出"Case"投资支出"Case"其它支出"CaseElseMsgBox"您输入的收支类别不合程序要求,这可能会造成计算的不正确!"+Chr(13)+"请点击右边的下拉箭头,并从中选择一个类别!",48,"类别错误"工资收入.SelStart=0工资收入.SelLength=Len(工资收入.Text)工资收入.SetFocusEndSelectEndSubPrivateSub每月_LostFocus()SelectCase每月.TextCase"每年"Case"每季"Case"每月"Case"每周"Case"每天"CaseElseMsgBox"您输入的间隔不合程序要求,这可能会造成计算的不正确!程序默认是每月."+Chr(13)+"请点击右边的下拉箭头,并从中选择一个!",48,"类别错误"EndSelectEndSub4.4.3折线图表模块此模块可以生成各项收支的折线图,直观的体现了收支情况。第116页 北京理工大学现代远程教育学院毕业设计(论文)效果图如下:(代码见附录)(图6)第116页 北京理工大学现代远程教育学院毕业设计(论文)4.4.4查询模块通过主界面进入查询窗体,查询模块用于查询显示满足不同条件的财务情况。(代码见附录)界面设计:在窗体中有九个标签(Label)、十个选择框(Checkbox)、四个按钮(CommandButton)。功能设计:可以在(Checkbox)中选择所需要查询的条件单击“刷新列表”按钮,直接进入到查询结果窗体界面中去。在窗体中可以显示出所要查询信息结果。4.4.5帮助界面设计界面设计:一个框架(Frame)、一个标签(Label)、一个按钮(CommandButton)。此功能并不详细,只是简单的介绍软件的基本使用方法。窗体运行界面如下:(代码见附录)(图8)第116页 北京理工大学现代远程教育学院毕业设计(论文)第五章总结家庭管理系统基本开发完毕。其功能基本符合用户需求,能够完成财务记录的存储和查询以及各类相关报表的打印以及财务信息的简单统计。并提供部分系统维护功能,使用户方便进行数据备份和恢复、数据删除。对于数据的一致性的问题也通过程序进行了有效的解决。由于准备不充分,所以该系统还有许多不尽如人意的地方,比如帮助文档比较少,无网络功能不完善,用户界面不够美观,出错处理不够等多方面问题。这些都有待进一步改善。第116页 北京理工大学现代远程教育学院毕业设计(论文)参考资料1.王勇领.计算机数据处理系统分析与设计.北京:清华大学出版社,19862.萨师煊,王珊。数据库系统概论.北京:高校教育出版社,19853.VisualBasic6.0实用技术4.薛华成.管理信息系统.北京:清华大学出版社,19935.毕庶伟.管理信息系统分析与设计.北京:机械工业出版社,1992附录登陆模块原代码OptionExplicitPublicgrzbpassAsString第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubComca_Click()UnloadMeEndEndSubPrivateSubComok_Click()grzbpass=Text1.TextIfLabel3.Visible=TrueThenIfText2.Text=Text3.TextThenDimiAsByte,pas(7)AsString,mwmw=""Fori=1ToLen(Text2.Text)pas(i-1)=Mid(Text2.Text,i,1)pas(i-1)=Chr(Asc(pas(i-1))+50+i*2)mw=mw+pas(i-1)NextiOpenApp.Path+"ok.pas"ForOutputAs#1Write#1,mwClose#1ElseMsgBox"两次输入的密码不相同,请重输。",48,"提示"Text3.Text=""WithText2.Text="".SetFocusEndWithExitSubEndIfEndIfUnloadMeEndSubPrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Line1.Visible=False第116页 北京理工大学现代远程教育学院毕业设计(论文)Line2.Visible=FalseLine3.Visible=FalseLine4.Visible=FalseLine1.BorderColor=&H80000009Line2.BorderColor=&H80000008Line3.BorderColor=&H80000008Line4.BorderColor=&H80000009EndSubPrivateSubLabel2_Click()IfModule1.mw<>Text1.TextThenMsgBox"请先输入正确的密码!"Text1.SelStart=0Text1.SelLength=8Text1.SetFocusElseLabel3.Visible=TrueLabel4.Visible=TrueLabel5.Visible=FalseText2.Visible=TrueText3.Visible=TrueText2.SetFocusEndIfEndSubPrivateSubLabel2_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1ThenLine2.BorderColor=&H80000009Line1.BorderColor=&H80000008Line4.BorderColor=&H80000008Line3.BorderColor=&H80000009EndIfEndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubLabel2_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Line1.Visible=TrueLine2.Visible=TrueLine3.Visible=TrueLine4.Visible=TrueEndSub主界面原代码OptionExplicitPublicmyyearAsStringPrivateSubMYHELP()Frmhelp.Show1EndSubPrivateSubvisok(testAsBoolean)"在某些功能启用时,另一些功能不允许用DimkkAsIntegerIftestThentextfind.Enabled=TrueToolbar1.Buttons.Item(1).Visible=Truezj.Enabled=TrueToolbar1.Buttons.Item(3).Visible=Truesy.Enabled=TrueToolbar1.Buttons.Item(4).Visible=TrueXY.Enabled=TrueToolbar1.Buttons.Item(5).Visible=Truexg.Enabled=TrueToolbar1.Buttons.Item(7).Visible=FalseToolbar1.Buttons.Item(8).Visible=FalseSlirecon.Enabled=TrueForkk=10To16第116页 北京理工大学现代远程教育学院毕业设计(论文)Toolbar1.Buttons.Item(kk).Visible=TrueNextkkxz.Enabled=Truecl.Enabled=TrueYJS.Enabled=TruePX.Enabled=TrueYD.Enabled=TrueSC.Enabled=TrueCX.Enabled=TrueEX.Enabled=Truedc.Enabled=TrueText1(0).Locked=TrueText1(1).Locked=TrueText1(2).Locked=TrueCombo1.Locked=TrueElsetextfind.Enabled=FalseToolbar1.Buttons.Item(1).Visible=Falsezj.Enabled=FalseToolbar1.Buttons.Item(3).Visible=Falsesy.Enabled=FalseToolbar1.Buttons.Item(4).Visible=FalseXY.Enabled=FalseToolbar1.Buttons.Item(5).Visible=Falsexg.Enabled=FalseToolbar1.Buttons.Item(7).Visible=TrueToolbar1.Buttons.Item(8).Visible=TrueSlirecon.Enabled=FalseForkk=10To16Toolbar1.Buttons.Item(kk).Visible=FalseNextkkxz.Enabled=Falsecl.Enabled=FalseYJS.Enabled=False第116页 北京理工大学现代远程教育学院毕业设计(论文)PX.Enabled=FalseYD.Enabled=FalseSC.Enabled=FalseCX.Enabled=FalseEX.Enabled=Falsedc.Enabled=FalseText1(0).Locked=FalseText1(1).Locked=FalseText1(2).Locked=FalseCombo1.Locked=FalseEndIfEndSubPrivateSubmok()"前进,后退按钮在记录位不同时的不同状态DimlAsInteger,nAsInteger,bookAsVarianttextfind.Text=Format(Data1.Recordset.Fields(0),"yyyy-mm-dd")book=Data1.Recordset.BookmarkData1.Recordset.MoveFirstData1.Recordset.MoveLastData1.Recordset.Bookmark=bookn=Data1.Recordset.AbsolutePositionl=Data1.Recordset.RecordCount-1SelectCasenCase0Toolbar1.Buttons.Item(3).Enabled=Falsesy.Enabled=FalseToolbar1.Buttons.Item(4).Enabled=TrueXY.Enabled=TrueCase1Tol-1Toolbar1.Buttons.Item(3).Enabled=TrueToolbar1.Buttons.Item(4).Enabled=Truesy.Enabled=TrueXY.Enabled=TrueCaselToolbar1.Buttons.Item(3).Enabled=True第116页 北京理工大学现代远程教育学院毕业设计(论文)Toolbar1.Buttons.Item(4).Enabled=FalseXY.Enabled=Falsesy.Enabled=TrueEndSelectIfl=0ThenToolbar1.Buttons.Item(3).Enabled=FalseToolbar1.Buttons.Item(4).Enabled=FalseEndIfSlirecon.Value=Data1.Recordset.AbsolutePositionLabel10.Caption=Str(Data1.Recordset.AbsolutePosition+1)EndSubPrivateSubdctable(tbAsString)"导出表为TEXT文件DimzbAsDatabaseDimreAsRecordsetDimrefieldAsByteDimrecountAsIntegerDimfilenumAsByteDimiAsIntegerSetzb=OpenDatabase(App.Path+"zb.mdb")Setre=zb.OpenRecordset(tb)refield=re.Fields.Countre.MoveLastre.MoveFirstrecount=re.RecordCountfilenum=FreeFileOpenApp.Path+""+CStr(Date)+".txt"ForOutputAsfilenumSelectCaserefieldCase6Write#filenum,re.Fields(0).Name,re.Fields(1).Name,re.Fields(2).Name,re.Fields(3).Name,re.Fields(4).Name,re.Fields(5).NameCase15Write#filenum,re.Fields(0).Name,re.Fields(1).Name,re.Fields(2).Name,re.Fields(3).Name,re.Fields(4).Name,_re.Fields(5).Name,re.Fields(6).Name,re.Fields(7).Name,re.Fields(8).Name,第116页 北京理工大学现代远程教育学院毕业设计(论文)re.Fields(9).Name,_re.Fields(10).Name,re.Fields(11).Name,re.Fields(12).Name,re.Fields(13).Name,re.Fields(14).NameEndSelectFori=0Torecount-1SelectCaserefieldCase6Write#filenum,CStr(re.Fields(0).Value),re.Fields(1).Value,re.Fields(2).Value,re.Fields(3).Value,CInt(re.Fields(4).Value),re.Fields(5).ValueCase15Write#filenum,CStr(re.Fields(0).Value),re.Fields(1).Value,re.Fields(2).Value,re.Fields(3).Value,re.Fields(4).Value,_re.Fields(5).Value,re.Fields(6).Value,re.Fields(7).Value,re.Fields(8).Value,re.Fields(9).Value,_re.Fields(10).Value,re.Fields(11).Value,re.Fields(12).Value,re.Fields(13).Value,re.Fields(14).ValueEndSelectre.MoveNextNextiClosefilenumMsgBox"数据已顺利导出,文件保存为"+App.Path+""+CStr(Date)+".txt。"+Chr(13)+"请及时处理,因为当天若再有数据导出将会被覆盖!",48,"提示"EndSubPrivateSubcl_Click()IfNot(Month(Date)=12AndDay(Date)=31)ThenDimnAsIntegern=MsgBox("未到12月31日,如提前作年终处理,则使统计数据不准和这以后的数据当年度查不到!(除非在元旦前不输数据)"+Chr(13)+"你的确要作此处理吗?",36,"年终处理")Ifn=7ThenExitSubEndIfComzt_Click"整年处理DimiAsInteger,jAsInteger,SZAsSingleDimzbAsDatabase第116页 北京理工大学现代远程教育学院毕业设计(论文)DimreyearAsRecordsetDimreyzjAsRecordsetSetzb=OpenDatabase(App.Path+"zb.mdb")Setreyear=zb.OpenRecordset("year",dbOpenDynaset)"dbOpenDynaset类型才能用findreyear.FindFirst("年度=""+myyear+""")"在YEAR表中找当前年度的处理情况Ifreyear.NoMatch=TrueThen"若没有当前年度的记录则加入reyear.AddNewreyear.Fields(0)=myyearreyear.Updatereyear.FindFirst("年度=""+myyear+""")EndIfData2.Recordset.MoveLastData2.Recordset.MoveFirst"YZJ表移到头reyear.EditIfreyear.AbsolutePosition=0Then"如果是年度中的第一个记录reyear.Fields(1)=Data2.Recordset.Fields(1)"则用月表中的第一条记录的上月结余Else"若是其它年度记录则用上年度的结余reyear.MovePreviousSZ=reyear.Fields(4)reyear.MoveNextreyear.Editreyear.Fields(1)=SZEndIfFori=5Toreyear.Fields.Count-1SZ=0Forj=1ToData2.Recordset.RecordCountSZ=Data2.Recordset.Fields(i)+SZ"循环计算YZJ表中各项收支数值和并存入YEAR表中Data2.Recordset.MoveNextNextjreyear.Fields(i)=SZData2.Recordset.MoveFirstNextiData2.Recordset.MoveLastreyear.Fields(2)=0第116页 北京理工大学现代远程教育学院毕业设计(论文)reyear.Fields(3)=0Fori=1To5reyear.Fields(2)=reyear.Fields(i+4)+reyear.Fields(2)"当年的收入reyear.Fields(3)=reyear.Fields(i+9)+reyear.Fields(3)"当年的支出Nextireyear.Fields(4)=reyear.Fields(1)+reyear.Fields(2)-reyear.Fields(3)"得到当年结余SZ=reyear.Fields(4)reyear.Updatereyear.FindFirst("年度=""+Trim(Str(Val(myyear)+1))+""")"当年处理完后,找下一年度的记录Ifreyear.NoMatch=TrueThenreyear.AddNew"没有则加入Elsereyear.EditEndIfreyear.Fields(0)=Trim(Str(Val(myyear)+1))"并且对year表中下一年度初始化reyear.Fields(1)=SZreyear.UpdateSetreyzj=zb.OpenRecordset("yzj",dbOpenDynaset)"打开含有每年收支数据的YZJ表(dbOpenDynaset类型才能用find)reyzj.FindFirst("year(年月)=""+Trim(Str(Val(myyear)+1))+""")"查找下一年度的第一条记录Ifreyzj.NoMatch=TrueThenreyzj.AddNew"没找到则加入reyzj.Fields(0)=CDate(Trim(Str(Val(myyear)+1))+"-1-1")"时间定为一月Elsereyzj.Edit"有则修改EndIfreyzj.Fields(1)=SZ"YZJ表中的上月结余修改reyzj.UpdateSetreyzj=zb.OpenRecordset("xb",dbOpenDynaset)"打开含有每天收支数据的XB表(dbOpenDynaset类型才能用find)reyzj.FindFirst("year(收支日期)=""+Trim(Str(Val(myyear)+1))+""")"查找下一年度的第一条记录第116页 北京理工大学现代远程教育学院毕业设计(论文)Ifreyzj.NoMatch=TrueThenreyzj.AddNew"没找到则加入reyzj.Fields(0)=CDate(Trim(Str(Val(myyear)+1))+"-1-1")"时间定为一月reyzj.Fields(1)=0reyzj.Fields(2)="其它收入"reyzj.Fields(3)="这条记录是程序自己加的,若本年中没有其它收支记录,请不要删除它,但可以修改."reyzj.Fields(4)=Falsereyzj.Update"加入一个0收入的记录使程序下次启动时不会测到最新年度记录数为0EndIfreyzj.Closereyear.FindFirst("年度=""+myyear+""")"回到刚处理的年度MsgBoxmyyear+"年度情况:"+Chr(13)+"去年结余:"+Str(reyear.Fields(1))+Chr(13)_+"当年收入:"+Str(reyear.Fields(2))+Chr(13)+"当年支出:"+Str(reyear.Fields(3))+Chr(13)_+"当年结余:"+Str(reyear.Fields(4))+Chr(13),48,myyear+"年度处理完毕"EndSubPrivateSubComauto_Click()Frmadd.Show1Data2.RefreshEndSubPrivateSubCombo1_LostFocus()SelectCaseCombo1.TextCase"工资收入"Case"奖金收入"Case"福利收入"Case"打工收入"Case"其它收入"Case"生活支出"Case"娱乐支出"Case"学习支出"第116页 北京理工大学现代远程教育学院毕业设计(论文)Case"投资支出"Case"其它支出"CaseElseMsgBox"您输入的收支类别不合程序要求,这可能会造成计算及查询的不正确!"+Chr(13)+"请点击右边的下拉箭头,并从中选择一个类别!",48,"类别错误"Combo1.SelStart=0Combo1.SelLength=Len(Combo1.Text)Combo1.SetFocusEndSelectEndSubPrivateSubComcancl_Click()OnErrorResumeNextData1.Recordset.CancelUpdateDimtAsBooleant=Truevisok(t)CallmokEndSubPrivateSubcomedit_Click()DimtAsBooleant=Falsevisok(t)Data1.Recordset.EditEndSubPrivateSubcomlr_Click()Frmlr.Show1EndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubcomtable_Click()Frmpic.Show1EndSubPrivateSubComok_Click()OnErrorResumeNextData1.Recordset.UpdateDimtAsBooleant=Truevisok(t)CallmokEndSubPrivateSubComzt_Click()Dimsl(4)AsSingle,zc(4)AsSingle"sl(收入数组)zc(支出数组)DimzslAsSingle,zzcAsSingle"总收入支出Data1.Refresh"记录刷新(重新排序)Data1.Recordset.MoveLastData1.Recordset.MoveFirstDimiAsInteger,jAsIntegerDimqmdateAsDate,qmjuAsSingle"前面日期和结余Forj=1To12Fori=0To4sl(i)=0zc(i)=0Nextizsl=0zzc=0Data1.Recordset.FindFirst"month(收支日期)="+Str(j)"查找i月份IfMonth(Data1.Recordset.Fields(0))<>jThen"如没有GoTolast第116页 北京理工大学现代远程教育学院毕业设计(论文)EndIfDoWhileData1.Recordset.AbsolutePosition<>-1"是否到尾(不是最后一个记录)IfMonth(Data1.Recordset.Fields(0))=jThenSelectCaseData1.Recordset.Fields(2)"分类计算Case"工资收入"sl(0)=Data1.Recordset.Fields(1)+sl(0)Case"奖金收入"sl(1)=Data1.Recordset.Fields(1)+sl(1)Case"福利收入"sl(2)=Data1.Recordset.Fields(1)+sl(2)Case"打工收入"sl(3)=Data1.Recordset.Fields(1)+sl(3)Case"其它收入"sl(4)=Data1.Recordset.Fields(1)+sl(4)Case"生活支出"zc(0)=Data1.Recordset.Fields(1)+zc(0)Case"娱乐支出"zc(1)=Data1.Recordset.Fields(1)+zc(1)Case"学习支出"zc(2)=Data1.Recordset.Fields(1)+zc(2)Case"投资支出"zc(3)=Data1.Recordset.Fields(1)+zc(3)Case"其它支出"zc(4)=Data1.Recordset.Fields(1)+zc(4)EndSelectData1.Recordset.MoveNext"测试下一个记录是否合适条件ElseExitDoEndIfLoopData1.RefreshFori=0To4zsl=zsl+sl(i)"总收入zzc=zzc+zc(i)"总支出第116页 北京理工大学现代远程教育学院毕业设计(论文)NextiData2.Recordset.FindFirst"month(年月)="+Str(j)"查找统计表中的j月记录IfMonth(Data2.Recordset.Fields(0))<>jThen"没有Data2.Recordset.FindFirst"month(年月)="+Str(j-1)"查找统计表中的上一月记录qmdate=Data2.Recordset.Fields(0)qmju=Data2.Recordset.Fields(4)Data2.Recordset.AddNewData2.Recordset.Fields(0)=qmdate+32"Data2.Recordset.Fields(0)=CDate(Str(year(CDate(qmdate)))+"-"+Trim(Str(HScroll1.Value))+"-1")Data2.Recordset.Fields(1)=qmjuData2.Recordset.UpdateEndIfData2.Recordset.FindFirst"month(年月)="+Str(j-1)"查找统计表中的上一月记录IfData2.Recordset.NoMatchThen"本月就是第一条,找不到上月的qmju=Data2.Recordset.Fields(1)Elseqmju=Data2.Recordset.Fields(4)EndIfData2.Recordset.FindFirst"month(年月)="+Str(j)"查找统计表中的当月记录Data2.Recordset.EditData2.Recordset.Fields(1)=qmjuData2.Recordset.Fields(2)=zslData2.Recordset.Fields(3)=zzcData2.Recordset.Fields(4)=Data2.Recordset.Fields(1)+zsl-zzcFori=0To4Data2.Recordset.Fields(i+5)=sl(i)Data2.Recordset.Fields(i+10)=zc(i)NextiData2.Recordset.Updatelast:Nextjvisok(True)第116页 北京理工大学现代远程教育学院毕业设计(论文)mokEndSubPrivateSubCX_Click()comlr_ClickEndSubPrivateSubData1_Error(DataErrAsInteger,ResponseAsInteger)"这就是放置错误处理代码的地方"如果想忽略错误,注释掉下面的行"如果想捕捉错误,在这里添加错误处理代码MsgBox"数据错误事件捕捉到错误:"&Error$(DataErr)Response=0"忽略错误EndSubPrivateSubCommand1_Click()Data1.Recordset.AddNewData1.Recordset(2)="工资收入"Data1.Recordset.UpdateData1.Recordset.MoveLastDimtAsBooleant=Falsevisok(t)Data1.Recordset.EditSlirecon.max=Data1.Recordset.RecordCount-1Slirecon.LargeChange=Int(Slirecon.max/10)+1Label9.Caption=Data1.Recordset.RecordCountEndSubPrivateSubCommand2_Click()OnErrorResumeNext第116页 北京理工大学现代远程教育学院毕业设计(论文)IfData1.Recordset.RecordCount=1ThenDimzbAsDatabaseDimreyearAsRecordsetDimiAsInteger,nAsInteger"Data1.Recordset.DeleteMsgBox"你删除本年最后一条收支情况,程序将关闭!",48,"下次再来吧!"Setzb=OpenDatabase(App.Path+"zb.mdb")Setreyear=zb.OpenRecordset("year",dbOpenDynaset)n=reyear.RecordCountFori=1Ton+1reyear.Deletereyear.MoveFirstNextiSetreyear=zb.OpenRecordset("yzj",dbOpenDynaset)n=reyear.RecordCountFori=1Ton+1reyear.Deletereyear.MoveFirstNextiSetreyear=zb.OpenRecordset("autoadd",dbOpenDynaset)n=reyear.RecordCountFori=1Ton+1reyear.Deletereyear.MoveFirstNextiSetreyear=zb.OpenRecordset("xb",dbOpenDynaset)n=reyear.RecordCountFori=1Ton+1reyear.Deletereyear.MoveFirstNextiForm_Unload(0)ExitSubEndIf第116页 北京理工大学现代远程教育学院毕业设计(论文)DimkoAsInteger,strsjAsString,bookAsVariantstrsj=Data1.Recordset.Fields(0)&""&Str(Data1.Recordset.Fields(1))&"元"&Data1.Recordset.Fields(3)&"的情况吗?"ko=MsgBox("的确要删除"+strsj,36,"删除记录")Ifko=vbYesThenko=Data1.Recordset.AbsolutePositionData1.Recordset.Delete"每作一次删除,AbsolutePosition=-1,当前无记录Data1.Refresh"记录刷新(重新排序)Data1.Recordset.MoveFirstData1.Recordset.MoveLastData1.Recordset.MoveFirstIfko0Then"若有预定reauto.MoveFirstDoWhilereauto.AbsolutePosition<>-1"寻找XB中最后一条符合某条预定条件的记录rexb.FindLast("autoadd=""+reauto.Fields(3)+"""+_"and收支金额="+Str(reauto.Fields(1))+_"and类别=""+reauto.Fields(2)+""")IfNot(rexb.NoMatch)Then"若XB中有这样一条由预定产生的记录audate=rexb.Fields(0)auto=Date-rexb.Fields(0)"今天距那天有多少天间隔第116页 北京理工大学现代远程教育学院毕业设计(论文)ye1=Val(Mid(Format(Date,"yyyy-mm-dd"),1,4)):ye2=Val(Mid(Format(rexb.Fields(0),"yyyy-mm-dd"),1,4))mo1=Month(Date):mo2=Month(rexb.Fields(0))da1=Val(Mid(Format(Date,"yy-mm-dd"),7,2))da2=Val(Mid(Format(rexb.Fields(0),"yy-mm-dd"),7,2))autm=(ye1-ye2)*12+(mo1-mo2)Ifda10Then"已过了预定的日期rexb.AddNew"则增加一个预定记录rexb.Fields(0)=reauto.Fields(0)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)第116页 北京理工大学现代远程教育学院毕业设计(论文)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateEndIfSelectCasereauto.Fields(3)Case"每天"Fori=1Toautorexb.AddNewrexb.Fields(0)=DateAdd("d",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiCase"每周"Fori=1ToInt(auto/7)rexb.AddNewrexb.Fields(0)=DateAdd("ww",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElse第116页 北京理工大学现代远程教育学院毕业设计(论文)rexb.Fields(4)=FalseEndIfrexb.UpdateNextiCase"每月"Fori=1Toautmrexb.AddNewrexb.Fields(0)=DateAdd("m",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiCase"每季"Fori=1ToInt(autm/3)rexb.AddNewrexb.Fields(0)=DateAdd("m",i*3,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiCase"每年"第116页 北京理工大学现代远程教育学院毕业设计(论文)Fori=1ToInt(autm/12)rexb.AddNewrexb.Fields(0)=DateAdd("yyyy",i,audate)rexb.Fields(1)=reauto.Fields(1)rexb.Fields(2)=reauto.Fields(2)rexb.Fields(5)=reauto.Fields(3)rexb.Fields(3)=reauto.Fields(4)IfMid(rexb.Fields(2),4,1)="入"Thenrexb.Fields(4)=TrueElserexb.Fields(4)=FalseEndIfrexb.UpdateNextiEndSelectEndIfreauto.MoveNextLoopEndIfDimreyearAsRecordsetSetreyear=zbauto.OpenRecordset("year")Ifrexb.RecordCount=0Then"没有任何记录,则是第一次使用Setreauto=zbauto.OpenRecordset("yzj",dbOpenDynaset)frmfirst.Show1Iffrmfirst.firdate=""ThenMsgBox"您什么都没有输入,下次在用吧。B-b!",48,"再见"CallForm_Unload(0)EndEndIfIfreyear.RecordCount=0Thenreyear.AddNewreyear.Fields(0)=Mid(Format(CDate(frmfirst.firdate),第116页 北京理工大学现代远程教育学院毕业设计(论文)"yyyy-mm-dd"),1,4)"保证在YEAR表中有一个年度reyear.UpdateEndIfrexb.AddNewrexb.Fields(0)=CDate(frmfirst.firdate)rexb.Fields(1)=0rexb.Fields(2)="其它收入"rexb.Fields(3)="这是程序自己加的记录,你可以修改它."rexb.Fields(4)=Truerexb.Updatemyyear=Mid(Format(CDate(frmfirst.firdate),"yyyy-mm-dd"),1,4)rexb.CloseDimreyzjAsRecordsetSetreyzj=zbauto.OpenRecordset("yzj")reyzj.AddNewreyzj.Fields(0)=CDate(frmfirst.firdate)reyzj.Fields(1)=frmfirst.firmoneyreyzj.Updatereyzj.Closereauto.CloseEndIfreyear.MoveLastmyyear=reyear.Fields(0)Me.Caption="小小收支薄-每日收支详情登记"+"("+myyear+"年度)"Data1.DatabaseName=App.Path+"zb.mdb"Data1.RecordSource="select*fromxbwhereyear(收支日期)=""+myyear+""orderby收支日期"Data1.RefreshData2.DatabaseName=App.Path+"zb.mdb"Data2.RecordSource="select*fromyzjwhereyear(年月)=""+myyear+""orderby年月"Data2.Refresh第116页 北京理工大学现代远程教育学院毕业设计(论文)DimnAsIntegerData1.Recordset.MoveFirstDoData1.Recordset.MoveNextLoopUntilData1.Recordset.AbsolutePosition=-1"Data1.Recordset.RecordCount-1"是否到最后一个记录(不是检测记录末)IfData1.Recordset.RecordCount=1ThenToolbar1.Buttons.Item(4).Enabled=False"若此句放在前面recordcount为1,经movefirst记录移动后,得到recordcount正确值.Data1.Recordset.MoveFirst"设置标尺属性IfData1.Recordset.RecordCount>1ThenSlirecon.max=Data1.Recordset.RecordCount-1Slirecon.LargeChange=Int(Slirecon.max/10)+1ElseSlirecon.max=Data1.Recordset.RecordCountSlirecon.LargeChange=0EndIfLabel9.Caption=Str(Data1.Recordset.RecordCount)Label10.Caption=Str(Data1.Recordset.AbsolutePosition+1)DimtAsBooleant=Truevisok(t)mokEndSubPrivateSubForm_Unload(CancelAsInteger)DimiAsInteger,jAsIntegerj=Forms.Count-1Fori=0TojUnloadForms(0)第116页 北京理工大学现代远程教育学院毕业设计(论文)NextiEndSubPrivateSubHELP_Click()"MYHELPEndSubPrivateSubJS_Click()dctable("yzj")EndSubPrivateSubPX_Click()Command5_ClickEndSubPrivateSubSC_Click()Command2_ClickEndSubPrivateSubSlirecon_Change()"Debug.PrintSlirecon.ValueData1.Recordset.MoveFirstData1.Recordset.MoveSlirecon.ValuemokEndSubPrivateSubsy_Click()Command4_ClickEndSubPrivateSubSZ_Click()dctable("xb")EndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubText1_LostFocus(IndexAsInteger)IfNotIsDate(Text1(0).Text)ThenText1(0).SetFocusText1(0).SelStart=0Text1(0).SelLength=Len(Text1(0).Text)EndIfIfNotIsNumeric(Text1(1).Text)ThenText1(1).SetFocusText1(1).SelStart=0Text1(1).SelLength=Len(Text1(0).Text)EndIfEndSubPrivateSubtextfind_KeyPress(KeyAsciiAsInteger)IfKeyAscii=13ThenCalltextfind_LostFocusEndIfEndSubPrivateSubtextfind_LostFocus()IfNotIsDate(textfind.Text)ThenWithtextfind.SelStart=0.SelLength=Len(.Text).SetFocusEndWithElseData1.Recordset.FindFirst"收支日期=CDate(""+textfind.Text+"")"IfData1.Recordset.NoMatchThenMsgBox"没有找到"+textfind.Text+"的收支情况!"+Chr(13)+Chr(13)+"将查找最接近的一个收支个记录。",48,"查找"Data1.Recordset.FindLast"收支日期<=CDate(""+textfind.Text+"")"EndIf第116页 北京理工大学现代远程教育学院毕业设计(论文)EndIfCallmokEndSubPrivateSubToolbar1_ButtonClick(ByValButtonAsComctlLib.Button)SelectCaseButton.KeyCaseIs="add"Command1_ClickCaseIs="pre"Command4_ClickCaseIs="next"Command3_ClickCaseIs="edit"comedit_ClickCaseIs="ok"Comok_ClickCaseIs="cancel"Comcancl_ClickCaseIs="del"Command2_ClickCaseIs="js"Comzt_ClickCaseIs="index"Command5_ClickCaseIs="find"comlr_ClickCaseIs="ctrl"Comauto_ClickCaseIs="table"comtable_ClickCaseIs="help"MYHELP"MsgBox"帮助尚未建立!",48,"sorry"CaseIs="about"Frmabout.Show1第116页 北京理工大学现代远程教育学院毕业设计(论文)CaseIs="exit"UnloadfrmxbEndSelectEndSubPrivateSubWRITER_Click()Frmabout.Show1EndSubPrivateSubxg_Click()comedit_ClickEndSubPrivateSubXY_Click()Command3_ClickEndSubPrivateSubxz_Click()frmyear.Show1EndSubPrivateSubYD_Click()Comauto_ClickEndSubPrivateSubYJS_Click()Comzt_ClickEndSubPrivateSubzj_Click()Command1_ClickEndSub记录模块原代码第116页 北京理工大学现代远程教育学院毕业设计(论文)OptionExplicitPrivateSubComca_Click()UnloadMeEndSubPrivateSubComok_Click()frmxb.myyear=Data1.Recordset.Fields(0)UnloadMeEndSubPrivateSubDBGrid1_RowColChange(LastRowAsVariant,ByValLastColAsInteger)Label2.Caption=Data1.Recordset.Fields(0)EndSubPrivateSubDBGrid1_Click()EndSubPrivateSubForm_Load()Data1.DatabaseName=App.Path+"zb.mdb"Label2.Caption=frmxb.myyearEndSub预定模块原代码OptionExplicitDimggzbAsDatabaseDimggyzjAsRecordsetPrivateSubComexit_Click()UnloadMeEndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubCommand1_Click()Textmon.Locked=FalseTextdate.Locked=FalseText2.Locked=False每月.Enabled=True工资收入.Enabled=TrueData1.Recordset.AddNewData1.Recordset.UpdateData1.Recordset.MoveLastEndSubPrivateSubCommand2_Click()IfData1.Recordset.RecordCount=0ThenMsgBox"没有记录,不能删除。",48,"你想干嘛"ExitSubEndIfIfData1.Recordset.RecordCount=1ThenData1.Recordset.DeleteUnloadMeExitSubEndIfData1.Recordset.DeleteData1.RefreshEndSubPrivateSubCommand3_Click()DimkoAsByteggyzj.MoveFirstggyzj.MoveCombo1.ListIndexggyzj.Editko=MsgBox("您要把"+Format(ggyzj.Fields(0),"yy-mm")+"的上月余额"+Trim(Str(ggyzj.Fields(1)))+"更改为元"+Text1.Text+"元吗?",36,"确认")Ifko=vbYesThen第116页 北京理工大学现代远程教育学院毕业设计(论文)ggyzj.Fields(1)=Val(Text1.Text)ggyzj.UpdateElseggyzj.CancelUpdateEndIfEndSubPrivateSubForm_Activate()IfData1.Recordset.RecordCount=0ThenTextmon.Locked=TrueTextdate.Locked=TrueText2.Locked=True每月.Enabled=False工资收入.Enabled=FalseEndIfEndSubPrivateSubForm_Load()Setggzb=OpenDatabase(App.Path+"zb.mdb")Setggyzj=ggzb.OpenRecordset("yzj",dbOpenDynaset)DoWhileggyzj.AbsolutePosition<>-1Combo1.AddItem(Format(ggyzj.Fields(0),"yy-mm"))ggyzj.MoveNextLoopCombo1.ListIndex=0Data1.DatabaseName=App.Path+"zb.mdb"工资收入.AddItem"工资收入"工资收入.AddItem"奖金收入"工资收入.AddItem"福利收入"工资收入.AddItem"打工收入"工资收入.AddItem"其它收入"工资收入.AddItem"生活支出"第116页 北京理工大学现代远程教育学院毕业设计(论文)工资收入.AddItem"学习支出"工资收入.AddItem"娱乐支出"工资收入.AddItem"投资支出"工资收入.AddItem"其它支出"工资收入.Text="工资收入"每月.AddItem"每年"每月.AddItem"每季"每月.AddItem"每月"每月.AddItem"每周"每月.AddItem"每天"每月.Text="每月"EndSubPrivateSubForm_Unload(CancelAsInteger)ggzb.CloseEndSubPrivateSubText1_LostFocus()IfNotIsNumeric(Text1.Text)ThenWithText1.SelStart=0.SelLength=Len(Text1.Text).SetFocusEndWithMsgBox"您要填写数字",48,"提醒"EndIfEndSubPrivateSub工资收入_LostFocus()SelectCase工资收入.TextCase"工资收入"Case"奖金收入"Case"福利收入"Case"打工收入"Case"其它收入"第116页 北京理工大学现代远程教育学院毕业设计(论文)Case"生活支出"Case"娱乐支出"Case"学习支出"Case"投资支出"Case"其它支出"CaseElseMsgBox"您输入的收支类别不合程序要求,这可能会造成计算的不正确!"+Chr(13)+"请点击右边的下拉箭头,并从中选择一个类别!",48,"类别错误"工资收入.SelStart=0工资收入.SelLength=Len(工资收入.Text)工资收入.SetFocusEndSelectEndSubPrivateSub每月_LostFocus()SelectCase每月.TextCase"每年"Case"每季"Case"每月"Case"每周"Case"每天"CaseElseMsgBox"您输入的间隔不合程序要求,这可能会造成计算的不正确!程序默认是每月."+Chr(13)+"请点击右边的下拉箭头,并从中选择一个!",48,"类别错误"EndSelectEndSub查询模块原代码OptionExplicitPrivatedbzbAsDatabase,relrAsRecordset第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubComexit_Click()UnloadMe"frmxb.ShowEndSubPrivateSubCommand1_Click()DimiAsInteger,lb(10)AsStringDimtAsInteger,sdAsStringIfCDate(Textmaxdate.Text)0Thensd=sd+""or类别=""+lb(i)第116页 北京理工大学现代远程教育学院毕业设计(论文)Elsesd=lb(i)EndIfEndIfNextisd="(类别=""+sd+"")""下面是以前用的笨方法,但上面的方法也是在搞懂下面这句才能想通的."sd="(类别=""+lb(0)+""or类别=""+lb(1)+""or类别=""+lb(2)+""or类别=""+lb(3)+""or类别=""+lb(4)+""or类别=""+lb(5)+""or类别=""+lb(6)+""or类别=""+lb(7)+""or类别=""+lb(8)+""or类别=""+lb(9)+"")"Data1.RecordSource="select*fromxbwhere"+sd+"and[收支日期]>=cdate("+"""+Trim(Textmindate.Text)+"""+")and[收支日期]<=cdate("+"""+Trim(Textmaxdate.Text)+"""+")and[收支金额]>="+Textminmon.Text+"and[收支金额]<="+Textmaxmon.Text+"ORDERBY[收支日期]ASC""虽然TEXT是字符但仍要在括号中加单引号才能正确计算Data1.RefreshSetrelr=dbzb.OpenRecordset("selectsum(收支金额)fromxbwheremid(类别,3,2)="收入"and"+sd+"and[收支日期]>=cdate("+"""+Trim(Textmindate.Text)+"""+")and[收支日期]<=cdate("+"""+Trim(Textmaxdate.Text)+"""+")and[收支金额]>="+Textminmon.Text+"and[收支金额]<="+Textmaxmon.Text)Textsl.Text=Format(relr.Fields(0),"currency")Setrelr=dbzb.OpenRecordset("selectsum(收支金额)fromxbwheremid(类别,3,2)="支出"and"+sd+"and[收支日期]>=cdate("+"""+Trim(Textmindate.Text)+"""+")and[收支日期]<=cdate("+"""+Trim(Textmaxdate.Text)+"""+")and[收支金额]>="+Textminmon.Text+"and[收支金额]<="+Textmaxmon.Text)Textzf.Text=Format(relr.Fields(0),"currency")EndSubPrivateSubComsl_Click()第116页 北京理工大学现代远程教育学院毕业设计(论文)StatictAsByteDimiAsIntegerIft=0Thent=1Fori=0To4Check1(i).Value=1NextiComsl.Caption="不选收入"Elset=0Fori=0To4Check1(i).Value=0NextiComsl.Caption="全选收入"EndIfEndSubPrivateSubComzc_Click()StatictAsByteDimiAsIntegerIft=0Thent=1Fori=5To9Check1(i).Value=1NextiComzc.Caption="不选支出"Elset=0Fori=5To9Check1(i).Value=0NextiComzc.Caption="全选支出"EndIfEndSub第116页 北京理工大学现代远程教育学院毕业设计(论文)PrivateSubDBGridlr_Click()EndSubPrivateSubForm_Activate()Me.Caption="家庭财务-收支浏览"+"("+frmxb.myyear+"年度)"Data1.DatabaseName=App.Path+"zb.mdb"Data1.RecordSource=("select*fromxbwhereyear(收支日期)=""+frmxb.myyear+""")Setdbzb=OpenDatabase(App.Path+"zb.mdb")Setrelr=dbzb.OpenRecordset("selectmin(收支日期),max(收支日期),min(收支金额),max(收支金额)fromxbwhereyear(收支日期)=""+frmxb.myyear+""")Textmindate.Text=relr.Fields(0)Textmaxdate.Text=relr.Fields(1)Textminmon.Text=relr.Fields(2)Textmaxmon.Text=relr.Fields(3)"Setrelr=dbzb.OpenRecordset("selectsum(收支金额)fromxbwhere(收支标志=trueandyear(收支日期)=""+frmxb.myyear+"")")"Textsl.Text=Format(relr.Fields(0),"currency")"Setrelr=dbzb.OpenRecordset("selectsum(收支金额)fromxbwhere(收支标志=falseandyear(收支日期)=""+frmxb.myyear+"")")"Textzf.Text=Format(relr.Fields(0),"currency")EndSubPrivateSubTextmindate_LostFocus()IfNotIsDate(Textmindate.Text)ThenTextmindate.SelStart=0Textmindate.SelLength=8Textmindate.SetFocusEndIfEndSubPrivateSubTextmaxdate_LostFocus()IfNotIsDate(Textmaxdate.Text)ThenTextmaxdate.SelStart=0第116页 北京理工大学现代远程教育学院毕业设计(论文)Textmaxdate.SelLength=8Textmaxdate.SetFocus"ExitSubEndIfEndSubPrivateSubTextminmon_LostFocus()IfNotIsNumeric(Textminmon.Text)ThenTextminmon.SetFocusTextminmon.SelStart=0Textminmon.SelLength=Len(Textminmon.Text)EndIfEndSubPrivateSubTextmaxmon_LostFocus()IfNotIsNumeric(Textmaxmon.Text)ThenTextmaxmon.SetFocusTextmaxmon.SelStart=0Textmaxmon.SelLength=Len(Textmaxmon.Text)"ExitSubEndIfEndSub帮助模块原代码OptionExplicitPrivateSubCommand1_Click()UnloadMeEndSubPrivateSubForm_Load()第116页 北京理工大学现代远程教育学院毕业设计(论文)Label1.Caption=Label1.Caption+"这里介绍家庭财务管理的各种功能各操作方法:"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"程序第一次启动时会要求你输入开始计账的年月和当时所有的现金数,输入后进入主界面,里面已有一条收支为0的记录了,您可以改掉它。"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"新增、删除、前一记录、后一记录这些是常规性功能,不用我多说了吧。"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"查询框中可输入任一日期,回车或TAB键后将转到所输入日期的第一个记录上,若没有该日期的收支情况将转到最接近该日期的记录上。"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"‘X月计算’按钮将计算这个月份的总收入、支出及各项收支的总和,并反映在下端的表格中,我们可以通过水平滚动条来决定计算哪个月,但你一定要保证上个月的计算结果是最新的,否则这个月以下的所有月份中的‘本月结余’和‘上月结余’都是错误的。你若发现某一月的结算中‘上月结余’和上一月的‘本月结余’不相符,请重新计算这个月及以下各月,或者使用‘整年计算’按钮。"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"工具条上的‘强制按时间重排’是为了在刚输入的前些天的情况也按收支时间排序。"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"工具条上的‘初始化设置’可调出预定面板,在预定面板上我们可以填入一些固定的收支情况(如每月的固定工资),程序将按设置自动填入数据库中,若你有一些日子没用本程序,在下一次启动时,也会自动进行补填。在预定面板上还能重新设置本年度第一个月的上月结余数,用来修改第一次启动程序时输入的现金总数。"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"工具条上的‘作拆线图’可以用不同颜色拆线显示出当年的任何一项或几项收支或月结算情况,纵坐标轴的比例可是随最大值变化的呢。这是我花了一番心血弄出来的,比调EXCEL要快吧,况且我们不一定都有EXCEL。"+Chr(13)+Chr(10)+Chr(13)+Chr(10)Label1.Caption=Label1.Caption+"04-4-5"EndSubPrivateSubLabel1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Label1.Top=Label1.Top-2200IfLabel1.Top+Label1.Height<1000ThenLabel1.Top=105EndIf第116页 北京理工大学现代远程教育学院毕业设计(论文)EndSub主程序OptionExplicitPublicmwAsStringSubmain()DimiAsInteger,pas(7)AsStringDimzbAsDatabaseDimreAsRecordsetSetzb=OpenDatabase(App.Path+"/zb.mdb")Setre=zb.OpenRecordset("xb")Ifre.RecordCount<>0Then"XB中有记录,说明不是首次使用IfDir(App.Path+"/OK.PAS")<>"ok.pas"Then"保存密码的文件不在MsgBox"保存密码的文件你藏哪去了?它叫OK.PAS,在同一目录里.",32,"出错"EndElsemw=""OpenApp.Path+"/ok.pas"ForInputAs#1Input#1,mwClose#1Fori=1ToLen(mw)pas(i-1)=Mid(mw,i,1)"将密文分成单个字符pas(i-1)=Chr(Asc(pas(i-1))-50-i*2)"单个字符解密Nextimw=""Fori=1To8mw=mw+pas(i-1)"合并得到明文Nextii=0DoWhileTruefrmpass.Show1"确认密码对话框Iffrmpass.grzbpass<>mwThen"密码不对i=i+1Ifi=3Then"三次都不对第116页 北京理工大学现代远程教育学院毕业设计(论文)MsgBox"请尊重他人的隐私权!你没有隐私吗?",48,"我会告你的哦!"EndEndIfElseExitDoEndIfLoopEndIfEndIffrmxb.ShowEndSub第116页'