最近在做一个基于ACCESS的检索系统,数据量不是很大,但数据检索窗体比较复杂,如下图(软件界面的文字部分做了隐藏处理),左侧是一个控件树,上方为检索的条件设置,第一个字段为检索值,第二个字段为是用户输入的检索值,第三个为检索逻辑,现把主要的技术难点记录一下:
(一)、学科树和检索条件的结合查询 ACCESS提供一个叫“Treeview”的控件,可以制作学科树,单击学科树的某个叶子节点,可以访问相应的学科数据。但用户又要求,检索后,要在不同学科下浏览检索结果,这就要求,单击学科树时,也要同时触发检索。 具体的实现方法为: Treeview的NodeClick事件,定义一个SQL变量,用户获取子节点的信息;同时,对进行条件判断,判断用户是否输入检索条件,如用户未输入检索条件,则直接把这个SQL变量赋给查询结果窗体;如用户输入了检索条件,则把用户的输入转化为SQL语句,并用and条件和这个SQL连接,这样就实现了学科树检索和用户条件检索的结合。 一个基于ACCESS的复杂检索系统的功能实现图解教程及关键代码1 一个基于ACCESS的复杂检索系统的功能实现图解教程及关键代码2 (二)、多字段检索和全文检索 用户要求能进行全文检索,怎么做呢?可以新建一个查询,把要检索的多个字段进行连接,连接成一个长字段,用户进行全文检索时就在这个字段内检索就可以了。这种实现方法不是特别好,但我测试,在目前的数据量下不会有问题,另外,ACCESS的查询保存的是SQL语句,并不会增加数据库表的体积,数据库体积不会增大,目前测试速度没有问题。 (三)、查询结果中记录的导出 查询结果存储在一个子窗体内,用户要求把查询结果导出为EXCEL格式。把窗体导出的数据导出方法很多,在其他开发工具里很容易就实现,但在ACCESS里确有些费周折。网上查了下,主要的方法有复制的方法,用VBA代码把子窗体的光标移动到第一条记录,然后写个循环,依次选中所有的行,然后,调用excel把选中的行复制到excel里去。这种方法在数据量小的时候,一点问题没有,但超过1万条是就很慢了。 我使用的是另一种方法,使用vb里的Excel.Application,这个对象可以直接把窗体里的内容复制到一个excel里, 具体如下:
exlpath = getFilepath(, "excel(*.xls)", "保存文件为xls", , False) If exlpath = "" Then Exit Sub (这一段是调用一个函数,给用选择一个保存路径的选择,用户选择的路径保存在exlpath里)
(下面的代码网上有,大意是创建一个excel对象,读取表结构,把表结构拷贝至第一行,从A2单元格开始拷贝数据) Set oExcel = CreateObject("Excel.Application") Set oBook = oExcel.Workbooks.Add()
Me.xiform.Form.Recordset.MoveFirst
For i = 0 To Me.xiform.Form.Recordset.Fields.Count - 1 oBook.Worksheets(1).Cells(1, i + 1).Value = Me.xiform.Form.Recordset.Fields(i).Name Next
oBook.Worksheets(1).Range("A2").CopyFromRecordset Me.xiform.Form.Recordset oBook.SaveAs ("" & exlpath & "") MsgBox "导出成功"
errexit: oBook.Close False oExcel.Quit Set oBook = Nothing Set oExcel = Nothing Exit Sub
errit: MsgBox "错误号为" & Err.Number & " 错误说明:" & Err.Description
End If Resume errexit
仔细看了Excel.Application这个对象,好像和dde有点像,可以对导出的excel格式进行一些更为精确的实质。但实现起来真的有点麻烦。 (四)调用帮助文件: 做好的帮助文件为chm格式,要在菜单或其他地方调用这个帮助文件。首先在模块里做一个函数:
Public Function help() ShellExecute 0, "Open", "" & Application.CurrentProject.Path & "\help\help.chm", "", "", SW_SHOW End Function 在菜单或按钮上调用就可以。 |