目: 客户信息管理系统
专 业: .nte网页1班
学号: 1303110112
姓 名: 刘冰涛
指导教师: 胡迎久
1、
题目
客户信息管理系统
2、 设计目的和要求
目的:利用Visual Basic和Access实现客户信息管理系统。
要求:使系统能运行正确,完成基本的功能如客户类型的增加、删除、查询和修改等。
3、 设计内容(包括设计思路、设计实现)
3.1需求分析
客户信息系统需要完成的功能有:
客户类型的建立与维护,包括客户类型的新建、修改和删除等。
客户信息的输入,详细全面记录并管理客户信息和联系人信息,客户信息包括客户的基本信息,一般的通讯方式及客户其他信息,如爱好、禁忌、生日等。
客户信息的修改和删除,包括启动与取消客户的生日提醒等。
方便实用的数据查询功能,根据不同条件查询客户,可以查看客户信息。
3.2 总体设计
本系统采用三层结构设计,即程序逻辑结构分为用户界面层、业务逻辑处理层和数据存储层。三层在实际的物理结构上也是独立的,业务逻辑处理层采用ActiveX DLL实现,用户界面与业务逻辑分离,系统的安全性、可维护性、重要性和扩展性都大大提高。
本系统也采用面向对象的设计,系统中将客户类型、客户等都封装成相应的类,同时每个类都有自己对应的集合类,从而再次提高了对数据库操作系统的安全性和程序的可扩展性。
根据对系统功能的分析,我们可以把系统划分成客户类型管理模块、客户管理模块和提醒管理模块。
系统的物理结构也分为三层,即用户界面、组件和数据库。
3.3 程序界面及核心代码
3.1需求分析
客户信息系统需要完成的功能有:
1、客户类型的建立与维护,包括客户类型的新建、修改和删除等。
2、客户信息的输入,客户信息包括客户的基本信息,一般的通讯方式及客户其他信息,如爱好、禁忌、生日等。
3、客户信息的修改和删除,包括启动与取消客户的生日提醒等。
4、根据不同条件查询客户,可以查看客户信息。
3.2概念设计
本系统采用三层结构设计,即程序逻辑结构分为用户界面层、业务逻辑处理层和数据存储层。三层在实际的物理结构上也是独立的,业务逻辑处理层采用ActiveX DLL实现,用户界面与业务逻辑分离,系统的安全性、可维护性、重要性和扩展性都大大提高。
本系统也采用面向对象的设计,系统中将客户类型、客户等都封装成相应的类,同时每个类都有自己对应的集合类,从而再次提高了对数据库操作系统的安全性和程序的可扩展性。
根据对系统功能的分析,我们可以把系统划分成客户类型管理模块、客户管理模块和提醒管理模块。
系统的物理结构也分为三层,即用户界面、组件和数据库。
系统功能模块图
各实体间关系的E-R图
客户类型信息实体E-R图
客户信息实体E-R图
3.3逻辑设计
(1)模式转换(E/R to Relational)
ClientType
:
ClientInfo表:
Cooperate表:
WarnType表:
Warning表:
(2)模式规范化
ClientType表、ClientInfo表、Cooperate表、WarnType表、Warning表均已经为BCNF范式
(3)完整性约束设计
实体完整性约束:ClientType表主键为TypeId
ClientInfo表主键为ClientId
Cooperate表主键为CooperateId
WarnType表主键为WTypeId
Warning表主键为WarnId
参照完整性约束:Cooperate表的ClientId参照ClientInfo表主键ClientId
Warning表的TypeId参照ClientType表主键TypeId
(4)外模式设计
建立了一张Client视图,用于显示每位客户的合作、提醒信息,语句如下:
Create view Client
as
select CooperateId,ClientId,WarnId,ClientId,TypeName,Name
from ClientType,ClientInfo,Cooperate,Warning
where Cooperate.ClientId=ClientInfo.ClientId and Warning.TypeId=ClientType.TypeId
(5)典型应用设计
客户类型管理模块:添加客户类型,修改客户类型,删除客户类型
客户管理模块:客户信息管理,客户评价管理,客户合作管理
提醒管理模块:查看今日提醒,提醒设置管理
3.4物理设计
内模式设计:主要包括索引、散列、簇集设计
ClientType表:索引字段为TypeId,索引表达式为TypeId,索引类型为主索引
ClientInfo表:索引字段为ClientId,索引表达式为ClientId,索引类型为主索引
Cooperate表:索引字段为CooperateId,索引表达式为CooperateId,索引类型为主索引
WarnType表:索引字段为WTypeId,索引表达式为WTypeId,索引类型为主索引
Warning表:索引字段为WarnId,索引表达式为WarnId,索引类型为主索引
3.5系统实现
主要模块及其核心代码如下:
(1)客户类型管理模块:
添加客户类型界面:
核心代码:
Public Function AddNew(Optional strName As String = "", _
Optional lngSuperID As Long = -1) As gxcAddNew
If ExistByName("ClientType", "TypeName", strName) Then
AddNew = DuplicateName_AddNew
Exit Function
End If
If lngSuperID <> 0 Then
If ExistByID("ClientType", "TypeId", lngSuperID) = False Then
AddNew = SuperNotExist
Exit Function
End If
End If
If strName <> "" Then Me.TypeName = strName
If lngSuperID <> -1 Then Me.SuperID = lngSuperID '
Dim strSQL As String
Dim ErrMsg As String
strSQL = "INSERT INTO ClientType(SuperId, TypeName) "
strSQL = strSQL & " VALUES(" & lngSuperID
strSQL = strSQL & ",'" & strName & "'"
strSQL = strSQL & ")"
If RunSql(strSQL, ErrMsg) Then
Me.ID = MaxID("ClientType", "TypeId")
AddNew = AddNewOK
Else
AddNew = AddNewFail
End If
End Function
(2)客户管理模块:
客户信息管理模块:
添加客户界面:
核心代码:
Public Function AddNew(Optional ByVal strName As String = "", _
Optional ByVal intAge As Integer = 0, _
Optional varSex As gxcSex = -1, _
Optional lngTypeId As Long = 0) As Boolean
On Error Resume Next
'如果
为缺省值,即未传入,则直接调用类中的参数,否则调用传入的参数
If strName <> "" Then Me.Name = strName
If intAge <> 0 Then Me.Age = intAge
If varSex <> -1 Then Me.Sex = varSex
If lngTypeId <> 0 Then Me.TypeID = lngTypeId
Dim strSQL As String
g_Conn.BeginTrans
'开始一个事务,以免费得到的ID值已被其它客户端所使用
'此处调用NextID
,得到该类对应的数据表的下一个ID,即最大ID+1
Me.ID = NextID("ClientInfo", "ClientId")
Me.TypeName = GetValueByID("ClientType", "TypeId", Me.TypeID, "TypeName")
'构造SQL语句,注意需调用RealString去除字符串中的单引号,以及一些SQL语法的关键词加[]
strSQL = "Insert into ClientInfo([Name], Age, Sex, TypeId, Mobile, Email, OfficePhone, "
strSQL = strSQL & " HomePhone, Fax, HomeAddress, MailAddress, ZipCode, Birthday, "
strSQL = strSQL & " BirthdayWarn, [Work], [Position], Company, CompanySite, SelfSite, "
strSQL = strSQL & " Likes, Hate, Remark, Importance, Friendly, Satisfaction) "
strSQL = strSQL & " VALUES("
strSQL = strSQL & "'" & RealString(mvarName) & "'," '客户名称
strSQL = strSQL & mvarAge & "," '客户年龄
strSQL = strSQL & mvarSex & "," '性别
strSQL = strSQL & mvarTypeId & "," '客户类型Id
strSQL = strSQL & "'" & RealString(mvarMobile) & "'," '手机
strSQL = strSQL & "'" & RealString(mvarEmail) & "'," 'E-mail
strSQL = strSQL & "'" & RealString(mvarOfficePhone) & "'," '办公室电话
strSQL = strSQL & "'" & RealString(mvarHomePhone) & "'," '宅电
strSQL = strSQL & "'" & RealString(mvarFax) & "'," '传真
strSQL = strSQL & "'" & RealString(mvarHomeAdr) & "'," '家庭住址
strSQL = strSQL & "'" & RealString(mvarMailAdr) & "'," '通讯地址
strSQL = strSQL & "'" & RealString(mvarZipCode) & "'," '邮编
strSQL = strSQL & "'" & mvarBirthday & "'," '生日
strSQL = strSQL & mvarBirthdayWarn & "," '是不启用生日提醒
strSQL = strSQL & "'" & RealString(mvarWork) & "'," '职业
strSQL = strSQL & "'" & RealString(mvarPosition) & "'," '职位
strSQL = strSQL & "'" & RealString(mvarCompany) & "'," '公司
strSQL = strSQL & "'" & RealString(mvarCompanySite) & "'," '公司网址
strSQL = strSQL & "'" & RealString(mvarSelfSite) & "'," '个人网址
strSQL = strSQL & "'" & RealString(mvarLikes) & "'," '喜好
strSQL = strSQL & "'" & RealString(mvarHate) & "'," '厌恶
strSQL = strSQL & "'" & RealString(mvarRemark) & "'," '备注
strSQL = strSQL & mvarImportance & "," '重要度
strSQL = strSQL & mvarFriendly & "," '友好度
strSQL = strSQL & mvarSatisfaction '满意度
strSQL = strSQL & ")"
'执行SQL语句,并提交事务
g_Conn.Execute strSQL
g_Conn.CommitTrans
'如果发生错误,则返回FALSE,表示未成功添加
AddNew = (Err.Number = 0)
End Function
查找客户界面:
核心代码:
'按条件查找客户,以集合类的方式返回
Public Function Find(Optional ByVal lngID As Long = 0, _
Optional ByVal strName As String = "", _
Optional ByVal lngTypeId As Long = 0) As CClients
'构造查询SQL
Dim strSQL As String
strSQL = "Select ClientInfo.*,ClientType.TypeName from ClientInfo left outer join ClientType "
strSQL = strSQL & " ON ClientType.TypeID=ClientInfo.TypeID Where "
If lngID <> 0 Then strSQL = strSQL & "ClientInfo.ClientID=" & lngID & " and "
'如果是按名称查询,则采用“包含”的查询方法
If strName <> "" Then
strSQL = strSQL & "ClientInfo.Name like '%" & RealString(strName) & "%' and "
End If
If lngTypeId <> 0 Then
strSQL = strSQL & "ClientInfo.TypeID=" & lngTypeId & " and "
End If
strSQL = strSQL & "ClientInfo.ClientId>0"
On Error Resume Next
'将查询结果加入集合类
Dim rs As Recordset
Set rs = g_Conn.Execute(strSQL)
Dim i As Long
Dim objClient As cClient
For i = 1 To rs.RecordCount
Set objClient = New cClient
With objClient
.ID = rs("ClientID").Value
.Name = Trim(rs("Name").Value)
.TypeName = Trim(rs("TypeName").Value)
.TypeID = rs("TypeID").Value
.Sex = rs("Sex").Value
.Mobile = Trim(rs("Mobile").Value)
.Email = Trim(rs("Email").Value)
.OfficePhone = Trim(rs("OfficePhone").Value)
.HomePhone = Trim(rs("HomePhone").Value)
.Fax = Trim(rs("Fax").Value)
.HomeAdr = Trim(rs("HomeAddress").Value)
.MailAdr = Trim(rs("MailAddress").Value)
.ZipCode = Trim(rs("ZipCode").Value)
.Birthday = rs("Birthday").Value
.Age = rs("Age").Value
.BirthdayWarn = rs("BirthdayWarn").Value
.Work = Trim(rs("Work").Value)
.Position = Trim(rs("Position").Value)
.Company = Trim(rs("Company").Value)
.CompanySite = Trim(rs("CompanySite").Value)
.SelfSite = Trim(rs("SelfSite").Value)
.Likes = Trim(rs("Likes").Value)
.Hate = Trim(rs("Hate").Value)
.Remark = Trim(rs("Remark").Value)
.Importance = rs("Importance").Value
.Friendly = rs("Friendly").Value
.Satisfaction = rs("Satisfaction").Value
End With
Me.Add objClient
Set objClient = Nothing
rs.MoveNext
Next i
Set rs = Nothing
Set Find = Me
Err.Clear
End Function
客户评价管理模块:
客户合作管理模块:
添加合作信息界面:
核心代码:
Public Function AddNew(Optional datDate As Date = #1/1/1900#, _
Optional lngClientId As Long = -1, _
Optional intSatify As Integer = -1, _
Optional strRemark As String = "") As gxcAddNew Public Function AddNew(Optional datDate As Date = #1/1/1900#, _
Optional lngClientId As Long = -1, _
Optional intSatify As Integer = -1, _
Optional strRemark As String = "") As gxcAddNew
If lngClientId <> -1 Then Me.ClientID = lngClientId
If intSatify <> -1 Then Me.Satisfaction = intSatify '上级合作信息的ID
If strRemark <> "" Then Me.Remark = strRemark
If datDate <> #1/1/1900# Then Me.CooperateDate = datDate
Dim strSQL As String
Dim ErrMsg As String
strSQL = "INSERT INTO Cooperate(ClientId, [Date], Satisfaction, Remark) "
strSQL = strSQL & " VALUES(" & Me.ClientID
strSQL = strSQL & ",'" & Me.CooperateDate & "'"
strSQL = strSQL & "," & Me.Satisfaction
strSQL = strSQL & ",'" & RealString(Me.Remark) & "'"
strSQL = strSQL & ")"
If RunSql(strSQL, ErrMsg) Then
Me.ID = MaxID("Cooperate", "CooperateId")
AddNew = AddNewOK
Else
AddNew = AddNewFail
End If
End Function
(3)提醒管理模块:
查看今日提醒界面:
核心代码:
Option Explicit
Private mvarID As Long '提醒信息ID
Private mvarTypeId As Long '提醒类型ID
Private mvarTypeName As String '提醒类型名称
Private mvarClientId As Long '提醒客户ID
Private mvarClientName As String '提醒客户名称
Private mvarMsg As String '提醒显示消息
Private mvarShowDate As Date '提醒显示时间
Private mvarBirthdayWarn As Boolean '是否启用生日提醒
'启用生日提醒
Public Property Let ShowBirthdayWarn(ByVal vData As Boolean)
mvarBirthdayWarn = vData
Dim strSQL As String
If mvarBirthdayWarn Then
strSQL = " SELECT * FROM Warning WHERE ClientId = " _
& Me.ClientID & " AND TypeId = " & BirthdayWarn
Dim rs As Recordset
Set rs = g_Conn.Execute(strSQL)
If rs.RecordCount = 0 Then
AddNew Me.ShowDate, Me.ClientID, 1, "今天是 " & Me.ClientName & " 的生日,请做好准备。"
End If
Set rs = Nothing
Else
strSQL = " DELETE FROM Warning WHERE ClientId = " _
& Me.ClientID & " AND TypeId = " & BirthdayWarn
g_Conn.Execute (strSQL)
End If
End Property
Public Property Get ShowBirthdayWarn() As Boolean
ShowBirthdayWarn = mvarBirthdayWarn
End Property
设计小结
一开始听到要做课程设计时,就有一种畏难心理,认为要编写一个几百甚至上千行的代码似乎不可能。但是世上无难事,只怕有心人,经过我们的努力和探索,终于完成了这次课程设计。此次课程设计不仅锻炼了我们独立思考和团队合作的能力,而且提高了我们动手的能力。
还是在高中接触的半个学期的VB知识,只是一点皮毛,现在远远不够用。所以我们通过图书馆借阅参考书籍、在网上查阅相关资料,等于是把VB从头学起。我们了解了VB和其他数据库开发工具的对比,知道了它在具体到数据库开发方面时的优势,即:快速、简单和功能完备;学习到了三层的C/S构架(客户端,组件层,数据库)的好处以及它的实现,如何通过用ADO来访问数据库,怎样把VB和数据库连接起来等等问题,在短期内让我对VB有了基础认识,也让我之后的课程设计可以少走弯路。
这次课程设计还有很重要的收获是,我学到了如何合作完成项目。这次的客户信息管理系统是两人一组合作完成的,也给了我们一个与他人合作的机会。我主要负责系统中一些如添加客户、查询客户的主要功能的设计和代码编写,徐幸同学负责对主窗体的设计和代码编写以及数据库的表设计。然后把两部分结合,生成了我们现在看到的课程设计。两个人的合作对完成课题更快捷可是也会有矛盾,可是我们会在商量和讨论后有一个更完美折中的方法。合作完成的成就感丝毫不亚于一个人的成功,反而因为多了一个人跟你分享快乐变得更能体会付出之后换来的喜悦。
当中也发生了一段小插曲,我们编译、调试都没问题,但在对exe文件的运行过程中,发现exe运行不了。后来查阅了资料,才知道ActiveX DLL在脱离了开发环境后,首次使用前必须注册。注册的命令虽然很简单,但是在这种找到错误,学习纠正的过程中,我们这次的课程设计也更具有了意义。
完成一个设计需要考虑很多方面,甚至是一些小细节也不能放过。通过这次的课程设计,我学到了很多,充实了自己的专业知识,为我以后的学习和设计增加了经验。