航空公司订票系统数据库结构航空公司订票系统功能模块图航空公司订票系统流程分析图系统程序模块划分从系统程序编制上或任务分配上功能划分可以这样:主界面功能模块公用标准模块用户管理模块表格数据功能模块单记录数据功能模块通用查询通用报表、打印模块系统主功能模块界面图菜单项工具栏(ToolBar)状态栏(Statusbar)侧边栏(TreeView)ImageList(隐藏,为ToolBar和TreeView提供图标)源代码迁移用户机器使用过程1、拷贝源代码、数据库备份文件到用户机器上2、打开SQLServer还原操作恢复数据库ticket3、用regsvr32注册用户控件userctrproj.ocx4、打开源程序修改连接字符串(在公用模块Module1中)中的datasource为用户的机器名系统主功能模块界面设计添加菜单(菜单编辑器、-、menu、&、显示窗口列表)添加imglist(隐藏方式left=8600、索引)添加工具条(图像列表、文本对齐、按钮索引关键字、样式5种、响应事件buttonclick集中处理所有按钮敲击事件)添加侧边栏(侧边栏由picturbox包容label、button、treeview构成、显示位置大小打开关闭由picturebox的事件过程控制、picturebox放置时设置Align属性、picturebox_Resize事件过程)TreeView操作(选择样式是否带图片链接线展开符号等、图像列表、TreeView.Nodes.Add方法、TreeView_NodeClick事件过程)系统主界面功能模块编码规则1、主界面要求是MDIForm窗体,表格数据模块是MDIForm窗体子窗体,其他模块是普通窗体。2、用户登录检测和权限检测应在主界面显示以前完成(本程序中单独设置用户登录和权限检测模块,由Main函数启动后调用)3、主界面模块的代码应尽量简洁,主界面的作用是通过菜单和工具栏完成系统功能的导向和链接,功能的实现在功能模块中实现.4、状态栏为系统使用提供帮助信息和状态信息.5、侧边栏可以方便用户对功能的查找和调用,是一个好的解决方案,但会增加程序的复杂性.系统主界面功能模块编码规则6、链接功能实现尽量在菜单点击事件过程中完成、其他工具栏、快捷键功能实现只是调用菜单的事件过程、注意状态关联。7、MDIForm_Initialize和MDIForm_Load两个窗体导入时触发的事件过程,Initialize甚至在Load之前被触发,主要在里面安排窗体包容控件和对象的初始化程序处理,尤其状态条的显示信息、文本框、Label、组合框等的显示文本,和列表框、组合框、树视图等的选项添加设置等。Load事件过程主要是窗体本身初始化信息的处理程序。本系统中用到的一些功能1、注册表读写功能函数GetSetting、SaveSetting窗体unload时保存窗体大小位置信息到注册表窗体load时读取注册表上一次窗体大小位置信息2、多文档MdiForm窗体的Arrange方法vbCascade0层叠所有非最小化MDI子窗体。vbTileHorizontal1水平平铺所有非最小化MDI子窗体。vbTileVertical2垂直平铺所有非最小化MDI子窗体。vbArrangeIcons3重排最小化MDI子窗体的图标功能封装调用原则PrivateSubmenuCarbin_Click()frmService.txtSQL=select*fromserviceInfofrmService.ShowfrmService.SetFocusEndSub1、主界面模块的菜单事件过程只是提供功能处理模块的导引链接frmService.Show2、在调用模块之前,应设置好模块的初始化条件frmService.txtSQL=“select*fromserviceInfo”当然调用模块中应该按照封装的原则提供这样的接口。3、调用模块之后,要进行后续处理如frmService.SetFocus让调用的窗体模块显示在最前,是活动子窗体。公用标准模块1、标准模块只包含过程、类型以及数据的声明和定义的模块。在标准模块中,模块级别声明和定义都被默认为Public。2、标准模块用来声明定义系统全局使用的变量、对象和过程,尤其是各窗体模块公用的通用的功能代码尽量集中抽取出来做成标准模块中的变量、对象和过程。3、系统如果有启动Main函数的话,要放置到标准模块中。从窗体模块中提取通用功能PublicFunctionConnectString()AsString定义连接字符串PublicFunctionExecuteSQL(ByValsqlAsString,MsgStringAsString)AsADODB.Recordset执行后台数据库访问操作PublicSubEnterToTab(KeyascAsInteger)单记录数据模块输入时回车换到下一个文本框继续输入PublicFunctionGetRkno()AsString获取添加记录的随机唯一编号PublicSubGetusrqx(ByValuser_idAsString)读取登录用户权限PublicSubFillcombox(comboxfilledAsComboBox,sqlAsString)表格数据模块填充过滤条件选项到combox控件PublicFunctionExecuteSQL(ByValsqlAsString,MsgStringAsString)AsADODB.Recordset'executesSQLandreturnsRecordsetDimcnnAsADODB.Connection:DimrstAsADODB.Recordset:DimsTokens()AsStringOnErrorGoToExecuteSQL_ErrorsTokens=Split(sql)用Split系统字符串函数对sql语句进行,默认空格为分隔符Setcnn=NewADODB.Connectioncnn.CursorLocation=adUseClient设置连接的游标位置cnn.OpenConnectString建立连接,连接字符串从ConnectString函数获取对后台的数据库的访问分成是有返回结果的查询还是不需要返回结果集的数据库操作两种方式来处理IfInStr(“INSERT,DELETE,UPDATE”,UCase$(sTokens(0)))Then数据操作方式cnn.ExecutesqlMsgString=sTokens(0)&“querysuccessful“用cnn.Execute简化执行操作Else查询方式Setrst=NewADODB.Recordsetrst.OpenTrim$(sql),cnn,adOpenKeyset,adLockOptimistic连接数据库并获取查询结果集SetExecuteSQL=rst传出结果集到函数本身MsgString=查询到&rst.RecordCount&条记录EndIf通用后台数据库访问执行功能函数ExecuteSQL_Exit:Setrst=Nothing:Setcnn=Nothing:ExitFunctionExecuteSQL_Error:MsgString=查询错误:&Err.DescriptionResumeExecuteSQL_ExitEndFunction填充combox框数据库选项功能函数1、被操作的组合框控件本身作为传址参数2、后台访问数据库的SQL操作语句作为输入参数3、访问数据库功能实现是调用ExecuteSQL功能函数4、结果数据集先暂时保存在临时RecordSet对象rsttemp中遍历访问结果集数据,并用combox.AddItem方法添加为列表项,注意要用IsNull函数判断字段值可能为空。Main启动主函数SubMain()DimfLoginAsNewfrmLoginfLogin.ShowvbModalIfNotfLogin.OKThenEndEndIfUnloadfLoginfrmMain.ShowEndSub1、启动后进行用户登录检测2、用户登录检测由frmLogin窗体模块负责完成3、frmLogin功能进行了功能封装,并提供了状态接口ok,方便外部查询调用4、Main主函数查询登录检测结果并决定是否显示主界面给用户。5、功能模块的组装和接口设置使整个程序代码结构性强,层次分明。1、用户管理一般包括用户登录检测、权限判断、用户添加、登录用户密码修改等。2、实质上仍然是数据库的访问操作,后台建立有系统用户表user_Info,保存有用户名、密码、权限信息(权限的实现原理)。3、本系统为Main启动登录检测模块登录结果返回判断是否显示主窗体方式值得借鉴。4、登录检测模块采用了功能封装,并提供了结果查询接口OK,是模块间相互衔接调用的好的解决方案。5、用户登录检测模式为三次错误提示,否则直接退出。6、用户管理就是对用户表user_Info的读写操作。用户管理功能模块用户登录检测流程1、判断用户名是否为空2、不为空,读取用户表user_info,查看用户记录是否存在3、用户不存在,提示并重新等待用户输入4、用户存在,匹配检测输入密码是否和记录中的密码吻合。5、密码正确,置检测结果显示接口OK状态为True,隐藏当前窗体,返回Main启动函数。6、密码不正确,置检测结果显示接口OK状态为False,输入次数记录变量miCount+1。7、判断输入次数记录变量miCount是否=3,否则程序直接退出。登录用户修改密码功能流程1、判断确认密码是否正确2、不正确重新输入3、正确的话读取后台数据库该用户记录4、修改数据库密码字段的值为文本框的值5、调用Update方法更新到数据源6、当前窗台隐藏添加用户功能模块流程1、判断用户名是否为空2、不为空的话,读取后台数据库,检测用户名是否已经存在3、继续判断确认密码是否正确4、以上皆成功的话,调用RecordSet.AddNew方法,用户名、密码、权限从相应控件值读取5、RecordSet.Update更新到数据源6、当前窗体隐藏表格数据显示窗体模块管理系统后台数据的表现方式一般有两种1、表格数据窗体模块(用表格控件显示数据信息,方便信息的查阅、对比。)2、单记录数据窗体模块(有文本框、组合框等显示信息数据,一次显示一条记录,方便数据的操作。)表格数据显示窗体模块的调用PrivateSubmenuBookticket_Click()frmticket.txtSQL=select*fromticketinfofrmticket.Showfrmticket.SetFocusEndSub数据源的处理1、模块级Recordset对象mrc(读取后台数据库的查询结果集作为程序数据源)DimmrcAsADODB.Recordset2、窗体导入时,通过公用ExcuteSQL数据库访问函数获取查询结果集。Setmrc=ExecuteSQL(txtSQL,MsgText)2、该数据源同时也作为单记录窗体的数据源,对象要传递给单记录窗体,所以在程序中增加了访问属性接口。PublicPropertyGetGetRecordSet()AsADODB.RecordsetSetGetRecordSet=mrcEndPropertyForm_Load的事件处理过程1、执行txtSQL数据库操作指令,获得结果集由mrc管理,并作为窗体模块的数据源。2、表格控件绑定显示数据源Setdgdlist.DataSource=mrc3、检索条件组合框控件数组进行数据选项的添加(调用通用Fillcombox)4、用户权限读取判断是否为只读、如果是dgdlist.AllowAddNew=Falsedgdlist.AllowDelete=Falsedgdlist.AllowUpdate=False检索组合框的事件处理1、组合框tag属性的设置为对应字段的名称(可简化后面检索条件语句的编写)cmb