1 / 53

航空公司订票系统数据库结构

航空公司订票系统数据库结构. 航空公司订票系统功能模块图. 航空公司订票系统流程分析图. 系统程序模块划分. 从系统程序编制上或任务分配上功能 划分可以这样: 主界面功能模块 公用标准模块 用户管理模块 表格数据功能模块 单记录数据功能模块 通用查询 通用报表、打印模块. 系统主功能模块界面图. 菜单项 工具栏( ToolBar) 状态栏( Statusbar) 侧边栏( TreeView) ImageList( 隐藏,为 ToolBar 和 TreeView 提供图标). 源代码迁移用户机器使用过程. 1、拷贝源代码、数据库备份文件到用户机器上

maryam-bean
Download Presentation

航空公司订票系统数据库结构

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 航空公司订票系统数据库结构

  2. 航空公司订票系统功能模块图

  3. 航空公司订票系统流程分析图

  4. 系统程序模块划分 从系统程序编制上或任务分配上功能划分可以这样: • 主界面功能模块 • 公用标准模块 • 用户管理模块 • 表格数据功能模块 • 单记录数据功能模块 • 通用查询 • 通用报表、打印模块

  5. 系统主功能模块界面图 • 菜单项 • 工具栏(ToolBar) • 状态栏(Statusbar) • 侧边栏(TreeView) • ImageList(隐藏,为ToolBar和TreeView提供图标)

  6. 源代码迁移用户机器使用过程 1、拷贝源代码、数据库备份文件到用户机器上 2、打开SQL Server还原操作恢复数据库ticket 3、用regsvr32注册用户控件userctrproj.ocx 4、打开源程序修改连接字符串(在公用模块Module1中)中的data source为用户的机器名

  7. 系统主功能模块界面设计 添加菜单(菜单编辑器、-、menu、&、显示窗口列表) 添加imglist(隐藏方式left=8600、索引) 添加工具条(图像列表、文本对齐、按钮索引关键字、样式5种、响应事件buttonclick集中处理所有按钮敲击事件) 添加侧边栏(侧边栏由picturbox包容label、button、treeview构成、显示位置大小打开关闭由picturebox的事件过程控制、 picturebox 放置时设置Align属性、 picturebox _Resize事件过程) TreeView操作(选择样式是否带图片链接线展开符号等、图像列表、 TreeView.Nodes.Add方法、 TreeView _NodeClick事件过程)

  8. 系统主界面功能模块编码规则 1、主界面要求是MDIForm窗体,表格数据模块是MDIForm窗体子窗体,其他模块是普通窗体。 2、用户登录检测和权限检测应在主界面显示以前完成(本程序中单独设置用户登录和权限检测模块,由Main函数启动后调用) 3、主界面模块的代码应尽量简洁,主界面的作用是通过菜单和工具栏完成系统功能的导向和链接,功能的实现在功能模块中实现. 4、状态栏为系统使用提供帮助信息和状态信息. 5、侧边栏可以方便用户对功能的查找和调用,是一个好的解决方案,但会增加程序的复杂性.

  9. 系统主界面功能模块编码规则 6、链接功能实现尽量在菜单点击事件过程中完成、其他工具栏、快捷键功能实现只是调用菜单的事件过程、注意状态关联。 7、MDIForm_Initialize和MDIForm_Load两个窗体导入时触发的事件过程, Initialize甚至在Load之前被触发,主要在里面安排窗体包容控件和对象的初始化程序处理,尤其状态条的显示信息、文本框、Label、组合框等的显示文本,和列表框、组合框、树视图等的选项添加设置等。 Load事件过程主要是窗体本身初始化信息的处理程序。

  10. 本系统中用到的一些功能 1、注册表读写功能函数GetSetting、SaveSetting 窗体unload时保存窗体大小位置信息到注册表 窗体load时读取注册表上一次窗体大小位置信息 2、多文档MdiForm窗体的Arrange方法 vbCascade0层叠所有非最小化 MDI 子窗体。 vbTileHorizontal1水平平铺所有非最小化 MDI 子窗体。 vbTileVertical2垂直平铺所有非最小化 MDI 子窗体。 vbArrangeIcons3重排最小化 MDI 子窗体的图标

  11. 功能封装调用原则 Private Sub menuCarbin_Click() frmService.txtSQL = "select * from serviceInfo" frmService.Show frmService.SetFocus End Sub 1、主界面模块的菜单事件过程只是提供功能处理模块的导引链接frmService.Show 2、在调用模块之前,应设置好模块的初始化条件frmService.txtSQL = “select * from serviceInfo”当然调用模块中应该按照封装的原则提供这样的接口。 3、调用模块之后,要进行后续处理如frmService.SetFocus让调用的窗体模块显示在最前,是活动子窗体。

  12. 公用标准模块 1、标准模块只包含过程、类型以及数据的声明和定义的模块。在标准模块中,模块级别声明和定义都被默认为 Public。 2、标准模块用来声明定义系统全局使用的变量、对象和过程,尤其是各窗体模块公用的通用的功能代码尽量集中抽取出来做成标准模块中的变量、对象和过程。 3、系统如果有启动Main函数的话,要放置到标准模块中。

  13. 从窗体模块中提取通用功能 Public Function ConnectString() As String 定义连接字符串 Public Function ExecuteSQL(ByVal sql As String, MsgString As String) As ADODB.Recordset 执行后台数据库访问操作 Public Sub EnterToTab(Keyasc As Integer) 单记录数据模块输入时回车换到下一个文本框继续输入 Public Function GetRkno() As String 获取添加记录的随机唯一编号 Public Sub Getusrqx(ByVal user_id As String) 读取登录用户权限 Public Sub Fillcombox(comboxfilled As ComboBox, sql As String) 表格数据模块填充过滤条件选项到combox控件

  14. Public Function ExecuteSQL(ByVal sql As String, MsgString As String) As ADODB.Recordset 'executes SQL and returns Recordset Dim cnn As ADODB.Connection: Dim rst As ADODB.Recordset: Dim sTokens() As String On Error GoTo ExecuteSQL_Error sTokens = Split(sql) 用Split系统字符串函数对sql语句进行,默认空格为分隔符 Set cnn = New ADODB.Connection cnn.CursorLocation = adUseClient 设置连接的游标位置 cnn.Open ConnectString 建立连接,连接字符串从ConnectString 函数获取 对后台的数据库的访问分成是有返回结果的查询还是不需要返回结果集的数据库操作两种方式来处理 If InStr(“INSERT,DELETE,UPDATE”, UCase$(sTokens(0))) Then 数据操作方式 cnn.Execute sql MsgString = sTokens(0) & “ query successful“用cnn.Execute 简化执行操作 Else 查询方式 Set rst = New ADODB.Recordset rst.Open Trim$(sql), cnn, adOpenKeyset, adLockOptimistic 连接数据库并获取查询结果集 Set ExecuteSQL = rst 传出结果集到函数本身 MsgString = "查询到" & rst.RecordCount & " 条记录 " End If

  15. 通用后台数据库访问执行功能函数 ExecuteSQL_Exit: Set rst = Nothing: Set cnn = Nothing: Exit Function ExecuteSQL_Error: MsgString = "查询错误: " & Err.Description Resume ExecuteSQL_Exit End Function

  16. 填充combox框数据库选项功能函数 1、被操作的组合框控件本身作为传址参数 2、后台访问数据库的SQL操作语句作为输入参数 3、访问数据库功能实现是调用ExecuteSQL功能函数 4、结果数据集先暂时保存在临时RecordSet对象rsttemp中 遍历访问结果集数据,并用combox.AddItem方法添加为列表项,注意要用IsNull函数判断字段值可能为空。

  17. Main启动主函数 1、启动后进行用户登录检测 2、用户登录检测由frmLogin窗体模块负责完成 3、 frmLogin功能进行了功能封装,并提供了状态接口ok,方便外部查询调用 4、 Main主函数查询登录检测结果并决定是否显示主界面给用户。 5、功能模块的组装和接口设置使整个程序代码结构性强,层次分明。 Sub Main() Dim fLogin As New frmLogin fLogin.Show vbModal If Not fLogin.OK Then End End If Unload fLogin frmMain.Show End Sub

  18. 用户管理功能模块 1、用户管理一般包括用户登录检测、权限判断、用户添加、登录用户密码修改等。 2、实质上仍然是数据库的访问操作,后台建立有系统用户表user_Info,保存有用户名、密码、权限信息(权限的实现原理)。 3、本系统为Main启动 登录检测模块 登录结果返回 判断是否显示主窗体方式值得借鉴。 4、登录检测模块采用了功能封装,并提供了结果查询接口OK,是模块间相互衔接调用的好的解决方案。 5、用户登录检测模式为三次错误提示,否则直接退出。 6、用户管理就是对用户表user_Info的读写操作。

  19. 用户登录检测流程 1、判断用户名是否为空 2、不为空,读取用户表user_info,查看用户记录是否存在 3、用户不存在,提示并重新等待用户输入 4、用户存在,匹配检测输入密码是否和记录中的密码吻合。 5、密码正确,置检测结果显示接口OK状态为True,隐藏当前窗体,返回Main启动函数。 6、密码不正确,置检测结果显示接口OK状态为False,输入次数记录变量miCount+1。 7、判断输入次数记录变量miCount是否=3,否则程序直接退出。

  20. 登录用户修改密码功能流程 1、判断确认密码是否正确 2、不正确重新输入 3、正确的话读取后台数据库该用户记录 4、修改数据库密码字段的值为文本框的值 5、调用Update方法更新到数据源 6、当前窗台隐藏

  21. 添加用户功能模块流程 1、判断用户名是否为空 2、不为空的话,读取后台数据库,检测用户名是否已经存在 3、继续判断确认密码是否正确 4、以上皆成功的话,调用RecordSet.AddNew方法,用户名、密码、权限从相应控件值读取 5、 RecordSet.Update更新到数据源 6、当前窗体隐藏

  22. 表格数据显示窗体模块 管理系统后台数据的表现方式一般有两种 1、表格数据窗体模块(用表格控件显示数据信息,方便信息的查阅、对比。) 2、单记录数据窗体模块(有文本框、组合框等显示信息数据,一次显示一条记录,方便数据的操作。)

  23. 表格数据显示窗体模块的调用 Private Sub menuBookticket_Click() frmticket.txtSQL = "select *from ticketinfo" frmticket.Show frmticket.SetFocus End Sub

  24. 数据源的处理 1、模块级Recordset对象mrc(读取后台数据库的查询结果集作为程序数据源) Dim mrc As ADODB.Recordset 2、窗体导入时,通过公用ExcuteSQL数据库访问函数获取查询结果集。 Set mrc = ExecuteSQL(txtSQL, MsgText) 2、该数据源同时也作为单记录窗体的数据源,对象要传递给单记录窗体,所以在程序中增加了访问属性接口。 Public Property Get GetRecordSet() As ADODB.Recordset Set GetRecordSet = mrc End Property

  25. Form_Load的事件处理过程 1、执行txtSQL数据库操作指令,获得结果集由mrc管理,并作为窗体模块的数据源。 2、表格控件绑定显示数据源 Set dgdlist.DataSource = mrc 3、检索条件组合框控件数组进行数据选项的添加(调用通用Fillcombox) 4、用户权限读取判断是否为只读、如果是 dgdlist.AllowAddNew = False dgdlist.AllowDelete = False dgdlist.AllowUpdate = False

  26. 检索组合框的事件处理 1、组合框tag属性的设置 为对应字段的名称(可简化后面检索条件语句的编写) cmbfind(2).Tag = “出发城市” 2、组合框后台数据库查询指令的赋值 sqlcmbfill(2) = "select distinct departCity from ticketinfo" 3、调用通用Fillcombox过程为组合框填充后台字段的数据选项 Call Fillcombox(cmbfind(i), sqlcmbfill(i)) 4、在组合框中添加一[全部]选项,并设置为默认选项 cmbfind(i).AddItem "[全部]", 0 cmbfind(i).ListIndex = 0

  27. 检索组合框的事件处理 5、检索组合框的选项点击事件过程(选择数据源检索条件、表格显示过滤后的记录信息) Private Sub cmbfind_Click(Index As Integer) 6、根据检索组合框数组的值,生成数据源的检索条件语句 For i = 0 To 5 If cmbfind(i).ListIndex <> -1 And cmbfind(i).Text <> "[全部]" Then sqlwhere = sqlwhere & " and " & cmbfind(i).Tag & "='" & cmbfind(i).Text & "'" Next

  28. 检索组合框的事件处理 7、如果条件不为空则设置数据源为该检索 条件选项 If sqlwhere <> "" Then mrc.Filter = Right(sqlwhere, Len(sqlwhere) - 4) 8、如果条件为空,重新设置数据源并更新表格数据 If sqlwhere = "" Then mrc.Filter = "" mrc.Requery End If 9、表格控件绑定数据同步更新为最新的数据源数据 dgdlist.ReBind

  29. 按钮事件处理过程 Private Sub cmdfresh_Click() '只有多用户应用程序需要 On Error GoTo RefreshErr Set dgdlist.DataSource = Nothing mrc.Requery Set dgdlist.DataSource = mrc Exit Sub RefreshErr: MsgBox Err.Description End Sub Private Sub cmdticketshow_Click() frmticketInfo.Show 1 End Sub 1、刷新按钮事件过程 涉及到数据库访问的应该有完整的错误处理 2、单记录查询案例事件过程 功能模块的调用 调用之前可设置初始条件. 3、查询、打印通用功能实现

  30. 单记录数据表示模块 1、一次显示一条记录的信息 2、Label表示字段名称,文本框和组合框字段内容显示和编辑 3、提供当前记录的移位操作 4、一般数据操作放置在单记录模块里 5、文本框和组合框绑定后台数据库的对应字段

  31. 单记录数据表示模块界面设计 1、每个文本框、组合框在程序中对datafield属性和datasource属性进行设置,动态绑定数据源字段名 2、记录定位包括movefirst、movenext、moveprevious、movelast四个按钮和一个记录位指示label,统一位于picStatBox图片容器中 3、数据操作 包括添加、编辑、删除、更新、取消、刷新、关闭七个按钮,其中更新、取消位于添加、编辑之后,统一位于picButtons图片容器中 SetButtons(True) SetButtons(False)

  32. 单记录数据表示模块数据源 1、整个模块的数据源是RecordSet对象adoPrimaryRS Dim WithEvents adoPrimaryRS As ADODB.Recordset 2、数据源adoPrimaryRS其实和表格数据显示模块的数据源mrc是一致的 Set adoPrimaryRS = frmticket.GetRecordSet 3、WithEvents表示此RecordSet对象可以接受预定义的响应事件,在程序中有MoveComplete和WillChangeRecord两个事件的事件过程 Private Sub adoPrimaryRS_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) End Sub Private Sub adoPrimaryRS_WillChangeRecord(ByVal adReason As ADODB.EventReasonEnum, ByVal cRecords As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) End Sub

  33. 单记录数据表示模块状态标识 Dim mvBookMark As Variant '记录书签 Dim mbEditFlag As Boolean '编辑状态标识 Dim mbAddNewFlag As Boolean '添加状态标识 Dim mbDataChanged As Boolean ‘数据修改标识 Private Sub cmdEdit_Click() mbEditFlag = True SetButtons False End Sub Private Sub cmdCancel_Click() SetButtons True mbEditFlag = False End SUb

  34. 模块Form_Load过程 1、RecordSet数据源数据读取 2、文本框设定绑定的后台字段名 For i = 0 To adoPrimaryRS.Fields.Count - 1 txtFields(i).DataField = adoPrimaryRS.Fields(i).Name Next 3、文本框设定绑定数据源 For Each oText In Me.txtFields Set oText.DataSource = adoPrimaryRS Next 4、设定数据操作按钮初始状态 SetButtons True 5、填充组合框对应字段数据选项列表 6、读取权限设定 7、设置状态标识变量的初始值

  35. 模块事件过程 按钮事件响应过程: cmdAdd_Click() 、cmdDelete_Click()、 cmdRefresh_Click() 、cmdEdit_Click() 、cmdEdit_Click()、 cmdUpdate_Click() 、cmdFirst_Click() 、cmdLast_Click() 、cmdNext_Click() 、cmdPrevious_Click() 其他过程: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Private Sub Combo1_fill() Private Sub txtFields_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) Private Sub Combo1_Click(Index As Integer)

  36. 创建Connection对象 由于在登录窗口中就开始连接数据库,所以在登录窗口frmLogin1的Load事件里创建Connection对象,如图所示

  37. 创建RecordSet对象 在“企业资质管理系统”中的通用查询窗口中,每次查询完都允许用户单击工具栏的“打印预览”或“打印”按钮打印当前的数据。例如查询“技术职称”为“工程师”的那些人员后,只打印查询结果中的数据,如图。

  38. 通用查询功能模块 为数据表提供统一通用的查询功能,并做成ActiveX DLL组件形式提供中间层调用服务。

  39. 查询组件类模块 1、包括类模块clsQuery(组件的调用、程序间数据的传递)和窗体模块frmQuery(提供查询操作的用户界面,并运行得到查询结果) 2、 在类模块clsQuery中 '定义个内部表单frmquery的实例类型, Private frmnewquery As New frmQuery 3、类模块中提供的外部访问查询结果接口: Public Property Get rsQuery() As ADODB.Recordset Set rsQuery = mrsQuery End Property

  40. 查询组件类模块 查询结果集在组件内部的交换: Public Sub ShowQueryForm() '为ActiveX DLL内部的表单设置源记录集 Set frmnewquery.rsFrmSource = rsSource '利用类和窗体的属性来交换数据,在 '在调用dll的应用程序中设定类的数据库链接属性 '这个链接属性要提供给内部表单使用,用来链接数据库 Set frmnewquery.cnnFrmQuery = cnnQuery frmnewquery.Show vbModal '返回查询窗体所得的记录集给类的查询结 '果记录集(类的一个属性),以备其他程序所用 Set rsQuery = frmnewquery.rsFrmQuery '************************************* '以上的过程即完成了数据交换过程 '************************************* End Sub

  41. 查询组件类模块 '定义字符串变量,用以存储一条查询语句 Private mstrQuerySql As String 'local copy '定义属性变量,用以存储内部表单返回的记录集 Private mrsQuery As ADODB.Recordset 'local copy '定义属性变量,用以存储从外部应用程序传入的源记录集 Private mrsSource As ADODB.Recordset 'local copy '定义个Command对象,用来取得记录集 Private mcommQuery As ADODB.Command 'local copy '定义一个数据库的链接,用来获取记录集之用 Private mcnnQuery As ADODB.Connection 'local copy

  42. 查询组件类模块 类模块的初始化方法: Public Sub InitDB(ByVal temConn As ADODB.Connection, ByVal temRs As ADODB.Recordset) Set cnnQuery = temConn Set rsSource = temRs End Sub

  43. 查询组件窗体模块 '定义模块级属性变量,存放SQL语句 Private mstrFrmSql As String '定义一个clsScoreQuery类的实例,用以调用封装在类中的函数 Private objQuery As New clsQuery '定义存放查询结果记录集的对象变量,属性变量 Private mrsFrmQuery As ADODB.Recordset 'local copy '定义存放从外部传入的记录集的对象变量,属性变量 Private mrsFrmSource As ADODB.Recordset 'local copy '定义命令对象,属性变量 Private mcommFrmQuery As ADODB.Command 'local copy '定义链接对象(属性变量),需要从外部获取 Private mcnnFrmQuery As ADODB.Connection 'local copy

  44. 查询组件窗体模块获得结果集 Private Sub cmdOk_Click() Dim commSql As String '在这里释放Command对象 If Not (commFrmQuery Is Nothing) Then Set commFrmQuery = Nothing End If '如果存在查询子句,那么就与源记录集中取得的字符串链接成完整的SQL语句8 If txtQuery.Text <> vbNullString Then commSql = rsFrmSource.Source & " " & "where" & " " commSql = commSql & strFrmSql Else '如果没有查询子句,就返回数据库中的所有记录 commSql = rsFrmSource.Source End If '调用类模块中的方法,返回一个记录集给表单的属性rsFrmQuery。 Set rsFrmQuery = objQuery.GetRecordSet(commSql, cnnFrmQuery) '此时,如果将链接关闭的话,那么查询得到的记录结也将不能正确的返回给用户 '因此下面的两条语句需要注释掉 'cnnFrmQuery.Close 'Set cnnFrmQuery = Nothing Unload Me End Sub

  45. 查询组件窗体模块 条件字段的选择同步更新操作符和值组合框的列表项填充 Private Sub cboFields_Click() 查询字符串生成过程: Private Sub cmdAdd_Click()

  46. 1.使用DataReport对象的Show方法实现打印预览 Show方法是用来打印预览当前的DataReport对象,其语法是:DataReport.Show 在前面曾创建了数据报表对象DataReport10,怎么实现它的打印预览功能呢?打开主窗体Form11,单击菜单“分组报表打印”的子菜单项“按人员技术职称分组统计”,弹出代码窗口,对象名:ryzc,编辑它的Click事件,如图所示。

  47. 完成了上述代码编写后,运行窗体,单击菜单“分组报表打印”的子菜单项“按人员技术职称分组统计”就可以预览报表对象DataReport10,如图所示。

  48. 2.设置DataReport对象为启动对象 如果想在程序执行时直接显示DataReport对象,而不经过菜单或窗体的调用,可以将数据报表设置为工程的启动对象,方法是:单击“工程→工程1属性”菜单项,弹出“工程1-工程属性”对话框,选择“通用”选项卡,将其中的启动对象设置为要预览的报表对象名称,如下页图所示。设置完报表DataReport10为启动对象,直接运行工程(按下“F5”键),报表就以打印预览的形式出现。

  49. 报表的打印 经过预览后的报表符合用户要求后,就可以打印输出了。打印一个数据报表可以使用下面两种方法之一。 1.使用打印按钮 用户使用“打印预览”后,出现预览窗口,可以单击窗口工具栏的“”打印按钮,直接将当前报表打印输出。 2.可以通过使用 PrintReport 方法编程打印 编程打印一个报表时,有两种选择:通过显示“打印”对话框打印,或不显示对话框打印。

More Related