基于C#+asp.net+SQL server的客户关系管理系统设计与实现(毕业论文+程序源码)
大家好,今天给大家介绍基于C#+asp.net+SQL server的客户关系管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦
文章目录:
1、项目简介
- 对CRM数据库设计做了概要介绍,进行CRM系统规划,在此规划上进一步细化抽象,得到整个系统的数据库设计结构。并详细介绍了费用管理系统模块和分析管理系统模块涉及的数据表。另外详细介绍了费用管理系统模块和分析管理模块的概要设计,给出了两个子系统的软件结构和各子模块的关系。
- 在详细设计阶段,用独立章节详细介绍了CRM系统中费用管理系统的设计设计思路及其功能的实现,并给出了效果图以及部分重要代码。阐述了分析管理系统模块的设计过程及实现效果。
2、资源详情
项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:22844个字58页
包含内容:整套源码+完整毕业论文
3、关键词:
ASP.NET;CRM;网络数据库;.Net Framework对象开发库4、毕设简介
提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。
第1章 引言
1.1 课题研究背景
省略
客户关系管理(CRM)已成为很多企业的基本商务战略,它与企业资源规划(ERP)、供应链管理(SCM)一起,是企业提高竞争力的三大法宝。
1.2 课题研究意义
省略
第2章 CRM与ASP.NET概述
CRM是一种旨在改善企业与客户相互关系的新型管理机制,它实施于企业的市场营销、销售、服务与技术支持等与客户相关的领域。其目标是一方面通过提供更快速和更周到的优质服务吸引和保持更多的客户,另一方面通过对业务流程的全面管理来降低企业成本。CRM既是一种概念,也是一套管理软件和技术。利用CRM系统,企业能搜集、跟踪和分析每一个客户的信息,从而知道什么样的客户需要什么样的东西,真正做到客户与产品达到l: 1的关系:同时还能观察和分析客户行为对企业收益的影响,使企业与客户的关系及企业利润得到最优化。
2.1 CRM基本概念
2.1.1 CRM概念
CRM(Customer Relationship Management),即客户关系管理,这个概念最初是在国外提出来,伴随着因特网和电子商务的大潮进入中国。产业界和理论界对客户关系管理空前重视,不同领域的作者在强调CRM时总是从不同侧重点出发,有人定位一种管理思想,也有人定位于一种管理信息系统,对CRM的定义,目前还没有一个统一的表述。
综合所有不同的理解,CRM可以定义为一种倡导企业以客户为中心的管理思想和方法,其含义可以分为三种层次:
1)面向企业前台业务应用的管理标准,其实质是在关系营销、业务流程重组等基础上进一步发展而成的以客户为中心的管理思想;
2)综合应用了数据库和数据仓库技术、数据挖掘技术、Internet技术、面向对象技术、客户机/服务器体系、图形用户界面、网络通讯等信息产业成果,以CRM管理思想为灵魂的软件产品;
3)整合了管理思想、业务流程、人及信息技术于一体的管理系统。
本文中对客户关系管理的定义可以表述如下:客户关系管理是企业在不断改进与客户关系相关的全部业务流程,最终实现信息化、自动化运营目标的过程中,所创造并使用的先进信息技术、软硬件和优化的管理方法、解决方案的总和。
省略
2.2 ASP.NET概述
2.2.1 概述
ASP.Net的前身ASP(Active Server Pages),以其简单的语法、嵌入HTML的编辑方法,在很短的时间内获得了巨大的成功,成为了NT平台上web技术的霸主.这种地位至今无人能动摇。
省略
2.2.3 ASP.NET页面主要的优点
ASP.NET页面主要的优点如下:
1)控件将可重复使用的功能封装起来,用户不必另外编写代码,就可实现状态管理、确认、数据处理等功能,从而简化了许多普通的编程任务。
2) ASP.NET页面的代码更简洁,易于阅读。在服务器端控件中封装代码,同时又能在页面中使用合适的事件处理技术,这使设计更为结构化。以前试用并优化过的控件具有可重复使用性,这也意味着加快了开发的速度。
3) ASP.NET页面对于代码和用户界面开发工具有更好的支持。
4) ASP.NET页面的最大优点是它没有对非结构脚本语言(包括VBScript和Jscript)的依赖性。ASP.NET中用户可以使用任何一种ASP.NEI支持的语言编写代码,可以不用以前的内嵌代码来编写代码从而使其成为一个单独模块使用。ASP.NET除了支持VB.NET、C#、JavaScript三种程序语言外,凡是可以编译成MSIL的程序语言,都可以成为制作ASP.NET网页的程序语言。ASP.NET为Web应用程序提供了一个真正的中间语言的执行框架。
第3章 CRM数据库设计
本CRM系统是具有对客户各方面信息进行详细管理、分类、统计等功能的复杂系统,一般由多个子系统组成。主要功能包括,客户管理系统模块、活动管理系统模块、销售管理系统模块、服务管理系统模块、费用管理系统模块、库存管理系统模块、报表管理系统模块、E-mail管理系统模块以及后台管理系统模块。本系统的设计为了尽量体现系统模块的独立性,因此除了共同的数据库之外,各模块之间的关联是很小的,系统开发过程中,小组成员基本独立完成每个模块的设计与实现,本人主要完成以下两个模块:费用管理系统模块和分析管理系统模块。
3.1 费用管理系统模块
与客户联系就必然产生费用,费用管理系统模块主要记录与客户之间发生的费用信息,以控制和客户发生的费用。
费用管理系统模块由费用详细信息管理和费用列表两部分构成,如下(图3-1)所示。
3.1.1 模块功能
费用管理系统主要就是要将企业与客户及相关联系人之间发生的各种费用进行详细管理,并可以方便的对费用信息进行添加、修改等编辑操作。在CRM中,费用管理系统可以通过费用的关键字段进行查询,快速的找到所需要的费用信息,提供方便全面的费用记录参考,具体费用管理系统实现的功能如下。
费用管理模块
- 添加费用:添加新的费用信息到费用表,其中包括费用主题、费用金额、费用日期、相关客户等信息。
- 浏览费用:能够对所有费用信息进行逐一浏览,并可以浏览其他用户公开的费用记录信息。
- 编辑信息:能够修改和删除费用信息,用户可以在浏览费用信息时随时更新费用信息,并可删除作废的费用信息。
费用列表模块 - 费用列表显示:对所选择客户的费用进行列表显示,使得用户更容易从全局去把握费用计划,并能够快速找到需要的费用记录,费用信息按照用户的需要进行列表,列表元素为用户选择的费用信息项。
- 费用信息模糊查询:通过限定的关键字字段对费用信息进行查询,将符合条件的费用信息进行列表显示。
- 批量删除费用信息:能够对选中的多个费用信息进行批量删除,用户可以在对费用信息进行查询后批量删除符合条件的费用信息。
3.1.2 模块关系
在了解了基本的费用管理系统的运行原理之后,下面介绍整个费用管理子系统的各种模块之间的关系。
在添加新的费用信息的时候,首先从费用信息表单中获得费用的详细信息,在对所有的字段进行格式校验合格后便将数据添加到数据库的费用表中。在添加费用信息时,必须为费用选择一个相关的客户信息,一个相关的联系人信息,才能把数据添加到费用表中。
具体各模块之间的关系如图3-2所示。
图3-2 费用管理系统模块关系图
3.2 分析管理系统模块
分析管理系统主要用于对系统中的数据进行列表分析与图表分析,由于相关分析太多,本文就选择几个具有代表性数据进行分析。分析管理系统模块分别为列表分析与图表分析两部分,如下(图3-3)所示。
3.2.1 实现功能
分析管理系统主要是通过前面的数据进行分析和总合,给出一种很明显的图形分析结果,让用户对于分析的结果一目了然。主要分析的模块有销售、客户和服务3个。
1、 销售模块。可以分为销售额和销售构成两部分。其中销售额部分可以按照年月日3个标准进行分析,并且可以选择分析数据的范围。销售构成部分可以按照客户和产品两个标准进行分析,也可以选择分析数据的范围。
2、 客户模块。可以分为客户地域分布分析和客户价值分析。客户地域分布分析可以按照国家、省份和城市3个标准进行分析。客户价值分析可以按照交易次数和交易金额两个标准进行分析。同样在分析的时候可以选择分析数据和日期范围。
3、 服务模块。可以分为服务趋势分析和服务构成分析。服务趋势分析是按照时间来统计服务的次数,具体可以按照年、月和日3个标准来分析。服务构成分析可以按照产品和服务类型两个标准来分析。在服务分析模块中同样可以选择数据范围。
3.2.2 运行原理
省略
具体的分析管理系统的流程图如图3-4所示。
图3-4 分析管理系统流程图
3.2.3 模块关系
分析管理系统可以分为3个字模块,其具体是销售子模块、客户子模块和服务子模块。每一个子模块之间又可以再分。总体分析的实现由两种形式,一种是通过列表的形式,一种是通过图示的形式。具体各子模块之间的关系如图3-5所示。
图3-5 分析管理系统模块关系
3.3 CRM系统数据库设计
首先,打开Microsoft SQL Server的查询分析器,创建一个空数据库CRM。(Create database CRM),再建立所需要的表。本文中的涉及到了11张表。分别为:客户信息表(Client)、联系人信息表(Touchman)、活动信息表(Activity)、产品信息表(Product)、库存信息表(Stock)、临时库存信息表(Stock_Temp)、销售信息表(Sell)、服务信息表(Feedback)、费用信息表(Fee)、用户信息表(User)和部门信息表(Section)。因本人分到的模块是费用管理系统模块和分析管理系统模块,所以这里仅详细介绍了本人所要应用表的具体结构。
3.3.1 销售信息表(Sell)
具体的销售信息表结构如表3-1所示。
3.3.2 费用信息表(Fee)
费用信息表的具体结构如表3-2所示。
3.3.3 服务信息表(Feedback)
具体的服务信息表结构如表3-3所示。
3.3.4 客户信息表(Client)
具体的客户信息表结构如表3-4所示。
3.3.5 联系人信息表(Touchman)
具体的联系人信息表结构如表3-5所示。
表3-5 联系人信息表(Touchman)
第4章 费用管理系统
费用管理系统是对用户与客户之间发生或即将发生的费用进行规划、记录、分析和预备的系统。在一个多客户企业中,当和客户之间发生各种活动联系时,和客户之间往往会产生各种各样的费用。通过费用管理系统的帮助,对预发生的费用进行规划,对已经发生的费用进行记录,将有效的控制费用的产生,使有限的资金能够得到合理的利用。
4.1 关键技术介绍
在费用管理系统中主要通过对数据库的操作对费用信息进行管理,其中涉及到数据的检验、数据的查询等数据库处理。
当数据库数据比较多的时候,用户需要查找某一个数据是一件很麻烦的事情。为了简化查询数据的过程,就必须有模糊查询数据模块。模糊查询数据模块的功能是,用户可以根据自己所记录的数据信息中的某几个关键字在整个数据库中查询,把符合条件的数据记录挑选出来,大大减少用户查询数据的数量,降低用户查询数据的时间。
如图4-1(a)所示,在模糊查询表单中选择关键字为“类型”,查询方式为“包含”,查询内容为“谈判”,单击“查询”按钮后得到的结果如图4-1(b)所示,可见类型中含有“谈判”的纪录都被提取出来进行了列表。实现模糊查询的具体逻辑如图4-2所示。
图4-1(a) 模糊查询示例
图4-1(b) 模糊查询示例
从图4-2中可以了解到模糊查询的逻辑流程。首先对用户提交的表单进行解析,这个过程得到相应的SQL语句,其实主要是SQL语句中的限制语句。根据查询的对象,这有一个最基本的查询语句,也就是将对象数据从数据库中提取出的SQL语句。将这两个语句合成为一个复杂的SQL查询语句后对数据库进行查询,即可得到模糊查询的结果。可以看出,用户表单提交查询关键字生成的SQL语句起了筛选的作用,将符合用户查询的数据从数据库提取出来。因此实现模糊查询的关键在于如何根据用户提交的表单数据生成相应的SQL语句。
图4-2 模糊查询逻辑图
4.2 费用管理模块
4.2.1 浏览费用信息
费用管理系统主要是通过费用表(Fee)来实现对客户费用信息的管理,其主页面为以文本框、下拉列表框和按钮为主组成的表单,并包含显示操作记录的文本框。
浏览费用信息是费用管理模块最基本的功能之一,用户能够通过该模块对数据库中的费用信息进行浏览,并进行相应的修改、删除等操作。显示费用信息的页面名称为Fee.aspx,需要显示的数据为包括费用主题、费用类型、相关客户、相关联系人等。
用户可以通过费用管理系统对所拥有的客户费用信息进行浏览,并根据实际情况进行相应的修改,具体的浏览费用信息页面如图4-3所示。
图4-3 浏览费用信息页面
在实现从数据库费用表中读出数据的时候需要数据库链接文件的支持,这个数文件就是前面所讲到的conn.aspx,因此在页面的开始也包含了此文件,格式如下:
<!--#include file=”…/conn.asp”-->
查看该页面需要在登录系统之后才能够访问,因此需要包含身份验证文件IsUser.asp,其包含的格式如下:
<!--#include file=”…/IsUser.asp”-->
在界面方面,首先要创建显示费用信息的表单,在Dreamweaver等网页编辑器中实现如图4-4所示的表单页面。
该表单除了具有显示费用详细信息的作用,还可以作为修改费用信息时的提交表单,具体表单设置如表4-2所示。
图4-4 显示费用详细信息表单
表单的属性设置代码如下:
<form id="Form1" method="post" runat="server">//所有的web控件都需放在表单中
这里的form名“name=Form1”为表单名称它是在服务器段执行的。
但显示费用详细信息时,是通过表单的初始值来实现的。可以通过内嵌ASP C#代码来对表单进行赋初值的操作,具体代码省略。
“相关客户(DropDownList1)”和“相关联系人(DropDownList2)”的下拉表单是通过循环语句实现的动态下拉表,代码如下:
private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
string ClientID=this.DropDownList1.SelectedValue;
SqlConnection con=conn.createconn();
con.Open();
SqlCommand cmd=new SqlCommand("select TouchmanID,TouchmanName from touchman where TouchmanClientID="+ClientID ,con);
SqlDataReader sdr=cmd.ExecuteReader();
this.DropDownList2.DataSource=sdr;
this.DropDownList2.DataTextField="TouchmanName";
this.DropDownList2.DataValueField="TouchmanID";
this.DropDownList2.DataBind();
sdr.Close();
con.Close();
}
可见,在HTML代码中表单元素的相关部分通过类似Text=’<%# DataBinder.Eval(Container.DataItem,”FeeTopic”)%>’
这句html实现了把已经绑定的数据库中的数据显示在网页上。需要注意的是,这句语句应放在他所对应的文本框中(上例即为费用主题对应的文本框)。
4.2.2 修改费用信息
在浏览费用信息时,有可能要修改其中的信息,所以要有费用信息修改的页面。由于修改和浏览的内容和形式基本相同,所以采用与浏览费用信息相同的页面“Fee.aspx”来作为修改费用信息所需要的数据表单。即为如图4-4所示的表单,当用户填写完需要修改的数据后,单击页面左下角位置的“修改”按钮,将表单提交到“Form1.asp”,即可对修改的数据进行保存。如图4-5所示。
图4-5 保存成功提示页面
具体代码如下:
private void SaveButton_ServerClick(object sender, System.EventArgs e)
{
string FeeID=Request.QueryString["FeeID"].ToString();
string FeeTopic=this.FeeTopic.Text;
string FeeClientID=this.TextBox1.Text;
string FeeTouchmanID=this.TextBox2.Text;
string FeeOppID=this.FeeOppID.Text;
string FeeSort=this.FeeSort.Text;
string FeeMoney=this.FeeMoney.Text;
string FeeDate=this.FeeDate.Text;
string FeeDetail=this.FeeDetail.Text;
string FeeRevisorID=Session["UserID"].ToString();
string FeeReviseDate=this.Text3.Value;
if(!Check_Open.Checked)
{
string FeeOpenFlag="0";
SqlConnection con=conn.createconn();
SqlCommand cmd=new SqlCommand("update Fee set FeeTopic='"+FeeTopic+"',FeeOppID='"+FeeOppID+"',FeeSort='"+FeeSort+"',FeeMoney='"+FeeMoney+"',FeeDate='"+FeeDate+"',FeeDetail='"+FeeDetail+"',FeeOpenFlag='"+FeeOpenFlag+"',FeeRevisorID='"+FeeRevisorID+"',FeeReviseDate='"+FeeReviseDate+"'where FeeID='"+FeeID+"' ",con);
con.Open();
cmd.ExecuteNonQuery();
}
else
{
string FeeOpenFlag="1";
SqlConnection con=conn.createconn();
SqlCommand cmd=new SqlCommand("update Fee set FeeTopic='"+FeeTopic+"',FeeOppID='"+FeeOppID+"',FeeSort='"+FeeSort+"',FeeMoney='"+FeeMoney+"',FeeDate='"+FeeDate+"',FeeDetail='"+FeeDetail+"',FeeOpenFlag='"+FeeOpenFlag+"',FeeRevisorID='"+FeeRevisorID+"',FeeReviseDate='"+FeeReviseDate+"' where FeeID='"+FeeID+"'",con);//
con.Open();
cmd.ExecuteNonQuery();
}
Response.Redirect("saveFee.aspx?FeeID='"+FeeID+"'");
保存完数据后,将通过如图4-5所示的页面提示用户费用信息已经保存成功,并在2s后自动返回到浏览费用信息页面Fee.aspx,显示刚刚保存的费用信息,具体代码如下:
<HTML>
<HEAD>
<title>保存费用信息</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
<LINK href="../StyleSheet1.css" type="text/css" rel="stylesheet">
<LINK href="../StyleSheet2.css" type="text/css" rel="stylesheet">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<table width="100%" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td width="100%" height="197" align="center">
<table border="0" cellspacing="0" cellpadding="0" height="85" bgcolor="#99ccff" width="100%">
<tr>
<td align="center">
<a href="addnewFee.aspx" class="linkblue2">保存费用信息成功!!单击返回</a>
<script>
setTimeout("location.replace('addnewFee.aspx')",2000)
</script>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</HTML>
为了实现2s后自动返回,在这里使用了“setTimeout”定时函数,该函数的功能是在设定时间之后执行相应的C#语句,这里设定为2000,代表2000ms,既是2s后执行跳转语句。
至此,修改费用信息的部分就完成了,接下来介绍如何实现添加费用信息。
4.2.3 添加费用信息
在如图4-1所示页面中单击“新建”按钮,将执行添加费用信息的操作。具体实现方式是通过在按钮上加响应函数,当按下“新建”按钮时,响应函数被触发,控制页面跳转到新建费用信息页面NewFee.aspx。
当系统用户与客户有新的费用发生的时候,可以通过填写费用信息表单将费用信息添加到费用表中,具体的费用信息的添加页面如图4-6所示。
图4-6 添加费用信息页面
在图4-6所示的页面里填写好费用信息表单后单击“保存”按钮,即可添加一条新的费用信息,系统将提示客户已经保存了该费用信息,如图4-7所示。
图4-7 成功添加费用信息
具体代码如下:
<input class="button_all"onclick="javacript:location.href='NewActivity.aspx?ActivityClientID ==ActivityClientID';" type="button" value="新建" name="NewFee.aspx">
添加费用信息页面与浏览费用信息页面基本相似,这里不再多做论述。
4.2.4 删除费用信息
当数据库中的费用信息已经不再符合实际,则需要将其删除,以便有效的对有效费用信息进行管理,因此需要具有删除费用信息功能。
删除费用信息的功能是通过向删除费用信息处理页面DeleteFee.aspx页面发送需要删除的费用信息的标识ID,删除费用信息处理页面通过提交过来的费用标识ID,将数据库中相应的费用信息删除。当单击Fee.aspx页面中如图4-3所示左下角的“删除”按钮时,便将当前查看的费用信息标识ID通过表单提交到DeleteFee.aspx页面。
具体实现代码如下:
private void DeleteButton_ServerClick(object sender, System.EventArgs e)
{
string FeeID=Request.QueryString["FeeID"].ToString();
SqlConnection con=conn.createconn();
con.Open();
SqlCommand cmd=new SqlCommand("delete from Fee where FeeID='"+FeeID+"'",con);
cmd.ExecuteNonQuery();
con.Close();
Response.Redirect("DeleteFee.aspx");}
至此,删除费用信息的功能实现就完成了。
4.3 费用列表模块
费用列表主要是将费用数据通过列表的方式展示给用户,并具有模糊查询和批量删除的功能,使得管理费用信息变得更加方便。
费用列表的功能是在添加费用信息后,用户可以在费用列表中查看相关客户的费用信息。单击列表中列出的费用主题名称即可看到详细的费用信息,页面的具体效果如图4-8所示。
图4-8 费用信息列表
4.3.1 费用信息列表显示
费用列表页面为Feelist.aspx,费用列表可以将多项费用信息通过列表方式详细的展示给用户,并可以快速链接到浏览费用信息页面查看详细费用信息。
如图4-9所示,显示信息主要是将费用的信息显示出来,方便用户查看。费用显示的信息为费用主题和用户在“显示项目”中选择的4项费用相关项目。为了配合删除功能,在每一条记录的前面增加一个复选框,如果选中表示在单击“删除”按钮时这条记录将被删除。在页面的上方,是快速查询的输入框和查询按钮,用户可以快速查询来对费用信息进行模糊查询。当记录比较多的时候,列表将用分页显示,用户可以从页面下部的1、2等页数来进行翻页。
图4-9 费用信息列表页面
信息列表显示的难点是按照用户的选择动态显示费用信息中不同的项目信息。该表单的设置如下:
<form id="Form1" method="post" runat="server">
这里的form名“name=Form1”为表单名称,它是在服务器端执行的。
当新建费用信息时,是通过表单的初始值来实现。可以通过内嵌ASP c#代码来对表单进行赋初值的操作,具体代码如下:
<input
class="button_all"id="NewClient" onclick="javascript:location.href='NewFee.aspx'" type="button" value="新建" name="NewClient">
4.3.2 费用信息列表分页
记录的分页功能主要通过记录集pagesize和pagecount属性来实现的。
在操作费用信息列表的时候,如果数据过多,在同一页面上显示出来会使网页变得很大,影响页面的美观,也降低了网页执行的效率。因此,有必要进行分页操作。
在HTML的中编写
<PagerStyle HorizontalAlign="Center" ForeColor="Black" BackColor="#999999" Mode="NumericPages"></PagerStyle>
而在所对应的.cs文件中编写如下程序代码:
private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
this.DataGrid1.CurrentPageIndex=e.NewPageIndex;
this.databindertodatagrid1();
}
来实现分页。
4.3.3 费用信息列表查询
页面中的快速查询功能,主要是实现以费用主题、费用类型等关键字段的模糊查询功能。通过在快速查询中选择相应的关键字段并填写关键字,可以对费用信息进行快速查询,具体查询效果如图4-10所示。
图4-10 快速查询费用信息
在费用信息列表中,当选中费用主题前的复选框时,表示单击“删除”按钮就可以删除该条费用信息记录,从而实现了批量删除信息的记录。
首先实现页面右上方的快速查询表单,具体代码如下:
private void Search_ServerClick(object sender, System.EventArgs e)
{
string select=this.DropDownList2.SelectedValue;
string select1=this.DropDownList1.SelectedValue;
string selvalue="%"+this.Text1.Value.ToString()+"%";
switch (select1)
{
case "0":
if(select=="0")
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee where FeeTopic like '"+selvalue+"'",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
else
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee ",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
break;
case "1":
if(select=="0")
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee where FeeOppID like '"+selvalue+"'",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
else
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee ",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
break;
case "2":
if(select=="0")
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee where FeeSort like '"+selvalue+"'",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
else
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee ",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
break;
case "3":
if(select=="0")
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee where FeeMoney like '"+selvalue+"'",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
else
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee ",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
break;
case "4":
if(select=="0")
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee where FeeDate like '"+selvalue+"'",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
else
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee ",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
break;
default:
if(select=="0")
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee where FeeDetail like '"+selvalue+"'",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
else
{
SqlConnection con=conn.createconn();
con.Open();
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=new SqlCommand("select * from Fee ",con);
DataSet ds=new DataSet();
sda.Fill(ds,"selllist");
this.DataGrid1.DataSource=ds.Tables["selllist"];
this.DataGrid1.DataBind();
con.Close();
}
break;
}
}
4.3.4 费用信息列表删除
列表删除功能即是将选中的记录从数据库中批量删除。批量删除的原理是靠费用信息列表前的复选框收集用户选择的费用信息记录标识ID,并将数据提交DeletFeeLIst.aspx页面进行删除操作。“删除”按钮的代码如下:
private void DeleteClient_ServerClick(object sender, System.EventArgs e)
{
foreach(System.Web.UI.WebControls.DataGridItem dl in this.DataGrid1.Items)
{
CheckBox chk=(CheckBox)dl.FindControl("CheckBox1");
if (chk.Checked)
{
string FeeID=dl.Cells[1].Text;
SqlConnection con=conn.createconn();
con.Open();
SqlCommand cmd=new SqlCommand("delete from Activity where FeeID='"+FeeID+"'",con);
cmd.ExecuteNonQuery();
con.Close();
Response.Redirect("DeleteFeeList.aspx");
}
}
}
第5章 分析管理系统
分析管理系统是CRM中的关键组成部分。一个好的调查要有一个好的分析过程,同样一个好的系统也同样要有好的分析系统,这样才能够充分利用系统的优越性。通过分析管理系统可以很好的把握客户的动向,掌握产品的趋势。这为以后的计划提供了很好的依据。
进入分析管理系统后,用户可以自由选择上面3个模块中的任意部分。进入个子部分后用户可以选择要分析的标准,用前面的单选按钮来更改分析标准。同样用户可以选择开始和结束时间来选择分析数据的范围。选择完范围后,用户就可以单击“查询”按钮,相应的分析结果就会出现在列表中。用户可以单击“图示”按钮来查看图形分析结果。
5.1 关键技术介绍
在分析管理系统中图表分析功能主要是通过VML来实现的。
VML(Vector Markup Language,矢量标记语言)是一种基于XML的标记语言,VML是新兴的、灵活的、开放的且基于文本扩展的HTML语言,但是VML并未得到W3C的正式认可。VML以现有HTML能力为基础并允许矢量图形信息和HTML页中的文本和其他记录集成。
XML全名是Extensible Markup Language,中文意思是可扩展标记语言,适用于标记电子文件使其具有结构性的标记语言。XML是根据SGML所制定出来的,所以XML可以看成是SGML的一部分子集,且目的是能够广泛应用在WWW上。
因为XML本身是基于HTML的,所以VML的核心也是基于HTML的。VML将图形信息与文本信息结合在一起。而且VML目前是W3C站点上的一个开放标准,完全建立在其他W3C认可的开放标准之上,这就意味着VML可以与现有的浏览器向后兼容。VML描述文本的方式类似于HTML,它使用CSS Level 1作为字体规范的机制,而且遵循CSS Level 1的标准使用RGB定义颜色值。
在VML中单个元素被定义为形状(shape),大多数形状是由矢量路径描述的。形状有很多属性,例如:名称(title)、样式(sytle)、填充(fill)、填充颜色(fillcolor)等。
5.2 销售分析
销售模块主要是利用前面用到的销售管理系统中生成的数据来进行分析。可以分为两个子模块:销售额分析和销售构成分析。
5.2.1 销售额分析
销售额分析主要是指按照时间来统计销售情况,包括销售的总金额和销售的总数量。统计时间可以是年、月或者是日。统计结果的显示首先是列表的形式,列表显示能够实现分页显示功能。统计结果还可以用图表的形式显示。
销售额分析的页面为analyse_sell_list.asp。在该页面的开始要包含一些必要的文件,如数据库链接、身份验证和调用函数的文件。具体如下:
<!--#include file="../conn.asp"-->
<!--#include file="Private_fun.asp"-->
<!--#include file="../pub_fun.asp"-->
销售额分析中的统计时间周期可以分为年月日,利用的主要是从数据库表sell中进行Group分组,分组的依据就是销售时间字段(selldate)。另外还将销售额字段进行求和,得出时间周期内的销售总额。
显示列表和图表的操作和周期选择等用的是同一个界面,并且该界面和列表显示在同一个表单中,该表单的名称为fm。图表显示是将该表单中条件部分传递到一个新的页面,利用这个页面来进行数据库查询和结果的图表显示。
下面以销售模块为例,具体介绍其界面情况。
首先进入到销售模块中的销售分析,也就是销售额分析。界面如图5-1所示。
图5-1 销售趋势分析界面
在该页面中用户可以在时间周期中选择分析的标准。例如选择年为分析标准,则出现如图5-2所示的结果。
图5-2 销售分析标准选择
用户还可以以开始时间和结束时间作为分析的标准,单击后面的 按钮,在如图5-3所示的窗口中选择分析数据的范围。
图5-3 销售分析范围选择
选择好要分析的数据后,用户可以通过更明确的图示方式来查看分析结果。以分析标准是年为例,其图示结果如图5-4所示。
图5-4 销售分析图示
其他模块部分的运行原理和销售额分析中的基本相同,只是分析标准不同。用户可以根据自己的需要选择。
进行统计时间周期选择以及一些统计数据选择的界面的实现代码如下:
<div align="right">
<table width="100%" cellpadding="0" cellspacing="0" bgcolor="#F2F2F2">
<tr bgcolor="#FFFFFF">
<td height="5" colspan="2"></td>
</tr>
<tr>
<td width="180" bgcolor="#566CDB"><font color="#FFFFFF"><img src="../images/DispStation.gif">销售趋势图信息 - 列表</font></td>
<td>
<div align="right">
<table border="0" cellpadding="0" cellspacing="0" class=tablebutton>
<tr>
<td align="right">
<input type="button" name="Button" value="查询" class="button_all" onClick="cmd_search()">
<input type="button" name="Button" value="图示" class="button_all" onClick="showchart()">
<input type="button" name="Button" value="返回" class="button_all" onClick="gomenu()">
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</div>
上面是操作导航栏和操作按钮部分,全部的操作按钮都是通过JavaScript函数来执行的。除了返回的函数gomenu中直接执行的是window.location外,其余的都是通过将表单fm提交到指定的页面来实现的。具体的执行函数代码如下:
时间周期选择是通过3个单选按钮来实现的,在单选按钮的onclick属性中有一个触发函数cmd_search。该函数与前面所指的查询函数相同,主要是提交表单。
<table width="80%" border="0" cellpadding="1" cellspacing="1" class=tableselect>
<tr>
<td class=TD_hr width="50">时间周期</td>
<td class="tablelist_td1" onclick="cmd_search()" colspan="3">
<INPUT TYPE=RADIO NAME="S_time" VALUE="0" <%if request("S_time")= 0 then response.Write("checked")%>>年
<INPUT TYPE=RADIO NAME="S_time" VALUE="1" <%if request("S_time")= 1 or request("S_time")="" then response.Write("checked")%>>月
<INPUT TYPE=RADIO NAME="S_time" VALUE="2" <%if request("S_time")= 2 then response.Write("checked")%>>日
</td>
</tr>
<tr>
<td class=TD_hr width="50">开始时间</td>
<td class="tablelist_td1">
<input class=text100 type="text" name="start_time" maxlength=10 value="<%if request("start_time")<>"" then response.Write(request("start_time"))%>"><input name="Button2" type="button" class="button_dic" id="Button2" onClick="show_calendar('fm.start_time')" value="…">
</td>
<td class=TD_hr width="50">结束时间</td>
<td class="tablelist_td1">
<input class=text100 type="text" name="end_time" maxlength=10 value="<%if request("end_time")<>"" then response.Write(request("end_time"))%>"><input name="Button3" type="button" class="button_dic" id="Button3" onClick="show_calendar('fm.end_time')" value="…">
</td>
</tr>
</table>
在时间周期中,初始的默认值为月。由于上面所说的提交函数cmd_search是将表单提交给自己的页面,为了达到数据的一致性,在显示的时间周期中,要判断提交过的值是否和该时间周期相同,如果相同则选中此周期,否则显示默认值。
下面是选择统计数据范围,该范围选择主要是销售时间的范围。
<tr>
<td class=TD_hr width="50">开始时间</td>
<td class="tablelist_td1">
<input class=text100 type="text" name="start_time" maxlength=10 value="<%if request("start_time")<>"" then response.Write(request("start_time"))%>"><input name="Button2" type="button" class="button_dic" id="Button2" onClick="show_calendar('fm.start_time')" value="…">
</td>
<td class=TD_hr width="50">结束时间</td>
<td class="tablelist_td1">
<input class=text100 type="text" name="end_time" maxlength=10 value="<%if request("end_time")<>"" then response.Write(request("end_time"))%>"><input name="Button3" type="button" class="button_dic" id="Button3" onClick="show_calendar('fm.end_time')" value="…">
</td>
</tr>
</table>
- 列表显示
在列表显示中要显示的是统计的周期(年、月、日)销售额和销售数量。具体组成查询语句的代码如下:
<%
''判断是否进行了查询操作
if request("opstatus")="query" then
''判断是否进行了数据范围的选择
if request("start_time")<>"" and request("end_time")<>"" then
sqlwhere=" where selldate between '"&request("start_time")&"' and '"&request("end_time")&"'"
end if
sql="select "
''根据统计时间周期来分别生成查询语句。
select case request("S_time")
case 0
sql=sql&"YEAR(SellDate) AS selldate, SUM(Sellmoney) AS totalmoney, SUM(SellProductnum) AS totalnum FROM Sell"
sql=sql& sqlwhere
sql=sql&" GROUP BY YEAR(SellDate)"
case 1
sql=sql&" RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)) AS selldate, SUM(Sellmoney) AS totalmoney, SUM(SellProductnum) AS totalnum, CONVERT(datetime, RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)) + '-1') AS selloder from sell"
sql=sql& sqlwhere
sql=sql&" GROUP BY RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)), CONVERT(datetime, RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)) + '-1') ORDER BY selloder"
case 2
sql=sql&" SellDate, SUM(Sellmoney) AS totalmoney, SUM(SellProductnum) AS totalnum FROM Sell"
sql=sql& sqlwhere
sql=sql&" GROUP BY SellDate"
end select
''如果没有进行查询操作,则默认的查询函数如下,即时间周期为月
else
sql="select "
sql=sql&" RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)) AS selldate, SUM(Sellmoney) AS totalmoney, SUM(SellProductnum) AS totalnum, CONVERT(datetime, RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)) + '-1') AS selloder from sell"
sql=sql&" GROUP BY RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)), CONVERT(datetime, RTRIM(YEAR(SellDate)) + '-' + RTRIM(MONTH(SellDate)) + '-1') ORDER BY selloder"
end if
%>
2 图表显示
图表显示是利用前面所提到的关键技术中的VML来实现的,具体是调用函数table1。在页面analyse_sell_list.asp中有一个“图示”按钮,单击它可以将页面表单中的查询信息传递到指定的页面。也就是说将表单fm提交到指定的页面。在show_sell.asp页面中首先要包含如下必要的文件:
<!--#include file="../conn.asp"-->
<!--#include file="../Pub_Fun.asp"-->
具体生成查询条件的代码如下:
<%
if trim(request("type_kind"))="" then
''判断是否进行查询操作
if request("opstatus")="query" then
''判断是否是进行数据范围的选择
if request("start_time")<>"" and request("end_time")<>"" then
condition=" where selldate between '"&request("start_time")&"' and '"&request("end_time")&"'"
else
condition=" where 1=1"
end if
'判断要显示的时间周期,默认值为月
if trim(request("S_time"))<>"" then
kind=trim(request("S_time"))
else
kind="1"
end if
''如果没有查询操作,则显示查询条件为真,时间周期为月
else
condition=" where 1=1"
kind="1"
end if
condition=encrypt(condition)
%>
<script language="JavaScript">
childwin=open("chart_sell_list.asp?condition=<%=condition%>&kind=<%=kind%>","","location=no,menubar=0,status=no,scrollbars,titlebar=no,resizable=1,toolbar=no,width=1000,height=520,top=20,left=20");
</script>
<%
else
''判断是否进行查询操作
if request("opstatus")="query" then
''判断是否是进行数据范围的选择
if request("start_time")<>"" and request("end_time")<>"" then
condition=" where selldate between '"&request("start_time")&"' and '"&request("end_time")&"'"
else
condition=" where 1=1"
end if
'判断要显示的统计对象,默认为产品
if trim(request("S_object"))<>"" then
kind=trim(request("S_object"))
else
kind="1"
end if
''如果没有查询操作,则显示查询条件为真,统计对象设置为产品
else
condition=" where 1=1"
kind="1"
end if
'将查询条件加密
condition=encrypt(condition)
'打开图表显示窗口
%>
<script language="JavaScript">
childwin=open("chart_sell_gc.asp?condition=<%=condition%>&kind=<%=kind%>","","location=no,menubar=0,status=no,scrollbars,titlebar=no,resizable=1,toolbar=no,width=1000,height=520,top=20,left=20");
</script>
5.2.2 销售构成分析
销售构成分析主要是按照销售对象来统计销售,包括销售额和销售数量。销售对象包括销售客户和产品。销售构成分析结果首先是按照销售列表形式显示出来,用户可以来选择要显示的数据的范围。在列表显示的过程中还可以实现翻页功能。当然,用户还可以将列表显示的内容进行图表显示,图表显示的结果是按照柱状图显示。
销售构成分析的页面是analyse_sell_gc.asp。该页面开始要包含一定的文件,该文件具体是进行数据库链接、身份验证以及公共函数,具体的文件格式如下:
<!--#include file="../conn.asp"-->
<!--#include file="../pub_fun.asp"-->
<!--#include file="../scripts/openwindow.js"-->
销售构成分析的操作界面和销售额分析的操作界面基本相同,不同的是两个的统计对象不同,具体的说,销售分析统计的对象是客户或产品。因此,在从数据库中读出数据的时候要用到分组函数,分组的依据是相关客户或是相关产品,这个比销售额分析中的分组操作更容易。
销售构成分析可以分为列表显示和图表显示。因此,销售构成分析应该有一个操作界面,该界面中主要是选择分组对象和数据范围,另外还可以返回到住目录和进入到图表显示页面。具体的操作栏代码如下:
<table width="100%" cellpadding="0" cellspacing="0" bgcolor="#F2F2F2">
<tr bgcolor="#FFFFFF">
<td height="5" colspan="2"></td>
</tr>
<tr>
<td width="180" bgcolor="#566CDB"><font color="#FFFFFF"><img src="../images/DispStation.gif">销售构成图信息
- 列表</font></td>
<td>
<div align="right">
<table border="0" cellpadding="0" cellspacing="0" class=tablebutton>
<tr>
<td align="right">
<input type="button" name="Button" value="查询" class="button_all" onClick="cmd_search()">
<input type="button" name="Button" value="图示" class="button_all" onClick="showchart()">
<input type="button" name="Button" value="返回" class="button_all" onClick="gomenu()">
</td>
</tr>
</table>
销售构成分析基本和前面所介绍的销售额分析相同。
5.3 客户分析
客户模块部分是针对客户的分析,具体分为客户地域分布分析和客户价值分析。客户地域分布分析就是该客户所在地区的统计,客户价值分析就是客户销售统计。
5.3.1 客户地域分布分析
客户地域分布分析集体是指客户所属的地区中总客户数量的统计,这样可以看出地区之间的发展潜力和实力。统计的地区可分为国家、省份和城市3种,要求统计的数据有客户的数量和销售总额,另外可以有范围的选择统计的客户。客户地域分布分析的结果要求能够以列表和图表两种方式来显示。
客户地域分布分析的文件是analyse_client_area.asp。若要该文件能够正常工作,在开始必须包含一定的文件,具体代码如下:
<!--#include file="../conn.asp"-->
<!--#include file="../pub_fun.asp"-->
<!--#include file="Private_fun.asp"-->
<!--#include file="../scripts/openwindow.js"-->
analyse_client_area.asp页面的查询、图表显示以及返回等操作按钮代码如下:
<div align="right">
<table border="0" cellpadding="0" cellspacing="0" class=tablebutton>
<tr>
<td align="right">
<input type="button" name="Button" value="查询" class="button_all" onClick="cmd_search()">
<input type="button" name="Button" value="图示" class="button_all" onClick="showchart()">
<input type="button" name="Button" value="返回" class="button_all" onClick="gomenu()">
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</div>
5.3.2 客户价值分析
客户价值分析是通过视图和销售表将客户的相关信息进行统计,包括客户总的销售金额和交易次数,并且能够将结果进行列表和图表显示。
客户价值分析可以分为交易次数和交易金额两种统计分析。在交易金额中,可以直接利用前面的销售表sell进行按照客户进行分组统计和求和。在交易次数中,因为不方便用一个SQL语句来进行此操作,所以借助视图来进行。
客户价值分析的页面是analyse_client_value.asp。其主要代码如下:
<!--#include file="../conn.asp"-->
<!--#include file="../pub_fun.asp"-->
<!--#include file="Private_fun.asp"-->
<!--#include file="../scripts/openwindow.js"-->
<div align="right">
<table border="0" cellpadding="0" cellspacing="0" class=tablebutton>
<tr>
<td align="right">
<input type="button" name="Button" value="查询" class="button_all" onClick="cmd_search()">
<input type="button" name="Button" value="图示" class="button_all" onClick="showchart()">
<input type="button" name="Button" value="返回" class="button_all" onClick="gomenu()">
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</div>
5.4 服务分析
服务模块中主要是针对服务反馈信息中的信息进行分析,通过分析客户的出按照时间上的服务趋势,还可以按照产品或客户看出服务构成结果。具体的说服务模块分为服务趋势分析和服务构成分析两部分。
5.4.1 服务趋势分析
服务趋势分析是按照时间为统计周期,通过统计在某一时间段内服务反馈的次数来查看整个服务反馈的趋势。统计周期可以分为年、月、日3个部分。
服务趋势分析的页面为analyse_service_list.asp。该页面的主要代码如下:
<!--#include file="../conn.asp"-->
<!--#include file="../scripts/openwindow.js"-->
<div align="right">
<table border="0" cellpadding="0" cellspacing="0" class=tablebutton>
<tr>
<td align="right">
<input type="button" name="Button" value="查询" class="button_all" onClick="cmd_search()">
<input type="button" name="Button" value="图示" class="button_all" onClick="showchart()">
<input type="button" name="Button" value="返回" class="button_all" onClick="gomenu()">
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</div>
5.4.2 服务构成分析
服务构成分析是按照服务类型、产品和客户为统计对象进行分析,是客户掌握产品的反馈情况、客户意见以及服务类型的有效性等信息。
服务构成分析的页面是analyse_service_gc.asp。该页面的主要代码如下:
<!--#include file="../conn.asp"-->
<!--#include file="../pub_fun.asp"-->
<!--#include file="../scripts/openwindow.js"-->
<div align="right">
<table border="0" cellpadding="0" cellspacing="0" class=tablebutton>
<tr>
<td align="right">
<input type="button" name="Button" value="查询" class="button_all" onClick="cmd_search()">
<input type="button" name="Button" value="图示" class="button_all" onClick="showchart()">
<input type="button" name="Button" value="返回" class="button_all" onClick="gomenu()">
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</div>
第6章 软件测试
测试是软件开发时期的最后一个阶段,也是软件质量保证中至关重要的一个环节。
6.1 测试的目的和方法
省略
6.2 具体测试
(1)向控件中插入数据,查看数据库中是否保存该数据,并且看是否通过下面的数据窗口显示记录。
(2)据插入发生错误时,是否有提示框给出,比如“日期类型不正确”等。
(3)是否直接可以正确的对数据窗口中的记录进行修改和删除。
(4)在查询窗口中看是否可以按不同的方式进行查询,查询的结果是一条记录还是全部的记录。
总之软件测试的目的是为了发现错误,然后及时的修改,在此给出一个测试用列。
测试目的:检查系统对非法输入数据的识别能力。
说明:在费用管理中,当新录一费用信息时需录入费用主题,费用类型,费用日期,费用金额,相关客户,相关联系人,相关机会,详细说明等信息。其中费用日期一定得是数据的,还有费用主题是必填的。
具体测试:任意输入一组合法数据,但费用日期为空。测试结果,将在费用主题文本框旁边显示“不为空”的提示框,这说名系统能保证不接受费用主题为空的记录。 再输入一组数据,费用主题为在系统中已经存在的编号。测试结果,系统弹出费用主题不能重复的警告框,这说名系统能保证不接受费用主题相同的记录。
总结:这个测试用例能保证系统录入的费用主题唯一,不为空。
第7章 结论与体会
客户关系管理是信息技术与传统的营销、销售和服务管理想整合的产物,是一种旨在改善企业与客户之间关系的新型管理机制,其核心思想是“以客户为中心”,通过完善的客户服务和深入的客户分析来满足客户的需求,保证实现客户的终生价值,为企业创造最大利润。
7.1 系统优缺点
系统评价就是客观,公正的从各个方面评价系统的各项功能。具体从优点,缺点这两方面进行阐述。
系统的主要优点有:
1.系统从基本上实现了CRM所要求的数据信息的收集和有效的管理
2.界面友好,输入信息方便(有些信息通过数据表直接调出);
3.可采用快捷键,操作方便快捷;
4.查询全面,对任何情况都可以查询,从而对管理进行监督;
5.即面向开发人员,又面向用户;
6.系统能支持网络数据传输,数据共享;
7.网页上的数据是直接于数据库相连的,数据信息是动态的,维护方便;
8.能对系统内的数据进行分析,即进行数据挖掘,为企业进行决策提供有利的依据;
9.对系统内的数据进行报表显示,则增加了系统的安全性。
系统还存在如下缺点:
1.可能在实际应用的某些功能不能实现,对于一些潜在的数据不能收集到;
2.数据库设计方面,由于所学知识有限,不能实现更为灵活的功能;
3.系统界面还不够美观;
4.系统的安全性考虑的还不够,对于用户权限细分不足,可能会导致越权(因现实中各个岗位分工是不一样的);
5.系统的分析有一定的局限性。
7.2 系统设计过程中的体会和感受
省略
参考文献
[1].陈承欢、彭勇 管理信息系统基础与开发技术(第一版) 北京:人民邮电出版社 2005.2
[2].萨师煊 王珊 数据库系统概论(第三版) 北京:高等教育出版社 2000.2
[3].刘兰娟 信息系统分析与设计 北京:电子工业出版社 2002.8
[4].宋文官 电子商务实用教程 北京:高等教育出版社 2002.8
[5].王恩波 网络数据库实用教程-SQL Servr 2000 北京:高等教育出版社 2004.1
[6].张立科 ASP开发CRM系统实例导航 北京:人民邮电出版社 2005.1
[7].陈楠基于数据仓库与数据挖掘技术的决策支持系统计算机时代2001年第3期
[8].杨晓,任清珍数据仓库数据集市和数据挖掘现代计算机2002年第1期
[9].曹术华得客户者得大下中国计算机报,2001年第12期
[10].Jason Price(美)等著窦芳等译Visual C#. NET从入门到精通电子工业
出版社2003.3
[11].荐沧,龙晓敏深入体验ASP. NET西安电子科技大学出版社2001. 10
[12].康际科技ASP. NET行家设计实务中国铁道出版社2002. 1
[13].Russ Basiura等著康埔泽,ASP. NET Web服务高级编程清华大学出版社2002.6
[14].Marco Bellinaso等著康博译ASP. NET Web站点高级编程一提出问题一设
计方案一解决方案清华大学出版社2002年9月
[15]. Joseph Bustos,Karl iWatson著侯或泽. NET Web服务入门经典一C#编程篇
致 谢
5、资源下载
本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。
序号 | 毕业设计全套资源(点击下载) |
---|---|
本项目源码 | 基于C#+asp.net+SQL server的客户关系管理系统设计与实现(源码+文档)C#_asp.net_CRM系统.zip |