订单管理信息系统
一、系统概述
(一)系统开发及应用背景
随着社会经济的发展,社会的信息化程度越来越高,中小企业在信息化的过程中担任了很重要的角色,其信息化速度也较快。随着企业的发展,其对信息化的要求也越来越高,因此有必要使用一个完整的系统来管理企业的各种信息数据
本次课程设计中我们小组通过开发一个完整的小型订单管理系统来帮助企业制定和开发一份企业管理信息系统,订单管理系统的总体任务是实现与订单相关的各种信息的系统化、规范化和自动化。
(二)、系统设计思想
设计中创建“订单管理系统”的主要目的是实现对订单信息的管理,然而规划订单管理必然会涉及下订单的客户,以及订单中所涉及的产品,因此在系统
中需要添加客户信息滚利和产品信息管理的功能。
一个信息管理系统必然由一定的用户来操作,要保证信息管理系统中信息正确,需要对能够操作信息的用户进行管理,因此在操作中添加了用户管理的功能。
信息管理系统中管理各种信息的目的是在于日后能够对系统中的信息进行浏览、查询和输出,因此在系统中添加了信息浏览的功能。 因此,一个简单而完整的订单管理系统至少应该包含本系统中设计的信息管理、信息浏览和用户管理3类功能。
二、系统调查
(一)系统目标及功能
在本次课程设计中,我们小组确定开发的订单管理信息所要完成的的功能有:
1 / 28
1. 系统登录控制,必须使用特定的用户名和密码登录系统才能使用系
统。
2. 产品信息管理,管理订单所使用的产品信息,可以浏览、增加、修改
和删除产品信息。
3. 客户信息管理,管理下订单时客户的的信息,可以浏览、增加、修改和删除客户信息
4. 订单信息管理,管理订单的信息,可以浏览、增加、修改和删除订单信息,在增加订单时需要使用的产品信息和客户信息必须首先通过产品信息管理和客户信息管理功能添加。
5 . 客户信息浏览,浏览系统中所有的客户信息,可以使用制定的关键字来查询相应的客户,并且可以使用报表的形式将查询结果输出。 6 产品信息浏览,浏览系统中所有的产品信息,可以使用制定的关键字查询相应的产品,并且可以使用报表的形式将查询结果输出。
7. 用户权限管理,本系统中是吸纳了简单的用户权限管理,普通用户仅
能修改密码,而管理员则可以添加、修改、删除用户。
(二)系统功能模块划分
根据上述的系统功能分析,可以得出如图1-1所示的系统功能模块图
2 / 28
产品信息管理 客户信息管理 订单信息管理 添加用户 修改用户 删除用户 修改密码 用户登录
产品信息浏览 客户浏览 三、系统分析与设计
(一)数据库设计
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏直接对应用系统的效率,以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。
设计数据库系统时应该充分了解用户各个方面的需要,包括现有
的及将来可能增加的需求。数据库设计一般包括如下几个步骤。
数据库需求分析 数据库概念结构设计 数据库逻辑结构设计
(二)数据库需求分析
用户的需求具体体现在各种信息的提供、保存、更新和查询,这
要求数据库结构能充分满足各种信息的输出和输入。收集基本数据、数据结构,以及数据处理的流程,组成一份详尽的数据字典,为后面的设计打下基础。
通过上述系统功能分析,正对一般客户管理信息系统的需求,总结出如下的需求信息。
订单信息涉及产品信息和客户信息。 产品信息和客户信息中需要存在唯一字段。 产品信息和客户信息可以按几种常用的信息查询。
产品信息、客户信息、订单信息应该可以增加、修改、删除和打印输
出。
用户信息中的用户名必须是唯一的。 用户信息中必须包含权限信息。
经过上述系统功能分析和需求总结,我们考虑到将来功能上的扩展,涉及如下面所示的数据项和数据结构。
3 / 28
产品信息,包含编号、品名、单位、单价、类别、产地以及说明
等。
客户信息,包含编号、名称、联系人、电话、地址、邮编等。 订单信息,包含订单编号、产品编号、产品数量、客户编号、联
系人、联系电话、送货地址、下单日期以及说明等。
用户信息,包含账号、密码、姓名、部门以及管理等。
(三)数据库概念结构设计
得到上面的数据项和数据结构以后,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础,这些实体包含各种具体信息,通过相互之间的作用形成数据的流动。
本次课程设计中,根据上面的设计规划处的实体有:订单信息实体、客户信息实体、产品信息实体,以及用户信息实体,各实体具体的描述E-R图如下。
“订单信息”、“客户信息”和“产品信息”实体之间的E-R图如图1-2
订单信息 产品信息 订购 客户信息
“订单信息”实体的E-R图如图1-3所示
4 / 28
订单信息
订单编号 产品编号 客户编号 下单日期 订单总额
“产品信息”实体的E-R图如图1-4所示
编号 品名 单位 单价 产品信息 “客户信息”实体的E-R图如图1-5所示
5 / 28
编号 名称 联系人 地址 客户信息 “用户信息”实体的E-R图如图1.6所示
账号 密码 姓名 部门 权限 用户信息 (四)数据库逻辑结构设计
数据库的概念结构设计完毕后,就可以将上面的数据库概念结构转化为实际数据模型,也就是数据库的逻辑结构。
使用Visual FoxPro 开发直接使用其自带的数据库,订单管理系统中使用的各个数据表的字段设置如下。
用户信息表(UserInfo)的字段设置如表1-1所示。
6 / 28
产品信息表(ProductInfo)的字段设置如表1-2所示
客户信息表(ClientInfo)的字段设置如表1-3所示
7 / 28
订单信息表(OrderInfo)的字段设置如表1-4所示
(五)创建订单管理信息系统项目
8 / 28
在Visual FoxPro项目主窗口中选择【文件】中新建命令,选择新建项目OFA。项目创建后即可打开项目管理器,如表单1-1所示。
四、程序设计
(一)创建可视化类
信息管理模块中所使用的表单中都使用到了移动记录工具栏和命令按钮工具栏,若分别添加,其属性和代码将是一件很繁琐的事,因此在本次课程设计中将首先创建可视类,然后在表单中添加创建的可视化类,就减少了工作量,又保证了组员间风格的一致。在本次试验中共需创建“移动记录工具栏”类和“命令按钮工具栏”这两个类。
1、创建“移动记录工具栏”类
(1)创建可视类
打开项目管理器,切换到“类”选项卡,单击该选项卡的新建,在
9 / 28
“新建类”对话框的“类名”文本框中输入可视化类的名称“MOVERECORD”,在“派生于”下拉列表框中选择要新建的基类“COMMANDGROUP”,单击“存储于”文本框右侧的按钮,打开“另存为”对话框,选择存储位置,以及可视类库的名称,并将可视类库命名为“ADMINBUTTON”设置完毕后,单击“确定”就完成了可视类的创建,打开了类设计器。
在可视化类中设置类的“BUTTONCOUNT属性值为4,并修改类及类中按钮的属性如表1-5所示。
“移动记录工具栏”类的属性设置
控件名称 属性 button height width Frontbold Forecolor Height width Caption tooltiptext 属性取值 4 40 320 .T. 0,0,255 30 65 首记录 到第一条记录 上一个 到上一条记录 下一个 到下一条记录 末记录 到最后一条记录 moverecord 按钮 cmdtop cmdpre Caption tooltiptext Cmdnxt Caption tooltiptext cmdbtm Caption tooltiptext 可视化类“移动记录工具栏”及其中的控件后,可视类的效果如下
10 / 28
图1-7
(2)添加代码
在本次实例中当鼠标移动到按钮上方时鼠标指针变为自定义形状,这需要在按钮的“MOUSEMOVE”事件中添加代码来指定鼠标的指针形状,代码如程1.1所示
LPARAMETERS nButton, nShift, nXCoord, nYCoord This.MousePointer = 99
&&鼠标指针为自定义形状
This.MouseIcon = SYS(5)+\"h_point.cur\" &&指定鼠标的指针 “首记录”按钮的click 代码 GO TOP
&&到首记录
THISFORM.REFRESH &&刷新表单
“移动记录工具栏”类中的“上一个”按钮的click 代码如程1.2所示
*如果到了数据表首部 IF BOF() .OR. RECNO() = 1
MessageBox(\"已到首记录\移动记录\") ELSE
*如果数据指针不位于数据表首部 SKIP-1 ENDIF *刷新表单
THISFORM.REFRESH
“移动记录工具栏”类中的“下一个”按钮的click 代码如程1.3所
11 / 28
示
*如果记录指针位于数据表末尾 IF EOF() or RecNO() = RecCount()
MessageBox(\"已到末记录\移动记录\") *如果记录指针不位于数据表末尾
ELSE &&记录指针下移 SKIP ENDIF *刷新表单
THISFORM.REFRESH()
“末记录”按钮的click 代码如程1.4所示
GO BUTTOM &&到数据末尾
THISFORM.REFRESH &&刷新表单
“移动记录工具栏”类中的4个按钮设定是,根据表单中数据记录指针的位置不同,禁用或者启用不同的按钮,所以需将判断及操作代码添加到“移动记录工具栏”类的“refresh”事件中,具体代码如程1.5所示
*如果数据表为空或者只有一条记录 IF BOF() .AND. EOF() .OR. RECCOUNT()=1 THIS.Cmdtop.ENABLED=.F. THIS.Cmdpre.ENABLED=.F. THIS.Cmdnxt.ENABLED=.F. THIS.Cmdbtm.ENABLED=.F. ENDIF
*如果在记录指针在数据表的末尾 IF RECNO()=RECCOUNT() .OR. EOF() THIS.Cmdtop.ENABLED=.T. THIS.Cmdpre.ENABLED=.T. THIS.Cmdnxt.ENABLED=.F.
12 / 28
THIS.Cmdbtm.ENABLED=.F. ELSE
*如果记录指针在数据表的首部 IF RECNO()=1 .OR. BOF() THIS.Cmdtop.ENABLED=.F. THIS.Cmdpre.ENABLED=.F. THIS.Cmdnxt.ENABLED=.T. THIS.Cmdbtm.ENABLED=.T. ELSE
*如果记录指针不在数据表的首部也不在尾部 THIS.Cmdtop.ENABLED=.T. THIS.Cmdpre.ENABLED=.T. THIS.Cmdnxt.ENABLED=.T. THIS.Cmdbtm.ENABLED=.T. ENDIF ENDIF
这样,“移动记录工具栏”类就创建完毕!
2、创建“命令按钮工具栏”类
由于前面已详细介绍了“移动记录工具栏”类的创建,这里就不再一一介绍了,按照之前我们设想设置好类及按钮的属性后,“命令按钮工具栏”类的效果如图1-8
13 / 28
与“移动记录工具栏”类相同,当鼠标移动到按钮上方时,鼠标指针要使用自定义鼠标指针,所以也要添加该类中的按钮的“mousemove”事件代码如上。
由于“命令按钮工具栏”类在各个表单中的效果相同,即可首先弹出一个确认话框,如果确认则退出当前表单,所以退出按钮的“click”事件代码如程1.6所示
LOCAL YN *确认对话框
YN=MESSAGEBOX(\"确定退出\订单管理系统\") IF YN=6 ENDIF
至此,“命令按钮工具栏”类创建完成。
&&声明本地变量
&&如果确认
THIS.PARENT.PARENT.RELEASE
(二)创建系统主表单
本次课程设计中,使用.PRG程序作为主程序,由该程序设置运行的环境,并调用系统登录表单,系统通过后显示系统LOGO表单,然后再试系统主表单,再由系统主表单调用其他表单完成系统提供的各个功能。
1、创建系统主程序
14 / 28
主程序是所编写的程序的入口,其作用是设置程序的运行环境,定义变量、常量,然后调用其他的表单,其代码如程1.7所示
*——系统环境设置 CLEAR CLEAR ALL SET ESCAPE OFF 断
SET TALK OFF
&& 关闭命令显示
SET SAFETY OFF && 覆盖时不要确认 SET STAT BAR OFF && 将状态栏关闭
SET SYSMENU OFF && 可关掉VFP系统菜单区域 SET SYSMENU TO && 关闭系统菜单 SET CENTURY ON && 显示四位年代 SET DATE ANSI yy.mm.dd
*——避免多次运行程序
*——声明API函数“FindWindow” DECLARE
Integer
FindWindow
IN
USER32.DLL
String
lpClassName,String lpWindowName
lpWindowName=\"订单管理系统\"
IF .NOT. FindWindow(0,lpWindowName)==0 &&寻找窗口标题 =MESSAGEBOX(\"程序已经运行了\订单管理系统\") QUIT ENDIF
_Screen.Caption=lpWindowName *——声明全局变量
PUBLIC cUser,IsAdmin && 声明全局变量,用来保存系统中的登录用户
*——调用登录表单 DO FORM Logon *——进入事物处理
15 / 28
&& 禁止运行的程序在按ESC键被中
&& 指定日期表达式的显示格式为
&& 显示登录表单
READ EVENTS
2、创建系统主菜单
打开项目管理器,切换到“其他”选项卡,在选项卡的类表框中选择“菜单”选项,新建菜单如下:
由于菜单不是单独运行,而是内置在系统主表单中运行,所以还
需要设置菜单的常规选项。打开菜单设计器,选择显示中常规选项命令,打开“常规选项”对话框,在此对话框中选中“顶层表单”复选框,这样菜单就可以与顶层表单一起运行了。
菜单设计完成后,还需要生成可执行的菜单文件(.mpr文件),
在菜单设计器中选择菜单生成命令,打开“生成菜单”对话框,在此对话框中的“输出文件”文本框中输入生成的可执行的菜单文件位置,单击确定按钮即可。
3、 创建用户管理模块
“订单管理系统”中设计的用户管理模块包括系统登录、密码修改、添加用户、修改用户和删除用户5项功能,其中修改和删除用户功能在集成在一个表单中,下面分别介绍:
(1) 创建“系统登录”表单
设置表单一些基本属性之后,创建好的表单效果如下
16 / 28
把用户信息表(userinfo)添加到数据环境中,之后便添加代码。
“确定”按钮的“click”事件代码如程1.8所示 *——改为精确比较 SET EXACT ON
*—— 试图登录次数自动加1 THISFORM.i=THISFORM.i+1 IF EMPTY(ALLTRIM(账号))
MESSAGEBOX(\"请输入账号名称\订单管理系统\") THISFORM.txt账号.SetFocus ELSE
SELECT UserInfo LOCATE FOR ALLTRIM(账号)=ALLTRIM(THISFORM.txt账号.VALUE) &&查找用户
*——用户名和密码正确
IF FOUND() .AND. ALLTRIM(密码)=ALLTRIM(THISFORM.txt密码.VALUE)
CUser=账号 IsAdmin=管理
THISFORM.RELEASE()
17 / 28
&&将登录用户的姓
名存储到全局变量中
Logo表单
ELSE
DO FORM LOGO &&执行
*——用户名和密码错误 3
系统\")
3次
系统\")
出表单
循环
FoxPro
ENDIF ENDIF
*——改为模糊比较 SET EXACT OFF
IF THISFORM.i<3 &&如果次数小于
MESSAGEBOX(\"账号或密码错误,请重新输入\订单管理THISFORM.txt账号.VALUE=\"\" THISFORM.txt密码.VALUE=\"\" THISFORM.txt账号.SETFOCUS
ELSE &&如果已登录
MESSAGEBOX(\"密码错误三次,系统无法启动\订单管理
THISFORM.RELEASE &&退CLEAR EVENTS QUIT
&&结束事件
Visual
&&退出
ENDIF
“取消”按钮的“click”事件代码如程1.9所示
*——声明本地变量 LOCAL YN
18 / 28
*——确认对话框
YN=MESSAGEBOX(\"确定退出\订单管理系统\") *——如果确认 IF YN=6
THISFORM.RELEASE CLEAR EVENTS QUIT ENDIF
&&退出当前表单 &&结束事务处理
&&退出Visual FoxPro
(2) 创建“修改密码”表单
将“用户信息表”添加到表单数据环境中,其代码添加介于篇幅就不详细介绍了。同上“修改用户表单与删除用户表单”也不一一介绍了。
(3) 创建“修改密码”表单
19 / 28
将“用户信息表”添加到表单数据环境中,其代码添加介于篇幅就不详细了。
4、 创建信息浏览表单
(1)创建“产品信息浏览”表单
命名为“proselect”将“产品信息”表添加到表单的数据环境中,
IF .NOT. EMPTY(ALLTRIM(THISFORM.txt产品编号.Value))
SelTJ=SelTJ + \" AND '\" + ALLTRIM(THISFORM.txt产品编
号.Value) + \"' $ 编号\" ENDIF
20 / 28
IF .NOT. EMPTY(ALLTRIM(THISFORM.txt产品名称.VALUE))
SelTJ=SelTJ + \" AND '\" + ALLTRIM(THISFORM.txt产品名
称.Value)+ \"' $ 品名\" ENDIF
SELECT ProductInfo SET FILTER TO
SET FILTER TO &SelTJ添加“产品信息浏览”表单的“init”事件代码如程2.1所示
PARAMETERS cFormMode
THISFORM.FormMode=cFormMode PUBLIC SelTJ SelTJ=\".T.\"
SELECT ProductInfo SET FILTER TO
IF THISFORM.FormMode=\"cBrowse\"
THISFORM.Grid1.Column1.Header1.Caption=\"编号\" THISFORM.CmdPrint.Visible=.T.
THISFORM.CAPTION=\"产品信息浏览\" ELSE
IF THISFORM.FormMode=\"cSelect\"
THISFORM.Grid1.Column1.Header1.Caption=\"编号(双击选择)\"
THISFORM.CmdPrint.Visible=.F.
THISFORM.CmdExit.Left=THISFORM.CmdExit.Left-35 THISFORM.CAPTION=\"产品信息选择\" ENDIF ENDIF
THISFORM.Refresh
21 / 28
当“产品信息浏览”表单作为“产品信息选择”表单时在表单推出是要向调用的该表单的表单返回值,即添加一个“return”语句,添加“产品信息浏览”表单的“unload”事件代码如程2.2所示
IF THISFORM.FormMode=\"cSelect\" Return THISFORM.SelectedPro ENDIF
当“产品信息浏览”表单作为“产品信息选择”表单时,在表格控件的第一列中双击时即可选择该条记录,并将该记录的“编号”字段值返回给调用表单,添加“产品信息浏览”表单的表格控件的第一列文本框的“dblclick”事件,代码如程2.3所示
If thisform.formmode=”cselect”
thisform.selectedpro=alltrim(this.value) thisform.release endif
查看按钮的“click”代码如程2.4所示 SelTJ=\".T.\"
THISFORM.Refresh
“打印”按钮的“click”代码如程2.5所示
REPORT FORM ProductInfo Preview FOR &SelTJ
“退出”按钮的“click”代码如程2.6所示
YN=MESSAGEBOX(\"确定退出\订单管理系统\") IF YN=6
22 / 28
IF THISFORM.FormMode=\"cSelect\"
THISFORM.SelectedPro=\"0000000000\" ENDIF
THISFORM.Release
ENDIF
至此,“产品信息管理”表单创建完毕。
(2)创建“产品信息浏览”表单
由于它与上“产品信息管理”相似,这里就不再介绍了。
5、 创建信息管理模块
(1)创建产品信息管理表单
23 / 28
将“产品信息”表添加到表单数据环境中,把之前创立的两个类控件添加到表单中,由于在这里还使用了一个自定义方法“modecontrol”,其代码如程2.7
Local BeModify,BeBrowse BeModify=THISFORM.bModify BeBrowse=THISFORM.bBrowse
THISFORM.txt编号.ReadOnly=.NOT. BeModify THISFORM.txt品名.ReadOnly=.NOT. BeModify THISFORM.txt单位.ReadOnly=.NOT. BeModify THISFORM.txt单价.ReadOnly=.NOT. BeModify THISFORM.txt类别.ReadOnly=.NOT. BeModify THISFORM.txt产地.ReadOnly=.NOT. BeModify THISFORM.txt说明.ReadOnly=.NOT. BeModify THISFORM.ProMoveRec.Enabled=.NOT. BeModify
THISFORM.ProAdminButton.CmdAdd.Enabled=.NOT. BeModify THISFORM.ProAdminButton.CmdMod.Enabled=.NOT. BeModify THISFORM.ProAdminButton.CmdDel.Enabled=.NOT. BeModify THISFORM.ProAdminButton.CmdPri.Enabled=.NOT. BeModify THISFORM.ProAdminButton.CmdExit.Enabled=.NOT. BeModify THISFORM.ProAdminButton.CmdSave.Enabled=BeBrowse THISFORM.ProAdminButton.Cmdccl.Enabled=BeBrowse
24 / 28
“产品信息管理”表单的“init”事件代码2.8 *——选择“产品信息”表所在的工作区 SELECT ProductInfo
*——清除工作区中可能存在的过滤条件 SET FILTER TO
*——如果“产品信息”表为空
IF EOF() AND BOF() OR RECCOUNT()=0
*——表单进入“数据表为空”状态 THISFORM.bModify=.T. THISFORM.bBrowse=.F. THISFORM.ModeControl
THISFORM.ProAdminButton.CmdAdd.Enabled=.T. THISFORM.ProAdminbutton.CmdExit.Enabled=.T. *——表单进入浏览状态 THISFORM.bModify=.F. THISFORM.bBrowse=.F. THISFORM.ModeControl
ELSE
ENDIF *——刷新表单 THISFORM.Refresh
添加“产品信息管理”的“refresh”事件代码如程3.0 IF EOF() AND BOF() OR RECCOUNT()=0
25 / 28
THISFORM.bModify=.T. THISFORM.bBrowse=.T. THISFORM.ModeControl
THISFORM.ProAdminButton.CmdAdd.Enabled=.T. THISFORM.ProAdminbutton.CmdExit.Enabled=.T.
ENDIF
(2)创建客户信息管理表单
将“客户信息”表添加到表单数据环境中,由于它与“产品信息管理”表单类似,所以这里不要再介绍了。
(4) 创建订单信息管理表单
将“产品信息”表和“客户信息”表和“订单信息”表添加到表单的数据环境中,添加两个类控件,表单就创立成功了。
(三)创建打印输出功能
因为报表创建比较简单,这里就不详细介绍了。产品信息报表打
26 / 28
印预览如下
五、系统测试和分工
(一)系统测试
把整个表单和报表全部建立后就对项目进行连编,之后再运行,
因为visual foxproa提供强大的调试工具—调试器,它可以帮助我们进行程序调试工作,知道程序完全运行为止。
(二)系统分工
陈城:负责创建可视化类、产品信息管理表单建立和项目联编 张千:负责用户功能模块建立
曹丽:负责报表建立和撰写课程设计实验报告 廖梦翔:负责客户信息管理表单建立
27 / 28
彭迎春和王文会负责建表
六、课程设计小结
这次课程设计我们组采取了分工合作的办法,每人负责系统里的一个子模块,各司其职。在做表单的时候,因为没有代码可以拷贝,所以就需要我们一个一个的把代码输入到电脑里,期间有很多次输入的代码有错误,我们就必须把错误找出来并改正,过程繁琐而枯燥。但是,我们体会到了团体合作的乐趣及团队合作的效率。我们只用了两次上机的时间就把这个 MIS系统的框架做出来了。
通过这次课程设计,我们知道了开发一个MIS系统大致的步骤,虽然做的系统不如专业人员的复杂、准确,但我们对这个课程有了一个初步的认识、了解。同时,在做的过程中,我们也学会了如何去发现问题,处理问题。总之,获益不少。
在这次课程设计中,我们也发现了一些问题,
1、我们选择开发的系统不够完善,子模块不够充足。使得整个系统
显得不够专业。
2、对一些基础知识不是很熟悉。
建议我们在日常的学习中,多注重实践能力的训练,把基础知识掌握牢固,对专业知识要充分理解,吸收,掌握。
28 / 28
因篇幅问题不能全部显示,请点此查看更多更全内容