货运设备管理系统 对整个铁路运输部门而言,设备管理具有很重要的意义。它是重要的基础管理信息资源,是进行技术改造、行车指挥、保障行车安全及事故抢险救援等的重要依据。设备是固定资产的重要组成部分,如何管理好各部门的设备,如何使设备的寿命周期更长,使其使用综合效率最高,是运输部门实现生产经营的重要目的之一。但是由于管理技术跟不上,使设备管理成为铁路系统技术管理的薄弱环节。铁路部门的日常计划、生产质量、技术、物资、能源和财务等管理,都与设备管理有着这样或那样的联系。随着铁路经营机制的变革和技术更新速度的加快,各级管理人员的行车技术设备信息的需求不断增长,以传统方式管理运输设备难以适应新形势的需要。 ????设备管理的好坏,在很大程度上决定了行车安全以及运输成本的高低。在现代化生产条件日益完善的今天,设备管理水平的高低对运输部门的影响更是强烈。所以,提高铁路运输部门客货运设备管理水平,使之为车站的正常生产经营提供效率更高的后勤服务是十分有必要的。随着现代化生产水平的不断提高,设备的性能更加高级,结构更加复杂,使用维修等条件更加严格,设备的投资越来越昂贵。设备管理成为影响运输部门经济效益的主要因素之一,在运输部门日常管理中的地位举足轻重。所以,如何加强铁路运输部门的客货运设备管理,是摆在我们面前的一项迫切的重要任务。 ????随着计算机的日益普及,计算机水平的飞速发展,尤其是以计算机为根基推动的信息技术和信息应用的发展更是成为了一个国家社会进步、经济腾飞的原动力。在全球互连网迅猛发展,网络经济正在兴起的背景下,铁路运输部门现有的设备管理系统也面临着向网络化、智能化、辅助决策支持等方向发展。 ????本系统运用计算机visual basic编程工具设计了一个管理铁路货运设备,改变以前的落后的管理法,是货运设备管理进入信息化。 ??? 下面是货运设备管理信息系统功能结构图。 ???????????????????????????    设计思想 在该系统的开发过程中,我们充分吸收和借鉴了长期以来从事各种工程项目所积累的行之有效的原理、概念、技术、和方法,特别是在以往的计算机软件开发过程中所积累的经验和教训。采用软件工程的概念、原理、技术和方法开发和维护软件,把正确的管理技术和先进的软件开发技术结合起来。严格运用了生命周期方法学和各种结构分析及结构设计技术,以最大限度的满足用户需求为目的,从时间角度对该设备管理信息系统的开发和维护进行了分解,将软件开发分为六个步骤:制定计划、需求分析、软件设计、程序编写、软件测试、运行和维护。 (1)对系统的设计进行了可行性研究 ? 开发应用软件前的可行性研究对开发人员来说是至关重要的一环,所以我们对以前类似的系统做了充分的研究,对即将开发的软件也做了大量的分析,并做出了相应的技术文档。以前有关设备管理的软件是在DOS操作系统下所实现的,随着计算机水平的不断提高,操作系统的不断升级,该系统版本低、界面单调,而且使用起来十分麻烦,已经远远不能符合用户的需要。我们所开发的系统要求紧密结合用户需求,针对以前软件的不足之处,开发出基于WINDOWS 视窗操作系统的版本,该系统界面友好、风格独特、功能强大、使用起来方便快捷。针对铁路运输部门来说,快速、高效是尤其重要的要素,系统的开发也紧密结合了此要求。 (2)对软件的需求分析及采用的开发环境 ?? 应用软件最主要的特点就是最大限度的满足用户的需求。系统开发人员要紧紧围绕用户的需求来开发软件。根据用户的要求,在经过反复分析研究之后,确定出铁路部门的运输设备履历簿管理信息系统要具有以下功能: 实现对以前版本的设备管理系统数据的兼容性; 方便、快捷、安全可靠的履历数据编辑功能; 高效、方便、时间和范围任意组合的车站数据查询功能; 路局、分局在任意时间里对任意范围的数据进行统计的功能; 路局、分局、车务段、车站部分数据年度、月度自动汇总功能; 自动生成车站履历簿报表及年度报表以及分局年度汇总表功能; 实现车站、车务段、分局、路局间的履历簿数据在网上自动传输的功能。 ? 操作系统采用当前计算机用户普遍采用的WINDOWS 95/98/2000操作系统,软件开发工具选用了面向对象的软件开发工具VISUAL BASIC 6.0,履历簿数据的存放、数据的处理及报表的生成选择了通用的办公软件OFFICE 系列中的MICROSOFT ACCESS以及MICROSOFT EXCEL 不仅实现了软件的大众性及通用性,而且实现了对以前在DOS下开发的履历设备管理数据存放的.dbf格式的兼容性。 (3)系统的设计思路 ? 如何制定系统总体结构,即用什么样的方案来设计应用软件的总体结构以及制定什么样的设计思路来完成所要开发的项目,是每个项目开发前最重要的环节之一。应用软件和工具软件不同,系统的总体结构、设计思路和系统目标是以用户的需求为中心的,所以选择最合乎用户要求的方案是必须的。 ? 该系统运行所采用的操作系统是当前大部分计算机用户普遍采用的WINDOWS 95/98/2000操作系统,也符合铁路运输部门普遍的使用习惯。 ? 在当前的软件开发中,面向对象(OO:Object-Oriented)的概念已经无处不在,面向对象的设计(OOD:Object-Oriented Design)成为系统设计和系统分析的首选方式,面向对象的编程(OO:Object-Oriented Programme)的语言已经成为主要的考虑对象。大多数其它程序设计语言将数据元素从执行它们的的过程或活动中分离,而面向对象(OO)的语言,是把数据与过程(或活动)结合起来与对象相联系。 ?? 对设备履历簿管理信息系统的开发选择了功能强大的面向对象程序开发工具VISUAL BASIC 6.0。它不仅有友好的图形界面,而且有强大的数据库访问和数据处理能力,以及许多支持面向对象设计和实现的特性: 在类模块中定义类; 用属性过程提供公共访问; 定义多态方法; 生成事件; 封装类常量; 用Object Browser 查看类; 创建对象; 使用窗体作为对象; 使用对象组; 定义多接口; 开发数据库应用程序; 开发基于WEB的应用程序; ? VISUAL BASIC 6.0 的许多新特性更加完善了面向对象的技术。采用新的数据访问工具如ADO2、DATA VIEW(数据视图)、DataEnvironment(数据环境)、Data Report(数据报告)设计器大大方便了访问数据库的功能;在WEB开发方面,可以用VB创建WEB应用程序。其中包括DHTML以及ILS应用程序。 ? 这些优秀的面向对象设计和面向对象数据访问的功能结合起来运用,能够高质量的完成对履历簿数据的编辑、查询以及统计功能。不仅实现每一个车站的数据查询,而且可以实现任何一个车务段,任何一个分局,任何一个路局,甚至任何一条铁路线上的所有车站的履历数据的查询和统计功能。功能完善,风格独特,优点突出,是该系统的特点,与多媒体的完美结合也使得该系统在使用户满意的程度上又上了一个台阶。 ? 数据处理是现代计算机应用中的一个重要组成部分。人们使用计算机对大量的数据保存和管理,一边推出有价值的信息辅助决策。数据处理的发展分为三个阶段:人工管理阶段、文件系统阶段、数据库系统阶段。数据库系统的发展有经历了三个阶段:网状数据库、层次数据库、关系数据库。 ? 数据库管理系统是一个软件系统,它能够对数据库进行存储管理、安全性管理、完整性管理。它为用户提供了一个软件环境,快速建立、维护、检索、存取和处理数据库中的信息。数据库和数据库管理系统在一起构成了数据库系统。 ? 面向对象程序设计方法中的对象是以对象名封装的数据结构和可施加在这些数据上的操作的集合。操作名列在封装对象的界面上,当一个对象A启动另一个对象B的某个操作C时,A只需要以操作名C为主要信息向B发一条消息。对象B接收到A的消息后就会自动启动操作C的工作,完成对B的数据结构的加工。 ?? 因此,数据库技术成为了计算机信息系统和应用系统的重要支柱。 ? 而面向对象程序开发中的面向对象的数据库系统就显的极为重要。铁路运输部门的客货运履历数据不仅多而且比较复杂,以前所采用的管理系统是DOS操作系统下的版本,履历簿数据是以.dbf的格式保存的,所以选择OFFICE办公软件中的数据库开发软件MICROSOFT ACCESS不仅符合绝大多数计算机使用者的习惯,而且强大的数据存放和数据处理能力、对以前版本的履历数据的完全兼容是完全正确的。报表的生成也选择了OFFICE 家族中的MICROSOFT EXCEL 实现报表的自动生成,完全按照用户习惯保存以及打印报表数据。简洁方便,完全符合用户的要求。 货运设备管理信息系统使用详细说明 ?? 1、首先进入系统并选择登录身份: ?? 单击图1中的“货运设备履历管理系统”,进入货运履历簿主窗口,如下图: ??????????  ??????????????????????????????? 图 1 ??? 点击菜单上的“登录”,进入货运设备管理登录窗口,选择登录身份。 ??????????  ???????????????????????????????????? 图 2 2、选择不同身份登录以及登录后的相关功能 ?? (1)以局(或分局)的身份登录: ??? 在图2中如果只选择全路局(全分局)而不选择车站直接登录系统,将会出现如下功能菜单(图3-3): ?????????????????????????  ??? 图3 ??? ①、对全局(全分局)的履历簿数据进行统计 ??? 单击菜单上的统计,进入系统的统计功能。利用该功能可以对全局(全分局)的履历簿数据进行任何条件的统计。具体步骤如下: ??? a、选定所要统计的范围 ??? 若登录身份是全路局(全分局),那么统计范围就在全路局(全分局)。在局级身份下可以选择以下几个范围: ??? 1)、按铁路线统计 ??? 在右图(图4)中选择所要统计的铁路线。则统计的数据是在这条铁路线上全路局(全分局)所有车站的数据。 ???????? ??????????????????????????????????? 图4 ??? 2)、按站、段统计 ??? 在下图中可选择所要统计的段级站或者车务段。如果图4中的选择是“无”,那么该下拉框中会出现全路局(全分局)的所有段级站以及车务段,如果选择了某条线,那么该下拉框中出现的只有这条线上的段级站以及车务段。图4和图5的下拉框组合确定的范围就是所要统计的范围。 ??? b、填写所要统计的时间 ??? 在时间范围一栏中填写所要统计的时间范围。要求起止时间都要填写。 ??? c、选定所要统计的表格及数据字段并确定统计条件 ??? 先选定表格,然后双击该表中的某个字段,接着编辑所要统计的条件,确认条件正确(即符合SQL查询语法)。如果就这一个条件进行统计,可点“统计”按钮进行统计。如果多条件组合统计,可以接着选择下一个字段,继续编辑统计条件,编辑完条件后,确认条件正确无误,单击“统计”按钮进行统计。 ?????????  ????????????????图5 ??? d、输出统计结果并保存 第二步点“统计”按钮后将会在如图6中出现统计结果,点“保存”可将该结果保存在一个文本文件中。? ??? ②、对某个车站的履历簿数据进行查询 ??? 利用该功能可以对全路局所有车站的货运设备履历簿数据进行查询。查询步骤如下: ??? a、选择车站 ??? 点击功能菜单(图3)中的查询,出现窗口6,在该窗口中可以用三种不同方式确定一个车站,所有的查询将针对这个车站。 ??? 三种查询确定车站的方式: ??? 首先,在“局/分局”一项中选择某分局,然后再确定车站名 ??? 1)、按站段别确定车站名 ??? 如图6,选中“站段别”一项,然后在左边的下拉框中选择车务段,右边的下拉框中会相应的出现该车务段的所有车站。如果左边的下拉框中选择的是段级站,那么右边的下拉框会自动消失。 ?????????  ?????????????????????????????????????? 图6 ??? 2)、按铁路线确定车站名 ??? 如图7,选中“线名”一项,然后在左边的下拉框中选择铁路线,右边的下拉框中会出现全局范围里该条铁路线上的所有车站名,这样就可以选择一个站名。 ?????????  ????????????????????????????????????? 图7 ??? 3)、按车站名首字母选择站名 ??? 如图8,选中车站名称”一项,在文本框中输入你所要查询的车站名的首字母,在文本框的右边会列出所有首字母符合条件的车站名,单击你所要查询的车站名即可。 ??????????  ?????????????????????????????????????????? 图8 ??? b、选择表格及字段 选择完车站名后点“确定”进入到下一窗口,如图9,按图中的提示可选择表格,选择字段。如果没有选择字段或者选择所有字段,那么系统都会自动认为你选择了所有字段。 ?????????  ?????????????????????????????????????????? 图9 ??? c、选择查询时间 ??? 在第二步中选择完表格后,选择时间一栏中会自动出现该表格所包含的所有时间字段。可在你所要查询的年份前打上对勾,那么查询结果中将只会出现你所选的年份的记录;如果你没有选择年份或选择了所有年份,那么系统会认为你所要查询的是所有年份的记录。 ??? d、得出查询结果 ??? 点击图9中的查询后会出现如图10的查询结果(仅一部分,另一部分可拉滚动条看到)。 ?????????  ????????????????????????????????????????? 图10 ??? ③、有关数据维护功能 ??? a、维护全局的所有车务段名、铁路线名、车站名以及车站名首字母 ?????????????????????  ??????????????????????????????????????? 图11 ??? 如图11,点击功能菜单上的“维护”——“济南分局”,可出现如下表格窗口, ?????????  ?????????????????????????????????????????? 图12 ??? 如图12,在该表格中可任意添加或删除记录或者更改记录的内容。需要注意的是,在车站名一栏中,所有后边带“站”字的车站都是段级站。 ??? b、 维护全局的所有货运设备履历簿填写时的可选项 ?????????????????????????  ??????????????????????????????????????????? 图13 ??? 如图13,点击功能菜单上的“维护”——“履历簿可选项”,进入如下窗口,如图14。选择某一张表格,然后选择一个可维护的字段。如果要添加内容,点击右边的添加项,在文本框中输入所要添加的内容,点“添加”按钮,该内容自动添加到数据库中。如果要删除内容,点击右边的删除项,选定所要删除的内容,点“删除”按钮,该内容自动从数据库中删除。 ???????????  ??????????????????????????????????????????? 图14 ??? ④、网上接收、发送数据 利用该功能可以接收由全局所有车站上报的数据库文件,然后可以对该数据进行浏览、查询、统计等操作;也可以将分局或者路局的数据传输给各车站或者车务段。 ?? (2)、以站、车务段的身份登录 ??? 如果选择某个车站登录系统,将会出现如下功能菜单(图15): ?????????????????????????  ????????????????????????????????????????? 图15 ??? ①、对履历簿数据进行编辑 ??? 点击菜单上的编辑,然后选择某一表格,接着出现该表格的编辑浏览窗口,如(图16)。 ?????????  ??????????????????????????????????????? 图16 ??? a、 记录的修改 ??? 用鼠标单击你所要修改的数据所在的单元格,该单元格获得焦点,如图17, ??????????????????????????????????  ???????????????????????????????????????? 图17 ??? 可任意改动该单元格的数据。如果该单元格的数据是固定的选项,那么单击该单元格后会出现如图18所示的下拉框,可在该下拉框中选择所要修改的数据。下拉框中的数据可在以局或者分局身份登录的功能中修改维护。在对某一单元格的数据修改完毕后,可用鼠标单击所要修改的下一个单元格,也可以按回车键使焦点挪到同一行的下一个单元格,当焦点在这一行的结尾时,按回车可使焦点移动到下一行的开始。 ??????????????????????????????????  ???????????????????????????????????????? 图18 ??? b、记录的添加 ??? 如果要添加记录,点击“添加”按钮,会出现如图19所示,新记录添加到最后一行。接着可以进行新记录的数据录入。 ???????????  ???????????????????????????????????????? 图19 ??? c、 记录的删除 ??? 如过要删除某一条记录,可单击该记录的第一列选定整条记录,也可以在除第一列外的任意一个单元格获得焦点时双击它而选定整条记录,然后点“删除”按钮,系统会提示你是否删除,如图20,选择“是”将会永久的删除该记录,且不能恢复;选“否”将不进行任何操作。 ???????????  ????????????????????????????????????????? 图20 ??? d、 数据的保存 ??? 当修改完数据或者添加完记录后,可以点“保存”按钮对数据进行保存,以免丢失。如果某一条记录中任何一个字段都没有填写数据,在保存时,系统会自动把它删除。 ??? e、 生成打印报表 ?????????  ???????????????????????????????????????? 图21 ??? 数据修改并保存完毕后,可点击“生成报表”按钮,然后在所出现的对话框中确定路径及文件名,如图3-25,再点“确定”系统会自动生成和该表格完全相同的EXCEL报表文件。若想打印该报表文件,可以随时在EXCEL中打开该文件,然后打印。 ??? ②、对履历簿数据进行查询? ??? a、选择表格及字段 ??? 如图21,按图中的提示可选择表格,选择字段。如果没有选择字段或者选择所有字段,那么系统都会自动认为你选择了该表格的所有字段。 ??? b、选择查询时间 ??? 选择完表格后,选择时间一栏中会自动出现该表格所包含的所有时间字段。可在你所要查询的年份前打上对勾,那么查询结果中将只会出现你所选的年份的记录;如果你没有选择选择年份或选择所有年份,那么系统会认为你所要查询的是所有年份的记录。 ??? c、得出查询结果 ??? 点击图9中的查询后会出现如图10的查询结果。 ??? ③、网上发送数据 ??? 利用此功能可以将车站编辑后的数据库文件通过网络直接发送到分局,以便分局领导统计、查询相关数据。  操作系统及开发环境功能集成  ? 近年来,网络的迅速普及和应用,促使计算机技术,网络数据传输技术,除了E-mail、FTP、WWW等传统的手段以外,电子报刊、远程教学、远程医疗、网上购物、虚拟专网、电子金融、电子贸易等新兴的INTERNET应用日益发展和成熟起来。INTERNET对铁路运输部门获取信息的方式和相互交流信息的方式产生了巨大的影响,全新的信息服务将会为铁路运输部门的工作方式及工作效率带来巨大的变化。铁路是国民经济的动脉,建国几十年以来,铁道部逐步建成了四通八达的铁道网,为国家提供了高效、畅通、经济的货运、客运服务,为我国社会稳定、经济繁荣作出了巨大贡献。国家大力发展计算机网络建设的现阶段,要提高铁路部门工作人员在本地、本行业的工作运营效率,充分利用网络强大的数据传输功能以及丰富的通信资源是必要的。要在铁路运输部门间建立Intranet,充分利用现有资源,实现路局与分局之间,分局与车站之间,以及路局与车站之间的履历簿数据互相传输功能。彻底代替以前铁路运输各部门之间的人工上报软盘的情形。  ? GIS(地理信息系统)是国际上近几年才发展起来的一种新型软件,它是在计算机硬、软设备支持下,实现地理空间数据输入、存储、管理、检索、处理和综合分析的技术系统。它最重要的特点在于把需要研究的数据和反映这些数据地理位置的图形有效结合起来,从而根据应用的需要进行信息的空间分析处理。将GIS技术与铁路运输管理相结合,充分发挥先进的GIS技术的特点和功能为铁路运输管理系统服务。 ? GIS是计算机应用领域的一个重要发展方向。对空间信息及其相关的属性信息的处理是GIS的基本功能,空间信息的查询和分析是GIS和其它数据处理系统的主要区别,迅速、及时地更新数据库,大规模、综合性地管理与地理分布有关的信息是它的特点。应用GIS技术是铁道部“十五”规划中的一个重点,也是实现“数字铁路”构想的重要技术组成部分。因此为解决实际问题,适应技术发展方向,基于GIS平台以铁路为具体服务对象做二次开发成为本项目的设计思路根源。 (4)代码的编写及系统速度的优化 ? 高级程序设计语言的特性和编码途径及方法将会决定编码的可靠性、可读性、可测试性和可维护性。编写的代码的目的是实现人和计算机之间的互相通信,最终实现应用软件一定要符合用户需求、方便用户使用的目的。编程人员尽可能的使该管理系统在使用过程中减小对操作系统资源的消耗。选用VISUAL BASIC 6.0设计程序,在优化系统速度我们采取了以下措施: ?????? 首先,优化系统的真实速度方面: 选用最佳的数据结构; 避免使用Variant 变量以及隐式变量; 尽可能的使用常数; 使用内嵌过程替代调用; 尽量使用ByVal传替参数,而不使用ByRef等。 ?????? 其次,在优化显示速度方面: 、恰当的使用AutoRedraw; 、设置属性时隐藏控件,以避免多次重画; 、用Image控件代替PictureBox控件; 、将容器的ClipControls属性设为False等。 第三,在优化感觉速度方面: 隐藏窗体而不卸载窗体; 使用进度指标器和等待光标; 加快应用程序的启动速度; 预加载需读取的数据等。 (5)系统的试用及测试 ? 在济南分局部分车站已经开始试用该系统。首先在一个相对较小的范围里进行测试使用。选取一个车务段,然后选取分局,路局,分别安装该系统。由不同的用户分别操作,实现了履历簿的记录添加、删除、保存以及报表生成等功能;而且成功的实现了车务段、分局、路局之间数据的互相传输。该系统受到现场用户的一致好评。 (6)系统的维护功能 ? 设备履历管理信息系统中包括客、货运管理两套系统。两套系统采用了相同的路局、分局、车务段以及车站名数据库,该数据库中的车站被划分为三种不同的范围。分别是分局、车务段、铁路线。不同的用户级别有不同的维护功能。比如路局可以维护所有的分局名、车务段名,铁路线名以及车站名;分局可以维护分局内的所有车务段名、铁路线名以及车站名。 程序源代码 ?'定义读取ini文件的API函数 Public Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long Public db As Database Public rst As Recordset Public strLoginBureaName As String '登陆的分局名 Public strSuoshuxian As String '如果是车站登陆,将登陆时所属的铁路线从数据库中读出来 Public strStationName As String '小站或者站管站中低一级的车站 Public strCwdName As String '车务段或者站管站中高一级的车站 Public strDatabaseName As String '数据库名称 Public NeedSaveLocal(1000, 1000) As Boolean Public IsColorTurn As Boolean '颜色是否转变,是否选中整条记录 Public LoginStationName As String Public LoginStation As String Public YearTj() As String Public Pathname As String '生成报表时所存储的全路径 Public SelectedYear As String Public TableNameSelected As String '所选择表格的名字 Public G_CurrentTableName As String '浏览编辑时所选择的表格 Public StrLogin As String '从config.ini中读取的字符串 Public IsNoQuery As Boolean '是否是查询所调用的窗体 Public CurrentYear As String '当前年份 Public G_DbStationData As Database '定义打开车站的数据库 Public G_RstStationData As Recordset '定义车站数据集 Public G_CurrentYear As String Public Enum G_Distinction '用枚举型变量定义登陆的级别 luju = 1 fenju = 2 chewuduan = 3 duanjizhan = 4 xiaozhan = 5 End Enum Public Function ReturnFileName(ByVal PathFileName As String) As String ?? Dim FNLen As Integer ?? Dim i As Integer ?? Dim temp As String ?? FNLen = Len(PathFileName) ?? If Right(PathFileName, 1) = "/" Then ????? ReturnFileName = "/" ????? Exit Function ?? End If ?? For i = 0 To FNLen - 1 ????? temp = Mid(PathFileName, FNLen - i, 1) ????? If temp = "\" Then ???????? ReturnFileName = Right(PathFileName, i) ???????? Exit Function ????? End If ?? Next i End Function Public Function FindWeihuPath(strPath As String) As String ?? '查询Weihu路径 ?? IntPathEnd = InStrRev(strPath, "\") ?? IntPathEnd = IntPathEnd - 1 ?? strCurrentPath = Mid(strPath, 1, IntPathEnd) ?? strCurrentPath = strCurrentPath & "\weihu" ?? FindWeihuPath = strCurrentPath End Function '从数据库中按照年份条件和车站名条件 '取出将要在网格中显示的记录集 Public Sub SelectCondition() ?? Dim StrYear As String '定义当前年份 ?? Dim strSQL As String '定义SQL语句 ?? '读取当前的年份 ?? StrYear = Left(Format(Date, "LONG DATE"), 4) ?? '如果以车站的身份登陆的话 ?? strSQL = "SELECT * FROM " & G_CurrentTableName & " WHERE P01='" & StrYear & "'" ?? Set G_RstStationData = G_DbStationData.OpenRecordset(strSQL) End Sub '从查询窗口所选择的表格中按照查询条件取出记录集 Public Sub QueryCondition() ?? Dim StrYear As String '定义当前年份 ?? Dim strSQL As String '定义SQL语句 ?? '读取当前的年份 ?? StrYear = Left(Format(Date, "LONG DATE"), 4) ?? '如果以车站的身份登陆的话 ?? strSQL = "SELECT * FROM " & G_CurrentTableName & " WHERE (" & SelectedYear & ") and cz='" & strStationName & "' ORDER BY P01" ?? Set G_RstStationData = G_DbStationData.OpenRecordset(strSQL) End Sub Public Sub FindLastRecAndCopyToCurrentYearRec() ?? '查找当前年的记录,如果不存在则复制上一年的记录, ?? '如果上一年不存在,则手动输入 ?? If G_RstStationData.RecordCount = 0 Then ????? ByValMsgbox = MsgBox("没有今年的信息,是否复制上一年的内容?", 0 + vbYesNo, "提问") ?? If ByValMsgbox = vbYes Then ????? Set G_RstStationData = G_DbStationData.OpenRecordset("select * from " & G_CurrentTableName & " where P01='" & CStr(CInt(Left(G_CurrentYear, 4)) - 1) & "' and cz='" & strStationName & "'") ?? If G_RstStationData.RecordCount = 0 Then ????? MsgBox "没有上一年的记录,请手动输入今年的设备信息!", 0 + vbInformation, "提示" ????? Exit Sub ?? End If ?? G_DbStationData.Execute "INSERT INTO " & G_CurrentTableName & " select * from " & G_CurrentTableName & " WHERE P01='" & CStr(CInt(Left(G_CurrentYear, 4)) - 1) & "' and cz='" & strStationName & "'" ?? Set G_RstStationData = G_DbStationData.OpenRecordset("select * from " & G_CurrentTableName & " WHERE P01='" & CStr(CInt(Left(G_CurrentYear, 4)) - 1) & "' and cz='" & strStationName & "'") ?? G_RstStationData.MoveLast ?? For i = G_RstStationData.RecordCount To G_RstStationData.RecordCount / 2 + 1 Step -1? ????? G_RstStationData.Edit ????? G_RstStationData.Fields(4).Value = Left(G_CurrentYear, 4) ????? G_RstStationData.Update ????? G_RstStationData.MovePrevious ?? Next ?? Else ????? Exit Sub ?? End If End Sub '将从数据库中读出的数据,显示在网格中 Public Sub BrowseData(ByVal Fg As MSFlexGrid, ByVal rec As Recordset) ?? On Error Resume Next ?? Dim strSqls As String ?? Dim CountRows As Integer ?? Dim CountCols As Integer ?? Dim ByValMsgbox ?? If IsNoQuery = True Then ????? '打开查询结果数据集 ????? QueryCondition ?? Else ????? '打开编辑表格数据集 ????? SelectCondition ????? '查找是否有今年的记录,如果没有,则复制上一年的 ????? '如果上一年没有,则手动输入当前年的记录 ????? FindLastRecAndCopyToCurrentYearRec ????? SelectCondition ?? End If ?? '数据集移动至尾,然后至头 ?? G_RstStationData.MoveLast ?? G_RstStationData.MoveFirst ?? CountRows = G_RstStationData.RecordCount ?? CountCols = G_RstStationData.Fields.Count - 4 ?? With Fg ????? If CountRows = 0 Then ???????? .Rows = 1 ????? End If ????? For i = 1 To CountRows ???????? For j = 1 To CountCols ??????????? .Rows = CountRows + 1 ??????????? .Cols = CountCols ??????????? .Row = i ??????????? .Col = j - 1 ??????????? If IsNull(G_RstStationData.Fields(.Col + 4).Value) Then ?????????????? .Text = "" ??????????? Else ?????????????? .Text = G_RstStationData.Fields(.Col + 4).Value ??????????? End If ??????????? If .Text = "0" Then ?????????????? .Text = "" ??????????? End If ???????? Next j ???????? G_RstStationData.MoveNext ????? Next i ????? .Refresh ?? End With ?? G_RstStationData.Close End Sub '存储网格中凡是有改变的方格中的数据 Public Sub SaveData(ByVal Fg As MSFlexGrid, ByVal rec As Recordset) ?? Dim CountRows As Integer ?? Dim CountCols As Integer ?? Dim j As Integer, k As Integer ?? '打开记录集 ?? SelectCondition ?? G_RstStationData.MoveLast ?? G_RstStationData.MoveFirst ?? With Fg ????? CountRows = .Rows ????? CountCols = .Cols ????? For i = 1 To CountRows - 1 ???????? For j = 0 To CountCols - 1 ??????????? If NeedSaveLocal(i, j) = True Then ?????????????? .Row = i ?????????????? .Col = j ?????????????? G_RstStationData.Edit ?????????????? G_RstStationData.Fields(j + 4).Value = .Text ?????????????? G_RstStationData.Update ??????????? End If ???????? Next j ???????? G_RstStationData.MoveNext ????? Next i ????? '删除所有记录中的空白记录 ????? For i = .Rows - 1 To 1 Step -1 ???????? If i > .Rows - 1 Then ??????????? Exit For ???????? End If ???????? For j = 1 To .Cols - 1 ??????????? .Row = i ??????????? .Col = j ??????????? If .Text <> "" Then ?????????????? BlankValue = True ?????????????? Exit For ??????????? End If ???????? Next j ???????? If BlankValue = False Then ??????????? .RemoveItem .Row ???????? End If ???????? BlankValue = False ????? Next i ?? End With ?? Set G_RstStationData = Nothing End Sub Public Sub AddRec(ByVal Fg As MSFlexGrid, ByVal rec As Recordset) ?? '记录集增加一条记录 ?? '前五个字段分别添上分局、车务段、车站、所属线,年份 ?? With rec ????? .AddNew ????? .Fields(0) = strLoginBureaName ????? .Fields(1) = strCwdName ????? .Fields(2) = strStationName ????? .Fields(3) = strSuoshuxian ????? .Fields(4).Value = Left(G_CurrentYear, 4) ????? .Update ????? .Close ?? End With End Sub