(本文作于2010年)前不久,单位领导交给我一项任务,建立媒体资源数据查询和管理系统。随着单位媒体资源的日积月累,各种媒体存储介质越来越多,这些数以万计的媒体数据,记载着当地政治、经济、社会人文等发展的历史,是当地一笔宝贵的历史资料,因此,搞好这些媒体资源的管理尤其重要。
对于数据的管理,数据库是最好的平台。数据库,即有结构的数据集合,通俗的讲,就是数据的仓库。因此,我想到了Access。在办公软件Office套件中,最为人们熟悉的是Word和Excel,因为它们功能强大且方便易用,更因为它们不仅可用于办公,还可用于个人写作和家庭记帐理财等。同为Office套件中一部分的Access,虽然有着同样强大的功能,但使用的人却相对少些,不像Word和Excel那样广泛。事实上,真正用过Access的人,对其强大功能和灵活应用均称赞“不错,很好的……。”Microsoft Access是一种关系式数据库,关系式数据库由一系列表组成,表又由一系列行和列组成,每一行是一个记录,每一列是一个字段,每个字段有一个字段名,字段名在一个表中不能重复。
表与表之间可以建立关系(或称关联,连接),以便查询相关联的信息。Access数据库以文件形式保存,文件的扩展名是mdb。
Access 数据库由六种对象组成,它们是表、查询、窗体、报表、宏、页和模块。
表(Table) ——表是数据库的基本对象,是创建其他5种对象的基础。表由记录组成,记录由字段组成,表用来存贮数据库的数据,故又称数据表。
查询(Query)——查询可以按索引快速查找到需要的记录,按要求筛选记录并能连接若干个表的字段组成新表。
窗体(Form)——窗体提供了一种方便的浏览、输入及更改数据的窗口。还可以创建子窗体显示相关联的表的内容。窗体也称表单。
报表(Report)——报表的功能是将数据库中的数据分类汇总,然后打印出来,以便分析。
宏(Macro)——宏相当于DOS中的批处理,用来自动执行一系列操作。Access列出了一些常用的操作供用户选择,使用起来十分方便。
模块(Module)——模块的功能与宏类似,但它定义的操作比宏更精细和复杂,用户可以根据自己的需要编写程序。模块使用Visual Basic编程。
页——是一种特殊的直接连接到数据库中数据的一种WEB页。通过数据访问页将数据发布到Internet 或Intranet上,并可以适用浏览器进行数据的维护和操作。
从上述特点可以看出,Microsoft Access数据库是一个开放式的数据管理开发平台,适用于小型企事业单位进行数据管理,开发和应用十分方便。以前,我也曾经应用它开发过诸如“用户收费管理”和“物资管理”等,实践证明,应用数据库管理数据,对于数据的查询、统计非常准确和快捷,大大地提高了办公自动化水平和工作效率。当然,要开发一个数据库也并非那么容易,你除需要熟练掌握数据库开发应用的技巧外,还需要具备一定编程能力和美术功底,这是因为,数据库的开发是建立在实际应用的基础上的,也就是说,你开发的数据库必须与工作实际相结合,具有实用性,同时界面也要友好和美观。下面,我就“媒体资源数据库”的开发实践介绍给大家,希望能对使用Access数据库的朋友们有一点帮助。我要声明的是,我的开发水平还处在初级阶段,采用的一些方法也是初级的(笨的)。
一、开发前的准备工作
干每一项工作都不外乎这样几个阶段:即准备阶段、实施阶段和总结阶段(对于系统开发而言叫做后期调试和完善阶段)。开发数据库也是如此,实施前必须进行前期准备。
(一)准备工具
这里的工具就是备用的工具书和工作平台。开发数据时会用到至少两套工具书:《Access使用手册》和《Visual Basic编程》;开发数据库时需要的平台是Microsoft Access系统、Photoshop系统(用于图形处理和制作)、图标制作系统等,如果要制作帮助文件还需要帮助文件制作系统。应用这些系统制作“图标”和主控界面的装饰图。(下图为装饰图)
(二)需求调查
开发的应用系统是否能满足实际使用的要求,关键看你是否进行了详细的需求调查和了解。只有做了详细的需求调查,才能开发出实用的应用系统来。对于这一点,很多初学者往往会忽视,只是埋头开发,结果弄出来的东西总是离实际要求相差甚远,根本不能使用。
对于本单位的“媒体资源管理”数据库而言,主要需要调查了解以下几点:
1.数据量多大。这是一个关键,如果数据量非常之大,那么应用Access是不行的。我了解到,单位的媒体资源数据量不大,平时的使用管理数据量也不大,因此,我决定使用Access来开发;
2.基本信息。要求每一个素材登记有编号、规格、类别、时长、首拍时间、拍摄人、素材内容、存放位置等基本信息;
3.媒体资源的规格。对于存储介质而言,我了解到的规格主要有模拟和数据磁带、光盘,磁带又分为大1/2、小1/2等;
4.媒体资源的类别。因为这些媒体资源记录的是当地的政治、经济等全方位的影像资料,为了便于管理,就必须对它进行科学合理的分类。但单位还没有明确的规定,我只能暂时按素材的内容所具有的性质分为:党群类、政务类、工业类、农业类、商业类、文教类、卫生类、体育类、科技类、军事类、综合类(因为有的磁带记录的内容多而杂)共11类;
5.编号规定。对于这些素材资料,每一个体如何编号,存放库位如何规定(编号),单位没有明确;
6.管理流程。这是与工作实际最紧密的重要环节,只有了解了实际管理的工作流程,才能按照流程需要来开发数据库。我了解到单位对于媒体资源的管理有专门的部门和人员,平时使用的人员也相对集中但不确定,平时随时都可能进行数据查询、素材借出或归还,借出或归还时都要主管领导批准和保管员检查签收等,当前应用一台计算机进行管理,将来也可能利用单位内部局域网联网管理;
7.查询功能。要求能灵活的进行多种条件的查询和精确查询,查询的主要条件是首次拍摄时间、素材内容提要等;
8.报表功能。要求能准确的进行总计或分类统计,对于借出、归还要有详细的登记统计等。
(三)框架构思
框架构思十分重要,一个好的框架,使数据库结构简单、关系明确、功能实用、使用方便。根据调查了解到信息,媒体资源数据库应该是一个开放式的数据库,即所有信息都是不固定的,因此,先期开发的数据库数据不能固定死,必须可变。同时,由于使用人员对于数据库的操作使用技能不高,因此,数据库的操作使用应越简单越好,应采用点击直接选择的方式,少使用或不使用文字录入,以降低使用难度,达到方便快捷的目的。
基于上述因素的考虑,媒体资源数据库以素材基本信息为主界面,上部为单个素材的基本信息,中部为该素材的借出、归还登记明细,底部为数据查询、数据库备份、报表等功能命令按钮和库存量数据动态显示。(下图为数据库主控界面)
二、实施系统开发
(一)明确表与表之间的关系
Access数据库是关系数据库,表与表之间可以建立关系,数据可以互相调用,所以,首先必须明确表与表之间应建立哪些关系。媒体资源数据库主表是“媒体资源登记表”,与它相关的主要是“借出登记表”和“归还登记表”,主表与副表之间应建立唯一的连接关系,而表中确保“唯一性”的字段是“磁带编号”,因此,它们的连接关系是建立在“磁带编号”关键字段上的。另外,主表中的“拍摄人”、“磁带规格”、“素材类别”及副表中“借出人”、“批准人”、“经办人”、“归还人”等信息由于是随时可变的,所以必须另外建立相应的独立表并与之建立连接关系,以便主、副表中的相应字段直接从中调用数据。
(二)建立副表
1.规格表
字段:规格,类型:文本(10个字符),并设该字段为主键。
2.类别表
字段:类别,类型:文本(10个字符),并设该字段为主键。
3.部门表
字段:部门,类型:文本(8个字符),并设该字段为主键。
4.职务表
字段:职务,类型:文本(6个字符),并设该字段为主键。
5.事由表
字段:事由,类型:文本(10个字符),并设该字段为主键。
6.人员表
字段:姓名,类型:文本(8个字符),并设该字段为主键。
字段:性别,类型:文本(2个字符),并设该字段从查阅向导——键入值“男、女”中获取。
字段:部门,类型:文本(8个字符),并设该字段从查阅向导——“部门”表中获取。
7.经办人表
字段及属性设置同人员表
8.批准人表
字段及属性设置同人员表,其中“职务”字段从“职务表”中获取。
9.借出登记表
字段:借出ID,类型:自动编号,并设该字段为主键。
字段:磁带编号,类型:文本(8个字符)。
字段:借出日期,类型:日期/时间(长日期格式,默认值:=Date$())。
字段:借出时间,类型:日期/时间(长时间格式,默认值:=Time$())。
字段:借出人,类型:文本(8个字符),并设该字段从查阅向导——“人员”表中获取。
字段:借出事由,类型:文本(10个字符),并设该字段从查阅向导——“事由”表中获取。
字段:批准人,类型:文本(8个字符),并设该字段从查阅向导——“批准人”表中获取。
字段:经办人,类型:文本(8个字符),并设该字段从查阅向导——“经办人”表中获取。
字段:次数,类型:数字(长整型,默认值:1)。
10.归还登记表
字段:归还ID,类型:自动编号,并设该字段为主键。
字段:磁带编号,类型:文本(8个字符)。
字段:归还日期,类型:日期/时间(长日期格式,默认值:=Date$())。
字段:归还时间,类型:日期/时间(长时间格式,默认值:=Time$())。
字段:归还人,类型:文本(8个字符),并设该字段从查阅向导——“人员”表中获取。
字段:经办人,类型:文本(8个字符),并设该字段从查阅向导——“经办人”表中获取。
字段:次数,类型:数字(长整型,默认值:1)。
(三)建立主表
11.磁带信息登记表
字段:磁带编号,类型:文本(8个字符),并设该字段为主键。
字段:磁带规格,类型:文本(10个字符),并设该字段从查阅向导——“规格”表中获取。
字段:素材类别,类型:文本(10个字符),并设该字段从查阅向导——“类别”表中获取。
字段:素材时长,类型:数字(长整型,默认值:0)。
字段:素材节数,类型:数字(长整型,默认值:1)。
字段:首拍日期,类型:日期/时间(长日期格式,掩码:9999年99月99日;0;_)。
字段:拍摄人,类型:文本(8个字符),并设该字段并设该字段从查阅向导——“人员”表中获取。
字段:存放位置,类型:文本(10个字符)。
字段:内容提要,类型:备注。
字段:关键贞1-4,类型:OLE 对象(共4个)。
字段:次数,类型:数字(长整型,默认值:1)。
以上表如下图
(四)创建关系
创建关系很简单,只需要打开关系编辑界面,将副表中的相关字段拖到主表的相关字段即可。如:将事由表中字段“事由”拖到借出登记表中字段“借出事由”处,单击对话框“确定”,两个表中的这两个字段即建立了关系。媒体资源数据库的表间关系如下图:
(五)创建查询
如果你对Visual Basic编程比较熟练,那么,可以使用Visual Basic编程来实现相关查询,如果不熟悉Visual Basic编程,就用Access数据库中创建查询向导来建立需要的查询表。从前面了解需求情况来看,媒体资源数据库除了能灵活地进行各个字段查找外,还要实现针对首拍日期和内容提要两条件的精确查找,另外,主控界面底部是关于库存量的动态显示,这就要求我们建立实时的数据统计,因此,媒体资源数据库应建立如下图中所显示的相关查询,以便窗体和报表使用。
这里要着重说明的是,基于“首拍日期”和“内容提要”两个条件的精确查询,需要在“磁带信息登记表查询”中“首拍日期”字段和“内容提要”两个字段设置查询条件,而“首拍日期”这个条件又是基于查询者临时输入的日期范围,因此,它必须是从输入日期数据的窗口中获得的相关日期信息;而“内容提要”字段中的数据不是固定的数据,查询条件不能固定,需要进行模糊查询。又因为是精确查找,这两个查询条件的逻辑关系应该是“与”的关系。
鉴于上述要求,在“磁带信息登记表查询”中“首拍日期”字段的“条件”栏中输入“>=[Forms]![报表日期范围]![开始日期] And <=[Forms]![报表日期范围]![终止日期]”查询条件,而在“磁带信息登记表查询”中“内容提要”字段的“条件”栏中输入“Like [输入内容提要可用通配符如:*人大*]”查询条件,且让它们在同一行中,形成逻辑与的关系。
对于其它查询表的建立可以在设计视图中逐个创建,这里不再叙述。
(六)创建窗体
窗体是人机对话的载体,没有窗体,人机对话将很难实现。窗体的创建步骤与表的创建步骤基本相似,先要创建非主控窗体,后创建主控窗体,这是因为,主控窗体的子窗体和部分数据来源于非主控窗体。使用窗体创建向导创建如“部门”等非主控窗体十分简单,而子窗体不需要手动创建,它在创建主控窗体时会自动创建的,所以,这里只着重说明主控窗体的创建过程。(所创建的窗体如下图所示)
主控窗体“磁带信息登记表”是整个数据库的操作平台,所有操作将在这个窗体上完成,它既有基本信息输入窗口,又有各种功能命令按钮;既有主窗体,又有子窗体,因此,创建过程比较复杂。
1.创建基本信息登记表窗体,进入窗体设计界面;
2.调整窗体大小,安排各个字段的位置,插入装饰图,使窗体美观大方;
3.设置窗体主要属性和参数:
(1)记录来源:磁带信息登记表;
(2)标题:影像资料信息登记;
(3)默认窗体:单个窗体;
(4)最大最小化按钮:最小化按钮;
(5)宽度:25.407厘米;
(6)打开:[事件过程],并进入代码编辑界面,输入如下代码:
Private Sub Form_Open(Cancel As Integer)
DoCmd.SelectObject acForm, “磁带信息登记表”, True
DoCmd.Minimize ‘最小化数据库
End Sub
4.创建借出登记子窗体
(1)将贷出登记表拖入界面中部左侧位置;
(2)设置借出登记表 子窗体属性及参数:
名称:借出登记表 子窗体;
源对象:借出登记表 子窗体;
链接子字段:磁带编号;
链接主字段:磁带编号;
宽度:14.101厘米;
高度:3.164厘米;
特殊效果:凹陷;
边框样式:实线;
边框宽度:细线。
(4)设置子窗体表属性及参数:
记录源:借出登记表;
标题:借出登记表 子窗体;
默认视图:数据表。
5.创建归还登记子窗体
归还登记子窗体的创建方法及属性、参数的设置与借出登记子窗体相同。
6.创建总量统计子窗体
(1)先将窗体页脚向下拉开一定距离,以便放置子窗体;
(2)将总量统计查询表拖至窗体页脚处;
(3)其它方法同上述子窗体的创建方法。
7.创建报表日期范围窗体
(1)用设计视图创建两个非绑定控件,分别作为“开始日期”和“终止日期”输入窗口,并在这两个控件左侧分别使用标签工具创建两个标签,输入“开始日期”和“终止日期”;
(2)设置窗体主要属性“打开”——“事件过程”,进入代码编辑状态,输入如下代码:
Private Sub Form_Open(Cancel As Integer)
Me.Caption = Forms![报表日期范围].OpenArgs
Forms!报表日期范围!开始日期.SetFocus
End Sub
(3)创建一个“预览……”命令按钮,设置主要属性“单击”——“事件过程”,进入代码编辑状态,输入如下代码:
Private Sub 预览_Click()
If IsNull([开始日期]) Or IsNull([终止日期]) Then
MsgBox “您必须输入开始时间和终止时间。”
DoCmd.GoToControl “开始日期”
Else
If [开始日期] > [终止日期] Then
MsgBox “截止日期必须大于开始日期。”
DoCmd.GoToControl “开始日期”
Else
Me.Visible = False
End If
End If
End Sub
8.创建命令按钮
(1)创建“刷新”命令按钮
使用Access系统工具在适当位置创建一个命令按钮,在弹出的对话框中选择记录操作——刷新数据,系统会自动建立相关代码如下:
Private Sub 刷新_Click()
On Error GoTo Err_刷新_Click
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
Exit_刷新_Click:
Exit Sub
Err_刷新_Click:
MsgBox Err.Description
Resume Exit_刷新_Click
End Sub
(2)创建“查找”命令按钮
方法同上。代码如下:
Private Sub 查找_Click()
On Error GoTo Err_查找_Click
Screen.PreviousControl.SetFocus
DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70
Exit_查找_Click:
Exit Sub
Err_查找_Click:
MsgBox Err.Description
Resume Exit_查找_Click
End Sub
(3)创建“精确查找”命令按钮
方法同上,代码如下:
Private Sub 精确查找_Click()
On Error GoTo Err_精确查找_Click
Dim stDocName As String
Dim stLinkCriteria As String
DoCmd.OpenForm “报表日期范围”, , , , , acDialog, “影像资料统计表”
If Not IsLoaded(“报表日期范围”) Then
Cancel = True
End If
stDocName = “资料精确查询”
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_精确查找_Click:
Exit Sub
Err_精确查找_Click:
MsgBox Err.Description
Resume Exit_精确查找_Click
End Sub
(4)创建“数据备份”命令按钮
方法同上,代码如下:
Private Sub 数据备份_Click()
On Error GoTo 11 ‘如果删除文件夹出错,执行第11行
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)
fso.DeleteFolder (“D:mtzy”) ‘删除已有的文件夹及文件
11 MkDir “D:mtzy” ‘创建文件夹
On Error GoTo 22 ‘如果复制文件夹出错,执行第22行
CopyFile “C:mtzymtzt.ico”, “D:mtzymtzt.ico”, 0 ‘复制并覆盖文件
CopyFile “C:mtzySecured.mdw”, “D:mtzySecured.mdw”, 0 ‘复制并覆盖文件
CopyFile “C:mtzy媒体资源管理.mdb”, “D:mtzy媒体资源管理.mdb”, 0 ‘复制并覆盖文件
CopyFile “C:mtzy媒体资源管理.bak”, “D:mtzy媒体资源管理.bak”, 0 ‘复制并覆盖文件
CopyFile “C:mtzy媒体资源管理.lnk”, “D:mtzy媒体资源管理.lnk”, 0 ‘复制并覆盖文件
CopyFile “C:mtzy媒体资源管理.snp”, “D:mtzy媒体资源管理.snp”, 0 ‘复制并覆盖文件
Exit_数据备份_Click:
Exit Sub
22 Err_数据备份_Click:
MsgBox Err.Description
Resume Exit_数据备份_Click
End Sub
(5)创建“基本信息录入”命令按钮
方法同上,选择窗体操作——打开窗体。代码如下:
Private Sub 录入基本信息_Click()
On Error GoTo Err_录入基本信息_Click
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = “基本信息录入”
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_录入基本信息_Click:
Exit Sub
Err_录入基本信息_Click:
MsgBox Err.Description
Resume Exit_录入基本信息_Click
End Sub
(6)创建基本信息录入窗体中的各种命令按钮,
方法同上,这里不再叙述。
(7)创建报表命令按钮
关于报表系统的相关命令按钮的创建,是在报表创建完毕后进行的。这里以“资料总表”命令按钮为例加以说明,其它报表命令按钮的创建方法相同。
使用Access系统工具在适当位置创建一个命令按钮,在弹出的对话框中选择报表操作——打开预览报表,系统会自动建立相关代码如下:
Private Sub 资料总表_Click()
On Error GoTo Err_资料总表_Click
Dim stDocName As String
stDocName = “影像资料统计表”
DoCmd.OpenReport stDocName, acPreview
Exit_资料总表_Click:
Exit Sub
Err_资料总表_Click:
MsgBox Err.Description
Resume Exit_资料总表_Click
End Sub
通过上述步骤的创建,主控窗体创建完毕。其界面如下图:
(七)报表制作
数据库的数据统计靠报表来实现,报表要根据功能需求来制作,见下图:
上图为已建好的报表。报表可以通过向导来创建,但一般都不美观、不实用,还需要人工制作。报表的创建步骤大同小异,这里只对“影像资料统计表”进行说明。
1.应用报表向导创建“影像资料统计表”;
2.进行调整制作:
(1)将页面页眉下移一定空间,并将报表页眉移到页面页眉处,以便每一页都显示报表页眉;
(2)插入单位标志图;
(3)使用标签控件在页面页眉右侧制作一个报表日期范围显示,在控件中输入“=”记录期间: ” & [Forms]![报表日期范围]![开始日期] & ” 至 ” & [Forms]![报表日期范围]![终止日期]”,将来接受报表日期范围对话框的日期数据;
(4)调整主体区数据控件的位置,并用画线工具画出表格竖线和横线;
(5)将报表页脚下拖一定空间,并在此处应用标签工具和文本框工具制作数据统计框,在文本框中应用Sum和Count两种函数进行数据统计;
调整完的报表结构如下图:
3.设置报表打开事件属性为“事件过程”,并进入代码编辑状态输入如下代码:
Private Sub Report_Open(Cancel As Integer)
DoCmd.OpenForm “报表日期范围”, , , , , acDialog, “影像资料统计表”
If Not IsLoaded(“报表日期范围”) Then
Cancel = True
End If
End Sub
4.设置报表关闭事件属性为“事件过程”,并进入代码编辑状态输入如下代码:
Private Sub Report_Close()
DoCmd.Close acForm, “报表日期范围”
End Sub
5.设置报表无数据事件属性为“事件过程”,并进入代码编辑状态输入如下代码:
Private Sub Report_NoData(Cancel As Integer)
MsgBox “没有此报表的数据。取消报表…”
Cancel = -1
End Sub
6.设置报表数据筛选,在过滤器属性中输入“([首拍日期])>=[Forms]![报表日期范围]![开始日期] and ([首拍日期])<= [Forms]![报表日期范围]![终止日期]”,并将打开过滤器属性设置为“是”,这样,报表将根据要求的日期范围统计数据。至此,本报表制作完毕;
7.进行运行调试,检查错误,修改。
(八)编译全局代码
进入模块,新建一个“全局代码”,并进入代码编辑状态,输入如下代码:
Option Compare Database
Function IsLoaded(ByVal strFormName As String) As Integer
‘ Returns True if the specified form is open in Form view or Datasheet view.
Const conObjStateClosed = 0
Const conDesignView = 0
If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
If Forms(strFormName).CurrentView <> conDesignView Then
IsLoaded = True
End If
End If
End Function
(九)设置数据库启动选项
1.打开数据库工具菜单下的启动选项窗口;
2.设置数据库应用程序标题;
3.设置数据库应用程序图标;
4.设置数据启动窗体为“磁带信息登记表”窗体;
5.其它选项可根据需要设置。
(十)设置数据库安全和用户账号及权限
应用Access系统的安全机制向导,设置数据库的安全机制很方便。以下是“媒体资源数据库”的安全机制:
1.组:管理员组、完全数据用户组、完全权限组、项目设计组、只读用户组五个组;
2.用户:Administrator、ccr、gly、cx共4个用户,并分别设置用户密码;
3.权限:Administrator为管理员权限,ccr为设计员权限,gly为完全数据用户权限,cx为只读用户权限。
至此,媒体资源数据库开发完毕,由于本人也是边学边用,所以难免存在这样或那样的错误,敬请朋友们多多指教!