资源描述
第4章 销售管理信息系统
PowerBuilder是Sybase公司推出的一套强大的数据库应用系统开发工具,它具有完整的客户/服务器体系结构、面向对象的应用程序开发方法以及可视化的开发环境,因而成为近几年流行的数据库前端开发工具。目前,PowerBuilder已经广泛地应用于银行、电信、医疗保健、保险等行业中,为这些行业的数据库应用提供了强大的开发功能。
销售管理信息系统作为信息管理系统的一个分支,已逐渐成为企业信息化建设的重要组成部分。为企业管理分布在全国的销售网点提供了一个功能强大、安装部署方便、使用成本低廉、操作简捷的实时销售管理系统。不仅能够促进销售业务的拓展,提高销售运作的效益,也为最终实现有效的“供应链管理”和更加广泛的“电子商务”奠定了基础。本章将以典型的销售管理信息系统为例,向读者详细讲述如何使用PowerBuilder开发企业销售管理信息系统。
4.1 PowerBuilder对数据库开发的支持
PowerBuilder作为专业的数据库开发工具,以其开放的体系结构、简洁高效的集成开发环境、强大的数据窗口技术、良好的数据库访问能力和友好的用户界面,日益成为数据库开发人员的得力助手。
PowerBuilder支持各种常见的数据库,提供了多种数据库接口。PowerBuilder与数据库的连接是建立在驱动程序之上的,可以通过ODBC或JDBC接口来存储数据,也可以通过像专用的数据库接口直接连接数据库。
数据窗口(DataWindow)是PowerBuilder中一个独特的对象,是Sybase的专利技术,PowerBuilder的成功在很大程度上归功于它。数据窗口的功能非常强大,它可以方便而快速地处理数据。通过数据窗口,无需编写复杂的SQL语句,就可以实现对数据库的读写操作。
本节将对PowerBuilder与Access数据库的连接,以及数据窗口技术的相关知识进行 介绍。
4.1.1 实现PowerBuilder访问Access数据库
PowerBuilder与Access的连接方法可以通过ODBC调用软件来实现。下面将介绍如何实现PowerBuilder访问Access中的“联系人管理”数据库。
因为是通过ODBC连接Access数据库,则需要定义ODBC数据源,具体方法可参阅2.8.1节内容,也可以通过PowerBuilder自带的工具定义ODBC数据源。
(1) 为“联系人管理”数据库注册ODBC数据源“联系人管理”,但只定义数据源是不够的,还要建立PowerBuilder的数据库配置文件(Profile)。
单击PowerBar上的DB Profile工具按钮,打开如图4-1所示的对话框。在树状视图列出的数据库接口驱动程序中选择所要连接的数据库类ODB ODBC,右击,在弹出的快捷菜单中选择New Profile命令。
图4-1 Database Porfile对话框
(2) 打开Database Profile Setup对话框,这里只有Connection选项卡中的Profile Name和Data Source两项参数是必须要指定的。Profile Name 指定配置文件的名称,这里指定为“联系人管理”;Data Source指定对应的ODBC数据源,这里选择前面定义好的ODBC数据源“联系人管理”;UserId和Password分别用于指定连接数据源的账户名和口令,它们是可选的,如图4-2所示。
(3) 选择Preview选项卡,测试连接是否成功。设置完毕后,单击OK按钮,数据库配置文件的参数将存放到Windows的注册表中,同时,配置文件的名称也会出现在数据库类ODB ODBC的目录中。然后右击该配置文件,在弹出的快捷菜单中选择Connection命令,PowerBuilder将完成对“联系人管理”数据库的连接,如图4-3所示。
连接成功后,就可以在PowerBuilder的开发环境中访问“联系人管理”数据库了。如果要在应用程序中连接Access数据库,可以直接在程序中编写脚本。同样,可以使用ODBC接口的语法,根据上面所填写的配置参数,在Application的Open事件中加入代码。
若使用ODBC接口的语法连接数据库,代码如下:
// Profile 联系人管理
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=联系人管理;UID=;PWD='"
//连接数据库
Connect;
If sqlca.sqlcode<>0 then
Messagebox('连接数据库失败',sqlca.sqlerrtext)
Halt Close
Else
Messagebox('提示信息', '连接数据库成功')
//其他操作,如打开登录窗口等
//Open(w_login)
End if
图4-2 Database Profile Setup 图4-3 Database Profile
4.1.2 PowerBuilder的数据窗口技术
数据窗口(DataWindow)是PowerBuilder开发数据库应用程序最强有力的工具。数据窗口对象是PowerBuilder数据窗口技术的核心内容,为检索、表现和操作相关数据库或其他数据源中的数据提供了非常方便的手段。开发人员可以通过定义数据窗口对象来指定数据的显示格式、表现风格以及其他数据属性,提高效率并开发出高质量的应用系统。
1. 数据窗口对象
PowerBuilder中的数据窗口对象主要完成两个方面的工作:一方面,它处理应用程序所需的底层数据源,使开发人员能够方便地操作各种类型的数据源,而不必关心这些数据源的底层调用,如数据源接口API,甚至较为高级的SQL语句也可以由数据窗口对象自动生成;另一方面,数据窗口对象控制着从数据源得到的结果集的显示,负责和应用程序的用户之间的交互,使开发人员不必再在高水平的图形界面设计上花费精力。
下面将使用PowerBuilder的数据窗口创建向导来创建一个简单的数据窗口对象。
(1) 选择显示风格
由于数据窗口对象显示的是数据库表中的信息,在创建数据窗口前对象,PowerBuider要求连接数据库。假设已经成功连接了数据库“联系人管理”(注意:因为PowerBuiler不支持中文字段,这里在数据库中增添了FriendInfo表,在下面的示例中将使用该表进行演示),接下来为数据窗口对象选择所需的显示风格(Presentation Style)。
选择File | New命令,弹出New对话框,选择DataWindow选项卡,如图4-4所示。
图4-4 选择数据窗口的显示风格
在PowerBuilder中,显示风格决定了以什么样的格式显示数据窗口中的数据。图1-32列出了数据窗口对象可用的11种显示风格:Composite,Crosstab,Freeform,Graph,Grid,Group,Label,N-Up,OLE2.0,Rich Text和Tabular,具体介绍可参阅PowerBuilder用户手册中的相关内容。
这里选择Freeform样式(因为这种风格应用最为普遍。它允许设计者在数据窗口画板中自由地调整和移动字段对象和字段标签对象),然后单击OK按钮。值得注意的是,如果没有建立并打开任何一个工作区(Workspace),或者工作区中没有任何容纳该数据窗口的PowerBuilder库,那么该按钮是不可用的。
(2) 选择数据源
接下来PowerBuilder会弹出Choose Data Source for Freeform DataWindow对话框,其中列出了5种类型的数据源,分别是Quick Select,SQL Select,Query,External,Stored Procedure,如图4-5所示。
图4-5 选择数据窗口的数据源
选择Quick Select类型的数据源。Quick Select数据源是最简单、也是最常用的数据源,该数据源所对应的SQL Select语句完全是由PowerBuilder自动、快速生成的。Quick Select数据源中的数据可以来自一个数据表,或通过外部关键字关联的多个数据表。
如果想在预览数据窗口对象或打开预览视图时,让数据窗口对象自动从数据源中重新获取数据,可以选中Retrieve on Preview复选框。
(3) 选择并设计数据库表中的字段
选中Quick Select后,单击Next按钮,PowerBuilder会弹出Quick Select对话框,如图4-6所示。在这里,PowerBuilder会指导开发者选择并设计数据库表中的字段。
图4-6 选择并设计数据库表中的字段
在对话框左上侧的Table列表中,列出了所连接上的数据库“联系人管理”中的表。而右上侧的Columns列表用于显示所选中的数据库表中的字段。这里选中数据表FriendInfo,单击Add All按钮,将表中所有的字段添加到对话框底部的列表中。在该列表中,可以定义字段的排序和选择条件。
(4) 设置颜色和边框信息
在图4-6中单击OK按钮,打开Select Color and Border Settings对话框,如图4-7所示。
图4-7 设置颜色和边框信息
在该对话框中,可以选择要创建的数据窗口对象的颜色和边界等信息。
● Backgroud Color:用于设置整个数据窗口对象的背景颜色。
● Text/Color:用于设置字段数据(即字段值)的标签所使用的颜色。
● Text/Border:用于设置字段数据(即字段值)的标签所使用的边框。
● Columns/Color:用于设置字段标题(即字段名称)的标签所使用的颜色。
● Columns/Border:用于设置字段标题(即字段名称)的标签所使用的边框。
● Wrap Height:用于设置细目带的高度,只有Freeform显示风格才有这个选项。
● Sava as default:用于将上述设置参数的值保存为默认值。
选好了这些信息后,单击Next按钮,会打开Ready to Create Freeform DataWindow对话框。这个对话框显示了在创建数据窗口的过程中从设计者那里获取到的各种信息。确认无误后,单击Finish按钮,完成对一个数据窗口对象的创建。
(5) 进入数据窗口面板
接下来PowerBuilder会生成刚才所设计的数据窗口对象。这时,在PowerBuilder的工作区中将弹出数据窗口面板。首先给出数据窗口面板中的Design视图,如图4-8所示。
图4-8 所生成的数据窗口对象的Design视图
Design视图主要用于对数据库进行设计,它分为若干区域,最常用的有页眉/标题(Header)、数据/细节(Detail)、汇总(Summary)和页脚(Footer)等4个区域。其中在标识带的标签旁有一个向上的小箭头,说明在标识带上方是相应区域,可以用鼠标拖动标识带来改变相应区域的大小。下面来简单解释一下各个区域的作用。
● 页眉/标题(Header)区域:用来显示栏目名(默认在建立数据库表时为列定义的标签名或列名)和报表的标题名及其他页眉信息,如日期等。
● 数据/细节(Detail)区域:是数据窗口的主体,它可以用来显示和操作来自数据源的数据。
● 汇总(Summary)区域:可以通过数据窗口表达式,在汇总区域对显示在数据/细节(Detail)区域中的数据进行汇总计算,如求合计、平均值等。
● 页脚(Footer)区域:在数据窗口的底部,通常用来显示一些页脚信息,如页码等。
图4-8所示的数据/细节(Detail)区域中共有10个对象,其中左边的4个对象为Text(文本)类型的对象,它们仅仅在数据窗口中显示一段文本;而右边的4个对象则为Column(字段)类型的对象,在程序运行时它们所显示的内容将和数据源中对应的字段相关。
我们会经常用到的另一个视图是Preview视图,如图4-9所示。这个视图用来在设计时预览数据窗口对象运行时的效果,并可以通过该窗口完成对数据库的一些操作。
Preview窗口在数据窗口面板中默认是打开的,如果在当前面板中看不到Preview窗口,可以选择View | Preview命令,打开Preview窗口。图4-9直观地显示了所设计的数据窗口运行时的结果,这对设计很有帮助。
图4-9 所生成的数据窗口对象的Preview视图
(6) 保存数据窗口对象
一切设计工作完成后,最后就是保持这个新建的数据窗口对象。选择File | Save命令,打开Save DataWindow对话框,如图4-10所示。
图4-10 保存数据窗口对象
在该对话框中,输入新建的数据窗口的名字,这里输入dw_friendinfo,然后可以在Comments文本框中为该数据窗口添加注释。确认无误后,单击OK按钮。
至此,一个完整的数据窗口对象就创建完毕了。
2. 数据窗口控件
数据窗口控件是数据窗口技术了另一个重要方面,它是数据窗口对象的容器。数据窗口对象定义好之后,一般要与窗口界面上的数据窗口控件相关联,用户通过数据窗口控件操作数据窗口对象,进而操作数据库。
数据窗口功能的强大性不仅表现在数据窗口对象具有丰富的显示样式和灵活的数据源,而且还表现在数据窗口控件具有非常多的事件和函数。下面将介绍在用户操作数据窗口时常用到的一些事件和函数。
(1) 检索数据
连接完数据库后,需要使用Retrieve()函数将数据从数据库检索到数据窗口中。如果为该函数提供了参数,那么这些参数值将用作数据窗口对象的SQL Select语句的提取参数。
Retrieve()函数的语法定义如下:
dwcontrol.Retrieve({, argument , argument … })
其中,dwcontrol是数据窗口控件名,argument(可选项)是向数据窗口对象的SQL Select语句提供的检索参数。
函数执行成功时,被检索到的数据将显示在数据窗口控件中,同时函数的返回值是从数据库中检索到的行数,否则该函数返回–1。
除了可以一开始从数据库中检索数据外,在操作数据库的过程中,任何时候都可以调用Retrieve()函数重新从数据库中检索数据。
(2) 添加和删除数据
用户通过数据窗口控件操作数据,可以直接以交互方式修改那些可编辑数据;如果要在数据窗口中插入新的行使用InsertRow()函数;如果要删除数据窗口中的行使用DeleteRow()函数。
● InsertRow()函数
该函数在数据窗口控件指定行前面插入一行。如果数据窗口中某些列定义了默认值,那么在新插入行显示之前,相应数据项的值首先使用默认值进行初始化。
InsertRow()函数的语法定义如下:
dwcontrol.InsertRow(row)
其中,dwcontrol是数据窗口控件名;row指定在哪一行插入新行,如果该参数值为0则在数据窗口尾部追加一新行。
● DeleteRow()函数
该函数将删除数据窗口控件中指定的数据行。
DeleteRow()函数的语法定义如下:
dwcontrol. DeleteRow(row)
其中,dwcontrol是数据窗口控件名;row指定要删除的行,如果该参数值为0则删除当前行。
(3) 更新数据
用户交互地对数据窗口进行修改,为数据窗口插入或删除行,但这些都只是发生在数据窗口中,对数据库没有产生影响。Update()函数把数据窗口控件中所有数据修改传送到数据库,从而更新数据库中的数据。
Update()函数的语法定义如下:
dwcontrol. Update({ accept {, resetflag } })
其中,dwcontrol是数据窗口控件名;accept(可选项)指定数据窗口控件在更新数据库之前是否自动执行AcceptText()的功能,把文本框中的内容放置到缓冲区中。resetflag(可选项)指定更新数据库后是否自动复位更新标志。
在执行Update()函数之前,必须使用SetTrans()或SetTransObject()函数建立数据窗口与数据库的连接。使用SetTransObject()函数建立连接时,应用程序的运行效率更高些,但应用程序本身需要负责事务的提交(使用SQL COMMIT语句)和回滚(使用SQL ROLLBACK)。执行了Update()后,应该检查该函数的返回值,以判断函数的执行是否成功。
若函数执行成功时返回1,发生错误时函数返回–1。
(4) 数据窗口常用事件
当用户在数据窗口上选择或单击某一个位置,或者检索、更新数据,或在开始打印报表,结束打印报表,在打印过程中等,都发生相应的事件。可以为这些事件编写程序,在事件触发时完成某些处理。
● 单击事件(Clicked)
用户在数据窗口控件的任何位置单击时都会触发Clicked事件,典型应用是单击选择要操作的数据行或数据项。该事件提供的参数及其含义如表4-1所示。
表4-1 Clicked事件的参数
参 数
含 义
Xpos
表示用鼠标单击的位置与数据窗口控件工作区的左边界的位置
Ypos
表示用鼠标单击的位置与数据窗口控件工作区的上边界的位置
Row
表示用户单击行的行号
Dwo
表示用户单击的数据窗口上的对象
该事件的返回值的含义如表4-2所示。
表4-2 Clicked事件的返回值
返 回 值
含 义
1
为默认返回值,继续处理
0
停止处理,不改变输入焦点
● 检索事件(RetrieveStart,RetrieveRow和RetrieveEnd)
当执行Retrieve()函数进行检索时,与之相关的事件有RetrieveStart,RetrieveRow和RetrieveEnd。
RetrieveStart事件发生在数据库窗口检索数据之前(即执行Retrieve()函数前),使用该事件可以为用户提供一个可视化的检索进度,有时还可以用来控制检索的权限。该事件返回值的含义如表4-3所示。
表4-3 RetriveStart事件的返回值
返 回 值
含 义
0
为默认返回值,继续进行索引
1
不执行索引
2
从数据库中检索数据前不重置行和缓冲区
RetrieveRow事件发生在没检索一条记录并送到数据窗口的时候,该事件返回值的含义如表4-4所示。
表4-4 RetriveRow事件的返回值
返 回 值
含 义
0
为默认返回值,继续进行索引
1
停止检索
RetrieveEnd事件在检索结束后触发,一般可以用于清除在前面的事件中打开的任务。
● 更新事件(UpdateStart和UpdateEnd)
当执行Update()更新数据库时,与之相关的事件有UpdateStart和UpdateEnd。
UpdateStart事件在用户调用了Update()后,修改数据库数据之前发生,该事件返回值的含义如表4-5所示。
表4-5 UpdateStart事件的返回值
返 回 值
含 义
0
为默认返回值,继续进行更新
1
不执行更新
UpdateEnd事件在数据窗口完成更新数据库操作后发生,该事件的参数及其含义如表4-6所示。
表4-6 UpdateEnd事件的参数
参 数
含 义
Rowsinserted
更新操作中新插入数据库的行数
Rowsupdated
更新操作中更新的行数
Rowdeleted
更新操作中被删除的行数
● 错误处理事件(DBError)
当操作数据库出现错误时,系统会触发数据窗口的DBError事件,开发人员可以在此编写一些出错处理程序,从而提供系统的容错性。该事件的参数及其含义如表4-7所示。
表4-7 DBError事件的参数
参 数
含 义
Sqldbcode
包含由数据库厂商提供的特定出错代码
Sqlerrtext
数据库厂商提供的错误信息文本
Slqsyntax
发送到DBMS的发生错误的SQL语句
(续表)
参 数
含 义
Buffer
数据窗口缓冲区,错误发生时数据行所在的缓冲区
Row
在对数据进行操作时发生错误的数据行号
该事件返回值的含义如图4-8所示。
表4-8 DBError事件的返回值
返 回 值
含 义
1
为默认返回值,系统显示出错信息
0
系统不显示出错信息
如果开发人员没有为DBError事件编写程序,那么当发生数据库错误时将显示系统提示的错误信息。
如果开发人员为DBError事件编写了处理错误的程序,然后不希望再显示系统提示的错误信息,则应该使事件处理程序返回1(禁止显示系统错误信息)。
此外,在数据窗口控件中用于出错处理的事件还有error事件和itemerror事件。
● 数据处理事件ItemChanged
ItemChanged事件在编辑、修改数据项时触发,即在用户对数据项有修改动作后,用Enter键、Tab键或箭头键等方法离开当前编辑的数据项时触发(如果新值与原值一样则不触发)。该事件的参数及其含义如表4-9所示。
表4-9 ItemChanged事件的参数
参 数
含 义
Row
数据项所在的行号
Dwo
dwObject类型,修改的对象,一般是数据列
Data
以字符串形式表示的修改后的数据
该事件返回值的含义如图4-10所示。
表4-10 ItemChanged事件的返回值
返 回 值
含 义
0
为默认返回值,接受新修改的值
1
不接收新修改的值且不允许改变输入焦点
2
不接收新修改的值但允许改变输入焦点
在数据窗口控件中与数据处理有关的事件还有ItemFocusChanged事件和RowFocus- Changed事件等。
(5) 数据窗口排序
尽管在定义数据窗口对象时可以指定数据窗口中的数据按某种方式排序,在应用程序中还可以动态改变数据窗口的排序方式。为了使数据窗口排序,要先使用SetSort()函数设置排序方式,然后再使用Sort()函数实施排序操作。
SetSort()函数的语法定义如下:
dwcontrol. SetSort(format)
其中,dwcontrol是数据窗口控件名;format用字符串指定排序条件表达式,表达式包括列名或列号,使用列号时,必须在列号前加上#符号。如果format参数为NULL,PowerBuilder会提示用户输入排序条件。
Sort()函数的语法定义如下:
dwcontrol. Sort()
其中,dwcontrol是数据窗口控件名。Sort()函数执行成功时返回1,发生错误时函数返回–1。
如果在调用Sort()函数之前没有执行SetSort()函数,那么Sort()函数就使用定义数据窗口对象时排序条件。此后,当执行Retrieve()函数检索数据时,如果函数执行成功,那么PowerBuilder会直接完成排序任务。
只有在使用SetSort()函数修改了排序条件,或由于应用程序数据处理,或用户输入改变了数据时,才需要执行Sort()函数重新排序数据。如果在数据窗口对象设置了Retrieve As Needed选项,那么Sort()函数的执行将取消这个选项的效果,也就是说,执行Sort()函数时将检索出所有满足SQL Select检索条件的数据。
(6) 数据窗口过滤
在设计数据窗口对象时可以定义过滤条件,在应用程序中也可以动态定义和改变数据窗口的过滤条件。和排序类似,数据窗口过滤首先需要用SetFilter()函数指定过滤条件,然后再使用Filter()函数实施过滤操作。
SetFilter()函数的语法定义如下:
dwcontrol.SetFilter(format)
其中,dwcontrol是数据窗口控件名;format用字符串指定过滤条件表达式,表达式包括列名或列号,使用列号时,必须在列号前加上#符号。如果format参数为NULL,PowerBuilder会提示用户输入过滤条件;如果format参数为空字符串,则表示去掉过滤条件。
Filter()函数的语法定义如下:
dwcontrol. Filter()
其中,dwcontrol是数据窗口控件名。
如果在调用Filter()函数之前没有执行SetFilter()函数,那么Filter()函数就使用定义数据窗口对象时的过滤条件。此后,当执行Retrieve()函数检索数据时,如果函数执行成功,那么PowerBuilder会直接完成过滤任务。
只有在使用SetFilter()函数修改了过滤条件,或由于应用程序数据处理或用户输入改变了数据需要重新过滤数据时,才需要执行Filter()函数。如果在数据窗口对象设置了Retrieve As Needed选项,那么Filter()函数的执行将取消这个选项的效果。
(7) 确定数据窗口当前焦点位置
在应用程序中经常需要确定当前焦点所在位置,或者将焦点设置到指定位置。获得焦点的函数是GetRow()和GetColumn(),设置焦点的函数是SetRow()和SetColumn()。
● GetRow()函数:用来获得数据窗口中当前行的行号。
● GetColumn()函数:用来获得数据窗口中当前列的列号。
● SetRow()函数:用来将指定行设置为数据窗口控件的当前行。
● SetColumn()函数:用来将指定列设置为数据窗口控件的当前列。
(8) 从数据窗口中读数据
在应用程序中可以将数据窗口指定单元的数据读到变量中,为了适应读取不同类型的数据,PowerBuilder提供了以下函数。
● GetItemDate()函数:用来从指定行、列位置读一Data类型的值。
● GetItemDateTime()函数:用来从指定行、列位置读一DateTime类型的值。
● GetItemDecimal()函数:用来从指定行、列位置读一Decimal类型的值。
● GetItemNumber()函数:用来从指定行、列位置读一数值类型(如Decimal,Double,Integer,Long或Real类型)的值。
● GetItemString()函数:用来从指定行、列位置读一String类型的值。
● GetItemTime()函数:用来从指定行、列位置读一Time类型的值。
(9) 写数据到数据窗口
在应用程序中也可以将数据写到数据窗口指定行、列的位置。与读数据不同,PowerBuilder只为写数据提供了一个函数SetItem()。
SetItem()函数的语法定义如下:
dwcontrol. SetItem(row , column , value)
其中,dwcontrol是数据窗口控件名;row指定了数据窗口的行;column指定了数据窗口的列;value是要写到数据窗口的任意类型的值,它的类型应该与指定列的数据类型相一致。
以上介绍了一些在数据窗口控件中常用的事件和函数。事实上,PowerBuilder为数据窗口控件提供了大约30多个事件和160多个函数,详细介绍请参见有关使用手册。
4.2 概 述
销售管理信息系统的主要任务是建立维护客户信息档案,统计汇总产品信息,进行销售订单的录入、维护,实现对企业销售合同的过程管理和成本管理,提供各类统计分析和随机查询。图4-11是一个典型的销售管理信息系统的界面。
图4-11 销售管理信息系统界面
在不同的企业之间,销售管理信息系统会存在一些差异。通常,销售管理信息系统主要功能包括以下方面。
(1) 客户信息管理。对客户的基本信息(如客户编号、客户名称、联系电话、公司地址等)进行检索、录入和修改。
(2) 客户预订管理。对客户的预订信息(如预订的产品名称、数量、截止日期等)进行检索、录入和修改。
(3) 产品信息管理。对产品的基本信息(如产品名称、产品型号、计量单位等)进行检索、录入和修改。
(4) 合同信息管理。对合同的基本信息(如客户名称、合同内容、签定日期、截止日期等)进行检索、录入和修改。
(5) 合同收支管理。对合同的收支信息(如发票号、凭单号、费用金额、收帐金额、经办人等)进行检索、录入和修改。
(6) 销售人员信息管理。对企业销售人员的用户信息(如用户名、密码、联系电话等)的检索、录入和修改。
从功能描述的内容来看,本实例可以实现6大功能。根据这些功能设计出系统的功能模块,如图4-12所示。
图4-12 销售管理信息系统功能模块示意图
用户只要根据本单位的具体情况,补充完善上述功能,就可以应用到实际管理当中去。销售管理信息系统作为当前应用非常广泛的数据库应用系统之一,其开发过程包括需求分析、UML系统建模、数据库分析和设计以及各功能模块的实现。在后面几节中将详细讲述。
4.3 需 求 分 析
需求分析阶段是销售管理信息系统开发最重要的阶段。开发者首先要了解和弄清用户的需求,然后严格地定义该系统的需求规格说明书。需求分析分为两个过程,一是理解需求,二是分析需求。
4.3.1 理解需求
理解需求是在问题及其最终解决方案之间架设桥梁的第一步。开发者只有和客户充分理解了需求之后才能开始设计系统,否则,对需求定义的任何改进,设计上都必须大量的返工。下面是经过双方调研后得到的需求规格说明。
(1) 系统为销售人员建立人事档案,用户进入系统前需要身份验证,用户名、密码输入正确后方可进入系统。
(2) 系统为客户建立客户档案,可按客户编号或名称方便查询档案信息,档案信息主要包括客户编号、客户名称、联系电话、公司地址等。销售人员可根据客户的购买意向在系统中制定或修改销售订单,并可按销售单号查询每一张销售订单,订单中需说明产品名称、数量、截止日期等信息。
(3) 在系统中,销售人员可根据客户订单的要求签定或修改合同,但逾期的订单不能再用于签定合同。系统进行合同信息的录入、维护,可按合同编号查询合同信息,并可方便地查看合同中产品的详细信息。
(4) 系统可以方便地录入和维护合同的收支信息,包括发票号、凭单号、费用金额、收帐金额、经办人、发生日期等信息。
(5) 系统可以准确地记录和查询产品信息,包括产品的名称、型号、计量单位等信息。
(6) 系统的客户端在Windows平台下运行,服务器端可在Windows平台或UNIX平台下运行。系统需要有较好的安全性和可扩展性,并提供简洁方便的图形用户界面。
4.3.2 分析需求
分析需求是从客户的需求中提取出软件系统,能够帮助用户解决业务问题,通过对用户业务问题的分析,规划出系统的功能模块,即定义用例。这个步骤是对理解需求的升华,直接关系到该系统的质量。
经过开发者同客户的需求分析后,确定销售管理信息系统的功能模块(用例)包括客户信息管理、客户预订管理、产品信息管理、合同信息管理、合同收支管理和销售人员信息管理。
前面描述了销售管理系统的功能模块划分,但没有给出各模块之间的关系。在本系统中,可以把模块分为3个功能集合来描述。
(1) 客户/产品信息管理功能集合。该集合只包括客户信息管理、产品信息管理两个模块。主要用于提供客户/产品的基本信息。
(2) 销售订单及合同管理功能集合。该集合包括客户预订管理、合同信息管理、合同收支管理3个模块。客户预订模块根据客户的要求制定销售订单;合同信息管理模块再根据销售订单签定销售合同;合同收支管理然后再对销售合同进行收支统计,如图4-13所示。
图4-13 销售订单及合同管理功能集合关系图
(3) 用户管理及权限功能集合。该集合包括销售人员信息管理和权限控制两个功能模块,虽然权限控制不是一个独立存在的模块,但它贯穿在整个运行过程中。销售管理信息系统的销售人员管理模块需要经过权限授权才可以使用。权限功能模块确定用户角色由销售经理、销售员工组成。其中:
● 销售主管享有最高权限,可以对销售员工的信息档案进行录入、维护和删除,还可以使用系统中所有业务功能。
● 销售员工享有业务权限,可以使用系统中的业务功能,但不能对销售人员的信息档案进行管理,只可以修改自己的登录口令。
为便于读者掌握,本章主要针对系统中前两个功能集合的开发实现,用户管理及权限功能集合在实例中没有详细实现,有兴趣的读者可自己完善这些功能。
4.4 UML系统建模
需求分析完成后,接下来的工作是对系统建模。因为UML适合于对逻辑数据库模式和物理数据库模式建模,所以这里对系统进行UML建模。下面将使用Rational Rose对销售管理信息系统进行UML建模。
4.4.1 销售管理信息系统的用例分析
系统的用例分析是UML建模的第一步。在需求分析中已经确定了销售管理信息系统的各功能模块(用例),包括客户信息管理、客户预订管理、产品信息管理、合同信息和收支管理以及销售人员信息管理,其用例图如图4-14所示。
图4-14 销售管理信息系统用例图
该用例图标记了销售管理信息系统的所有用例,并且形象地描述了各用例与用户角色之间的关系。用例图所表示的各用例的作用以及各用户角色的权限请参看需求分析部分。
4.4.2 销售管理信息系统的域类分析
由于类图用于对系统的静态设计视图建模,支持系统的功能需求,即系统要提供的最终服务,因此可以使用类图来进行域类分析。域类分析是建立在用例分析基础上的,根据用例来确定销售管理信息系统中所要用到的类及类间的关系,从而得到类图,如图4-15所示。
图4-15 销售管理信息系统类图
在域类分析时,设计该系统的类图应注意以下两点。
(1) 对数据对象类的确定
确定对象类时需要考虑:结合数据库细节,定义了类的标记值;展开这些类的结构性细节,即属性细节。根据销售管理信息系统的用例分析,确定所用到的类主要包括:客户信息(ClientsInfo)、产品信息(ProductsInfo)、销售人员(SalersInfo)、客户预订(OrderSchedule)、客户合同(ContractOrder)、合同产品(ConProduct)、合同收帐(ConIncome)、合同支出(ConCost)。
(2) 对各类间关联的确定
观察各类之间的关系,如循环关联、一对一关联和n元关联等,从而确定各类间的关联。销售管理信息系统的各类间的关联可根据系统功能用例来确定,比如客户信息(ClientsInfo)类和客户预订(OrderSchedule)类之间是1: n的关联。关联须谨慎确定,以保证数据的完整性,防止以后频繁的修改,影响系统的开发进度。
4.4.3 销售管理信息系统的设计
在UML中,对系统动态方面建模的5种图有用例图、活动图、状态图、时序图和协作图。在设计阶段,需要使用状态图来描述类的对象的状态及其行为,显示对象的整个生命周期。在本系统中,有状态图的类有客户预订(OrderSchedule)和客户合同(ContractOrder),将两个类的状态图结合在一起如图4-16所示。
图4-16 状态图
另外,在多数情况下,为了描述用例的动态行为,还需要用到时序图。时序图可以单独使用,来可视化、详述、构造和文档化一个特定对象群体的动态信息,对一个实例的特定控制流进行建模。下面给出各个用例的时序图,以帮助接下来的设计工作。
客户预
展开阅读全文