|
[毕业论文] [转帖]医药行业进销存系统论文=2=(VB+SQL Sever 2000)
第5章 系统具体实现
5.1 编程环境的选择
微软公司的visual basic 6.0是windows应用程序开发工具,是目前最为广泛的、易学易用的面向对象的开发工具。visual basic提供了大量的控件,这些控件可用于设计界面和实现各种功能,减少了编程人员的工作量,也简化了界面设计过程,从而有效的提高了应用程序的运行效率和可靠性。所以对初学者来说,用vb编程是一件很容易的事。
故而,实现本系统使用visual basic 6.0是一个相对较好的选择。因为我们在开发过程中要使用visual basic 6.0中的数据库编程,下面我们简单介绍一下我们要用到的开发环境、数据库访问方式、表格控件和报表的使用知识。
5.1.1 visual basic界面简介
启动vb后会出现一个[新工程]对话框,在这个对话框中有三个标签。[新建]标签页是用来选择你要开发的项目类型,并新建一个工程;[现存]标签页可以通过浏览来查找工程文件并打开该工程;[最新]标签页用来快速打开以前编辑过的工程。我们选中某项后,单击“打开”按钮后进入vb的主界面。
vb的界面包括菜单条、工具条、工具箱、工程管理器、属性窗口、表单布局窗口和编辑区等。
1、工具条
vb的工具栏在缺省状态下为标准工具栏,我们可以通过“视图”-“工具栏”菜单来选择工具条上显示的按钮,也可以通过customize...(定制)菜单项来自定义工具条。
2、工具箱
vb的工具箱其实就是用来显示控制件的工具条,它提供了一些标准控件,可以通过菜单“工程”-“部件”为工具箱添加扩展的控件,以加快你的开发速度。
图5.1 visual basic编程环境示图
3、工程管理器
工程管理器用来列出工程的表单、模块、类模块和设计器的窗口,其上方的三个图形按钮为[查看代码]、[查看对象]和[切换文件夹],可以分别进入代码窗口,进入表单窗口,改变工程管理器窗口中的文件显示方式。若界面中无工程管理器可以按ctrl+r激活。
4、属性窗口
属性窗口可使我们对表单、控件的属性进行设置。属性窗口的标题栏用来显示当前的对象;下拉框中可以选择当前表单中的对象;两个标签页分别是按字母序和按分类序列出属性项;中间的两列窗口用来显示属性名和该属性的值;最下边的提示栏用来简要的说明该属性的含义。属性窗口可用f4激活。
5、表单布局窗口
表单布局窗口可以使我们对程序运行时表单的显示位置进行设置。将鼠标移到表单布局窗口中的表单小图上,移动表单至需要的地方即可,如果你想让表单显示在屏幕中央,可在表单布局窗口中右击表单,选择“启动位置”-“屏幕中央即可”。
以上三项均可以在“视图”菜单或工具条中激活。
6、代码窗口
单击工程管理器的[查看代码]按钮或双击表单或表单上的某一控件即可激活代码窗口。代码窗口上面有两个下拉框,左边的下拉框用于选择对象,右边的下拉框用于选择与对象相对应的事件,在选择后下面的代码框中会自动出现事件的开始和结尾的代码。其中“通用”“声明”事件中的代码对整个表单都起作用。
7、外接程序管理器
visual basic为程序员提供了一些快速开发的的工具,在使用这些工具前需要先将这些工具加入到外接程序菜单中。具体的方法为:点击外接程序下的外接程序管理器,在弹出的对话框中我们可以选择加入的工具。先在左上方的列表中选择要载入的工具,然后选中右下角的“在启动中加载”和“加载\卸载”两项,点击“确定”即可将该工具添加到外接程序菜单中。从外接菜单中删除工具项可在“外接程序管理器”对话框中选择该工具,并取消对上述两项的选择即可。
5.1.2 ado
作为微软旗下一款优秀的rad工具,vb在数据库应用开发方面的能力十分强大。微软设计了多种数据库访问方法。
在vb的开发环境中,可以使用三种数据库访问方式,它们分别是:数据访问对象(dao)、远程数据对象(rdo)和ado对象模型。
因为我们采用的是ado,所以我们只介绍一下ado。
ado(activex data object)是dao/rdo的后继产物。ado 2.0在功能上与rdo更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ado"扩展"了dao和 rdo 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。
作为最新的数据库访问模式,ado的使用也是简单易用,所以微软已经明确表示今后把重点放在ado上,对dao/rdo不再作升级,所以ado已经成为了当前数据库开发的主流。
ado涉及的数据存储有dsn(数据源名称)、odbc(开放式数据连接)以及ole db三种方式。后面的例程将详细讲解这三种方式的具体访问实现。
要使用ado,必须清楚ado的对象层次结构,其大体上分为以下7个对象层次:
1、 command 对象:包含关于某个命令,例如查询字符串、参数定义等的信息。command 对象在功能上和 rdo的rdoquery 对象相似。
2、 connection 对象:包含关于某个数据提供程序的信息。connection 对象在功能上和 rdo 的 rdoconnection 对象是相似的,并且包含了关于结构描述的信息。它还包含某些 rdoenvironment 对象的功能,例如transaction 控件。
3、 error对象:包含数据提供程序出错时的扩展信息。error 对象在功能上和 rdo 的rdoerror 对象相似。
4、 field 对象:包含记录集中数据的某单个列的信息。field 对象在功能上和 rdo的rdocolumn 对象相似。
5、 parameter 对象:包含参数化的command对象的某单个参数的信息。该 command对象有一个包含其所有parameter 对象的 parameters 集合。parameter 对象在功能上和 rdo 的 rdoparameter 对象相似。
6、 property对象:包含某个 ado 对象的提供程序定义的特征。没有任何等同于该对象的rdo,但dao有一个相似的对象。
7、recordset对象:用来存储数据操作返回的记录集。此对象和connection对象是所有对象最重要的两个对象。
当然,对于初级用户来说,我们只需要掌握其中的connection对象和recordset对象就可以实现基本的数据库操作。
5.2 关系型数据库的实现:
5.2.1 数据库简介
数据库是一种存储数据并对数据进行操作的工具。数据库的作用在于组织和表达信息,简而言之,数据库就是信息的集合。计算机的数据库可以分为两类:非关系数据库(flat-file)和关系数据库(relational)。关系数据库中包含了多个数据表的信息,数据库含有各个不同部分的术语,象记录、域等。
新建一个数据库:
创建任何一个数据库的第一步是仔细的规划数据库,设计必须是灵活的、有逻辑的。创建一个数据库结构的过程被认为是数据模型设计。
1. 标识需要的数据;
2. 收集被标识的字段到表中;
3. 标识主关键字字段;
4. 绘制一个简单的数据图表;
5. 规范数据;
6. 标识指定字段的信息;
7. 创建物理表。
修改已建的数据库:
数据库的修改分为:添加、编辑和删除记录。这三种操作均可由visual basic 创建的程序来完成。
实现数据库之间的联系:
数据库之间的关系指明两个库之间共享一个共同的关键字值。一个连接是指一种虚拟的表,这种表是在当用户要求从相互关联的各个不同的表中获取信息时建立的,关键字段用于在相互连接的不同表中查找匹配的记录。一个更高级的连接形式称为自连接。这种连接是指一个表被连接到它自己的一个字段,或在不同的纪录中由重复数据的组合字段。数据库中有三种不同类型的关键字:主关键字、组合关键字和外关键字。在表中使用的关键字类型用于描述库表示什么以及在数据库中如何与其它的库建立关系。
5.2.2 sql server 2000简介
sql server 2000是微软公司最新版的大型数据库服务器,其性能指标在各方面都有赶超oracle数据库的趋势。在经历了sql server 6.5和7.0两个版本的尝试后,微软公司终于开始向大规模的业务领域进发了。记得在以前各种关于sql server的文章,都会将其定位成中小型应用方面,这种感觉被大家自然的延续到了2000版之中。其实这是一种误解。在过去的很长一段时间中,微软公司凭请了世界上最优秀的数据库专家以及专门搭建了信息量可谓空前的地理信息系统,励精图治,就是为了摘掉扣在自己头上的这顶帽子。有了强大的性能和功能支持,再配合其一向为人称道的易用性,sql server可以说成为了开发者手中的一柄利器!
另外,目前国内的一些关于微软平台的数据库编程教程,喜欢使用access作为数据库平台的案例,并展开相关的内容。这其实对于开发真正的数据库应用并没有直接的帮助作用,只能使大家停留在应用的初级阶段。sql server 2000提供的非常简单的缺省安装和使用模式,其上手难度并不比access大。另外,sql server 2000可以兼顾小、中、大规模的应用,有着远远比access强大的伸缩性。因此,建议大家不如一步到位,直接从高起点开始,这对于持续发展个人技能也是很有好处的。
很多人并不了解sql server 2000,所以在安装它的时候总是产生问题,其原因是安装sql server 2000没有注意到其版本和操作系统的版本问题。我们先介绍一下安装sql server 2000企业版的软硬件配置要求,安装过程的详细步骤,以及需要注意的事项。
5.2.2.1硬件和操作系统要求
下表说明安装 microsoft sql server 2000 或 sql server 客户端管理工具和库的硬件要求。
下表说明为使用 microsoft sql server 2000 各种版本或组件而必须安装的操作系统。
5.3 二者的结合:
微软公司的ODBC数据库引擎提供了与数据库打交道的途径,我们是通过它以及visual basic 来访问数据库并对其进行各种操作。visual basic、SQL Server2000以及其他微软的软件产品都是通过ODBC数据库引擎,从而给用户提供了丰富的数据类型。
ADO数据对象模型在数据库中的信息与将信息显示给用户看的visual basic程序之间架起了一座桥梁。我们可以设置ADO对象的各个属性,告诉它要调用那个数据库的哪个部分。缺省情况下,ADO数据对象根据数据库中的一个或多个数据表建立一个dynaset-type(动态集合)类型的记录集合。一个记录集合是动态的也就意味着,当原来的数据表中的容改变了以后,该记录集合中的记录也会随之改变。它还提供了用来浏览不同记录的各种跳转方法,使用微软公司推荐的ADO对象模型将为以后的扩展带来便捷。
5.4开发过程介绍
由于该系统是由我和安明两个人完成,我们每个人完成三个模块。我完成的部分是系统登陆管理、进货信息管理、财务管理和标准模块的编写。
下面我来介绍一下我的开发过程。
5.4.1 用户界面的实现
图5.2登录窗体示图
该窗体是保证系统使用的安全性,所以实现起来就要考虑很多因素。
对于用户名,我无法知道该用户使用的名称,但是能够了解到该用户给计算机设定的用户名,于是我采用了windows系统函数“getusernamea”来获取用户名,上图所示的用户名“summer”是我的计算机名称。
该窗体的代码如下:
private declare function getusername lib "advapi32.dll" alias "getusernamea" (byval lpbuffer as string, nsize as long) as long
public ok as boolean
private sub form_load()
dim sbuffer as string
dim lsize as long
sbuffer = space$(255)
lsize = len(sbuffer)
call getusername(sbuffer, lsize) ‘调用api 函数得到计算机用户名
if lsize > 0 then
txtusername.text = left$(sbuffer, lsize)
else
txtusername.text = vbnullstring
end if
end sub
private sub cmdcancel_click() ‘取消操作
ok = false
me.hide
end sub
private sub cmdok_click() ‘判断是否输入了正确的密码
'todo: create test for correct password
'check for correct password
if txtpassword.text = "123" then
ok = true
me.hide
else
msgbox "invalid password, try again!", , "login"
txtpassword.setfocus
txtpassword.selstart = 0
txtpassword.sellength = len(txtpassword.text)
end if
end sub
下图是该系统的主窗体:
图5.3主窗体示图
为了美观,我加入了一幅图片,并在窗体的下方放置了状态栏控件,用来显示本系统的版本信息、日期和时间,以方便用户的使用。
系统中的主要操作项是由菜单来实现的,这样的好处是纯中文信息,不会带来使用上的不便。因为功能模块的数量很多,如果使用工具栏来实现,一时带来记忆上的复杂性,二是容易产生操作上的失误。
对于主窗体,我们能按照正规商业软件的形式进行设计,我们考虑了软件帮助文档,虽然由于时间有限我们没能将帮助文档的内容填充进去,但是我们宏观上的设计并没有出现疏忽。
还有版权的问题,我们提出了版权的问题,这样在今后的使用和维护中不会产生法律问题,我们认为在一些细节上我们能考虑到,这对我们将来是有很多好处的。
在系统使用中,最常用的是显示信息,就如下图进货单设置信息窗体:
其中最为醒目的就是表格的显示了,几乎所有功能模块中都有这个控件的使用,而且在任何信息管理系统中,它都是非常主要的,所以我们详细介绍一下。
图5.4表格使用示图
5.4.2 表格控件总览:
在vb开发环境中,表格控件在界面开发元素中占有重要的地位。它不仅有外观整洁、表达形式规范的优点,而且更重要的是它较高的信息表现率(就是相对于其他控件来说能够表达更多的信息),随着信息时代的到来,它的应用将更加的广泛。
那么在vb平台下,如何操作这一功能强大的控件元素呢?事实上我们知道,vb平台下面的表格控件是相当丰富的,总结下来提供了4种类型:microsoft data bound grid control、microsoft datagrid control、microsoft flexgrid control、microsoft hierarchial flexgrid control.
这四种表格各有其特点,下面我们只简单介绍我们使用的microsoft flexgrid control。
这里重点介绍这种控件,因为在实际开发中,这两控件应用的场合更多一些,它不仅能够反映数据,而且也能把数据的修改信息反映到数据库中去,所以弥补了上述这种控件的不足。
如果数据不需要修改,那么可以进行绑定操作,其方法跟前面介绍的完全一样,就是通过设置datasource属性来完成数据的显示工作。但是实际开发中,需要对整个表格控件更为灵活的显示控制。
在给出例程之前,有必要对这一控件进行比较详尽的认识:这种控件允许将文本或者图像放置于每个单元格之中,控件的row与col属性允许用户在代码中指定当前行和列,当然也可通过操作鼠标和键盘来改变这两个属性,而text属性指明当前单元格的文本。如果单元格的文本太长而不能完全显示出来的话,可以通过将wordwrap属性设置为true来达到显示的目的。下面将比较重要的属性小结如下:
datasource---------用来指定需要绑定的数据源,比如data控件。
cellpicture----------用来设定当前单元格的图像,便于显示该图像。此属性不能在设计时使用。
col,row---------------设定当前列和当前行,注意它们均是从0开始的,如果同时设定它们,可以指定当前的单元格。设计时也不能使用。
cols,rows---------------设置表格控件总的列数和行数。
hwnd---------------表格句柄,可以结合windows api对表格控件进行更高级的控制。
text---------------指定当前的单元格的文本内容。
textmatrix(i,j)-------此属性比较重要,它用来指定第i行和第j列所确定的单元格的文本内容。它等价于下面的代码:
mshflexgrid1.rows =i
mshflexgrid1.cols =j
mshflexgrid1.text =指定的字符串
wordwrap-------为ture时可以在当前单元格换行显示,否则如果要显示的字符的长度超过列宽,那么就不能显示完全。
以上只是介绍了表格控件经常使用的属性,还有很多其他重要的属性这里限于篇幅就不详细讲解了。我们它主要显示后台数据库中的信息,这样非常直观,我们将在附录部分给出该窗体的完整代码。
5.4.3 模块功能的具体实现
该模块的添加和修改功能通过调用一个共同窗体来实现。这种方法可以使软件更简洁,更节省空间。
添加功能由下面的代码来实现:
private sub cmdadd_click()
gintdhmode = 1
frmdh1.show 1
end sub
修改功能由下面的代码来实现:
private sub cmdmodify_click()
dim intcount as integer
if frmdh.msglist.rows > 1 then
gintdhmode = 2
intcount = msglist.row
if intcount > 0 then
frmdh1.txtsql = "select * from dh where dh_no ='" & trim(msglist.textmatrix(intcount, 1)) & "'"
frmdh1.show 1
else
msgbox "警告", vbokonly + vbexclamation, "请首先选择需要修改的纪录!"
end if
end if
end sub
图5.5 保存窗体示图
这个相同的窗体实现的是保存功能,代码如下:
private sub cmdsave_click()
dim intcount as integer
dim smeg as string
dim msgtext as string
for intcount = 1 to 8
if trim(txtitem(intcount) & " ") = "" then
select case intcount
case 1
smeg = "订货单号"
case 2
smeg = "供应商代码"
case 3
smeg = "商品代码"
case 4
smeg = "有效期限"
case 5
smeg = "数量"
case 6
smeg = "订货单价"
case 7
smeg = "折扣比例"
case 8
smeg = "总金额"
end select
smeg = smeg & "不能为空!"
msgbox smeg, vbokonly + vbexclamation, "警告"
txtitem(intcount).setfocus
exit sub
end if
next intcount
for intcount = 0 to 2
if trim(combo1(intcount) & " ") = "" then
select case intcount
case 0
smeg = "业务员"
case 1
smeg = "供应商名称"
case 2
smeg = "商品名称"
end select
smeg = smeg & "不能为空!"
msgbox smeg, vbokonly + vbexclamation, "警告"
combo1(intcount).setfocus
exit sub
end if
next intcount
if not isdate(format(trim(txtitem(4)), "yyyy-mm-dd")) then
msgbox "药品的有效期限请输入日期!", vbokonly + vbexclamation, "警告"
txtitem(4).setfocus
exit sub
end if
for intcount = 5 to 7
if not isnumeric(trim(txtitem(intcount))) then
smeg = "请输入数字!"
msgbox smeg, vbokonly + vbexclamation, "警告"
txtitem(intcount).setfocus
exit sub
end if
next intcount
'添加判断是否有相同的id记录
if gintdhmode = 1 then
txtsql = "select * from dh where dh_no ='" & trim(txtitem(1)) & "'"
set mrc = executesql(txtsql, msgtext)
if mrc.eof = false then
msgbox "已经存在此订单编号的记录!", vbokonly + vbexclamation, "警告"
txtitem(1).setfocus
exit sub
end if
mrc.close
end if
'先删除已有记录
txtsql = "delete from dh where dh_no ='" & trim(txtitem(1)) & "'"
set mrc = executesql(txtsql, msgtext)
'再加入新记录
txtsql = "execute dh_setup '"
txtsql = txtsql & trim(txtitem(0)) & "','"
txtsql = txtsql & trim(combo1(0).itemdata(combo1(0).listindex)) & "','"
for intcount = 1 to 3
txtsql = txtsql & trim(txtitem(intcount)) & "','"
next intcount
for intcount = 4 to 8
txtsql = txtsql & trim(txtitem(intcount)) & "','"
next intcount
txtsql = txtsql & trim(txtitem(9)) & "'"
set mrc = executesql(txtsql, msgtext)
if gintdhmode = 1 then
msgbox "添加记录成功!", vbokonly + vbexclamation, "添加记录"
for intcount = 0 to 9
txtitem(intcount) = ""
next intcount
for intcount = 0 to 2
combo1(intcount).listindex = 0
next intcount
txtitem(0) = format(now, "yyyy-mm-dd")
mblchange = false
unload frmdh
frmdh.txtsql = "select dh_no,in_date,ywman,gfdm,wzdm,cxend,sl,in_danj,i_zk,i_zke,bz from dh"
frmdh.show
elseif gintdhmode = 2 then
unload me
unload frmdh
frmdh.txtsql = "select dh_no,in_date,ywman,gfdm,wzdm,cxend,sl,in_danj,i_zk,i_zke,bz from dh"
frmdh.show
end if
end sub
整个系统基本上都是由上述三种功能组合来实现,所以仔细分析上述代码是理解本系统的捷径。还有一个功能模块就是打印报表。
下面让我们来介绍一下报表对象的使用。
报表如图所示:
图5.6 报表示图
首先介绍一下datareport对象的几个常用属性。一是datasource,用于设置一个数据源,通过该数据源,数据使用者被绑定到一个数据库;二是datamember,从datasource提供的几个数据成员中设置一个特定的数据成员;三是leftmargin、rightmargin、topmargin、bottommargin等,用于指定报表的左右上下的页边距;四是sections,即datareport的报表标头、页标头、细节、页脚注、报表脚注5个区域,如果加上分组(可以有多层分组),则增加一对区域,即分组标头、分组脚注。其中datasource一般是一个数据环境或是adodb.connection类型的变量,而datamember则对应数据环境中的command或是adodb.recordset类型的变量,推荐使用数据环境及command,页边界大家肯定都很清楚,下面我主要介绍以下sections,这也是datareport的精髓所在。
sections是一个集合,您可以为每一个section指定名称,也可以用其缺省的索引,从上到下依次为1、2…。每个section均有height和visible属性,您可以在一定条件下使一个section不可见。在section中可以放置各种报表控件,其中rptlabel、rptimage、rptshape和rptline可以放在任意的section中,用于输出各种文字、图形及表格线;rpttextbox只能放在细节中,一般用于绑定输出datamemeber提供的数据字段;rptfunction只能被放置在分组注脚中,用于输出使用各种内置函数计算出的合计、最大值、最小值、平均值、记数等等。上述报表控件中常用公共属性有用于控制位置及高度宽度的top、left、height、width和控制可见性的visible;其中rpttextbox还有datafield、datamember、dataformat及font属性;其他属性不再多说。
然后介绍一下我的使用经验。一是对想控制的报表控件按类型有规律的命名;二是用rptshape的矩形框做表格线框,比用rptline画框省事多了,只有斜线才使用rptline;三是报表标题及报表中的表头文字、日期及页码用rptlabel,其中caption属性支持转义字符,%d为长格式日期,%d为短格式日期,%p为总页数,%p为当前页码;四是对固定报表在设计窗口直接将报表控件摆放到位,对于活报表,应首先考虑报表最大的情形,将足够的控件分别放置在不同区域,位置大小可以不必深究,然后在报表输出前用vba代码对所有控件的属性进行调整,包括位置、高度、宽度、字体、对齐方式、显示格式、可见性等等,相应的对section也应根据情况调整其高度和可见性。
报表是常用的控件,所以我想有必要介绍一下它的实现过程。
首先是连接数据库
with 数据环境.rscommand名
if .state = adstateopen then .close
.source = sql语句
.open 打开想输出的数据库数据项以便输出
end with
with 报表名
.datasource=数据环境
.datamember=command名 这两行也可固定设好而不必每次设置
设置页表头部分(rpttlabel…为报表控件名)
.sections(2).controls("rptlabelpage").caption = "共%p页第%p页"
.sections(2).controls("rptlabeldate").caption = "打印日期:%d"
.sections(3).controls("rptlabel1").left=…
设置细节部分(rptshapex、rpttextboxx为报表控件名)
.sections(3).controls("rptshape1").left=…
.sections(3).controls("rptshape1").top=…
.sections(3).controls("rptshape1").height=…
.sections(3).controls("rptshape1").width=…
.sections(3).controls("rpttextbox1").datamember=command名
.sections(3).controls("rpttextbox1").datafield=字段1
.sections(3).controls("rpttextbox1").font.name=…
.sections(3).controls("rptshapen").visible=false
.sections(3).controls("rpttextboxn").visible=false
. sections(3).height=计算出的或固定的细节高度
动态调整报表标题(rptlabeltitle为报表标签控件名)
.sections(2). controls("rptlabeltitle").left=…
这样做的优点是报表设计时简单,调整方便、随意,只需更改一点代码,而不必为了一点点的修改而费神的在设计窗口调整半天。
该系统最后一个主要的功能就是查询了,下面是查询的实现:
图5.7 查询功能示图
private sub cmdok_click()
dim dbegindate as string
dim denddate as string
dim sqsql as string
sqsql="select inh.in_date,inh.ywman,inh.inh_no,dm_gf.dm,dm_gf.mc,dm_ck.dm,dm_ck.mc,dm_wz.dm,dm_wz.mc,inh.cxend,inh.sl,inh.in_danj,inh.i_zk,inh.i_zke,inh.jsfk,inh.jz,inh.yf,inh.bz from inh inner join dm_gf on inh.gfdm = dm_gf.dm inner join dm_ck on inh.ckdm = dm_ck.dm inner join dm_wz on inh.wzdm = dm_wz.dm where inh.ywman = '" & trim(combo1(0).itemdata(combo1(0).listindex)) & "'"
if chkdate.value = vbchecked then
dbegindate = format(cdate(cboyear(0) & "-" & cbomonth(0) & "-" & cboday(0)), "yyyy-mm-dd")
denddate = format(cdate(cboyear(1) & "-" & cbomonth(1) & "-" & cboday(1)), "yyyy-mm-dd")
sqsql = sqsql & " and inh.in_date >= '" & dbegindate & " '"
sqsql = sqsql & " and inh.in_date <= '" & denddate & " '"
end if
if trim(sqsql) = "" then
msgbox "请设置查询条件!", vbokonly + vbexclamation, "警告"
exit sub
else
frminquireywy.txtsql = sqsql
me.hide
frminquireywy.show 0
end if
end sub
以上就是我的毕业设计的全部功能,其他模块的编写就是上述几个功能的合集。整个过程中就是添加、修改和删除以及表格控件和报表的使用,这让我很好的了解到真正的软件是可以完整的实现用户的要求,而不是用华丽的外表和不同的实现方法来取悦用户。试想用data控件、ado控件和ado对象分别来实现不同模块的添加、修改和删除功能,没有任何实际的意义,反而给自己带来编码的复杂性。让我更是消除了我的困惑。因为我一直都认为我知道得太少,不能够完成工作上的复杂任务,但实际上,这个毕业设计当中的大部分知识和工具的使用我以前都是知道的,只是没有想到完成一个软件就是几个知识点的重复利用,这也让我明白了软件开发中重用的真正意义。
当我按照软件工程的步骤进行开发时,我都没有想到会有什么不同发现,没想到,把详细设计完整的做好,竟然没有花费我太多的时间来编码,基本上是很顺利的完成了。编码让我有了如鱼得水的感觉,突然间,我发现我已经可以将大学里学习的知识融合在一起了,这时我才发现,每个课程都是很有用的,编码只是其中最为简单的部分,向软件工程等课程背后所包含的宏观思想才是真正需要我们掌握的。 |
|