浙大远程计算机专业毕业论文格式规范参考111
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江大学远程教育学院
本科生毕业论文(设计)题目用数据库管理商品库存
专业计算机应用技术
学习中心
姓名学号
指导教师
年月日
摘要
文章讨论了基于MS SQL Server和PowerBuilder的C/S两层数据库应用程序开发。
在微软Windows操作系统环境下,服务器端安装SQL Server,客户端安装PowerBuilder开发的数据库应用程序,实现了简单的收货、发货商品库存管理。
关键词: 数据库程序设计 SQL PowerBuilder 收货发货库存
目录
一、前言 (4)
二、应用系统运行平台 (4)
(一) 服务器端软件环境 (4)
(二) 客户端软件环境(含开发工具) (4)
三、数据库设计 (4)
(一) 创建数据库 (4)
(二) 创建数据库用户 (4)
(三) 创建表和索引 (4)
(四) 建立表之间的关系 (5)
(五) 定义数据库备份策略 (7)
四、应用程序设计 (7)
(一) 需求分析 (7)
1、访谈用户 (7)
2、需求说明书 (7)
(二) 软件设计 (7)
1、概览 (7)
2、应用对象模块 (8)
3、用户登录模块 (9)
4、主界面模块 (10)
5、基础代码维护模块 (11)
6、收货模块 (15)
7、发货模块 (19)
8、库存报表模块 (21)
参考文献
一、前言
随着计算机技术的发展,数据越来越重要,并且逐渐从程序中分离出来,至今已经形成了各种成熟的关系型数据库系统。
在这个过程中,数据库的应用也越来越广泛,特别是在企业管理领域,从早期的MIS系统到现在的ERP软件和电子商务软件,都离不开数据库。
数据库应用程序的开发工具也由早期的dbase、Foxbase发展到今天基于Web的面向对象的J2ee、.Net等开发平台。
业界领先的ERP软件如SAP、Oracle等更是功能强大、庞大复杂,初始安装就需要上百GB的磁盘空间。
然而,有许多原理是相通的,在这里我以MS SQL Server数据库管理系统和PowerBuilder开发工具创建一个库存管理的简单应用,以说明数据库应用的基本框架。
二、应用系统运行平台
(一)服务器端软件环境
操作系统可安装Windows 2000 server(标准版或企业版)并打SP4补丁包或Windows Server 2003(标准版或企业版)并打SP2补丁包。
数据库系统安装Microsoft SQL Server 2000(标准版或企业版)。
(二)客户端软件环境(含开发工具)
操作系统可安装Windows 2000 Professional版或Windows XP,并打上最新的补丁包,再安装SQL Server 2000客户端软件和PowerBuilder 6.5。
三、数据库设计
(一)创建数据库
通过SQL Server企业管理器创建一个名为Inventory的数据库,接受默认数据文件和日志文件的设置(如果是生产系统,还需考虑服务器性能并安排数据文件和日志文件到不同的磁盘阵列上)。
(二)创建数据库用户
通过SQL Server企业管理器,在数据库Inventory下创建用户MSA,并授予db_owner的角色。
设置该用户的密码。
(三)创建表和索引
创建操作员代码表sys_opt,并将操作员代码设为主键:
CREATE TABLE [SYS_OPT] (
[CODE_OPT] [char] (6) NOT NULL primary key, --操作员代码
[NAME_OPT] [char] (8) NOT NULL , --操作员姓名
[PASSWORD] [char] (10) NULL --密码
)
GO
在操作员代码表中先增加一条记录,用于管理员登录:
INSERT INTO [SYS_OPT]([CODE_OPT], [NAME_OPT], [PASSWORD])
VALUES('admin','管理员','')
GO
创建仓库代码表list_warehouse,并将仓库代码设为主键:
CREATE TABLE [LIST_WAREHOUSE] (
[CK_NO] [char] (4) NOT NULL PRIMARY KEY, --仓库代码
[CK_NAME] [char] (20) NOT NULL , --仓库名称
[CK_ADDRESS] [varchar] (200) NULL --仓库地址
)
GO
创建物料代码表list_material,并将物料代码设为主键:
CREATE TABLE [LIST_MATERIAL] (
[MATERIAL_NO] [char] (4) NOT NULL PRIMARY KEY, --物料代码[MATERIAL_NAME] [char] (20) NOT NULL, --物料名称
[UNIT] [char] (4) NOT NULL --计量单位
)
GO
创建收发货记录表MATERIAL_ACCOUNT,并将单据号码设为主键。
因为收货单与发货单的结构非常相似,在这里用一张表来进行存储,增加一个单据类型字段,用以区分是收货单还是发货单。
这里还假设计量单位都与物料代码表中的一致,所以不保存计量单位。
为了简单起见,在这里用系统自动产生的流水号来表示单据号。
CREATE TABLE MATERIAL_ACCOUNT(
--单据号码设为主键和自动增长标识列
RECORD_NO INT NOT NULL IDENTITY (1, 1) PRIMARY KEY,
RECORD_TYPE CHAR(2) NOT NULL, --单据类型(GR收货,GI发货)RECORD_DATE DATETIME NOT NULL, --制单日期
CK_NO CHAR(4) NOT NULL, --仓库代码
MATERIAL_NO CHAR(4) NOT NULL, --物料代码
AMOUNT DECIMAL(18, 3) NOT NULL, --数量
CODE_OPT CHAR(6) NOT NULL --操作员代码
)
GO
为了提高性能,在表MATERIAL_ACCOUNT中分别以操作员代码、仓库代码、物料代码创建索引。
而操作员代码表、仓库代码表、物料代码表则已经有系统自动按关键字创建的索引了。
(四)建立表之间的关系
为了避免在表MATERIAL_ACCOUNT中输入无效的仓库代码、物料代码和操作员代码,分别在这几列中创建外键约束,参照引用操作员代码表、物料代码表、仓库代码表。
这样,就建立了表MATERIAL_ACCOUNT和表SYS_OPT、LIST_WAREHOUSE、LIST_MATERIAL之间的关系。
(五)定义数据库备份策略
在这里仅仅使用简单恢复模型,并设定每周六凌晨0点进行完全备份和每天晚上10点进行差异备份。
四、应用程序设计
(一)需求分析
需求分析是软件设计中非常重要的一个环节,没有经过详细的需求分析就匆匆忙忙进行软件开发是注定要失败的。
所以一定要花时间与用户进行沟通交流,详细了解客户到底需要软件做到什么。
在沟通交流过程中也可以大致告诉用户软件可以做到些什么、是怎样做的。
对用户提出的一些不切实际的需求一定要以合理的方式明确地拒绝。
经双方讨论并明确的需求要以书面的形式签字确认。
1、访谈用户
访谈用户是了解用户需求的重要方式。
需要跟公司不同层面的用户访谈,了解公司的业务流程和各个环节的不同需求。
对忙碌的管理人员和销售员要提前预约,以合理安排客户的时间。
每次访谈后要进行访谈内容整理,以文档的形式记录下来。
2、需求说明书
经过详细的需求调研,最终形成需求说明书。
需求说明书包含项目背景、项目目标任务、需求规定等内容,其中需求规定是重点。
下面简单列出本文的需求:(1)仓库按代码进行管理,避免每次输入仓库名称增加额外工作量和多次输入相
同仓库但名称不一致。
(2)物料按代码进行管理,避免每次输入物料名称增加额外工作量和多次输入相
同物料但名称不一致。
(3)每次收货、发货都进行登记,以便统计库存。
(4)每次发货时,都要检查库存,避免出现客户拿了提单到仓库却提不到货。
(5)不同的操作人员有不同的登录帐户和密码,普通用户只能修改自己的密码,
管理员可以修改任何人的密码。
管理员可以创建、删除、修改普通用户。
(6)对进货、发货进行创建、更改操作后,保存时把操作员代码保存到该记录中,
以便明确责任。
(二)软件设计
1、概览
根据需求说明书进行软件设计,把软件的功能划分为以下几个主要模块:应用对象模块(主程序):在PowerBuilder中,每个应用程序都有且只有一个应用对象,作为程序的入口,相当于C语言中的main函数。
在这个模块中主要完成建立数据库连接等一系列初始化环境的建立。
用户登录模块:验证用户的登录信息,拒绝非授权用户使用系统。
主界面模块:显示主窗口、主菜单,接受用户的选择,根据用户的选择调用相应的模块。
基础代码模块:进行基础代码维护和用户维护。
收货模块:进行收货记录的登记和修改删除。
发货模块:进行发货记录的登记和修改删除。
库存报表模块:进行查询统计和库存报表的打印。
2、应用对象模块
创建全局变量,在Open事件中对事务对象SQLCA的几个数据库连接属性进行赋值。
在Close事件中进行退出程序前的一些清理操作。
以下是部分Open事件的代码及注释:
SQLCA.DBMS ="MSS Microsoft SQL Server" //数据库系统类型
SQLCA.Database ="Inventory" //数据库名称
SQLCA.LogID ="MSA" //数据库系统登录名
SQLCA.LogPass ="123321" //数据库系统登录密码SQLCA.ServerName ="Myserver" //数据库服务器
Connect Using sqlca; //进行数据库连接
If sqlca.sqlcode<>0 Then //如果连接失败Close(w_connect)
Beep(1)
Messagebox('警告','运行本系统所需数据库不能成功联接!'+&
sqlca.sqlerrtext,Stopsign!) //出错提示Halt //退出程序End if
Open(W_login) //显示登录界面
接下来,判断登录界面返回值,如果是1(成功登录),打开主界面,否则退出程序。
3、用户登录模块
显示用户登录窗口,在窗口中有两个文本输入框和两个Button按钮。
两个文本输入框分别接受用户名和密码的输入,并放入全局变量gs_user_code和局部变量ls_user_password中。
两个Button按钮分别是确认和取消按钮。
当用户单击取消按钮时,关闭登录窗口,返回值0。
当用户单击确认按钮时,进行身份验证,如果身份验证成功,关闭登录窗口,返回值1;如果身份验证不成功,提示错误信息,要求用户重新输入。
以下是确认按钮的Clicked事件的部分代码:
//根据输入的用户名从数据库中读取密码
select password into :ls_pswd from sys_opt where code_opt=:gs_user_code;
//如果密码是空值,则改为空字符串
if isnull(ls_pswd) then ls_pswd=''
if ls_pswd <> ls_user_password then //密码不匹配messagebox('提示信息','用户名或口令错误!',Exclamation!)
return
end if
4、主界面模块
主界面显示主窗口(W_main)、主菜单,接受用户的选择,根据用户的选择调用相应的模块。
choose case ls_select
case 'code_maintain' //基础代码维护
opensheet(w_sheet_code,w_main,3,layered!)
case 'goods_receipt' //收货
opensheet(w_sheet_gr,w_main,3,layered!)
case 'goods_issue' //发货
opensheet(w_sheet_gi,w_main,3,layered!)
case 'report' //库存报表
opensheet(w_sheet_report,w_main,3,layered!)
case 'quit' //退出
close(this)
end choose
5、基础代码维护模块
基础代码维护模块主要进行仓库代码、物料代码、操作员代码的维护。
由于这三种基础代码的维护非常相似,只需设计一个界面(DataWindow 控件)就可以满足。
在基础代码维护模块(W_sheet_code)中设计一个下拉菜单,菜单项分
别是:仓库代码维护、物料代码维护、操作员代码维护、退出。
当用户进入该模块(W_sheet_code)时如果选择退出,则返回主界面(W_main);如果选择其他菜单,则分别将不同的参数传递给维护界面的窗口(W_enter_code)。
维护界面窗口根据收到的不同参数,分别连接不同的数据源(DataWindow),给予用户维护。
对于仓库代码、物料代码维护,数据窗对象的设计相对比较简单,这里就不赘述了。
但进入操作员代码维护界面时,需要根据当前登录用户进行判断,如果当前登录用户的代码是admin,就允许他/她创建、修改、删除用户记录,当然包括密码;如果不是,则仅仅允许他/她修改自己的密码。
有两种方法可以进行实现:一是创建两个数据窗对象,二是创建一个数据窗对象,然后动态修改SQL 语句。
我认为第一种方法简单可行,但缺点是今后修改数据窗时需要同时修改两个数据窗。
这里我创建两个数据窗对象,一个是管理员用的(d_enter_operator_admin),另一个是普通用户用的(d_enter_operator_ordinary)。
普通用户使用的数据窗对象的操作员代码和操作员姓名是只读的,不能修改。
当普通用户进入操作员维护界面时,还要把创建、删除按钮disable掉。
以下是部分菜单Clicked事件代码:
choose case ls_select
case 'operator', 'warehouse', 'material' //进入基础代码维护界面
OpenWithParm(w_enter_code,ls_select)
case 'quit' //退出
close(this)
end choose
以下是部分维护界面窗口Open事件代码:
ls_select = message.powerobjectparm //将外部传入的参数保存
CHOOSE CASE ls_select
//根据传入的参数,分别连接不同的数据对象(数据源)到同一个
//数据窗控件(界面)中
CASE 'operator' //操作员维护
IF gs_user_code = 'admin' THEN //如果当前用户是admin dw_1.dataobject = 'd_enter_opeartor_admin'
ELSE //如果当前用户是普通用户
dw_1.dataobject = 'd_enter_opeartor_ordinary'
cb_create.enabled = FALSE //使创建按钮不起作用
cb_delete.enabled = FALSE //使删除按钮不起作用END IF
CASE 'warehouse' //仓库代码维护dw_1.dataobject = 'd_enter_warehouse'
CASE 'material' //物料代码维护dw_1.dataobject = 'd_enter_material'
END CHOOSE
6、收货模块
收货模块的设计是这样的:窗口顶部的左侧是一排按钮,分别是创建、更改、删除、显示,窗口顶部的右侧是开始日期(默认值为今天减30天)和截至日期(默认值为今天),窗口的下方默认是最近30天内收货记录的清单。
如果需要显示不同时间段的收货记录清单,可以调整开始日期和截至日期来实现。
创建、更改、显示可以共用一个窗口,根据不同的传入参数加以区分。
修改开始日期和截至日期时,需要刷新列表。
当更改收货记录并保存时或者删除收货记录时,都需要判断库存是否为负数,如果库存出现负数,说明程序是有问题的。
这个问题在后面处理发货记录时也会碰到,所以把判断库存是否为负数做成一个函数(f_is_negative),传入仓库代码和物料代码,返回库存是否为负数。
在处理收货记录修改或删除时,要在update语句执行后,事务提交(commit)之前,执行该函数。
以下是修改收货记录保存时(cb_save按钮的Clicked事件)部分代码:If dw_1.update(true,false) = 1 Then //数据窗生产update语句成功
If sqlca.sqlcode <> 0 Then //SQL返回错误码
RollBack Using sqlca; //事务回滚
messagebox('提示信息','保存数据不成功!'+sqlca.sqlerrtext)
return -1
Else //SQL返回码0,update语句成功
if f_is_negative(ls_ck_code,ls_material_code) then
//如果产生负库存
RollBack Using sqlca; //事务回滚
messagebox('提示信息','库存不能为负数,保存数据不成功!')
return -1
else
Commit Using sqlca; //提交事务
dw_1.resetupdate ()
messagebox('提示信息','保存数据成功!')
End If
End if
Else
//数据窗生产update语句时有错误,需要检查数据窗代码End if
删除收货记录时(cb_delete按钮的Clicked事件)也需要同样方法处理,这里不再详细列出。
以下是函数f_is_negative的定义:
以下是函数f_is_negative的实现:
下面是cb_save按钮的Clicked事件完整代码:
7、发货模块
发货模块与收货模块的设计相同,窗口顶部的左侧是一排按钮,分别是创建、更改、删除、显示,窗口顶部的右侧是开始日期(默认值为今天减30天)和截至日期(默认值为今天),窗口的下方默认是最近30天内发货记录的清单。
如果需要显示不同时间段的发货记录清单,可以调整开始日期和截至日期来实现。
创建、更改、显示可以共用一个窗口,根据不同的传入参数加以区分。
修改开始日期和截至日期时,需要刷新列表。
当创建或更改发货记录并保存时,都需要判断库存是否为负数,与收货处理时类似,调用函数(f_is_negative),传入仓库代码和物料代码,返回值表示库存是否为负数。
在处理发货记录创建或修改时,要在update语句执行后,事务提交(commit)之前,执行该函数。
代码与收货类似。
8、库存报表模块
可以通过创建一个基于交叉表的DataWindow对象方便地实现库存报表,PowerBuilder所提供的交叉表有点像Excel中的数据透视表,按不同维度进行分类统计非常方便。
在选择条件中,允许用户输入仓库代码(可以多选)和物料代码(可以多选),然后生成交叉表显示出来,也可以直接调用数据窗控件的print方法打印报表。
参考文献
1、Jeffry L. Byrne 著、李小坚等译:《Microsoft SQL Server 6.5 管理员手册》机械工业出版社 1997年;
2、侯太平、童爱红编著:《Delphi数据库编程》清华大学出版社 2004年;
3、王春森主编:《系统设计师(高级程序员)教程》清华大学出版社 2001年;
4、李礼、魏江江编著:《边用边学PowerBuilder编程》清华大学出版社 2001年;
5、萨师煊、王珊:《数据库系统概论》高等教育出版社 2000年;
6、李春葆、曾平编著:《数据库原理与应用》清华大学出版社 2006年;
7、汪星明主编:《管理系统中计算机应用》武汉大学出版社 1999年;
8、微软公司著:《SQL Server 7.0系统管理》北京希望电子出版社 1999年;
9、微软公司著:《SQL Server 7.0实现数据库设计》北京希望电子出版社 1999年;
10、房增华、徐远超编著:《Delphi 5 数据库编程实战与精通》清华大学出版社 2000年。
(注:可编辑下载,若有不当之处,请指正,谢谢!)。