摘要
“信息手段革命”转向“信息内容革命”,引发了全球性数字校园建设浪潮。在信息时代的今天,计算机参与事业单位日常业务管理以成为事业单位现代化管理的当务之急。随着电脑的普及与使用,现在的管理也提升了一个档次,渐渐实现了无纸化办公,即从原来的人工记录管理模式转变为电脑一体化管理。排课问题是一个NP-Complete问题,尤其针对高校的排课一直都没有很好的解决方法,但是此问题又是每个学校在每个学期都会碰到的必要行政作业。本文在相关理论的指导下,在分析以往一些排课软件的基础上,提出一个高校通用排课系统的设计方法,并对一些具体的问题给出相应解决方案。本文介绍了在Vb环境下采用“自上而下地总体规划,自下而上地应用开发”的策略开发一个管理信息系统的过程。该系统采用VB6.0作为开发工具,ACCESS2000作为数据库管理系统。简单介绍了VB6.0的编程环境和其数据库编程技术。在可行性研究和需求分析的基础上,对系统的设计方案、功能模块、接口设计、数据库系统设计和安全设计等进行了较详细的论述。
该系统遵循先进、经济、安全、高效、可靠、易操作、易维护和开放的设计原则。
最后,对课题设计作出客观评价和总结,并对系统的不足之处提出其改进方案和新的构想方案。在论文末,将列出有关的参考文献。
关键词:高校;教务;排课;排课系统;专家排课
Abstract
" means revolution of information " is turned to " the content revolution of the information ", has caused the global digital campus to build tides . During this information times, combining computers with enterprise usual events management has become an emergent task that every enterprise must accomplish as soon as possible.With the popularization and use of the computer, present management has been promoted much, more and more jobs have been done by computer.Course arranging Problem is an NP-Complete Problem, there is no a good solution for this matter of the college. However, it is also a necessary administration task for every school in every semester. This essay, with the correlative theory’s guidance, on the basis of analyzing some courses-arraying software, proposes a design method of commonly used courses arraying information system in college, and solves some of the certain problems.This article introduces the detailed process of exploring a management information system under the environment of Vb, utilizing “Top-Bottom” overall plan and a strategy according to “Bottom-Top” application and exploitation. Then makes a concise description of programmable environment and database technique of VB6.0. Based on feasibility analyzing and system demand analyzing, emphatically expounds design-project、 functional model、interface designing database system designing、 security design in this paper.
The MIS of school’s magnetic card strictly follows the design principle of security, economy, efficiency reliability, and easy operating, maintaining and expanding.
Finally, the author makes a subjective estimate of his design, and puts forward improving methods and new plans to overcome the shortcomings of the existing system.At the end of this article, references are listed.
Key Words: college; teaching affairs; courses arranging; courses arrangement management system; expert courses-arraying
2.2.1 Visual Basic6.0基本概述和特点... 21
第1章 绪 论
1.1背景分析
随着信息技术的飞速发展,各个行业的信息化正势在必行。科技的进步大大地提高了生产率。作为高校,如何才能提高办学效率,更好地完成教学任务,跟上社会发展步伐,这是一个摆在教学工作者面前的一个迫切的问题。应用信息化来改造传统的教学管理模式是一个重要途径。
近几年来,随着各高校办公自动化工作的推进,教务管理自动化也被摆上了日程。在教务工作中占有很大比重的一项就是每学期的课程表排定工作。由于教工、教室和设备的相对紧张,如何进行合理地安排和分配,从而充分利用教学资源是我们不得不面对的问题。而人工进行排课不仅任务重,效率低,而且易出错,难于维护,想要排出一张各方面都满意的课表非常困难。并且随着高校规模的扩大手工排课的难度和工作量呈几何级数增长。
高校通用排课系统正是为了减轻教务人员工作量,实现教务工作自动化,解决排课这一老大难问题的教务办公软件。
1.2意义
该系统是一个管理项目,旨在更好地管理高校的教学与资源整合,推动科技成果的推广转化,推进高校改革,提高高校的办学效率。在现有人力管理基础上,结合日渐成熟的当代计算机技术和各种辅助软件,对人力管理模式进行信息化改造,形成高效、便捷的计算机管理模式,是信息化改造传统产业的一个应用。
1.3 需求分析
1.3.1 需求
排课管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以排课管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件排课,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对排课信息进行管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高排课管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。因此,开发这样一套管理软件成为很有必要的事情,在下面的各章中我们将以开发一套排课管理系统为例,谈谈其开发过程和所涉及到的问题及解决方法
计算机已经成为我们学习和工作的得力助手:今天,计算机的价格已经十分低廉,性能却有了长足的进步。它已经被应用于许多领域,计算机之所以如此流行的原因主要有以下几个方面:首先,计算机可以代替人工进行许多繁杂的劳动;其次,计算机可以节省许多资源;第三,计算机可以大大的提高人们的工作效率;第四,计算机可以使敏感文档更加安全,等等。 在中小学中用计算机管理排课的意义现在我国的中小学校中排课的管理水平还停留在纸介质的基础上,这样的机制已经不能适应时代的发展,因为它浪费了许多人力和物力,在信息时代这种传统的管理方法必然被计算机为基础的信息管理所取代。我作为一个计算机应用的大专生,希望可以在这方面有所贡献。改革的总设计师邓小平同志说过"科学技术是第一生产力",我希望能用我四年的所学编制出一个实用的程序来帮助中小学进行更有效的课程管理。
归纳起来,好处大约有以下几点:
1. 可以存储历届的排课,安全、高效;
2. 只需一到二名排课录入员即可操作系统,节省大量人力;
3. 可以按照录入人员的输入来自动生成课程表,并尽量减少冲突等情况发生。 排课的设计分析根据实际情况,我们使用原型法(Rapid Prototyping)即以少量代价快速地构造一个可执行的软件系统模型。使用户和开发人员可以较快地确定需求,然后采用循环进化的开发方式,对系统模型作连续的精化,将系统需具备的性质逐渐增加上去,直到所有的性质全部满足。此时模块也发展成为最终产品了。
1.3.2 分析
编程环境的选择微软公司的Visual Basic 6.0是Windows应用程序开发工具,使目前最为广泛的、易学易用的面向对象的开发工具。Visual Basic提供了大量的控件,这些控件可用于设计界面和实现各种功能,减少了编程人员的工作量,也简化了界面设计过程,从而有效的提高了应用程序的运行效率和可靠性。故而,实现本系统VB是一个相对较好的选择。 关系型数据库的实现Access2000 就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。Access 的优点在于它能使用数据表示图或自定义窗体收集信息。数据表示图提供了一种类似于 Excel 的电子表格,可以使数据库一目了然。另外,Access 允许创建自定义报表用于打印或输出数据库中的信息。Access也提供了数据存储库,可以使用桌面数据库文件把数据库文件置于网络文件服务器,与其他网络用户共享数据库。Access 是一种关系数据库工具,关系数据库是已开发的最通用的数据库之一。如上所述,Access 作为关系数据库开发具备了许多优点,可以在一个数据包中同时拥有桌面数据库的便利和关系数据库的强大功能。
二者的结合(DBA)微软的JET数据库引擎提供了与数据库打交道的途
径,我们是通过它以及Visual Basic 来访问数据库并对其进行各种操作。Visual Basic、Access以及其他微软的软件产品都是通过共用JET数据库引擎,从而给用户提供了丰富的数据类型。当今的微软对数据库中的ADO比较注视,并在.net上使用了ADO.net技术,鉴于ADO在很多程序里的广泛应用,使用ADO来连接数据库将是最为适用的,并且在定义了ADO的连接模块后,对于将来的升级也会很方便,只要修改一下连接源,就可以轻松的更换后台。
1.4功能
(1) 初始设置模块包括四个子模块,即:备份以前数据、载入以前数据、清除以前数据和清除排课数据;
备份以前数据包括:对原有排课数据的备份和对原有课程申请数据的备份;
载入以前数据包括:对原有排课数据的载入和对原有课程申请数据的载入;
清除以前数据包括:对原有排课数据的清楚和对原有课程申请数据的清楚;
清除排课数据:是对已有排课数据进行清楚以用于新的排课数据的建立。
(2) 辅助功能子系统功能;
课程类型信息,年级专业信息,日程安排信息,班级信息,教室信息,教师信息和课程信息的添加、删除和修改。
(3) 用户管理子系统功能;
用户的添加和删除,用户密码的设置和修改,用户权限的设置,用户重新登陆。
(4) 课表管理子系统功能;
包括班级课表、教师课表、教室课表、日期课表的查询功能实现的操作。
(5) 课表管理子系统功能;
包括班级课表、教师课表、教室课表、日期课表的查询功能实现的操作。
(6)系统管理子系统功能;
包括用户管理、日志查看、用户密码的修改和退出系统的功能实现的操作。
(7) 排课管理子系统功能;
包括课程申请管理,手动排课和自动排课三个子模块;其中最重要的模块就是课程申请管理子模块,它是进行自动排课的依据。
1.5结构
本系统主要由两个模块组成。分别是前端的用户管理模块和后端的数据库管理模块。
本论文共分为摘要、正文和结尾三大部分。其中正文分为六章。第一章为绪论,第二章为系统需求分析,第三章为系统总体设计,第四章为系统详细设计,第五章为应用程序的测试,第六章为结论。摘要部分简明的概括了系统的内容和功能。最后为参考文献。
1.6 算法分析
课程表问题又称时间表问题,是一个多因素的整体优化问题。1975年,S.Even等人论证了课表问题是NP完全类问题。由于课程表问题所涉及的信息较多,并且求解课程表问题最优解的时间复杂性是课程表规模的指数级,所以一般采用求近似最优解的算法。在现实生活中,人们一般也只是要一个满足各种条件的近似最优解,或者说 “满意解”,而不一定非要最优解不可。因此,对于课程表问题,关键不是如何找到最优解,而是如何提高解的满意度。
遗传算法是John.H.Holland根据生物进化的模型提出的一种优化算法,它是基于进化过程中的信息遗传机制和优胜劣汰的自然选择原则和搜索算法。它从一个种群开始,利用选择、交叉、变异等遗传算子对种群进行不断进化,最后得到全局最优解或近似最优解。根据其算法特点,遗传算法非常适合于排课表问题。
一、问题描述
考查课表的约束条件,最基本的要求无外乎这样几个:
(一)每个班级在同一时间只能上一门课;
(二)每个普通教室和实验室在同一时间只能容纳一个班上课,大教室和操场可以容纳其容量允许的班级数上课;
(三)每个教师在同一时间只能在一个地点上课。
以上约束,称为硬约束,因为不如此,课表是不可行的。还有一些约束如:某个教师希望或不希望在某个时段上课;自习课和体育课最好不排每天的一二节课;同一门课在一周内的分布尽可能均匀等,这些要求称为软约束,因为它们或者可以通过排课以外的方法,如变更其他事务的日程安排等加以解决;或者只能尽可能满足,而不可能全部满足。
满足硬约束的课表是合法的,但却不一定是令人满意的。那么如何提高一个课表的满意度呢?可以请各个教师填一张“时段偏好”表,在每个上课时段上标上相应的数值,以确定他希望或不希望在某个时段上课――0表示不希望,1表示无所谓,2表示希望,3表示强烈希望。并且每个教师根据职称,或职务,或所上课程重要性的不同确定优先级:1,2,3级逐级递增,这样一张课表的满意度就很好计算了:每个上课时段所对应的上课老师的“时段偏好”值乘以这个老师的优先级的积的总和。
另一个决定课表好坏的度量就是同一门课在一周内的分布尽可能均匀,即课程的分散度。如果该课程一周只上一次,分散度设为1,如果一次以上,则可以将每次间隔的时段数相乘,因为分布越平均,其乘积就越大。将所有课程的分散度相加即总的课表的分散度。
定义适应度函数:适应度=满意度+分散度。
二、遗传算法
(一)初始化
根据班级信息表以及它与本学期课程信息表的关系,找到每个班的所有课元,再根据这些课元,以及本学期课程表和排课表之间的关系,找到这个班的所有排课元。假设每星期上5天课,每天2节连上,有3个时间段,则每星期有15个上课时间段。那么将这15个时间段随机地分配给上述某个班的所有排课元,也就是排好了一个班的课表。一个班的“排课元”的数目一定是小于或等于15的。如果小于则有时段未排到,即是自习时间。可在“班级信息表”新建一个临时字段“自习”,记录这些自习时间。
再来排教室。给每个班安排一个满足人数要求的教室作为固定教室。一般的课程就在固定教室上,如果是语音课则排语音室,如果是体育课则安排操场,如果是实验课则排实验室。排的时候注意比较该教室的“已排”字段,如与已排时段有冲突,则更换时段。
对每个班做上述工作,则排好了一张初始课表。这张初始课表肯定有很多 “硬冲突”,必须消除。由于排课时已经注意了教室的时段不能冲突,所以只要查看教师的时间有无冲突即可。根据教师信息表与本学期课程信息表的关系,得到每个教师的课元,再根据这些课元,以及本学期课程信息表与排课表的关系得到该教师的所有排课元。检查这些排课元的时段,如有重复,则须调课:首先考虑与自习课调,班级信息表的“自习”字段记录了该班的自习时段。如果这些自习时段都与该老师的上课时间有冲突,则考虑能否用大教室,查看该老师在该时段所上课程的教室要求能否用大教室,如能,统计该老师在该时段的上课班级的总人数,安排一个能容纳这么多学生的大教室。如果大教室方案不能解决问题,则只能和同班的其他老师调换,但注意只能和未检查过冲突的老师换,以免循环调换。
(二)建立初始种群
计算消除了硬冲突的课表的适应度函数,记录在数组中。将该排课表考贝到新数据集ds2。拷贝过来的这个排课表即一个“染色体”。重复上述过程,直至染色体数目达到种群规模。
(三)遗传操作
对ds2 中的每张表做如下操作:
1.选择。采用“随机竞争法”。随机选取两张表,比较它们的适应度,删除适应度小的表,复制适应度大的表替换它。
2.变异。设变异概率为Pm,随机产生一个(0,1)范围内的数,如果小于Pm,才进行变异操作。随机选取两天,让这两天的时段互换。这样做的好处是不用纠错。
3.交叉。类似地,设交叉概率为Pc,随机产生一个(0,1)范围内的数,如果小于Pc,才进行交叉操作。这里采用“单点交叉”。随机选两张表,再随机选取一个序号,让这两张表中这个序号的记录的“上课时段”值互换。互换后这两张表都要纠错,消除硬冲突。过程仿初始化时的消除冲突过程。只是要注意,如果调换的排课元涉及到大教室,须换回所在班的固定教室。重复该过程,注意每一步操作后都要更新适应度数组,使数组值与表一致。迭代500代后,选取最大适应度的表传回ds1排课表。
1.6.1遗传算法的基本思想
遗传算法的基本思想正是基于模仿生物界的遗传过程。它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里为字符串),从而得到一个由具有不同染色体的个体组成的群体。这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代。后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程。群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解。值得注意的一点是,现在的遗传算法是受生物进化论学说的启发提出的,这种学说对我们用计算机解决复杂问题很有用,而它本身是否完全正确并不重要(目前生物界对此学说尚有争议)。
遗传算法的基础思想是在本世纪50年代初,由于一些生物学家尝试用计算机模拟生物系统演化时而提出的。
遗传算法是模拟生物通过基因的遗传和变异,有效地达到一种稳定的优化状态的繁殖和选择的过程,从而建立的一种简单而又有效的搜索方法。它运用随机而非确定性的规则对一族而非一个点进行全局而非局部地搜索,它仅利用目标函数而不要求其导数或其它附加限制,它虽然在特定问题上效率也许不是最高,但效率远高于传统随机算法,是一种普遍适用于各种问题的有效方法。遗传算法的主要思路有:
1、繁殖(reproduction):繁殖是根据现有各个体的目标函数值,确定其生存概率,模拟生物界的自然选择,劣者淘汰,适者生存。在遗传算法中,我们人为地保持种群包含的个体总数不变。比较优秀的个体(模型)有较大的生存概率,并可能繁衍,比较差的个体(模型)可能会淘汰。这样产生的下一代的个体,一般都具有较大目标函数值,因而有较大的生存概率。
2、交配(crossover):从种群中随机地选择两两一组的双亲,分别随机地交换部分染色体,各自产生两个新染色体。
3、变异(mutation):染色体按一定概率(一般很小)可随机地产生变异。
遗传算法能够解决的问题不仅限于最优化问题,但无论哪种问题,都要解决两个关键问题:(1)必须能将问题的解答用一组二进制数码表示,即建立解答与二进制数码间的映射(mapping)关系。(2)定义一种对最佳解的定量量度,即适度函数。
1.6.2遗传算法的结构
霍兰德的遗传算法通常被称为“简单遗传算法”(SGA)。现以此作为讨论对象,分析遗传算法的结构和机理。
结合如下的货郎担问题(简记TSP)分析:
设有n个城市,城市i和城市j之间的距离为d(i,j), i,j=1,...,n.TSP问题是要找遍访每个域市恰好一次的一条回路,且其路径总长度为最短。
一、编码与译码
许多应用问题结构很复杂,但可以化为简单的位串形式编码表示。
将问题结构变换为位串形式表示的过程叫编码;而相反将位串形式编码表示变换为原问题结构的过程叫译码。
我们把位串形式编码表示叫染色体,有时也叫个体。
对TSP可以按一条回路城市的次序进行编码,比如码串134567829表示从城市1 开始,依次是城市3,4,5,6,7,8,2,9,最后回到城市1。
一般情况是从城市w1开始,依次经过城市w2,……,wn,最后回到城市w1,我们就有如下编码表示:
w1 w2 …… wn
由于是回路,记wn+1= w1。它其实是1,……,n的一个循环排列。要注意w1,w2 ,……,wn是互不相同的。
二、适应度函数
为了体现染色体的适应能力,引入了对问题中的每一个染色体都能进行度量的函数,叫适应度函数。
通过适应度函数来决定染色体的优、劣程度,体现了自然进化中的优利劣汰原则。对于优化问题,适应度函数就是目标函数。
目标函数是指,优化目标与设计变量之间的函数关系式,是所关心的目标(某一变量)与相关的因素(某些变量)的函数关系。
目标函数是把优化问题转化成为数学问题,经过分析、研究,抓住主要因素,建立合适的数学模型。
例:为了实现增产、增收、提高土地利用率的目的,利用农作物生长的季节差、时间差,把相同或不同类的农作物套种在一起。
目标函数是增产增收和提高土地利用率与土地的单位面积农作物收益的总和之间的关系。
Smax=f(x1,x2,x3,…)
TSP的目标是路径总长度为最短,路径总长度的倒数就可以为TSP的适应度函数:
请注意其中wn+1= w1。
适应度函数要有效反映每一个染色体与问题的最优解染色体之间的差距,一个染色体与问题的最优解染色体之间的差距小,则对应的适应度函数值之差就小,否则就大。
三、遗传操作
简单遗传算法的遗传操作主要有三种:选择、交叉、变异。
选择操作也叫复制操作,根据个体的适应度函数值所度量的优、劣程度决定它在下一代是被淘汰还是被遗传。
一般地说,选择将使适应度较大(优良)个体有较大的存在机会,而适应度较小(低劣)的个体继续存在的机会较小。
简单遗传算法采用赌轮选择机制,令Σfi表示群体的适应度值之总和,fi表示种群中第i个染色体的适应度值,它产生后代的能力正好为其适应度值所占份额fi/Σfi。
交叉操作的简单方式是将被选择出的两个个体P1和P2作为父母个体,将两者的部分码值进行交换。假设有如下八位长的二个体:
产生一个在1到7之间的随机数c,假如现在产生的是3,将P1和P2的低三位交换:P1的高五位与P2的低三位组成数串10001001,这就是P1和P2的一个后代Q1个体;P2的高五位与P1的低三位组成数串11011110,这就是P1和P2的一个后代Q2个体。
其交换过程如下所示:
变异操作的简单方式是改变数码串的某个位置上的数码。我们先以最简单的二进制编码表示方式来说明,二进制编码表示的每一个位置的数码只有0与1这两个可能,比如有如下二进制编码表示:
其码长为8,随机产生一个1至8之间的数k,假如现在k=5,对从右往左的第5位进行变异操作,将原来的0变为1,得到如下数码串(红色的数字1是被变异操作后的):
二进制编码表示时的简单变异操作是将0与1互换:0变异为1,1变异为0。
现对TSP的变异操作作简单介绍,随机产生一个1至n之间的数k,决定对回路中的第k个城市的代码wk作变异操作,又产生一个1至n之间的数w,替代wk,并将wk加到尾部,得到: w1 w2 …… wk-1 w wk+1 …… wn wk
你发现这个串有n+1个数码,注意数w其实在此串中出现重复了,必须删除与数w相重复的,得到合法的染色体。
四、控制参数
并不是所有被选择了的染色体都要进行交叉操作和变异操作,而是以一定的概率进行,一般在程序设计中交叉发生的概率要比变异发生的概率选取得大若干个数量级,交叉概率取0.6至0.95之间的值;变异概率取0.001至0.01之间的值。
种群的染色体总数叫种群规模,它对算法的效率有明显的影响,规模太小不得于进化,而规模太大将导致程序运行时间长。对不同的问题可能有各自适合的种群规模,通常种群规模为30至100。
1.6.3遗传算法的基本原理
遗传算法类似于自然进化,通过作用于染色体上的基因寻找好的染色体来求解问题。
与自然界相似,遗传算法对求解问题的本身一无所知,它所需要的仅是对算法所产生的每个染色体进行评价,并基于适应值来选择染色体,使适应性好的染色体有更多的繁殖机会。
在遗传算法中,通过随机方式产生若干个所求解问题的数字编码,即染色体,形成初始群体;
通过适应度函数给每个个体一个数值评价,淘汰低适应度的个体,选择高适应度的个体参加遗传操作,经过遗传操作后的个体集合形成下一代新的种群。对这个新种群进行下一轮进化。
这就是遗传算法的基本原理。
遗传算法思想:
(1) 初始化群体;
(2) 计算群体上每个个体的适应度值;
(3) 按由个体适应度值所决定的某个规则选择将进入下一代的个体;
(4) 按概率Pc进行交叉操作;
(5) 按概率Pc进行突变操作;
(6) 没有满足某种停止条件,则转第(2)步,否则进入(7);
(7) 输出种群中适应度值最优的染色体作为问题的满意解或最优解。
程序的停止条件最简单的有如下2种:
一是完成了预先给定的进化代数则停止;
二是种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。
根据遗传算法思想可以画出简单遗传算法框图
1.6.4遗传算法的收敛性
一些研究人员对进化算法的运行机理进行过研究,证明了一般的遗传算法不一定收敛,只有每代保存了最优个体时才收敛。在实际应用中,使用了上述结论来保证收敛性。
优秀个体保护法就是将每代中的最优个体,直接进入子代,相应淘汰其子代中适应度最差的个体,使种群规模不变。
对保存最优个体时遗传算法是收敛的结论的证明是通过对遗传算法构造马尔柯夫(markov)链,因为遗传算法的进行过程是一个马尔柯夫过程。
当遗传算法收敛时,求到的解通常只是所要解决问题的最优解的一个近似解,或者叫满意解。
从数学分析的角度看,收敛过程是一个无限逼近过程,而计算过程是一个有限自动机,因此通过遗传算法程序求得的解总是一个近似解。
1.6.5遗传算法的性能(在排课中的应用)
上面指出遗传算法程序求得的解是一个满意解,哪些因素会影响到解的质量?这正是遗传算法的性能问题。
首先要注意的是种群的规模要适当,种群规模太小,种群中就没有充分的多样性,不利于适应度值高的染色体的进化,致使算法得不到满意的解。可以认为种群规模大有利于种群的进化,种群健壮发展,但染色体多,每进行一轮进化花费的机器时间就多,致使算法的效率低。
适应度函数的构造对遗传算法的性能影响较大,由于适应度是衡量染色体优劣的准则,有时优劣染色体的适应度值没有拉开距离,必要提升优良染色体的适应度值,降低劣弱染色体的适应度值,给优良染色体很多的生存机会,达到提高进化速度的目标。可以结合所求解问题的实际情况对适应度函数作适当的变换,提高选择过程的效率。
如下有一个线性变换:
式中fi为个体的适应度,fyi为变换后的适应度值,c1、c2为常数。
C1和C2的选取主要依具体问题的情况而定,并应满足一定的约束条件(例如变换后的适应度值不能是负值等)。
适应度函数直接作用到了选择操作,也就是说选择操作的性能主要是由适应度函数来决定,但是怎样运用适应度函数是需要研究的。
对遗传算法的性能影响最大的也许是交叉和变异操作。
首先是交叉和变异操作并不是都要进行,对某些问题遗传算法求解时其性能主要由交叉操作决定,甚至没有变异操作时,算法的性能更好;而对另外的某些问题遗传算法求解时其性能主要由变异操作决定,甚至不要交叉操作更合适。
交叉和变异操作的更重要的是不同的问题要构造一些性能更优的交叉和变异操作,才能保证算法的高效率,构造时往往需要对所要求解的问题进行分析和运用一些经验。
例如,TSP求解时,前面使用的交叉操作使回路中的左边部分的城市改变较大,但对TSP来说,对回路中的各个位置应有同等的进行机会,于是有如下改进的交叉操作,将两个被选出的染色体,都随机地分成三段(两个染色体的分法相同),再从三段中随机地选取一段在两染色体之间进行交换,形成新染色体。
求解TSP的变异操作有如下更有效的方式:
随机产生1和n之间的两相异整数k和m,若k<m,则将
(w1,w2,…,wk, wk+1,…,wm,…,wn)
变为:
(w1,w2,…,wm, wm-1 ,…,wk+1, wk,…,wn).
如果是k>m,则将
(w1,w2,…,wk, wk+1,…,wm,…,wn)
变为:
(wm,wm-1,…,w1,wm+1,…,wk-1,wn,wn-1,…,wk).
上述变换方法可简单说成是“逆转中间或者逆转两端”。
这个变异操作针对TSP非常适用,仅使用这一个变异操作,不使用其他的变异操作和任何交叉操作,构造了改进的遗传算法,发现其性能相当不错,在解的质量相当的情况下,花费的总机时少。
交叉概率和变异概率选取也是遗传算法的性能影响最大的因素之一,直接影响着收敛速度。我们着重讨论变异概率,变异概率大会扩大搜索范围,使搜索过程不陷入局部极小。
但也可能使正朝着最优解缓慢前进的个体改变方向,破坏好个体;变异概率大则对染色体的破坏大,因此常设定一大一小两个变异概率,当整个种群平均适应度增长较快时,使用小变异概率;反之使用较大变异概率。对整个种群使用相同的变异概率,并不利于优良个体的成长和劣个体的改良。
回顾遗传算法常使用的收敛准则是每代保留最优个体,这个要求其实也在降低算法的效率,因为将导致一些个体早熟和降低种群的多样性。
讨论一个新问题:
交叉或变异产生的新个体能否与父个体进行竞争。按简单遗传算法,交叉或变异产生的新个体不论优劣都取代父个体,并不科学。对新个体要有与父个体进行竞争的机会,当父个体比新个体优时,按一定的概率保留父个体而舍去新个体。
停止的条件,与解的质量有关系,由于所要解决的问题的最优解预先不知道,就连一个供参考的近似解也不可能有,停止条件就成了一个值得研究的方面。如果按预设的进化代数作停止条件,由于不同的问题的复杂度不同,而且对同一问题构造的遗传操作不同其算法性能不同,因此很难合理地预设一个进化停止代数。
另一个常用的停止条件是种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时,这是一个比较合理的方式,但可能由于构造的算法在进化机制上存在不合理因素,出现进化进程缓慢,或者个别个体早熟,导致过早结束运行,得到一个质量很差的解。
例:遗传算法在试题组卷中的应用
自动组卷如何保证生成的试卷能最大程度的满足用户的不同需要,并具有随机性、科学性、合理性,这是实现中的一个难点。尤其在交互式环境下用户对于组卷速度要求较高,而一个理论上较完美的算法可能会以牺牲时间作为代价,往往不能达到预期的效果。
一般来说,用户在自动组卷时会对试卷的质量提出多方面的要求,如总题量、平均难度、题型比例、章节比例、重点章节比例、知识点的交叉与综合等,自动组卷就应最大程度的满足用户的要求。因此,在组卷之前,我们首先为自动组卷过程建立控制指标相应状态空间D。
D的每一行由某一试题的控制指标组成,如题号、题型、章节、难度等,并且这些属性指标都进行编码表示成二进制形式,而每一列是题库中的某一指标的全部取值。在具体出题时,考方可能不会用到所有的指标,所以D包含的个体d_target可以表示为d_request和d_void,d_request表示考方要求的控制指标,d_void表示考方不要求的控制指标。
考试自动出题的遗传算法如下:
(1) 根据考方的出题要求,规划状态空间库D中的数据,保留d_request部分,而不要d_void部分,对其剩余部分进行编码D [1],D[2],……D[i]。
(2) 初始化试题库[STK]。随机从题库中抽出一组试题,并进行编号STK[1],STK[2]……STK[j],确定合适的交换概率Pc和变异概率Pm;并定义其适应值flexibility[k](k=1,2……j)
(3) 从试题库[STK]中取出STK[m](0≤m≤j)与状态空间库[D]中的指标D[n] (0≤n≤i)进行匹配。如果STK[m]与D[n]完全匹配,则
flexibility[k]<-flexibility[k]+1
如果不匹配,则有
flexibility[k]<-flexibility[k]+0
(4) 进行淘汰选择,保留具有高适应度的试题。即把flexibility[k]为0的STK[m]去掉,这样就生成了一个新的试题模型STK[h]。
(5) 重复过程2生成新的试题模型STK[p]。按一定的交换概率Pc从[STK]中随机选取模型STK[h]和STK[p],交换彼此位串中对应的值,产生新的试题模型STK[h]、STK[p]。
(6) 按一定的变异概率从题库[STK]中随机选出一试题模型STK[h]进行基因突变,产生一个新的试题模型。
(7) 在完成以上选择、交叉、变异步骤后,产生一个考试试题模型,按照事先确定的误差精度对其进行收敛性的判别,当其适应度高时,试题组卷成功,转向步骤8,如果其适应度低,则转向步骤3继续执行。
(8) 输出相应的考试试题,组卷结束。
以上用遗传算法抽题时,交换概率Pc和变异概率Pm的确定很重要。
太小使选题工作进展缓慢,太大则会破坏适应值高的试题模型。通常规定其为0.4。同样,Pm太小就不能产生新的试题模型,太大又会产生过多的试题模型。它宜规定为0.1。
自动选题时,选题的方式可采用父辈挑选和生存选择两种。父辈挑选就是采用不返回随机抽样,它使每个题目都有被选中的可能;生存选择采用允许父辈和子代进行竞争,并让其中的优良者进入下一轮竞争环境的二分之一择优选择。
两种选择方式共同作用于选题保证了选题的顺利完成。在选题的过程中,哪一道题目被选中是一个非均匀随机事件,其概率依赖于上一次选题的过程。
第2章 开发语言的介绍
2.1系统开发环境介绍
硬件环境: AMD 2200+,1GB内存,20G硬盘,64mb显卡
系统软件: Windows 2000 Advanced Server
DBMS: SQL SEVER 2000
开发语言: Microsoft Visual Basic 6.0
2.2开发语言简介
2.2.1 Visual Basic6.0基本概述和特点
Visual Basic是Microsoft公司推出的程序设计语言,具有简单易学、功能强大、软件费用支出低、见效快等特点。它提供了开发Windows应用程序最迅速、最简捷的方法。它不但是专业人员得心应手的工具,而且易于被非专业人员掌握使用,全世界数以百万计的程序设计人员正在使用Visual Basic开发各种类型的软件。从1.0到4.0版本,Visual Basic只有英文版,5.0版以后的Visual Basic在推出英文版的同时,又推出了中文版,这大大方便了中国的用户。Visual Basic6.0是在Visual Basic5.0的基础上推出的,在某些方面较5.0版有重要的改进,它所提供的开发环境与Windows 9x或Windows NT具有完全一致的界面,使用更方便,其代码效率已达到Visual C++的水平。在面向对象程序设计方面,6.0版的Visual Basic全面支持面向对象的程序设计,包括数据抽象、封装、对象与属性、类与成员、继承和多态等。和Visual Basic5.0一样,Visual Basic6.0也包括三种版本,即学习版、专业版和企业版,这些版本是在相同的基础上建立起来的,因此大多数程序可以在三种版本中通用。
Visual Basic(以下简称VB)可以说是可视化语言的先驱了,而且它也是可视化程度最高的一个,从几年前VB诞生之日起到现在,它已经经历了六个版本,这么高的更新率,不外乎说明两个问题:用户对VB的热衷,微软对VB的重视。不可否认微软对市场的预测能力是极为高明的,而它强大的技术、财力支持也使它在许多以前未进入的领域,在不长的时间内有成为最有力的竞争对手。
VB的出现可以说是Microsoft Windows的日渐成熟的必然产物。Microsoft Windows为程序员和最终用户提供了一个共同的人机界面。对用户,Windows提供了一个图形鼠标的操作环境,该环境对所有的应用程序都一样;对于程序员,Windows提供了一组预定义工具――称之为Microsoft Windows 的软件开发工具箱(SDK),该工具能使程序员建立一个与Windows界面相同的应用程序,而且,程序员不必关心最终用户的硬件配置情况。在这一开发环境中,程序员唯一困难的是Microsoft SDK提供了六百多个函数和与其一致的事件驱动(event-driven)编程技术。两种新方法的交叉使众多的程序员重新陷入困境,程序员不仅要掌握程序驱动编程技术和六百多个函数的功能,而且还得用C语言描述这些问题。因此一般情况下,程序员首先要掌握C程序设计技术,而后再开始学习SDK。这样的条件下就要求在Microsoft多任务环境下出现一种操作方便,使用简单的新工具--Visual Basic由此诞生。
英文Visual的意思是“视觉的”,“可视的Basic”这个名字可能抽象了点,但实际上它却是最直观的编程方法,之所以叫做“可视”,你只要看到VB的界面就会明白,实际上你无需编程,就可以完成许多步骤。在VB中引入了控件的概念,在Windows中控件的身影无处不在,各种各样的按钮、文本框、无线钮,都是控件的种类,VB把这些控件模式化,并且每个控件都有若干属性用来控制控件的外观,工作方法。这样你就可以象在画板上一样,随意点几下鼠标,一个按钮就完成了,这些在以前的编程语言下是要经过相当复杂的工作的。
Visual basic 6.0具有的特点:
(1) 统一的数据访问,集成了ADO/OLE支持。
(2) 将可视化的数据库工具集成到了Visual Basic环境中。
(3) 新的Oracle模式和存储过程设计能力。
(4) 数据环境设计器(Data Environment Designer)工具可实现基于ADO的数据访问组件。
(5) 新的集成化的报表书写器(Report Writer)工具。
(6) 分层的FlexGrid(Hierarchical FlexGrid)控件可用于显示分级数据。
(7) 具有创建数据源的功能。
(8) 可创建OLE DB 提供者(OLE DB Provider)。
(9) 可方便地进行机器间和层次间的远程数据访问。
(10)高级数据绑定。
2.2 ACCESS简介
2.2.1 ACCESS概述
Access是Office系列软件中用来专门管理数据库的应用软件。所谓数据库是指经过组织的、关于特定主题或对象的信息集合。数据库管理系统分为两类:文件管理系统和关系型管理系统。Access应用程序就是一种功能强大且使用方便的关系型数据库管理系统,一般也称关系型数据库管理软件。它可运行于各种Microsoft Windows系统环境中,由于它继承了Windows的特性,不仅易于使用,而且界面友好,如今在世界各地广泛流行。它并不需要数据库管理者具有专业的程序设计水平,任何非专业的用户都可以用它来创建功能强大的数据库管理系统。本章将专门介绍Access 2002(下面简称为Access)的基本功能及其常用的操作,主要内容包括创建和使用数据表,建立和使用查询、窗体,以及数据表与其他数据文件之间的转换等。
数据库技术是计算机软件的一个重要分支,它产生于20世纪60年代,最早是由IBM公司推出的IMS数据库系统。数据库技术从开始到现在大致经历了三个阶段,分别是:人工管理阶段、文件管理阶段和数据库管理阶段。
Access使用标准的SQL(Structured Query Language,结构化查询语言)作为它的数据库语言,从而提供了强大的数据处理能力和通用性,使其成为一个功能强大而且易于使用的桌面关系型数据库管理系统和应用程序生成器。
一个Access数据库中可以包含表、查询、窗体、报表、宏、模块以及数据访问页。不同于传统的桌面数据库(dbase、 FoxPro、Paradox), Access数据库使用单一的*.mdb文件管理所有的信息,这种针对数据库集成的最优化文件结构不仅包括数据本身,也包括了它的支持对象。
此外,Access 2002还利用Office套件共享的编程语言VBA(Visual Basic for Application)进行高级操作控制和复杂的数据操作。
2.2.2 Access的启动和退出
应用Access的第一步就是启动Access,常用的启动方式有下面几种:
l 从开始菜单启动Access。单击【开始】→【程序】→【Microsoft Access】,启动后的画面如图9-1所示。
l 用“运行”命令启动Access。单击【开始】→【运行】,在“运行”对话框中输入命令:msaccess,按【确定】按钮即可。
l 通过打开已有的数据库来启动Access。在Windows资源管理器中,双击一个Access数据库,即可启动Access,并打开该数据库(见图9-2)。
要退出Access,可选择菜单【文件】→【退出】,或通过单击Access主窗口的关闭按钮。
直接启动Access时的窗口
通过打开已有的数据库来启动Access
Access默认的窗口由标题栏、菜单栏、数据库工具栏、数据库窗口和状态栏组成,象Office的其他应用软件一样,Access 2002也增加了任务窗格,它的使用方法和本书前面章节中介绍的方法一样。工具栏和菜单栏的可用项是与当前数据库窗口的内容密切相关的,也就是说,工具栏和菜单栏会随着数据库窗口显示的内容的不同而变化。
2.2.3新数据库文件的创建
Access中创建和处理的文件是数据库文件,其扩展名为 .mdb。与Microsoft Office中其他的应用程序(Word、Excel等)不同的是,Access启动后,并不自动创建一个空的文件,然后让用户输入数据,再保存。在Access中,需要用户自己来创建一个新的数据库文件。
在图9-1新启动的Access窗口中,单击任务窗格中的“新建空数据库”项,Access会马上弹出一个对话框让用户给出要新建的数据库的文件名。这也是和Office中其他的软件不同的。输入文件名后,Access打开一个新窗口,如下图所示。
在该窗口的标题栏中显示了新建数据库文件的名称,如图中的“Myfirst”,窗口工作区的左窗格中列出了数据库可包含的主要对象类型,右窗格中列出的是创建当前对象的向导和具体的对象名称。
另外,还可以在任务窗格中单击“根据模板新建”,使用数据库向导来创建新的数据库。数据库中具体内容的创建将在后面作介绍。
2.3数据库文件的打开及数据库对象
Access可打开的文件类型包括Excel电子表格、Dbase数据库、文本文件、Paradox数据库、Web页以及Access自己生成的mdb文件。在任务窗格的“打开文件”项下,可以选择曾经使用过的文件直接打开,也可以使用菜单【文件】→【打开】或常用工具栏的打开按钮 ,在“打开对话框”中选择文件来打开。在一个Accss窗口中,同一时刻只能打开一个Access数据库,当打开或新建一个数据库时,会自动关闭原来打开的数据库。如果需要打开多个数据库,则要启动多个Access窗口。
Access具有全环绕数据库文件结构,可以在一个mdb文件中包含数据对象(表、索引、查询)和应用对象(窗体、报表、宏、VBA代码模块)。在一个打开的Access数据库窗口(图9-2)中,分组显示了数据库包含的对象,其类型包括表、查询、窗体、报表、页、宏、模块等。一个Access数据库可以包含多达32768个对象(表、查询、报表等的组合),下面对这些对象作一简要介绍。
表:存储数据的容器,是关系数据库系统的基础。表以行列格式存储数据项,这一点和电子表格有些类似。表中的单个信息单元(列)称为字段,在表的顶部可以看到这些字段名;表的一行中所有数据字段的集合,称为记录。用户可以从其他的应用系统(如 dBASE、FoxPro、Paradox)、客户/服务器数据库(如 SQL Server)以及电子表格(如Excel工作表和Lotus1-2-3)中导入表。Access可以同时打开1024个表。
查询:显示从多个表(最多为16个)中选取的数据。通过使用查询,用户可以指定如何表示数据,选择构成查询的表,并可以从所选表中提取出最多255个特定的字段。用户可以通过指定要查询数据的条件来决定显示的数据项。
窗体:窗体是数据库和用户的一个联系界面,用于显示包含在表或查询结果中的数据,或操作数据库中的数据。窗体中可以包含图片、图形、声音、视频等多种对象,也可以包含VBA代码来提供事件处理。子窗体是包含于主窗体中的窗体,主要是用来简化用户的操作。
报表:用友好和实用的形式来打印表和查询结果数据。报表中可以加入图形来美化打印效果。Access的报表处理能力比起其他关系数据库管理系统来(包括那些为小型机和大型机设计的应用管理系统在内),其报表的处理能力显得更为灵活方便。报表中同样也可以添加VBA代码来实现一定的功能。
宏:宏主要是用于执行特殊的操作和响应用户激发的事件,如单击命令按钮操作等。现在宏已经过时了,Access 2002之所以支持宏,是为了能够与早期的 Access 版本所创建的数据库应用系统保持兼容。Microsoft建议在Access应用系统中采用VBA代码来进行事件的处理,这一原则在Office系列中均适用。
模块:在模块中使用VBA代码的目的主要有两个:一是创建在窗体、报表和查询中使用的自定义函数;二是提供在所有类模块中都可以使用的公共子过程。通过在数据库中添加VBA代码,用户就可以创建出自定义菜单、工具栏和具有其他功能的数据库应用系统。
第3章 系统分析
3.1可行性研究
正式开发管理信息系统之前进行调研是非常必要的,其必要性主要表现在以下几个方面。
(1)明确用户的要求,以根据调查结果进行可行性分析,确认系统的开发是否可行。
(2)提出新系统的人员并不都是系统研究人员,有些人对于的功能和处理数据的方法没有明确的认识。它们只是根据自己业务工作的需要提出了要求,系统开发人员要对此进行详细的调查和分析,确认用户的要求可以通过现有的计算机技术实现,保证开发的管理信息系统的功能与用户提出的要求相吻合。
(3)企业的现行系统可能是手工系统,也可能是使用和计算机的系统,无论是何种情况,都要详细地调查现行系统中信息处理的具体情况,系统内部功能结构,以便设计出一个合理的、好的新系统逻辑模型,为新系统的设计工作打好基础,保证整个系统开发的质量。
总之,必要对现行系统进行详细的调查,明确用户需求,保证开发的新系统的功能与用户的要求相吻合,避免耗费大量的人力、物力、财力,新系统的开发却失败的悲剧发生。
3.1.1系统可行性分析
可行性分析是在用户的要求和系统调研的基础上进行的,对新系统的开发从社会、技术、经济、管理等方面进行分析,并得出新系统的开发工作可行、不可行、需要修改、追加投资、暂缓开发、分步实施等方案和结论,最后完成可行性分析。
可行性分析一般可定义为:可行性分析是在建设的前期对工程项目的一种考察和鉴定,对拟议中的项目进行全面与综合的技术、经济能力的调查,判断它是否可行。
可行性分析阶段的主要工作包括以下几个方面:
(1)新系统目标可行性分析:
分析新系统的目标是否符合企业的现状和发展的需要。
(2)社会可行性分析:
社会可行性分析主要是指管理信息系统的开发是否符合国家法律、政策,是否能够与社会大系统实现良好的对接。
(3)技术可行性分析:
技术可行性分析是根据新系统的目标来衡量是否具备所需要的技术,包括系统开发人员数量和水平,硬件方面,软件方面及其它应用技术。
(4)经济可行性分析
经济可行性分析主要是对开发新系统所投入的资金与系统投入使用后所带来的经济效益进行比较,确认新系统是否会给企业带来一定的经济效益。
(5)管理可行性分析:
管理可行性分析主要是分析企业现行的管理体制和企业领导是否具有现代化的管理意识和管理水平。
经过与企业领导和相关人员的研究和探讨,基本上保证了本系统的开发工作的顺利进行。
本处重点讨论一下技术可行性分析:
技术可行性分析主要包括四个方面:目前有关的技术能否支持所开发的新系统;新系统开发人员的数量和水平,即人力资源;硬件和软件资源。
技术支持:首先根据新系统的目标,考虑目前有关的技术能否支持所开发的新系统。这里讨论的技术必须是已经普遍使用的,而不是待研究的或正在研究的。
硬件资源:开发管理信息系统所需的硬件资源包含以下两个方面:系统开发人员在管理信息系统的开发过程中所需要的计算机设备及其有关的外部设备;管理信息系统开发成功投入使用后,使用单位所应具备的计算机设备及其有关的外围设备。对硬件资源进行可行性分析时主要考虑计算机的主机内存、类型、功能、联网能力、安全保护措施以及输入/输出设备,外存储器和联网数据通信设备的配置、功能、效率等指标是否符合系统方案设计要求,同时还要考虑计算机的性能/价格比。
3.软件资源
软件资源的可行性分析主要考虑以下几点是否满足用户的要求:
(1)操作系统的选择;
(2)编译系统的选择;
(3)数据库管理系统的选择;
(4)高级编程语言的选择;
(5)汉字处理系统的选择;
(6)应用软件包的选择。
本系统对设计环境要求不高,对软硬件的运行环境需要也不高,因此完全可以在某学校原有的基础上进行使用。
3.2现行设计方法的优缺点
现行的MIS系统系统的开发大都是采用结构化的开发方法,它是在对传统开发方法继承批判的基础上,通过不断探索和努力而形成的一种系统化方法。这种方法的突出优点就是它强调系统开发过程的整体性和全局性,强调在整体优化的前提下考虑具体的分析设计问题,即自顶向下的观点。它强调的另一个观点是严格地区分工作阶段,强调一步一步地、严格地进行系统分析和设计,每步工作都要及时地总结,发现问题及时地反馈和纠正,从而避免开发过程的混乱,它是目前被广泛采用的一种系统开发方法。
随着时间的推移,这种开发方法也逐渐地显露很多不足。最突出的表现是起点太低,所用工具落后、繁琐,致使系统开发周期过长。这种方法要求开发者在调查中就充分地掌握用户需求、管理状况以及预见可能发生的变化,这不大符合人们循序渐进地认识事物的规律性,因此在实际工作中有一定的困难。
3.3系统需求
信息社会的高科技,商品经济化的高效益,使计算机的应用已普及到经济和社会生活的各个领域。计算机虽然与人类的关系愈来愈密切,还有人由于计算机操作不方便继续用手工劳动。为了适应现代社会人们高度强烈的时间观念,学生信息管理系统软件为教学办公室带来了极大的方便。该软件是以汉语编程语言为实现语言,其功能在系统内部有源代码直接完成。通过操作说明,使用者可以了解本软件的基本工作原理。操作人员只需输入一些简单的汉字、数字,即可达到自己的目标。
第4章 系统总体设计
4.1 系统功能模块设计
高校排课管理系统建立以学生为中心的全校集中的排课活动管理,从而规范排课管理业务处理方式,提高处理效率,为教师和学生提供优质服务,为服务创新提供坚实的基础,为管理决策提供全面的支持。通过采用计算机管理,从根本上解决了人力和物力上的耗费问题,最终实现差错率低,容易查询,计算机存储,节省物力资源,减少教务处工作量,提高效率。
经过慎重考虑,并尽量使排课的速度加快,因此对各位教师和各班级都建立一个占用表,首先计算当前要排课程的老师的已排课程占用情况,将其与排课班级的占用表进行对比,获取有用空间,即得到的空间都会适合,这样使用随机推举的方式来自动生成一个新位置,达到排课效果,并且不会造成冲突等情况的发生。
排课作为系统的主要重点,在编写中就要尽量避免各种各样的冲突和错误发生,因此也需要经过投入长时间的测试与使用才能使程序的功能达到最好,速度最快。
在课程表输出方面,将采用目前最常用的报表形式来进行输出,并且同时使用VB中操作EXECL的方法将课程表输出到EXECL自制的课程表模板文件中,并且同时可以实现打印,这样用户如果在认为报表输出的格式并不能让您满意的话,就可以根据自己的需要来修改EXECL的模板,达到课程表的完美输出。
4.2方案论证
4.2.1 实现功能
1.1 掌握学校所有的课程和教师的信息。包括每门课程的时间、班级以及任课老师的姓名等。
1.2 针对不同的人员授予不同的权限。提供灵活的浏览、查询功能。可以查看某个系、某个班级所有课程的信息。
1.3 可以对一个或多个班级进入课程管理与排课表管理,可以不限次的生成该班级课程表。
1.4 可以对课程进行变动管理。既可以手工排课,又可以实现自动排序功能。
1.5 帮助系统维护可以实现:操作日志、重新登录、打印设置(包括统计各种报表及打印等)、退出等操作。
1.6 提供一种或多种课程表输出功能,并使用活动的模板输出功能,输出样式可以由用户自定义。
1.7 实现功能全面化,由于每个学校或班级的每天课程数目或时间都不太一样,实现智能计算总课程数目和管理对应的时间段,并且根据每门课程的独立分布式来进行排列(例如:大学语文自动排列的分布方式可以是周一至周六,那么系统就会自动将其平均分布在周一至周六这些天里)
1.8用户管理:设置两个级别用户:管理员和普通用户,管理员有权限操作系统中的所有数据,普通用户只能以执行查询,输出之类的功能,无法对系统进行实质性的操作,用户使用本系统之前必须先通过身份认证(用户级别、用户名和密码,密码输入有次数限制,连续三次输入错误密码则锁定该用户)
4.2.2功能与模块的设计
本系统采用各班级独立划分管理,所有教师均可为任何班级服务,各班级根据每天课程数目来进行自动排序。
4.3 数据库设计
数据库是以一定的组织方式存储在一起的相关数据的集合,他能以最佳的方式。最少的数据冗余为多种应用服务,程序与数据有教高的独立性。
数据库技术的萌芽可以追溯到20世纪60年代中期,60年代末期到70年代初期数据库技术日益成熟,具有坚实的理论基础。
70年代,数据库技术有了很大发展,出现了很多基于层次或网状模型的商品化数据库系统,并广泛运行在企业管理、交通运输、情报检索、军事指挥、政府管理和辅助决策等各个方面。
20世纪80年代以来,几乎所有新开发的数据库系统都是关系型的。微型机平台的关系数据库管理系统也越来越多,功能越来越强,其应用已经遍及各个领域。
数据库在一个信息管理系统中占有非常重要的地位,数据库结构系统设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。同时,合理的数据库结构也将有利于程序的实现。
设计数据库系统时,应该充分了解用户各个方面的需求,包括现有的以及将来可能增加的需求。
4.3.1 数据库需求分析
用户的需求具体体现在各种信息的提供、保存、更新和查询,这就要求数据库结构能充分满足各种信息的输出和输入。收集基本数据、数据结构以及数据处理的流程,组成一份详尽的数据字典,为以后的具体设计打下基础。
在仔细研究所有排课的可能性问题,如选择排课的班级、授课的教师、上课的教室以及每天的课程安排节数等,将得到一种算法,那就是由用户先输入班级、教师、教室、课程、日程安排等基本信息,然后完整填写课程申请表,当用户点击排课时,系统按照基本信息表中的信息在课程申请表中查找相应信息进行自动排课。系统处理过程的数据流图如图所示:
图4-2 学生管理系统数据流图
4.3.2 数据库逻辑结构设计
1 登陆
字段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
用户名 | 文本 | 50 | 是 | 无 | 否 |
密码 | 文本 | 50 | 否 | 有(无重复) | 否 |
权限 | 文本 | 50 | 是 | 无 | 否 |
2 课程名
字 段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
课程名 | 文本 | 4 | 否 | 有(无重复) | 是 |
教师姓名 | 文本 | 50 | 是 | 无 | 否 |
3 课程信息表
字 段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
课程名 | 文本 | 50 | 否 | 有(无重复) | 否 |
课节数 | 数字 | 长整型 | 是 | 无 | 是 |
每周课数 | 数字 | 长整型 | 是 | 无 | 否 |
需要周数 | 数字 | 长整型 | 是 | 有(有重复) | 否 |
任课老师 | 文本 | 50 | 否 | 无 | 否 |
两节课累排 | 文本 | 50 | 否 | 无 | 否 |
课程分布 | 文本 | 50 | 否 | 无 | 否 |
所属班级 | 文本 | 50 | 否 | 无 | 否 |
4 临时生成表
字段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
时间段 | 文本 | 50 | 是 | 无 | 是 |
星期一 | 文本 | 50 | 否 | 无 | 是 |
星期二 | 文本 | 50 | 否 | 无 | 是 |
星期三 | 文本 | 50 | 否 | 无 | 是 |
星期四 | 文本 | 50 | 否 | 无 | 是 |
星期五 | 文本 | 50 | 否 | 无 | 是 |
星期六 | 文本 | 50 | 否 | 无 | 是 |
星期日 | 文本 | 50 | 否 | 无 | 是 |
所属班级 | 文本 | 50 | 否 | 无 | 是 |
自动编号 | 自动编号 | 是 | 无 | 否 |
5 课程占用表
字段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
班级 | 文本 | 50 | 是 | 无 | 否 |
占用 | 文本 | 50 | 否 | 有(无重复) | 否 |
6 系统日志
字段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
用户名 | 文本 | 50 | 是 | 无 | 否 |
时间 | 文本 | 50 | 否 | 无 | 否 |
操作记录 | 文本 | 255 | 否 | 无 | 否 |
7 系统设定
字段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
每天课数 | 数字 | 长整型 | 是 | 无 | 否 |
8 占用
字段 | 数据类型 | 字段大小 | 必填字段 | 索引 | 允许为空 |
教师姓名 | 文本 | 50 | 是 | 无 | 否 |
占用 | 文本 | 50 | 否 | 无 | 否 |
4.4登陆系统流程图
设计说明:进入主界面后,等待操作用户输入用户名和密码,在输入之后按确定进入,验证用户名和密码,实现流程:
(1) 检测数据库中有无管理员帐号,如果有,则等待用户输入用户名和密码,否则按程序本身自动执行插入命令,新建一个管理员用户,并等待用户输入.
(2) 验证用户名和密码是否正确,错误次数不能超过三次,超过三次则退出系统登陆界面
(3) 当验证通过后,检测该登陆用户的管理权限,并设置变量传值给主窗体.
4.5 主界面中课表生成部分流程图
4.5.1 班级管理流程图
模块设计说明:班级的操作部分是排课程序正常执行的重要部分,班级的添加不允许有同名的班级出现,而修改也不能做到修改班级名,班级名称将作为不可修改的数据部分,而删除部分,在删除之前必须保证该班级的课表是否已经生成,如果是,则需要注销课程表,这样做是让该班级生成的课表占用教师空间的部分全部返回,这样不会使教师的空间被反复占用,而最终导致错误发生。
4.2.2 班级课程处理流程图
模块设计说明:课程数据的添加,修改或删除都会影响到已生成课程表的返回,因为在操作之前必要保证课程表属于未生成状态,如果当前为生成状态,则需要注销课程表,这样才可以继续操作。
注:已生成课程表的返回:由于课程表排列好后,对应的课程后教师的排课占用表都会有标记标明,如果这时修改了某此数据后,这教师的占用表并没有恢复到未生成状态,这样就会导致不可预知的错误发生。
4.5.3 课表生成部分流程图
模块设计说明:此处将执行的数据分成很多小部分来执行,这样做可以在测试中便如发现问题,因为排课系统的要求非常高,所以在程序实现方面是以由简到繁的过程,(1)排课中要求的每周课程数相加不能超出定义的课表范围,否则也将会出现死循环,(2)列出对应课程教师的未被占用的排课列表和班级的课程占用表;(3)穷举法列出以上两者之间的共通点,可用点;(4)最后通过循环随机选择来实现课程的定位与排列;(5)课程定位中不允许每天有相同的课程重复,并按规定来执行按什么样的格式来排列,例如两节连排,也就是说可以把该课程在同一天排在一起,可以实现两节课连上,这是大学课表里最常用的一个功能.
4.5.4 报表输出功能
模块设计说明:此处采用了两种输出方式,第一种是普通的报表方式输出,可以实现一般的打印预览等功能,第二种则是采用模板功能,用户可以自由修改模板,前提是不可以更改数据位,其它的部分无论如何修改都没有关系。
(用户管理模块,时间段模块,课程管理模块)此处几个模块是经过资源优化将其与班级管理整合在一起的,此处工作流程基本上与班级管理的流程相同。
第5章 系统详细设计
5.1 系统流程图
图5-1系统程序流程图
5.2 创建工程项目
为了用Visual Basic 创建应用程序,应当使用工程。
打开Visual Basic后,单击文件|新建工程,在工程模板里选择标准 EXE,这时Visual Basic将自动产生一个Form窗体,删除这个窗体,把这个工程保存为“工程1”。
5.3 创建系统的主窗体
创建高校自动排课系统的主窗体,如图5-2主窗体所示,实现高校自动排课系统的所有功能。
图5-2主窗体
根据创建的高校自动排课系统的主窗体,进行主窗体菜单方面的创建,如图5-2主窗体所示,来实现高校自动排课系统的各项功能。
代码分析:
Dim Classprint As New OpenRs '定义打印记录集
Dim xlApp As New Excel.Application
Dim sendsql As String
Private Sub gridcs() '对grid所需求进行初始化
On Error GoTo finish
Select Case Grid1.Cell(hang, 7).Text
Case "周一至周五"
Grid2.Cols = 5 * nknumber + 1
Grid3.Cols = 5 * nknumber + 1
Case "周一至周六"
Grid2.Cols = 6 * nknumber + 1
Grid3.Cols = 6 * nknumber + 1
Case "周一至周日"
Grid2.Cols = 7 * nknumber + 1
Grid3.Cols = 7 * nknumber + 1
End Select '以下是列出对应的教师资源以及班级资源
Grid2.Range(1, 1, Grid2.Rows - 1, Grid2.Cols - 1).ClearText
Grid3.Range(1, 1, Grid3.Rows - 1, Grid3.Cols - 1).ClearText
Set kc2 = cnn.Execute("select 占用 from 占用 where 教师姓名='" & Grid1.Cell(hang, 5).Text & "'")
For i = 1 To Grid2.Cols - 1
Grid2.Cell(1, i).Text = Mid(kc2.Fields(0), i, 1)
Next
Grid3.Range(1, 1, Grid3.Rows - 1, Grid3.Cols - 1).Alignment = cellCenterCenter
Set kc2 = cnn.Execute("select 占用 from 课程占用 where 班级='" & XPCombo1.Text & "'")
For i = 1 To Grid3.Cols - 1
Grid3.Cell(1, i).Text = Mid(kc2.Fields(0), i, 1)
Next
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub grid4hq() '获取教师与班级之间的课程点
On Error GoTo finish
Grid4.Rows = 1
Dim m As Integer
For i = 1 To Grid2.Cols - 1 Step n '通过对比对教师与班级之间的可以排课点进行规纳
If Grid2.Cell(1, i).Text = "0" Then
If Grid3.Cell(1, i).Text = "0" Then
Grid4.Rows = Grid4.Rows + 1
Grid4.Cell(Grid4.Rows - 1, 1).Text = i
End If
End If
Next
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub asPopup1_Click(Cancel As Boolean)
kctable = "登陆"
Form6.Caption = "用户管理"
Form6.Show 1
End Sub
Private Sub asPopup10_Click(Cancel As Boolean)
kctable = "班级名称"
Form6.Caption = "班级管理"
Form6.Show 1
End Sub
Private Sub asPopup2_Click(Cancel As Boolean)
kctable = "教学时间段"
Form5.Caption = "教学时间段设置"
Form5.Show 1
End Sub
Private Sub asPopup3_Click(Cancel As Boolean)
End
End Sub
Private Sub asPopup4_Click(Cancel As Boolean)
kctable = "课程名"
Form5.Caption = "课程管理"
Form5.Show 1
End Sub
Private Sub asPopup5_Click(Cancel As Boolean) '这里是对一些生成错误的数据进行还原
Dim vyes As String
vyes = MsgBox("当系统出现排课错误时进行的完全还原操作,确定吗?", vbQuestion + vbYesNo, "提示")
If vyes = vbYes Then
Set kc2 = cnn.Execute("update 占用 set 占用='000000000000000000000000000000000000000000'")
Set kc2 = cnn.Execute("update 课程占用 set 占用='000000000000000000000000000000000000000000'")
End If
End Sub
Private Sub delbutton_Click() '删除按钮
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
word_validate
If vde = False Then '检测当前是否可以删除
MsgBox "因已生成课程表,为不可操作状态,请注销现有的课程表在进行操作!", vbInformation, "提示"
Exit Sub
End If
If kcdel = False Then
MsgBox "当前删除操作不被允许!", vbInformation, "非使用对象"
Exit Sub
End If
If hang = 0 Then '选取行不能为0,0行是字段行不可删除
Exit Sub
End If
Dim delok As String
If Grid1.Cell(hang, 1).Text = "" Then '这里选取行不能为空
Exit Sub
End If
delok = MsgBox("确认删除课程名为" & Grid1.Cell(hang, 1).Text & "的数据吗??", vbQuestion + vbOKCancel, "注意:此操作将会将学生资料与成绩资料完全清除")
If delok = vbOK Then
sql = "delete from 课程信息 where " & kc1.Fields(0).Name & "='" & Grid1.Cell(hang, 1).Text & "' and 所属班级='" & XPCombo1.Text & "'"
Set kc2 = cnn.Execute(sql)
'利用SQL语句删除用户选取的行,这里使用的是SQL语句
MsgBox "目标己删除完成!", , "提示"
Call XPButton3_Click
End If
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub editbutton_Click() '班级课程资料的编辑
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
word_validate
If vde = False Then
MsgBox "因已生成课程表,为不可操作状态,请注销现有的课程表在进行操作!", vbInformation, "提示"
Exit Sub
End If
If kcedit = False Then
MsgBox "当前修改操作不被允许!", vbInformation, "非使用对象"
Exit Sub
End If
Dim delok As String
delok = MsgBox("确认修改刚才修改的所有数据吗??", vbQuestion + vbOKCancel, "提示")
If delok = vbOK Then
hang = 1
Do While hang <= Grid1.Rows - 1 '这里使用循环实现修改所有行,所有列
If Grid1.Cell(hang, 1).Text = "" Then
MsgBox "己完成修改操作!", , "提示"
Exit Sub
End If
If Grid1.Cell(hang, 3).Text < "2" And Grid1.Cell(hang, 6).Text = "1" Then
MsgBox "第" & hang & "行的每周课数无法实现两节课连排!", vbInformation, "提示"
Exit Sub
End If '以上是编辑SQL的修改语句,并提交到数据库执行
sql = "update 课程信息 set "
For j = 1 To Grid1.Cols - 2
sql = sql & kc1.Fields(j - 1).Name & "='" & Grid1.Cell(hang, j).Text & "',"
Next
sql = sql & kc1.Fields(j - 1).Name & "='" & Grid1.Cell(hang, j).Text & "' where " & kc1.Fields(0).Name & "='" & Grid1.Cell(hang, 1).Text & "' and 所属班级='" & XPCombo1.Text & "'"
Set kc2 = cnn.Execute(sql) '用kc2更新数据集,这样可实现批量更新
hang = hang + 1
Loop
MsgBox "己完成修改操作!", , "提示"
Call XPButton3_Click
End If
Exit Sub
finish:
MsgBox Err.Description
End Sub
Function word_validate() '权限验证,主要验证用户是否能执行输入等操作
Set kc2 = cnn.Execute("select count(所属班级) from 临时生成表 where 所属班级='" & XPCombo1.Text & "'")
If kc2.Fields(0) = 0 Then
vde = True
Else
vde = False
End If
End Function
Private Sub finddkd_Click() '这里是调课的按钮
On Error GoTo finish
If admin = False Then
MsgBox "非管理员不可执行此操作", vbInformation, "权限错误"
Exit Sub
End If
'以下是检查班级是否为空,或其它的一些行和列的指向是否正确
If XPCombo1.Text = "" Or Grid5.Cell(hang1, ne1).Text = "" Or hang1 = 0 Or ne1 = 0 Then
MsgBox "对象选择错误!", vbInformation, "错误"
Exit Sub
End If
Set kc1 = cnn.Execute("select 任课老师,两节课累排,课程分布 from 课程信息 where 课程名='" & Grid5.Cell(hang1, ne1).Text & "' and 所属班级='" & XPCombo1.Text & "'")
Select Case kc1.Fields(2) '获取课程的分布,并以此来确定调课点的位置
Case "周一至周五"
Grid2.Cols = 5 * nknumber + 1
Grid3.Cols = 5 * nknumber + 1
Case "周一至周六"
Grid2.Cols = 6 * nknumber + 1
Grid3.Cols = 6 * nknumber + 1
Case "周一至周日"
Grid2.Cols = 7 * nknumber + 1
Grid3.Cols = 7 * nknumber + 1
End Select
If kc1.Fields(1) = "1" Then
n = 2
Else
n = 1
End If
Grid2.Range(1, 1, Grid2.Rows - 1, Grid2.Cols - 1).ClearText '以下代码是将教师的资源占用与班级作对比,再次寻找可用的点
Grid3.Range(1, 1, Grid3.Rows - 1, Grid3.Cols - 1).ClearText
Set kc2 = cnn.Execute("select 占用 from 占用 where 教师姓名='" & kc1.Fields(0) & "'")
For i = 1 To Grid2.Cols - 1
Grid2.Cell(1, i).Text = Mid(kc2.Fields(0), i, 1)
Next
Grid3.Range(1, 1, Grid3.Rows - 1, Grid3.Cols - 1).Alignment = cellCenterCenter
Set kc2 = cnn.Execute("select 占用 from 课程占用 where 班级='" & XPCombo1.Text & "'")
For i = 1 To Grid3.Cols - 1
Grid3.Cell(1, i).Text = Mid(kc2.Fields(0), i, 1)
Next
Grid4.Rows = 1
Dim m As Integer '以下是将可用的点进行规纳和处理,确定调课位置
For i = 1 To Grid2.Cols - 1 Step n
If Grid2.Cell(1, i).Text = "0" Then
If Grid3.Cell(1, i).Text = "0" Then
Grid4.Rows = Grid4.Rows + 1
Grid4.Cell(Grid4.Rows - 1, 1).Text = i
End If
End If
Next
'------------以上整理排课的资源列表
Dim X, Y As Integer '以下计算出行和列的位置,并将其背景色变色显示,提示用户
jehang = hang1
jene = ne1
For i = 1 To Grid4.Rows - 1
X = Round(Grid4.Cell(i, 1).Text / nknumber)
If X < Grid4.Cell(i, 1).Text / nknumber Then
X = X + 1
End If
Y = Grid4.Cell(i, 1).Text Mod nknumber
For j = 1 To nknumber
If Grid5.Cell(j, X).Text <> Grid5.Cell(hang1, ne1).Text Then
If j = nknumber Then
Grid5.Cell(Y, X).BackColor = RGB(255, 255, 255)
End If
Else
If X = ne1 Then
Grid5.Cell(Y, X).BackColor = RGB(255, 255, 255)
End If
Exit For
End If
Next
Next
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub Form_Load()
On Error GoTo finish
Grid1.SetRegisterInformation "CNwinndy", "W]vyY-nonvk-u\nty-Zbl_e-`hms^" '进行注册
Me.Picture = LoadPicture(App.Path & "\images\bgmain.jpg")
With Grid1 '这里设置图表控件grid1的一些参数
.AllowUserResizing = True '是否可调整行和例
.DisplayFocusRect = False '当前活动单元格是否显示一个虚框
.ExtendLastCol = True '是否让表格充满控件
.Appearance = Flat '选择绘图风格,平面还是3D
.FixedRowColStyle = Flat '固定行/列的样式
.ScrollBarStyle = Flat '滚动条的样式
'以上几个都是关于grid1的美化设置,都是一些无关紧要的设置
End With
Grid1.DefaultFont.Name = "Tahoma"
Grid1.DefaultFont.Size = 8
Grid1.BackColorFixed = RGB(148, 167, 178)
Grid1.BackColorFixedSel = RGB(148, 167, 178)
Grid1.BackColorBkg = RGB(148, 167, 178)
Grid1.BackColorScrollBar = RGB(148, 167, 178)
Grid1.BackColor1 = RGB(148, 167, 178)
Grid1.BackColor2 = RGB(148, 167, 178)
Grid1.Column(0).Width = 0
Grid1.Column(1).Width = 120
Grid1.Column(2).Width = 60
Grid1.Column(3).Width = 60
Grid1.Column(4).Width = 60
Grid1.Column(5).Width = 100
Grid1.Column(6).Width = 80
Grid1.Column(7).Width = 187
XPCombo1.Clear '清空xpcombo的集合内容
Set kc2 = cnn.Execute("select 班级名称 from 班级名称")
Do While Not kc2.EOF '将所有班级名称加入xpcombo1集合
XPCombo1.AddItem kc2.Fields(0)
kc2.MoveNext
Loop
Grid1.Visible = False
Grid1.Column(4).Locked = True
'---------------------
grid2pz
grid3pz
Grid4.RowHeight(0) = 0 '设定grid4的第0行的行高为0
Grid4.Column(0).Width = 0
Grid4.Column(1).Width = 20
'-------------grid5课程表的一些基本配置,包含第0行的内容,列宽等信息
Grid5.Visible = True
For i = 1 To 7
Grid5.Column(i).Width = 80
Grid5.RowHeight(0) = 18
Next
Grid5.Column(0).Width = 107
For i = 1 To 6
Grid5.RowHeight(i) = 18
Next
'以下在表格中填入一些固定内容
Grid5.Cell(0, 1).Text = "星期一"
Grid5.Cell(0, 2).Text = "星期二"
Grid5.Cell(0, 3).Text = "星期三"
Grid5.Cell(0, 4).Text = "星期四"
Grid5.Cell(0, 5).Text = "星期五"
Grid5.Cell(0, 6).Text = "星期六"
Grid5.Cell(0, 7).Text = "星期日"
'设置单元格格式
Grid5.Range(0, 0, 0, 7).FontSize = 10
With Grid5.Range(0, 0, Grid5.Rows - 1, Grid5.Cols - 1)
.Alignment = cellCenterCenter '位置居中
.BackColor = RGB(148, 167, 178)
'.ForeColor = RGB(255, 252, 0)
.WrapText = True '是否可自动换行
End With
Grid5.BackColorBkg = RGB(148, 167, 178)
'以下语句确定表教学时间段是否为空内容,如果是则转到输入界面
Set kc2 = cnn.Execute("select * from 教学时间段 order by 自动编号 asc")
i = 1
If kc2.EOF = True Then
MsgBox "系统目前支持每天的课数为6节,因此您需要输入6个时间段!", vbInformation, "提示"
kctable = "教学时间段"
Form5.Show 1
End If
Do While Not kc2.EOF
Grid5.Cell(i, 0).Text = kc2.Fields(0)
i = i + 1
kc2.MoveNext
Loop
XPPbr1.Visible = False
'以下是关于不是管理员的一些处理,即某些功能非管理员不可使用
If admin = False Then
XPButton2.Enabled = False
XPButton4.Enabled = False
XPButton1.Enabled = False
XPButton6.Enabled = False
savebutton.Enabled = False
editbutton.Enabled = False
delbutton.Enabled = False
asPopup5.Enabled = False
asPopup10.Enabled = False
asPopup4.Enabled = False
asPopup2.Enabled = False
asPopup1.Enabled = False
End If
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub grid2pz()
On Error GoTo finish
Grid2.ReadOnly = True '整张表格为只读模式
Grid2.Column(0).Width = 0
Grid2.RowHeight(0) = 0
Grid2.Cols = (7 * nknumber) + 1 '设定grid2的列为需要的数目,nknumber为每天的上课数
For i = 1 To Grid2.Cols - 1
Grid2.Column(i).Width = 20
Next
'以下是将所有行所有列的颜色进行修改
Grid2.Range(1, 1, Grid2.Rows - 1, Grid2.Cols - 1).BackColor = RGB(90, 158, 214)
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub grid3pz()
On Error GoTo finish
Grid3.ReadOnly = True
Grid3.Column(0).Width = 0
Grid3.RowHeight(0) = 0
Grid3.Cols = (7 * nknumber) + 1
For i = 1 To Grid3.Cols - 1
Grid3.Column(i).Width = 20
Next
Grid3.Range(1, 1, Grid3.Rows - 1, Grid3.Cols - 1).BackColor = RGB(90, 158, 214)
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub kcmge()
On Error GoTo finish
'以下是将数据库表中的课程信息表中的所有内容全部写入表格
kctable = "课程信息"
numberkc = 7 '课程信息表字段的列数
Set kc1 = cnn.Execute("select * from " & kctable & " where 所属班级='" & XPCombo1.Text & "' order by 每周课数 asc")
'以上利用SQL查询数据库中所有对应的课程信息
For i = 1 To numberkc
Grid1.Cell(0, i).Text = kc1.Fields(i - 1).Name
Next
i = 1
Grid1.Rows = 1
Do While Not kc1.EOF
Grid1.Rows = Grid1.Rows + 1 '每读取一条数据,就将表格的数量+1行
For j = 1 To numberkc '设定读取列
If Not kc1.Fields(j - 1) Is Nothing Then '空值的处理
Grid1.Cell(i, j).Text = kc1.Fields(j - 1)
Else
Grid2.Cell(i, j).Text = ""
End If
Next
kc1.MoveNext '读取下一记录
i = i + 1
Loop
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub Grid1_CellChange(ByVal Row As Long, ByVal Col As Long)
On Error GoTo finish '这里主要验证快捷菜单,确定当前是否可以保存,修改,或删除
If kcsave = False Then
savebutton.Enabled = False
Else
savebutton.Enabled = True
End If
If kcedit = False Then
editbutton.Enabled = False
Else
editbutton.Enabled = True
End If
If kcdel = False Then
delbutton.Enabled = False
Else
delbutton.Enabled = True
End If
'以下代码是将总课数与每周课数相除,得出需要多少周来完成教学
If Grid1.Cell(Row, 2).Text <> "" And Grid1.Cell(Row, 3).Text <> "" And Row <> 0 Then
Grid1.Cell(Row, 4).Text = Int((Grid1.Cell(Row, 2).Text) / (Grid1.Cell(Row, 3).Text))
End If
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub Grid1_RowColChange(ByVal Row As Long, ByVal Col As Long)
On Error GoTo finish
hang = Row '这里主要是实时确定当前鼠标所在行
If Grid1.Cell(Row, 1).Text <> "" Then '通过每行填写的课程名来换取相对应的教师姓名
Grid1.ComboBox(5).Clear
Set kc2 = cnn.Execute("SELECT DISTINCT 教师姓名 FROM 课程名 where 课程名='" & Grid1.Cell(Row, 1).Text & "'")
Do While Not kc2.EOF
Grid1.ComboBox(5).AddItem kc2.Fields(0)
kc2.MoveNext
Loop
End If
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub Grid5_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If dkyesno = True And Button = 2 Then
PopupMenu dk '当按下鼠标右键时显示菜单dk
End If
End Sub
Private Sub Grid5_RowColChange(ByVal Row As Long, ByVal Col As Long)
hang1 = Row ' 这里获取行和列的值,调课需要使用的
ne1 = Col
End Sub
Private Sub playwz_Click() '这里就是完成调课的功能按钮
If admin = False Then
MsgBox "非管理员不可执行此操作", vbInformation, "权限错误"
Exit Sub
End If
Dim Y As Integer
If Grid5.Cell(hang1, ne1).BackColor <> RGB(255, 255, 255) Then
MsgBox "课程不可以调至此处"
Else
Dim kcstr As String
Dim str1, str2 As String
kcstr = Grid5.Cell(jehang, jene).Text '以下是通过记忆将目标复制下来,以作后来修改之用
Select Case jene
Case 1
str1 = "星期一"
Case 2
str1 = "星期二"
Case 3
str1 = "星期三"
Case 4
str1 = "星期四"
Case 5
str1 = "星期五"
Case 6
str1 = "星期六"
Case 7
str1 = "星期日"
End Select
For i = 1 To nknumber
If Grid5.Cell(i, jene).Text = kcstr Then '做到清除并将资源占用情况修改
Grid5.Cell(i, jene).Text = ""
Y = jene * nknumber - nknumber + i '计算行的位置
Set kc2 = cnn.Execute("select 任课老师 from 课程信息 where 课程名='" & kcstr & "' and 所属班级='" & XPCombo1.Text & "'")
'以上通过课程名来获取教师的姓名
Set kc3 = cnn.Execute("select 占用 from 占用 where 教师姓名='" & kc2.Fields(0) & "'")
'通过教师的姓名来获取该教师的资源占用情况
str2 = Mid(kc3.Fields(0), 1, Y - 1) & "0" & Mid(kc3.Fields(0), Y + 1)
'将改写的占用情况写入字符串str2
Set kc3 = cnn.Execute("update 占用 set 占用='" & str2 & "' where 教师姓名='" & kc2.Fields(0) & "'")
'将字符串str2写入占用中
Set kc3 = cnn.Execute("select 占用 from 课程占用 where 班级='" & XPCombo1.Text & "'")
str2 = Mid(kc3.Fields(0), 1, Y - 1) & "0" & Mid(kc3.Fields(0), Y + 1)
Set kc3 = cnn.Execute("update 课程占用 set 占用='" & str2 & "' where 班级='" & XPCombo1.Text & "'")
'这里同上
Set kc3 = cnn.Execute("update 临时生成表 set " & str1 & "='' where 所属班级='" & XPCombo1.Text & "' and 时间段='" & Grid5.Cell(i, 0).Text & "'")
End If
Next
Select Case ne1 '这里确定数据移动的新列位置
Case 1
str1 = "星期一"
Case 2
str1 = "星期二"
Case 3
str1 = "星期三"
Case 4
str1 = "星期四"
Case 5
str1 = "星期五"
Case 6
str1 = "星期六"
Case 7
str1 = "星期日"
End Select
Y = ne1 * nknumber - nknumber + hang1
'计算行的位置
Grid5.Cell(hang1, ne1).Text = kcstr
'将记忆的课程名写入新单元格
Set kc2 = cnn.Execute("select 任课老师 from 课程信息 where 课程名='" & kcstr & "' and 所属班级='" & XPCombo1.Text & "'")
Set kc3 = cnn.Execute("select 占用 from 占用 where 教师姓名='" & kc2.Fields(0) & "'")
str2 = Mid(kc3.Fields(0), 1, Y - 1) & "1" & Mid(kc3.Fields(0), Y + 1)
'通过查询课程得到教师姓名并取得资源占用情况,在此基础上作出修改
If n = 2 Then
Grid5.Cell(hang1 + 1, ne1).Text = kcstr
str2 = Mid(kc3.Fields(0), 1, Y - 1) & "11" & Mid(kc3.Fields(0), Y + 2)
End If
Set kc3 = cnn.Execute("update 占用 set 占用='" & str2 & "' where 教师姓名='" & kc2.Fields(0) & "'")
Set kc3 = cnn.Execute("select 占用 from 课程占用 where 班级='" & XPCombo1.Text & "'")
str2 = Mid(kc3.Fields(0), 1, Y - 1) & "1" & Mid(kc3.Fields(0), Y + 1)
If n = 2 Then
str2 = Mid(kc3.Fields(0), 1, Y - 1) & "11" & Mid(kc3.Fields(0), Y + 2)
End If
Set kc3 = cnn.Execute("update 课程占用 set 占用='" & str2 & "' where 班级='" & XPCombo1.Text & "'")
Set kc3 = cnn.Execute("update 临时生成表 set " & str1 & "='" & kcstr & "' where 所属班级='" & XPCombo1.Text & "' and 时间段='" & Grid5.Cell(hang1, 0).Text & "'")
Set kc3 = cnn.Execute("update 临时生成表 set " & str1 & "='" & kcstr & "' where 所属班级='" & XPCombo1.Text & "' and 时间段='" & Grid5.Cell(hang1 + 1, 0).Text & "'")
Grid5.Range(0, 0, Grid5.Rows - 1, Grid5.Cols - 1).BackColor = RGB(148, 167, 178)
'以上就是通过在次写入占用的形式改写教师的资源占用情况,并将修改后的背景还原回来
End If
End Sub
Private Sub savebutton_Click() '保存课程资料
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
word_validate '执行验证,查看该班级是否已生成了课表
If vde = False Then '如果是则提示并退出
MsgBox "因已生成课程表,为不可操作状态,请注销现有的课程表在进行操作!", vbInformation, "提示"
Exit Sub
End If
If kcsave = False Then
MsgBox "当前不允许保存!", vbInformation, "提示"
Exit Sub
End If
For i = 1 To Grid1.Rows - 1 '处理重名数据,这主要是一个数据处理前期检查
If Grid1.Cell(i, 1).Text <> "" Then '检查表格某行第一列是否为空
Set kc1 = cnn.Execute("select 课程名 from 课程信息 where 课程名='" & Grid1.Cell(i, 1).Text & "' and 所属班级='" & XPCombo1.Text & "'")
If kc1.EOF = False Then
MsgBox "第" & i & "行的课程名在数据库里出现重复,请检查", vbInformation, "错误"
Grid1.Cell(i, 1).SetFocus
Exit Sub
End If
End If
Next
For i = 1 To Grid1.Rows - 1
For n = 1 To Grid1.Cols - 1
Select Case n
Case 1, 2, 3, 4, 5, 7 '检查数据是否为空,因为某些数据是不允许为空的,所以在这里必须要做个检测
If Grid1.Cell(i, 1).Text <> "" Then
If Grid1.Cell(i, n).Text = "" Then
MsgBox "第" & i & "行的--[" & Grid1.Cell(0, n).Text & "]--字段不允许为空!", vbInformation, "提示"
Grid1.Cell(i, n).SetFocus '这里实现自动提示并移动到提示的行
Exit Sub
End If
'以下是检测每周课数,与是否可以连排,如果每周课数为1,连排就无意义了
If Grid1.Cell(i, 3).Text < "2" And Grid1.Cell(i, 6).Text = "1" Then
MsgBox "第" & i & "行的每周课数无法实现两节课连排!", vbInformation, "提示"
Exit Sub
End If
ElseIf i = 1 Then
MsgBox "无任何数据可保存", vbInformation, "排课系统"
Exit Sub
End If
End Select
Next
If Grid1.Cell(i, 1).Text <> "" Then '执行插入语句
'以下是通过组织语句进行组成SQL的插入语句并运行
sql = "insert into 课程信息 values('"
For j = 1 To Grid1.Cols - 1
sql = sql & Grid1.Cell(i, j).Text & "','"
Next
sql = sql & XPCombo1.Text & "')"
Set kc1 = cnn.Execute(sql)
End If
Next
MsgBox "命令执行完毕!", vbInformation, "完成"
Call XPButton3_Click
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub XPButton1_Click() '添加课程的按钮
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
word_validate
If vde = False Then '保证课表未生成的状态下才可以运行
MsgBox "因已生成课程表,为不可操作状态,请注销现有的课程表在进行操作!", vbInformation, "提示"
Exit Sub
End If
Grid1.Visible = True
kctable = "课程信息"
'以下是读取字段的名称
numberkc = 7
Set kc1 = cnn.Execute("select * from " & kctable)
For i = 1 To numberkc
Grid1.Cell(0, i).Text = kc1.Fields(i - 1).Name
Next
Grid1.Rows = 1
Grid1.Rows = 8
gridcenter
Grid1.Cell(1, 1).SetFocus
griddispose
kcsave = True
kcedit = False
kcdel = False
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub gridcenter()
If Grid1.Rows <> 1 Then '以下是将grid1的所有行所有列的文字全部居中显示
Grid1.Range(1, 1, Grid1.Rows - 1, Grid1.Cols - 1).Alignment = cellCenterCenter
End If
End Sub
Private Sub griddispose() '这里主要是对课程的表格进行处理,并加入课程分布以及所有课程名项
On Error GoTo finish
Grid1.Column(1).CellType = cellComboBox
Grid1.Column(5).CellType = cellComboBox
Grid1.Column(6).CellType = cellCheckBox
Grid1.Column(7).CellType = cellComboBox
Grid1.ComboBox(1).Clear
Set kc2 = cnn.Execute("SELECT DISTINCT 课程名 FROM 课程名")
Do While Not kc2.EOF
Grid1.ComboBox(1).AddItem kc2.Fields(0)
kc2.MoveNext
Loop
Grid1.ComboBox(7).Clear
Grid1.ComboBox(7).AddItem "周一至周五"
Grid1.ComboBox(7).AddItem "周一至周六"
Grid1.ComboBox(7).AddItem "周一至周日"
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub XPButton2_Click() '这里是排课的主要代码
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
Call XPButton3_Click
XPPbr1.Visible = True
'计算每周数目是否超出范围
kbreturn '返回以前己生成的课表
Dim nnum As Integer '当班级的课程为空时退出排课
Set kc2 = cnn.Execute("select count(所属班级) from 课程信息 where 所属班级='" & XPCombo1.Text & "'")
If kc2.Fields(0) = 0 Then
MsgBox "没有定义课程,无法排课!", vbInformation, "课程未定义"
XPPbr1.Visible = False
Exit Sub
End If
'总结所有课程的每周课数累加是否超过规定的数量
Set kc2 = cnn.Execute("select sum(每周课数) from 课程信息 where 所属班级='" & XPCombo1.Text & "'")
XPPbr1.Max = kc2.Fields(0)
XPPbr1.Min = 1
XPPbr1.Value = 0
nnum = 30
Set kc2 = cnn.Execute("select count(课程分布) from 课程信息 where 所属班级='" & XPCombo1.Text & "' and 课程分布='周一至周六'")
nnum = nnum + kc2.Fields(0) * 2
Set kc2 = cnn.Execute("select count(课程分布) from 课程信息 where 所属班级='" & XPCombo1.Text & "' and 课程分布='周一至周日'")
nnum = nnum + kc2.Fields(0) * 4
If kc2.Fields(0) > nnum Then
MsgBox "每周累计课数超出设置范围,请重新调整"
Exit Sub
End If
Set kc2 = cnn.Execute("delete from 临时生成表 where 所属班级='" & XPCombo1.Text & "'")
pkzx '进入排课中心过程
XPPbr1.Visible = False
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub pkzx()
'Second(Time)
On Error GoTo finish
Dim weizi, X, Y, j1, j2 As Integer
Grid5.Range(1, 1, Grid5.Rows - 1, Grid5.Cols - 1).ClearText '先清除课程表表格中的所有内容
For hang = 1 To Grid1.Rows - 1
Select Case Grid1.Cell(hang, 6).Text
Case "1"
n = 2 'n代表该课程是否允许连排
Case "0"
n = 1
End Select
For i = 1 To Grid1.Cell(hang, 3).Text / n '通过循环为某个课程开始排表
gridcs '执行过程,此过程主要是运行grid2,grid3,读取可用的教师资源和班级资源用
grid4hq '这里是将可用的教师资源和班级资源进行对比,得出需要的结果
If Grid4.Rows <= 1 Then
Exit Sub
End If
weizi = Int(Grid4.Rows * Rnd()) '随机出某个grid4中的数值
Do While weizi = 0 '前提是随机的结果不能是0,否则重新随机
weizi = Int(Grid4.Rows * Rnd())
Loop
'以下计算随机出来的值,取向于课程有的某行某列
X = Round(Grid4.Cell(weizi, 1).Text / nknumber)
If X < Grid4.Cell(weizi, 1).Text / nknumber Then
X = X + 1
End If
Y = Grid4.Cell(weizi, 1).Text Mod nknumber
For j = 1 To nknumber
If Grid5.Cell(j, X).Text = Grid1.Cell(hang, 1).Text Then
i = i - 1
Exit For
End If
If j = nknumber Then
Select Case n
Case 2 '当允许两节课连排时运行
If Grid5.Cell(Y, X).Text = "" And Grid5.Cell(Y + 1, X).Text = "" Then
Grid5.Cell(Y, X).Text = Grid1.Cell(hang, 1).Text
Grid5.Cell(Y + 1, X).Text = Grid1.Cell(hang, 1).Text
Grid2.Cell(1, Grid4.Cell(weizi, 1).Text).Text = "1"
Grid2.Cell(1, Grid4.Cell(weizi, 1).Text + 1).Text = "1"
Grid3.Cell(1, Grid4.Cell(weizi, 1).Text).Text = "1"
Grid3.Cell(1, Grid4.Cell(weizi, 1).Text + 1).Text = "1"
XPPbr1.Value = XPPbr1.Value + 2
Else
i = i - 1
End If
Case 1
If Y > 4 Then ' 这里主要是想将单节课程放在下午5,6节课位置
Grid5.Cell(Y, X).Text = Grid1.Cell(hang, 1).Text
Grid2.Cell(1, Grid4.Cell(weizi, 1).Text).Text = "1"
Grid3.Cell(1, Grid4.Cell(weizi, 1).Text).Text = "1"
XPPbr1.Value = XPPbr1.Value + 1
Else
Y = 5
If Grid5.Cell(Y, X).Text = "" Then
Grid5.Cell(Y, X).Text = Grid1.Cell(hang, 1).Text
weizi = nknumber * X - 1
Grid2.Cell(1, weizi).Text = "1" '此处直接使用weizi就能找到grid2的位置
Grid3.Cell(1, weizi).Text = "1"
XPPbr1.Value = XPPbr1.Value + 1
Else
i = i - 1
End If
End If
End Select
'以上XX="1"的部分都是实时对表格进行修改,以便后面将表格的数据提交到数据库
Dim gsql1, gsql2 As String
gsql1 = ""
gsql2 = ""
For j1 = 1 To nknumber * 7 '以下是开始提交各表格的数据
If j1 > Grid2.Cols - 1 Then
gsql1 = gsql1 & "0"
Else
gsql1 = gsql1 & Grid2.Cell(1, j1).Text
End If
Next
Set kc2 = cnn.Execute("update 占用 set 占用='" & gsql1 & "' where 教师姓名='" & Grid1.Cell(hang, 5).Text & "'")
'将修改的数据提交到数据库中
For j2 = 1 To nknumber * 7
If j2 > Grid3.Cols - 1 Then
gsql2 = gsql2 & "0"
Else
gsql2 = gsql2 & Grid3.Cell(1, j2).Text
End If
Next
Set kc2 = cnn.Execute("update 课程占用 set 占用='" & gsql2 & "' where 班级='" & XPCombo1.Text & "'")
End If
Next
Next
Next
Dim gsql3 As String
For i = 1 To Grid5.Rows - 1 '以下是将生成的课表保存到数据库中
gsql3 = "insert into 临时生成表(时间段,星期一,星期二,星期三,星期四,星期五,星期六,星期日,所属班级) values('"
For j = 0 To Grid1.Cols - 1
gsql3 = gsql3 & Grid5.Cell(i, j).Text & "','"
Next
gsql3 = gsql3 & XPCombo1.Text & "')"
Set kc3 = cnn.Execute(gsql3)
Next
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub XPButton3_Click()
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
Grid1.Visible = True
kcsave = False
kcedit = True
kcdel = True
griddispose
kcmge
gridcenter
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub kbreturn() '此处主要是返回课表,解决课表占用情况
On Error GoTo finish
Call XPButton8_Click
Dim js, str1 As Integer
js = 0
XPPbr1.Max = (Grid5.Rows - 1) * (Grid5.Cols - 1)
XPPbr1.Min = 1
For i = 1 To Grid5.Cols - 1
For j = 1 To Grid5.Rows - 1
js = js + 1
XPPbr1.Value = XPPbr1.Value + 1
If Grid5.Cell(j, i).Text <> "" Then '以下主要是通过得到教师的资源信息,通过循环得到所要返回的目标,然后对数据进行修改
Set kc2 = cnn.Execute("select 任课老师 from 课程信息 where 课程名='" & Grid5.Cell(j, i).Text & "' and 所属班级='" & XPCombo1.Text & "'")
Set kc3 = cnn.Execute("select 占用 from 占用 where 教师姓名='" & kc2.Fields(0) & "'")
Dim str2 As String
str1 = Len(kc3.Fields(0))
str2 = Mid(kc3.Fields(0), 1, js - 1) & "0" & Mid(kc3.Fields(0), js + 1)
Set kc3 = cnn.Execute("update 占用 set 占用='" & str2 & "' where 教师姓名='" & kc2.Fields(0) & "'")
End If
Next
Next
'以下是返回班级的占用资源情况信息
Set kc2 = cnn.Execute("update 课程占用 set 占用='000000000000000000000000000000000000000000' where 班级='" & XPCombo1.Text & "'")
'同步删除已生成的课表
Set kc2 = cnn.Execute("delete from 临时生成表 where 所属班级='" & XPCombo1.Text & "'")
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub XPButton4_Click()
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
Call XPButton3_Click
kbreturn
End Sub
Private Sub XPButton5_Click()
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
Set xlApp = CreateObject("Excel.Application")
'激活EXCEL应用程序
xlApp.Visible = False '隐藏EXCEL应用程序窗口
'打开工作簿,strDestination为一个EXCEL报表文件
'设定工作表
Dim strSource, strDestination As String
strSource = App.Path & "\Excels\bak.xls"
'RegisterFee.xls就是一个模版文件
strDestination = App.Path & "\Excels\temp.xls"
FileCopy strSource, strDestination
Set xlbook = xlApp.Workbooks.Open(strDestination)
Set xlSheet = xlbook.Worksheets(1)
'将模版文件拷贝到一个临时文件
sendsql = "select 时间段,星期一,星期二,星期三,星期四,星期五,星期六,星期日,所属班级 from 临时生成表 where 所属班级='" & XPCombo1.Text & "' order by 自动编号 asc"
Set kc2 = cnn.Execute(sendsql)
xlSheet.Cells(1, 1) = XPCombo1.Text & "课程表" '以上就是通过写数据库的手法将内容写入到EXECL中
For i = 5 To 8
For j = 1 To 8
xlSheet.Cells(i, j) = kc2.Fields(j - 1)
Next
kc2.MoveNext
Next
For i = 10 To 13
If kc2.EOF = True Then
Exit For
End If
For j = 1 To 8
xlSheet.Cells(i, j) = kc2.Fields(j - 1)
Next
kc2.MoveNext
Next
xlbook.Save
Dim vyes As String
vyes = MsgBox("是否打印导出的课程表内容?", vbQuestion + vbYesNo, "是否打印?")
If vyes = vbYes Then
If Printers.Count <= 0 Then '检测是否有打印机
MsgBox "没有安装打印机", , "错误"
xlApp.Quit
Exit Sub
End If
xlSheet.PrintOut '有打印机就可使用
End If
xlApp.Quit
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub XPButton6_Click()
If kcsave = True Then
Grid1.Rows = Grid1.Rows + 1
Else
MsgBox "非添加状态不可添加新行", vbInformation, "不可操作"
End If
End Sub
Private Sub XPButton7_Click() '这里是报表输出
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
sendsql = "select 时间段,星期一,星期二,星期三,星期四,星期五,星期六,星期日,所属班级 from 临时生成表 where 所属班级='" & XPCombo1.Text & "' order by 自动编号 asc"
MDIForm1.WindowState = 2
Classprint.rsDK1 sendsql
ClassReport.Show '显示报表
Set ClassReport.DataSource = Classprint.rs1 '报表的数据源是 Classprint模块中的rs1
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub XPButton8_Click() '这里是显示已生成的课程表的内容
On Error GoTo finish
If XPCombo1.Text = "" Then
MsgBox "班级名称不可为空,请选择班级", vbInformation, "提示"
End If
dkyesno = True
Grid5.Range(1, 1, Grid5.Rows - 1, Grid5.Cols - 1).ClearText '清空数据
sendsql = "select 星期一,星期二,星期三,星期四,星期五,星期六,星期日,所属班级 from 临时生成表 where 所属班级='" & XPCombo1.Text & "' order by 自动编号 asc"
Set kc2 = cnn.Execute(sendsql)
If kc2.EOF = True Then
Exit Sub
End If
For i = 1 To 6 '向表格中写入数据
For j = 1 To 7
Grid5.Cell(i, j).Text = kc2.Fields(j - 1)
Next
kc2.MoveNext
Next
Exit Sub
finish:
MsgBox Err.Description
End Sub
图5-3 菜单编辑器
5.4 系统管理模块的设计
5.4.1 系统用户管理模块主要实现:
(1)用户登陆
(2)用户管理
(3)日志管理
(4)修改口令
5.4.2 用户登陆窗体的创建
系统启动后,将首先出现用户登陆窗体,用户首先输入用户名,然后输入密码,如果用户3次输入密码不正确,将退出程序。图5-4为用户登陆窗体,图5-5为密码3次不正确的退出提示框。
图5-4用户登陆窗体
图5-5密码3次不正确的退出提示框
用户如果没有输入用户名和用户密码,将出现消息框给予提示。
代码分析:
Private Declare Sub ReleaseCapture Lib "user32" () '支持移动API
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Sub Form_Load()
Me.Picture = LoadPicture(App.Path & "\images\login.jpg")
Text1.BackColor = RGB(83, 82, 132)
Text2.BackColor = RGB(83, 82, 132)
End Sub
Private Sub Image1_Click()
On Error GoTo finish
Set kc1 = cnn.Execute("select * from 登陆 where 用户名='" & Text1.Text & "' and 密码='" & Text2.Text & "'")
If kc1.EOF = True Then
If pnum < 2 Then
pnum = pnum + 1
MsgBox "用户名或密码错误!", vbInformation, "错误次数:" & pnum
Text1.Text = ""
Text2.Text = ""
Text1.SetFocus
Exit Sub
Else
MsgBox "用户名或密码错误超过三次,系统会自动退出", vbInformation, "提示"
End
End If
Else
If kc1.Fields(2) = "超级管理员" Then
admin = True
Else
admin = False
End If
Unload Me
formmain.Show
End If
Exit Sub
finish:
MsgBox Err.Description
End Sub
Private Sub Image2_Click()
End
End Sub
Private Sub Label1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture '以下的移动方式更简便
SendMessage Me.hwnd, &HA1, 2, 0&
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Call Image1_Click
End If
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Call Image1_Click
End If
End Sub
5.4.3 用户管理窗体的创建
进入系统后,选择菜单“用户管理”就可以对用户信息进行管理,包括对用户的添加、修改、删除的各项功能的实现。但使用该功能必修是系统管理员的权限,普通用户的权限不能进入会有提示框出现。
选择添加用户会弹出一个添加用户的窗体,在这个窗体中放置了3个文本框和1个列表框,用来输入用户名、密码和用户类型;两个按钮用来确定是否添加用户;用户需要两次输入密码,用来确保输入密码的正确。
当把用户名、密码和用户类型输入完毕后,系统将首先查询数据库中与新建用户名相同的记录,如果有相同记录将提示用户重新输入用户名。当确定数据库中没有相同的用户名,并且两次输入密码一致时,将把该条记录添加到数据库中。
单击“取消”按钮将取消添加用户的操作。
选择修改用户时必修在列表选中一个用户的信息,才会弹出一个修改用户的窗体,在这个窗体中放置了3个文本框和1个列表框,用来输入用户名、密码和用户类型;这个窗体主要是用来修改用户的权限。
单击“取消”按钮将取消修改用户的操作。
选择删除用户时必修在列表选中一个用户的信息,然后会提示你是否删除该用户,如果点击“是”则删除该用户,否则取消该删除操作。
单击“取消”按钮将取消用户管理的操作。
5.4.4 日志管理窗体的创建
进入系统后,选择菜单“日志管理”就可以对所有用户登陆信息进行管理,包括对用户登陆信息的查询和删除功能的实现。但使用该功能必修是系统管理员的权限,普通用户的权限不能进入会有提示框出现。
在这个窗体中放置了2个文本框、1个DataGrid表和3个按钮,2个文本框用来对用户登陆信息的按天查询和按用户名查询;1个DataGrid表是用来显示用户登陆信息的表;3个按钮用来对用户登陆信息的单个删除、全天删除和返回主窗体。
选择单个删除时必修在列表选中一个用户登陆的信息,然后会提示你是否删除该信息,如果点击“是”则删除该用户,否则取消该删除操作。
选择全天删除时会查找到按天查询的所有用户登陆的信息,然后会提示你是否删除该信息,如果点击“是”则删除该用户,否则取消该删除操作。
单击“取消”按钮将取消日志修改的操作。
5.4.5 修改用户密码窗体的创建
用户可修改自己的密码,选择菜单“用户密码的修改”,出现修改密码的窗体。
在这个窗体中放置了4个文本框,用来显示用户名和输入原密码、确认原密码和新密码;两个按钮用来确定是否修改密码;如果原密码错误将提示重填,当两次输入新密码一致时,数据库中的记录将更新,不一致则提示。
单击“取消”按钮将取消用户密码的修改的操作。
5.5班级管理模块的设计
5.5.1 辅助功能模块主要实现的功能:
(1)课程类型管理
(2)年级专业管理
(3)日程管理
(4)班级管理
(5)教室管理
(6)教师管理
(7)课程管理
5.5.2 课程类型管理窗体的创建。
选择“辅助功能/课程类型管理”菜单,将出现如图5-9所示的窗体。
图5-9课程类型管理窗体
代码分析:
Dim i, n As Integer
Private Declare Function GetKeyState Lib "user32" _
(ByVal nVirtKey As Long) As Integer
Private Sub Form_Load()
Grid1.SetRegisterInformation "CNwinndy", "W]vyY-nonvk-u\nty-Zbl_e-`hms^" '进行注册
With Grid1
.AllowUserResizing = True
.DisplayFocusRect = False
.ExtendLastCol = True
.Appearance = Flat
.FixedRowColStyle = Flat
.ScrollBarStyle = Flat
.DefaultFont.Name = "Tahoma"
.DefaultFont.Size = 8
.BackColorFixed = RGB(90, 158, 214)
.BackColorFixedSel = RGB(110, 180, 230)
.BackColorBkg = RGB(90, 158, 214)
.BackColorScrollBar = RGB(231, 235, 247)
.BackColor1 = RGB(231, 235, 247)
.BackColor2 = RGB(239, 243, 255)
.GridColor = RGB(148, 190, 231)
.Column(0).Width = 0
.Column(1).Width = 150
.Column(2).Width = 100
.Column(3).Width = 100
.Column(3).Locked = True
End With
MsgBox "因为某此班级正在使用这里的某些资源,使用修改和删除有可能会造成不必要的损失!", vbInformation, "友情提示"
Call callmain
End Sub
Private Sub callmain()
kcsave = False
kcedit = True
kcdel = True
Set kc1 = cnn.Execute("select * from " & kctable)
Select Case kctable
Case "课程名", "教学时间段"
Grid1.Rows = 1 '清除所有记录
i = 2
End Select
Grid1.Cols = i + 1 '必须+1,因为实际上为4行,但第一行是隐藏的
For i = 0 To i - 1 '显示数据的字段名
Grid1.Cell(0, i + 1).Text = kc1.Fields(i).Name '读取表中的各字段名
Next
n = i
i = 1
Do While Not kc1.EOF
Grid1.Rows = Grid1.Rows + 1
For j = 1 To n '设定读取列
If kc1.Fields(j - 1) = Null Then '空值的处理
Grid1.Cell(i, j).Text = ""
Else
Grid1.Cell(i, j).Text = kc1.Fields(j - 1)
End If
Next
i = i + 1
kc1.MoveNext '读取下一记录
Loop
Grid1.Column(1).Locked = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call XPButton5_Click
End Sub
Private Sub Grid1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu cz
End If
End Sub
Private Sub Grid1_RowColChange(ByVal Row As Long, ByVal Col As Long)
hang = Row
End Sub
Private Sub Grid1_Validate(Cancel As Boolean) '设定TAB键切换
Dim nActiveRow As Long, nActiveCol As Long
Const VK_TAB = 9
If GetKeyState(VK_TAB) < 0 Then
nActiveRow = Grid1.ActiveCell.Row
nActiveCol = Grid1.ActiveCell.Col
If nActiveCol < Grid1.Cols - 1 Then
Grid1.Range(nActiveRow, nActiveCol + 1, _
nActiveRow, nActiveCol + 1).Selected
End If
Cancel = True
End If
End Sub
Private Sub renovate_Click()
Call callmain
End Sub
Private Sub XPButton1_Click()
kcsave = True
kcedit = False
kcdel = False
Set kc1 = cnn.Execute("select * from " & kctable)
Grid1.Rows = 1 '清除所有记录
Grid1.Rows = 2 '默认为2行
For i = 0 To 1 '显示数据的字段名
Grid1.Cell(0, i + 1).Text = kc1.Fields(i).Name '读取表中的各字段名
Next
Grid1.Column(1).Locked = False
Grid1.Cell(1, 1).SetFocus
XPButton2.Default = True
End Sub
Private Sub XPButton2_Click()
If kcsave = False Then
MsgBox "不支持保存操作!", vbInformation, "当前不支持"
Exit Sub
End If
If Grid1.Cell(1, 1).Text <> "" Then
Set kc1 = cnn.Execute("select * from " & kctable & " where " & kc1.Fields(0).Name & "='" & Grid1.Cell(1, 1).Text & "' and " & kc1.Fields(1).Name & "='" & Grid1.Cell(1, 2).Text & "'")
If kc1.EOF = True Then
Set kc1 = cnn.Execute("insert into " & kctable & "( " & kc1.Fields(0).Name & "," & kc1.Fields(1).Name & ") values('" & Grid1.Cell(1, 1).Text & "','" & Grid1.Cell(1, 2).Text & "')")
'---------------------为教师的时间占用作标记
If kctable = "课程名" Then
Dim num As Integer
num = 7 * nknumber
For i = 1 To num
sql = sql & "0"
Next
Set kc2 = cnn.Execute("insert into 占用 values('" & Grid1.Cell(1, 2).Text & "','" & sql & "')")
End If
'------------------
MsgBox "提交成功!", vbInformation, ""
Call callmain
Else
MsgBox "数据不可重复!", vbInformation, "不可重复"
Exit Sub
End If
Else
MsgBox "对象不可以是空格", vbInformation, "错误提示"
End If
End Sub
Private Sub XPButton3_Click()
If kcedit = False Then
MsgBox "当前修改操作不被允许!", vbInformation, "非使用对象"
Exit Sub
End If
For i = 1 To Grid1.Rows - 1
Set kc2 = cnn.Execute("update " & kctable & " set " & kc1.Fields(0).Name & "='" & Grid1.Cell(i, 1).Text & "'," & kc1.Fields(1).Name & "='" & Grid1.Cell(i, 2).Text & "' where " & kc1.Fields(0).Name & "='" & Grid1.Cell(i, 1).Text & "'")
Next
MsgBox "修改的数据己经完成", vbInformation, "完成操作"
Call callmain
End Sub
Private Sub XPButton4_Click()
If kcdel = False Then
MsgBox "当前删除操作不被允许!", vbInformation, "非使用对象"
Exit Sub
End If
If hang = 0 Then
Exit Sub
End If
If Grid1.Cell(hang, 1).Text = "" Then
Exit Sub
End If
Set kc1 = cnn.Execute("delete from " & kctable & " where " & kc1.Fields(0).Name & "='" & Grid1.Cell(hang, 1).Text & "' and " & kc1.Fields(1).Name & "='" & Grid1.Cell(hang, 2).Text & "'")
MsgBox "目标己删除,请刷新数据!", vbInformation, "删除成功"
Call callmain
End Sub
Private Sub XPButton5_Click()
Set kc2 = cnn.Execute("select * from 教学时间段 order by 自动编号 asc")
i = 1
Do While Not kc2.EOF
formmain.Grid5.Cell(i, 0).Text = kc2.Fields(0)
i = i + 1
kc2.MoveNext
Loop
Unload Me
End Sub
在窗体上放置了2个文本框、1个列表框1个DataGrid表和4个按钮,在文本框中按要求填入相应的信息,点击“添加”可以进行对课程类型信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要编辑数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行编辑,数据修改成功后,点击“编辑”完成该操作。点击“清除”时将文本框中的信息清空,便于用户新的输入。这个窗体的建立是实现自动排课的一个重要的数据信息。
5.5.3 年级专业管理窗体的创建
选择“辅助功能/年级专业管理”菜单,将出现如图5-10所示的窗体。
在窗体上放置了3个文本框、1个DataGrid表和4个按钮,在文本框中按要求填入相应的信息,点击“添加”可以进行对年级专业信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要编辑数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行编辑,数据修改成功后,点击“编辑”完成该操作。点击“清除”时将文本框中的信息清空,便于用户新的输入。这个窗体的建立是实现自动排课的一个重要的数据信息。
图5-10年级专业管理窗体
代码分析:
Dim i, n As Integer
Private Declare Function GetKeyState Lib "user32" _
(ByVal nVirtKey As Long) As Integer
Private Sub Form_Load()
Grid1.SetRegisterInformation "CNwinndy", "W]vyY-nonvk-u\nty-Zbl_e-`hms^" '进行注册
With Grid1
.AllowUserResizing = True
.DisplayFocusRect = False
.ExtendLastCol = True
.Appearance = Flat
.FixedRowColStyle = Flat
.ScrollBarStyle = Flat
.DefaultFont.Name = "Tahoma"
.DefaultFont.Size = 8
.BackColorFixed = RGB(90, 158, 214)
.BackColorFixedSel = RGB(110, 180, 230)
.BackColorBkg = RGB(90, 158, 214)
.BackColorScrollBar = RGB(231, 235, 247)
.BackColor1 = RGB(231, 235, 247)
.BackColor2 = RGB(239, 243, 255)
.GridColor = RGB(148, 190, 231)
.Column(0).Width = 0
.Column(1).Width = 100
.Column(2).Width = 100
.Column(3).Width = 100
End With
If kctable = "班级名称" Then
MsgBox "请尽量不要修改和删除班级名称,否则可能会造成资源浪费!", vbInformation, "友情提示"
End If
Call callmain
End Sub
Private Sub callmain()
kcsave = False
kcedit = True
kcdel = True
Set kc1 = cnn.Execute("select * from " & kctable)
Select Case kctable
Case "班级名称"
Grid1.Rows = 1 '清除所有记录
i = 3
Case "登陆"
Grid1.Column(3).CellType = cellComboBox
Grid1.ComboBox(3).Clear
Grid1.ComboBox(3).AddItem "超级管理员"
Grid1.ComboBox(3).AddItem "一般用户"
Grid1.Rows = 1 '清除所有记录
i = 3
End Select
Grid1.Cols = i + 1 '必须+1,因为实际上为4行,但第一行是隐藏的
For i = 0 To i - 1 '显示数据的字段名
Grid1.Cell(0, i + 1).Text = kc1.Fields(i).Name '读取表中的各字段名
Next
n = i
i = 1
Do While Not kc1.EOF
Grid1.Rows = Grid1.Rows + 1
For j = 1 To n '设定读取列
If kc1.Fields(j - 1) = Null Then '空值的处理
Grid1.Cell(i, j).Text = ""
Else
Grid1.Cell(i, j).Text = kc1.Fields(j - 1)
End If
Next
i = i + 1
kc1.MoveNext '读取下一记录
Loop
Grid1.Column(1).Locked = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call XPButton5_Click
End Sub
Private Sub Grid1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu cz
End If
End Sub
Private Sub Grid1_RowColChange(ByVal Row As Long, ByVal Col As Long)
hang = Row
End Sub
Private Sub Grid1_Validate(Cancel As Boolean) '设定TAB键切换
Dim nActiveRow As Long, nActiveCol As Long
Const VK_TAB = 9
If GetKeyState(VK_TAB) < 0 Then
nActiveRow = Grid1.ActiveCell.Row
nActiveCol = Grid1.ActiveCell.Col
If nActiveCol < Grid1.Cols - 1 Then
Grid1.Range(nActiveRow, nActiveCol + 1, _
nActiveRow, nActiveCol + 1).Selected
End If
Cancel = True
End If
End Sub
Private Sub renovate_Click()
Call callmain
End Sub
Private Sub XPButton1_Click()
kcsave = True
kcedit = False
kcdel = False
Set kc1 = cnn.Execute("select * from " & kctable)
Grid1.Rows = 1 '清除所有记录
Grid1.Rows = 2 '默认为2行
For i = 0 To 2 '显示数据的字段名
Grid1.Cell(0, i + 1).Text = kc1.Fields(i).Name '读取表中的各字段名
Next
Grid1.Column(1).Locked = False
Grid1.Cell(1, 1).SetFocus
End Sub
Private Sub XPButton2_Click()
If kcsave = False Then
MsgBox "不支持保存操作!", vbInformation, "当前不支持"
Exit Sub
End If
If Grid1.Cell(1, 1).Text <> "" Then
Set kc1 = cnn.Execute("select * from " & kctable & " where " & kc1.Fields(0).Name & "='" & Grid1.Cell(1, 1).Text & "'")
If kc1.EOF = True Then
Set kc1 = cnn.Execute("insert into " & kctable & " values('" & Grid1.Cell(1, 1).Text & "','" & Grid1.Cell(1, 2).Text & "','" & Grid1.Cell(1, 3).Text & "')")
'--------------------
If kctable = "班级名称" Then
Dim num As Integer
num = 7 * nknumber
For i = 1 To num
sql = sql & "0"
Next
Set kc2 = cnn.Execute("insert into 课程占用 values('" & Grid1.Cell(1, 1).Text & "','" & sql & "')")
End If
formmain.XPCombo1.Clear
Set kc2 = cnn.Execute("select 班级名称 from 班级名称")
Do While Not kc2.EOF
formmain.XPCombo1.AddItem kc2.Fields(0)
kc2.MoveNext
Loop
'---------------------
MsgBox "提交成功!", vbInformation, ""
Call callmain
Else
MsgBox "该名称名己存在!", vbInformation, "不可重名"
Exit Sub
End If
Else
MsgBox "对象不可以是空格", vbInformation, "错误提示"
End If
End Sub
Private Sub XPButton3_Click()
If kcedit = False Then
MsgBox "当前修改操作不被允许!", vbInformation, "非使用对象"
Exit Sub
End If
For i = 1 To Grid1.Rows - 1
Set kc2 = cnn.Execute("update " & kctable & " set " & kc1.Fields(1).Name & "='" & Grid1.Cell(i, 2).Text & "'," & kc1.Fields(2).Name & "='" & Grid1.Cell(i, 3).Text & "' where " & kc1.Fields(0).Name & "='" & Grid1.Cell(i, 1).Text & "'")
Next
MsgBox "修改的数据己经完成", vbInformation, "完成操作"
Call callmain
End Sub
Private Sub XPButton4_Click()
If kcdel = False Then
MsgBox "当前删除操作不被允许!", vbInformation, "非使用对象"
Exit Sub
End If
If hang = 0 Then
Exit Sub
End If
If Grid1.Cell(hang, 1).Text = "" Then
Exit Sub
End If
If kctable = "班级管理" Then
Set kc1 = cnn.Execute("select count(所属班级) from 临时生成表 where " & kc1.Fields(0).Name & "='" & Grid1.Cell(hang, 1).Text & "'")
If kc1.Fields(0) = 0 Then
MsgBox "该班级仍然占用了教师的排课资源,请注销该班级的课程表后在操作", vbInformation, "提示"
End If
End If
Set kc1 = cnn.Execute("delete from " & kctable & " where " & kc1.Fields(0).Name & "='" & Grid1.Cell(hang, 1).Text & "'")
MsgBox "目标己删除,请刷新数据!", vbInformation, "删除成功"
Call callmain
End Sub
Private Sub XPButton5_Click()
Unload Me
'Form1.WindowState = 0
End Sub
5.5.4 教学时间段窗体的创建。
如图5-11所示的窗体。
图5-11日期管理窗体
在窗体上放置了2个文本框、1个DataGrid表和4个按钮,在文本框中按要求填入相应的信息,点击“添加”可以进行对日期安排信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要编辑数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行编辑,数据修改成功后,点击“编辑”完成该操作。点击“清除”时将文本框中的信息清空,便于用户新的输入。这个窗体的建立是实现自动排课的一个重要的数据信息。
5.5.5 班级管理窗体的创建。
选择“辅助功能/班级管理”菜单,将出现如图5-12所示的窗体。
图5-12班级管理窗体
在窗体上放置了6个文本框、1个DataGrid表和5个按钮,在文本框中按要求填入相应的信息,点击“更新”后才能开启“添加”,点击“添加”可以进行对班级信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要编辑数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行编辑,数据修改成功后,点击“编辑”完成该操作。点击“清除”时将文本框中的信息清空,便于用户新的输入。这个窗体的建立是实现自动排课的一个重要的数据信息。
5.5.6 教室管理窗体的创建
在窗体上放置了1个DataGrid表和4个按钮,在文本框中按要求填入相应的信息,点击“添加”可以打开另一个添加教室信息的窗体,进行对教室信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要修改数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行修改,数据修改成功后,点击“修改”完成该操作。点击“返回”时退出该窗体。这个窗体的建立是实现自动排课的一个重要的数据信息。
图5-13教室管理窗体
5.5.7 教师管理窗体的创建。
在窗体上放置了1个DataGrid表和4个按钮,在文本框中按要求填入相应的信息,点击“添加”可以打开另一个添加教室信息的窗体,进行对教师信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要修改数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行修改,数据修改成功后,点击“修改”完成该操作。点击“返回”时退出该窗体。这个窗体的建立是实现自动排课的一个重要的数据信息。
5.5.8 课程管理窗体的创建。
选择“辅助功能/课程管理”菜单,将出现如图5-15所示的窗体。
在窗体上放置了8个文本框、2个DataGrid表和5个按钮,在文本框中按要求填入相应的信息,点击“更新”后才能开启“添加”,点击“添加”可以进行对课程信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要编辑数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行编辑,数据修改成功后,点击“编辑”完成该操作。点击“清除”时将文本框中的信息清空,便于用户新的输入。这个窗体的建立是实现自动排课的一个重要的数据信息。
图5-15课程管理窗体
5.6 排课管理模块的设计
5.6.1 排课管理模块主要实现的功能:
(1)课程申请管理
(2)自动排课
5.6.2 生成课程管理窗体的创建
选择“排课管理/课程申请管理”菜单,将出现如图5-16所示的窗体。
在窗体上放置了9个文本框、1个DataGrid表和4个按钮,在文本框中按要求填入相应的信息,其中在提示框为“课程编号”的文本框中填入相应的课程信息后,在提示框“学时”的文本框中自动载入与课程信息相应的学时,而不允许自己填入,在提示框为“课程编号”的文本框中填入相应的课程信息后,在提示框“学期标志”的文本框中自动载入与课程信息相应的学期标志,而不允许自己填入。还有点击“添加”可以进行对课程信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要修改数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行修改,数据修改成功后,点击“修改”完成该操作。点击“返回”时退出该窗体。这个窗体的建立是实现自动排课的一个重要的数据信息
图5-16生成课程管理窗体
5.6.3 手动排课窗体的创建
在窗体上放置了10个文本框、1个DataGrid表和4个按钮,在文本框中按要求填入相应的信息,在数据库中则产生对应的一些信息自动填入。还有点击“添加”可以进行对课程信息的添加,如果在数据库中找到相同的信息则提示有相同信息后,重新输入;点击“删除”时提示用户要在表中要选中一行,如果点击“是”删除选中信息,否则取消操作;当用户需要编辑数据时提示用户要在表中要选中一行,然后将选中的数据显示到相应的文本框中,进行编辑,数据修改成功后,点击“编辑”完成该操作。点击“退出”时退出该窗体。这个窗体的建立是实现对自动排课的一个辅助修改,使得本系统在排课上更加贴近用户。
5.6.4 自动排课窗体的创建
选择菜单“排课管理/自动排课”菜单,功能是自动排课,是本系统的中最重要的一项功能,使用户方便的进行对课程信息、班级信息、教师信息、教室信息等的排课管理,能够正确实现自动排课这个功能是本系统最重要也是最简单的功能。
5.7 课表管理模块的设计
5.7.1 课表管理模块主要实现如下功能:
(1)班级课表
(2)教师课表
(3)教室课表
(4)日期课表
5.7.2 班级课表窗体的创建
在窗体上放置了6个文本框、1个DataGrid表和2个按钮,在文本框中按要求填入相应的信息,点击“查询”时按文本框中的信息进行模糊查询找到相应的信息在DataGrid表中显示出来,如果没找到相应的信息则提示,然后重新输入;点击“清除”时将文本框中的信息清空,便于用户新的输入。
5.7.3 教师课表窗体的创建
在窗体上放置了4个文本框、1个DataGrid表和2个按钮,在文本框中按要求填入相应的信息,点击“查询”时按文本框中的信息进行模糊查询找到相应的信息在DataGrid表中显示出来,如果没找到相应的信息则提示,然后重新输入;点击“清除”时将文本框中的信息清空,便于用户新的输入。
5.7.4 教室课表窗体的创建
在窗体上放置了5个文本框、1个DataGrid表和2个按钮,在文本框中按要求填入相应的信息,点击“查询”时按文本框中的信息进行模糊查询找到相应的信息在DataGrid表中显示出来,如果没找到相应的信息则提示,然后重新输入;点击“清除”时将文本框中的信息清空,便于用户新的输入。
5.7.5 日期课表窗体的创建
在窗体上放置了2个文本框、1个DataGrid表和2个按钮,在文本框中按要求填入相应的信息,点击“查询”时按文本框中的信息进行模糊查询找到相应的信息在DataGrid表中显示出来,如果没找到相应的信息则提示,然后重新输入;点击“清除”时将文本框中的信息清空,便于用户新的输入。
5.8 关于模块的设计
一个良好的Windows应用程序应该提供一个About窗口,其中包括本系统的名称、联系方式和使用者等信息。高校自动排课软件系统的About窗体如
结论
确定了本系统的实用价值后,选用了目前最常用也最简便的access数据库做为后台,鉴于ADO在很多程序里的广泛应用,使用ADO来连接数据库将是最为适用的,并且在定义了ADO的连接模块后,对于将来的升级也会很方便,只要修改一下连接源,就可以轻松的更换后台,access适用于单机版,当想转换为网络版的SQL数据库时,就很容易做到
为了减少系统的数据资源,选用了目前最方便的将数据交给后台处理的方法,即使用SQL的语句将数据库交给ACCESS后台,由后台来处理,这样系统的执行会加快,也使用程序本身变得简单
1. 本程序使用了新型控件flexcell,此控件的双色表格与单元格的特殊赋值功能不但能带给用户最好的视觉感受,同时在操作时大大减少了手动输入操作,因此也为非计算机人员的可操作性带来很大的方便。
2. 采用独特的资料占用排除方法来生成所需要的课程表,使课程表生成速度加快。
3. 支持很方便的课程,用户等模块的添加,修改,删除等过程。
4. 使用定位查询,只要选择对应的班级,就可以找到对应的内容,班级就是一个整体,通过班级来寻找所想要的数据会实现的更为简便。
5. 特殊的课程表输出功能,大大减少了课程表输出时的格式局限性,只要修改EXECL中的模板,就可以打印出你想要的效果来。
程序的不足:
1.对排课来说,各个学校都有着不太相同的排列方法,有每天的课节数,允许课程连排数,时间段等等,而这些方法转换为计算机语言时,往往会因为这样那样的限制而造成死循环或者程序速度缓慢,因为排课系统要适应大部分学校使用,所以这里提供的一些要求是不能够满足大部分人的。
2.由于排课实现功能复杂,程序中也许有不可预知的错误未测试出来,所
以这也需要长时间的进行测试才能发现并修复问题。
经过两个多月的毕业设计,高校排课系统的编码工作基本完成,其功能基本符合用户需求,能够实现对班级、教师、课程信息的排课。在完成的系统中,实现自动排课的这个功能是通过建立一个课程申请表来完成的。而手动排课这个功能是对以完成自动排课出来的数据信息进行修改和补充。但由于经验不足。设计出来的程序无论在功能上还是不够完善,在效果上都不是十分理想,程序还有很多地方需要不断改进。衷心希望各位老师给我提出宝贵的意见。系统用户的添加和口令的修改,并提供部分系统维护功能,使用户方便、安全的进行操作。再经过一定的测试,改正一些隐蔽的错误,即可使用。
在即将走向岗位的我来说,这次设计让我学会了如何运用我自己的专业知识,大大培养了我对所学知识的综合应用能力和对问题的分析解决能力,我想这为我以后参加工作打下了一个很好的基础。
本系统编码部分的工作量很大。主要是通过VB + ACCESS来实现系统的功能。在知识和技术方面,涉及了数据库编程的许多方面。因此本人对VB这门语言有了较系统的掌握,在数据库编程和应用方面加深了认识,得到了很好的锻炼。
在系统开发过程中,我深刻体会到了理论联系实际的重要性。以前从书本上所学的知识只是肤浅的感性认识,并没有透彻的理解,真正的掌握。在应用过程中出现了种种的疑问与错误。通过这次程序开发,懂得了一个系统的开发必须有符合事实的需求分析,一个有规划的,高效的方案设计,到最后的程序开发和调试等一系列的周密、谨慎的步骤,而每一个环节的疏忽都会影响到程序顺利的进行。
软件的开发要求我们必须使用科学的方法,仔细,耐心的调查研究每细节,在学习中开发,在开发中学习,直到最后系统的完成。它是一个有序的,系统的工作。
参考文献
1 刘瑞新. Visual Basic程序设计教程. 电子工业出版社 2004,5
2 高春艳 李艳 谷伟东.Visual Basic 数据开发关键技术与实例应用.人民邮电出版社.2004,5
3 李晓黎 张巍. Visual Basic+SQL Sever数据库应用系统开发与实例.人民邮电出版社2003,8
4 李盘林 李立健.基于启发性知识研究生院课表编排系统[J].计算机学报.1992,(11):876-880.
5 王能斌 钱祥根.大学课程表调度系统--UTSS[J].计算机学报.1984,(5):383-389.
6 张清绵 徐明.智能教学组织管理与课程表调度系统[J].大连理工大学学报.1991,31(2):227-232.
7 林漳希 林尧瑞.人工智能技术在课表编排中的应用[J].清华大学学报.1984,24(2):1-9.
8 张海藩.软件工程导论[M].北京:清华大学出版社.1987年6月第一版
9 刘明渊.电脑在排课作业上的应用-问题的性质与几个系统的作法[J].咨询与教育杂志.1993,4.
10 包冬意,赖永进,吴智辉.大专院校排课自动化之研究[J].大叶学报2(1):p.135-144,1993.
11 萨师煊 王珊.数据库系统概论[M].北京:高等教育出版社.2000年2月第三版.
12 苗雪兰 刘瑞新 宋会群.数据库系统原理及应用教程.机械工业出版社.2005.
13 张海藩.软件工程导论. 清华大学出版社编著 2004.7.
14 施伯乐 丁宝康 周傲英 田增平.数据库系统教程.高等教育出版社编著 1999,12.
15 黄明 梁旭.Visual Basic 6.0信息系统设计与开发实例.机械.2001,9.
16 ISBN 7-900056-45-9/TP•44,蒋慧,吴礼发,陈卫卫, UML Programming Guide 设计核心技术,北京希望电子出版社, 2001.1 第1版,149-166
17 Philippe Kruchten,Agility with the RUP,Cutter IT Journal, December 2001,Vol. 14, 3-7。
18 Alistair Cockburn,Writing Effective Use Case,王雷,张莉译,机械工业出版社,2002.9 71-95
19 Kent Beck,Extreme Programming Explained, Pearson Education,No.1,October 1999。
20 Ronald E. Jeffries, Ann Anderson, Chet Hendrickson,Extreme Programming Installed,Pearson Education,No.1,October 2000。
21 蒋慧,吴礼发,陈卫卫, UML Programming Guide 设计核心技术,北京希望电子出版社, 2001.1 第1版,149-166
标签:毕设,End,Sub,Text,排课,Cell,源码,窗体,Grid1 From: https://blog.csdn.net/qq_52030698/article/details/139252955