立即注册 登录
公卫人 返回首页

asteriod的个人空间 https://www.epiman.cn/?12177 [收藏] [复制] [RSS]

日志

一个基于ACCESS的复杂检索系统的功能实现(原创)

热度 10已有 972 次阅读2009-7-13 09:51 |个人分类:access数据库开发与应用|

最近在做一个基于ACCESS的检索系统,数据量不是很大,但数据检索窗体比较复杂,如下图(软件界面的文字部分做了隐藏处理),左侧是一个控件树,上方为检索的条件设置,第一个字段为检索值,第二个字段为是用户输入的检索值,第三个为检索逻辑,现把主要的技术难点记录一下:
一)、学科树和检索条件的结合查询

    ACCESS提供一个叫“Treeview”的控件,可以制作学科树,单击学科树的某个叶子节点,可以访问相应的学科数据。但用户又要求,检索后,要在不同学科下浏览检索结果,这就要求,单击学科树时,也要同时触发检索。

   具体的实现方法为:

   Treeview的NodeClick事件,定义一个SQL变量,用户获取子节点的信息;同时,对进行条件判断,判断用户是否输入检索条件,如用户未输入检索条件,则直接把这个SQL变量赋给查询结果窗体;如用户输入了检索条件,则把用户的输入转化为SQL语句,并用and条件和这个SQL连接,这样就实现了学科树检索和用户条件检索的结合。

(二)、多字段检索和全文检索

    用户要求能进行全文检索,怎么做呢?可以新建一个查询,把要检索的多个字段进行连接,连接成一个长字段,用户进行全文检索时就在这个字段内检索就可以了。这种实现方法不是特别好,但我测试,在目前的数据量下不会有问题,另外,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

在菜单或按钮上调用就可以。


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 epiman 2009-7-13 11:09
复杂检索系统是不是用上手容易的Visual Basic或者Visual Foxpro设计更好一些?Access这方便接触的不多:(

facelist

您需要登录后才可以评论 登录 | 立即注册

手机版|会员|至尊|接种|公卫人 ( 沪ICP备06060850号-3 )

GMT+8, 2024-5-16 13:14 , Processed in 0.031461 second(s), 7 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部