数据库系统课程设计
目录
第 1 章 前言 ....................................................... 1
1.1 课题背景................................................. 1 1.2 开发工具................................................. 1 1.2.1 SQL Server 2005................................ 2 1.2.2 MFC............................................... 2 1.2.3 ADO............................................... 2
第2章 需求分析..................................................... 3 2.1 任务概述.................................................. 3 2.1.1任务目标............................................. 3 2.1.2用户特点............................................. 3 2.2 系统的功能需求 ............................................ 3
2.2.1 系统角色功能需求 ................................... 3 2.2.2 功能模块 ........................................... 3 2.3 系统的性能需求 ............................................ 3 2.4 系统的数据需求 ............................................ 4 第 3 章 系统总体设计 ................................................ 5
3.1 系统功能设计 .............................................. 5
3.1.1 各功能模块介绍 ...................................... 5 3.1.2 系统总体模块图 ...................................... 5
第 4 章 数据库设计 ................................................... 6
4.1 数据库概念设计 ............................................ 6 4.2 数据库逻辑设计 ............................................ 7 4.2.1 表汇总 ............................................. 7
4.2.2 表逻辑结构设计 ..................................... 7
第 5 章 详细设计 .................................................... 9
5.1 程序结构的设计 ............................................. 9 5.2 页面设计 ................................................... 10
5.2.1 登录界面 ............................................ 10 5.2.2 管理界面 .............................................10 5.2.3 用户管理 .............................................11 5.2.4 客户信息管理 ........................................ 11 5.2.5 商品信息管理 .........................................12 5.2.6 营销信息管理 .........................................12 5.3 编码设计 ................................................... 13
5.3.1ADO连接 ................................................. 13 5.3.2 更改密码 .............................................. 17 5.3.3 登录…………........................................... 17 5.3.4 客户管理.............................................. 18 5.3.5 商品管理.......................................... …….21 5.3.6 销售管理.......................................... ……..23
第 6 章 结论与展望 .................................................. 31
6.1 结论 ........................................................ 31 6.2 系统不足 .................................................... 31 6.3 感谢........................................... …………………31 参考文献 ........................................................... 31
第1章 前言
1.1 课题背景
随着中国电子商务、互联网业务的迅猛发展,国内许多企业已跨入电脑网络管理时代,并因此提高了管理效率和市场竞争力。但目前仍有部分企业还停留在原始计账管理阶段。而随着全球经济信息化的进程和WTO的成功实现,企业面临着前所未有的机遇和挑战,在如此激变的社会形势和激烈的市场竞争下,愈来愈多的企业管理者意识到效率管理和科学管理的重要性,以及增强市场竞争力的迫切性,因此建立科学、规范、高效的管理制度和秉承富有竞争力的经营理念是每一个企业管理者的渴望,企业采用电脑管理进货、库存、销售等诸多环节也已成为趋势及必然。
许多从事商业活动的企业都需要采购商品、销售商品以及将商品暂时存储在仓库中,对这一工作流程进行有效地管理和控制,对这些企业来说是非常重要。在进货、库存、销售环节中,由于商品种类繁多、业务量大、库存管理复杂,使用手工操作的工作量很大,在操作过程中也很容易出现各种错误。而采用计算机管理则可以大大提高日常工作的效率,不仅将原来由手工操作的进货、出货及销售这一整套流程用计算机进行全程管理,而且消除了手工操作中可能存在的不确定因素,达到进销存管理流程清晰,从而能够比较彻底地贯彻经营者的管理模式。
由于科学技术的不断发展,计算机科学日渐成熟,其强大的功能已为人们所深刻认识,它己进入人类社会的各个领域并发挥着越来越重要的作用。采用计算机进行信息化管理已成为衡量企业管理科学化和现代化的重要标志,而销售管理的全面自动化、信息化则是其中重要的组成部分。销售管理的好坏对于企业的决策者和管理者来说都至关重要,在很大程度上影响着企业的经济效益和社会效益。因此,本文所研究的销售管理系统具有一定的使用价值和现实意义。 一直以来人们使用传统人工的方式进行销售管理,这种管理方式存在着诸多缺点,如:工作量大、效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。鉴于此,本文研究了一种基于关系型数据库的销售管理方案。利用SQL Server2005数据库管理系统灵活性和开发效率高的特点,采用面向对象的VC的方法,开发出销售管理系统。该系统具有手工管理所无法比拟的优点,如:检索迅速、查找方便、可靠性高、存储量大、保密性好、信息利用率高、成本低等。该系统能够极大地提高销售管理的效率,优化企业的人力、物力,降低企业的管理成本,为企业销售管理的信息化、正规化奠定了坚实的基础。
1.2 开发工具
本文所采用的开发工具主要是基于数据库系统的SQL Server 2005 和基于面向对象程序设计的VC,主要利用其MFC技术。利用SQL Server 2005创建商场客户表、商品表、商品供应商表、进货表、销售表以及用VC连接数据库用的用户信息表。利用ADO连接的方法访问数据库。利用VC和数据库建立连接之后,
3
利用VC中的控件按钮以及一些程序代码实现一些特定的功能,例如营销信息查询、删除、修改等,极大地提高了销售管理的效率。 1.2.1 SQL Server 2005
SQL Server 2005 是微软公司动用上千人的研发力量,耗费五年时间打造出来 的产品,在企业及数据库产品中具有里程碑的意义。SQL Server 2005 是一个关系 数据库管理系统,是一个全面的数据库平台,其数据库引擎为关系型数据和结构 化数据提供了更安全可靠的存储功能。SQL Server 2005 结合了分析、报表、集 成和通知功能,引进了一套集成的管理工具和管理应用编程接口,以提供易用性、 可管理性及对大型 SQL Server 配置的支持。其新的查询类型和在交易过程中使用 错误处理的功能,为开发人员在 SQL Server 查询开发方面提供了更高的灵活性和 控制力。
SQL Server 可以适合大容量数据的应用,在功能上和管理上都比 Microsoft Access 要强的多。在处理海量数据的效率,后台开发的灵活性,可扩展等方面强 大。在 SQL Server 2005 中还可以使用存储过程,在服务器执行操作时,减少网络 通讯,提高了执行效率,而且保证了数据库的安全。 1.2.2 MFC
MFC,微软基础类(Microsoft Foundation Classes),同VCL类似,是一种Application Framework,随微软Visual C++ 开发工具发布。目前最新版本为9.0(截止2008年11月)。该类库提供一组通用的可重用的类库供开发人员使用。大部分类均从CObject 直接或间接派生,只有少部分类例外。 MFC 应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。MFC 提供了MFC AppWizard 自动生成框架。
Windows 应用程序中,MFC 的主包含文件为\"Afxwin.h\"。
此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。
由于它的易用性,初学者常误认为VC++开发必须使用MFC。这种想法是错误的。作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。 1.2.3 ADO
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLEDB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。
4
第 2 章 需求分析
2.1 任务概述
2.1.1 系统目标
销售管理系统是为了提高销售管理效率而开发的。它包括客户信息管理、商品信息管理、营销信息管理等模块,并提供了查询、修改、添加、删除等功能。销售管理系统能简化贸易公司在销售管理方面的复杂性,和减少在管理上的庞大开销。随着计算机行业的飞速发展,人类已经进入了信息时代,社会中的各个单位、部门也陆续开始使用软件化的管理模式,由于它具有方便、准确、快速、灵活的特点,使得在管理上实现了自动化、一体化、多元化的目标。
本课程设计开发了一个销售管理系统,该系统完成了对商品进货、商品销售、供应商信息、客户信息等的添加、修改、删除、查询等功能,迅速准确地完成各种工作,大大提高了企业的管理效率。 2.1.2用户特点
许多从事商业活动的企业都需要采购商品、销售商品以及将商品暂时存储在仓库中,对这一工作流程进行有效地管理和控制,对这些企业来说是非常重要。在进货、库存、销售环节中,由于商品种类繁多、业务量大、库存管理复杂,使用手工操作的工作量很大,在操作过程中也很容易出现各种错误。本系统采用计算机管理则可以大大提高日常工作的效率,不仅将原来由手工操作的进货、出货及销售这一整套流程用计算机进行全程管理,而且消除了手工操作中可能存在的不确定因素,达到进销存管理流程清晰,从而能够比较彻底地贯彻经营者的管理模式。
2.2系统的功能需求 2.2.1 角色功能需求
本系统共包含供应商、商品、客户三中角色:
(1)供应商:包括商品供应商和商品的品牌商两种,我们可以通过添加、修改和删除等操作对这两种供应商进行更新;
(2)商品:进货和销售功能均以商品为主体,同时可以添加商品的数量; (3)客户:客户可以采购商品,也可以添加客户的数量及信息 2.2.2功能模块
系统包括管理员信息模块、客户信息模块、商品信息模块、营销信息模块(进货和销售管理)、供应商信息模块。
(1)管理员信息模块功能需求:可以添加新的用户及密码,也可以更改当前用户的密码;
(2)客户信息模块功能需求:可以添加新客户的各种信息,也可以进行删除、修改和查询;
(3)商品信息模块功能需求:能够添加新的商品,也可以对以前的商品信息进行删除、修改和查询;
(4)营销信息模块功能需求:包括进货和销售信息,可以对其进行添加、删除、修改和查询;
(5)供应商信息模块功能需求:可以添加、删除、修改和查询供应商的信息。
5
2.3 系统的性能分析
为了保证系统能够长期、安全、稳定、可靠、高效的运行,系统应该满足以下的性能需求:
(1)系统处理的准确性和及时性 系统处理的准确性和及时性是系统的必要性能。在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足用户对信息的处理。由于系统的查询功能对于整个系统的功能和性能完成很重要。从系统的多个数据来源来看,学生信息查询、教师信息查询、实验信息 查询、排课结果查询、实验成绩查询,其准确性很大程度上决定了系统的成败。 因此,在系统开发过程中,系统采用优化的 SQL 语句及安全扩展存储过程来保证 系统的准确性和及时性。
(2)系统的开放性和系统的可扩充性 系统在开发过程中,应该充分考虑以后的可扩充性。例如实验信息属性添加、修改,用户查询的需求及管理工作的分级管理等模块也会不断的更新和完善。所 有这些,都要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点, 应通过系统的开放性来完成,既系统应是一个开放系统,只要符合一定的规范, 可以简单的加入和减少系统的模块,配置系统的硬件。通过软件的修补、替换完 成系统的升级和更新换代。
(3)系统的易用性和易维护性 系统是直接面对使用人员的,而有些使用人员往往对计算机并不是非常熟悉。这就要求系统能够提供良好的用户接口,易用的人机交互界面。要实现这一点, 就要求系统应该尽量使用用户熟悉的术语和中文信息的界面;针对用户可能出现 的使用问题,要提供足够的在线帮助,缩短用户对系统熟悉的过程。
系统中涉及到的数据是高校实验室相当重要的信息,因此系统为不同角色的 用户提供了方便的管理后台进行数据管理,特别为系统管理员提供了数据备份, 日常安全管理,防止系统意外崩溃等功能。
2.4系统的数据需求
该系统的开发主要任务是实现对销售系统自动化的处理,所以我们初步规划出系统所需要的数据有:
客户的基本信息:公司名称、联系人姓名、地址、城市、地区、邮编、联系
电话、传真、主页、备注;
供应商基本信息:公司名称、联系人姓名、地址、城市、地区、邮编、联系
电话、传真、主页、备注;
商品的基本信息:商品名称、商品规格、规格单位、商品备注信息;
6
进货的基本信息:供应商名称、商品名称、商品规格、商品规格单位、数量、
单价、进货日期、备注;
销售的基本信息:客户名称、商品名称、产品规格、规格单位、数量、单价、
销售日期、折扣、备注。
第 3 章 系统总体设计
3.1 系统功能设计
3.1.1各功能模块介绍
经过分析后确定系统应具备以下功能:
(1)系统管理功能
① 修改密码:修改正在运行的用户密码; ② 添加用户:添加新的用户,并设置密码。
(2)客户信息管理功能
① 供应商信息管理:添加、删除、修改或查询供应商信息。 ② 客户信息管理:添加、删除、修改或查询客户信息。 (3)商品信息管理功能
添加、删除或修改商品信息。
(4)营销信息管理功能
① 进货信息管理:添加、修改、查询或删除进货信息。 ② 销售信息管理:添加、删除、修改或查询进货信息。
3.1.2 系统总体模块图
7
第 4 章 数据库设计
4.1 数据库概念设计
本系统包括的实体有:客户、供应商、商品、管理员,下面是各实体的实体属性介绍:
(1) 管理员
描述:销售管理中存储的所有管理员信息(包括所有查询的所需信息) 其中包含属性 用户名:用于标识登陆系统的用户账号,具有唯一性 用户密码:用于对应登陆用户名的密码 (2) 供应商信息supperliers
描述:销售管理中存储的所有供应商信息
其中包含属性 CompanyName:用于标识供应商,具有唯一性
ContactName:用于标识联系人姓名 Address:用于标志供应商公司地址 City:用于标识供应商所在城市 Region:用于标识地区信息 PostalCode:用于标识邮编 Phone:用于标识联系电话 Fax:用于标识传真信息
HomePage:用于标识公司主页
SupplierMemo:用于标识备注信息
8
(3) 客户信息 customers
描述:销售管理中存储的所有客户信息
其中包含属性 CompanyName:用于标识客户公司,具有唯一性
ContactName:用于标识联系人姓名 Address:用于标志客户公司地址 City:用于标识客户所在城市 Region:用于标识地区信息 PostalCode:用于标识邮编 Phone:用于标识联系电话 Fax:用于标识传真信息
HomePage:用于标识公司主页
SupplierMemo:用于标识备注信息
(4) 商品信息 products
描述:销售管理中存储的所有商品信息
其中包含属性 ProducName:用于标识商品,具有唯一性 Spec:用于标识商品规格 Unit:用于标识商品规格单位 Productmemo:用于标识备注信息
系统总体E-R图:
4.2数据库逻辑设计
4.2.1表汇总
各数据库表的简要说明: 表名 9
简要说明
Customers 销售管理中存储的所有客户信息 Orders 销售管理中存储的所有商品销售信息 Supplies 销售管理中存储的所有供应商信息 Sstock 销售管理中存储的所有商品进货信息 Products 销售管理中存储的所有商品信息 User_Info 销售管理中存储的所有管理员信息 4.2.2 表逻辑结构设计 表1 customers表 字段名 CompanyName ContactName Address City Region PostalCode Phone Fax Homepage 数据类型 varchar varchar varchar varchar varchar varchar varchar varchar varchar 长度 40 30 60 15 10 10 24 24 50 16 长度 40 40 20 20 20 8 8 8 16 长度 40 20 20 16 长度 10
描述 联系人姓名 联系地址 城市姓名 地区姓名 邮政编码 联系电话 传真 公司主页 备注信息 描述 客户名称 商品名称 商品规格 商品数量 商品单价 销售日期 折扣 备注 描述 商品名称 商品规格 备注 描述 是否主键 否 否 否 否 否 否 否 否 否 是否主键 是 是 否 否 否 否 否 否 是否主键 是 否 否 是否主键 客户公司名称 是 CustomerMemo text 字段名 ProducName Spec Unit Quantity UnitPrice OrderDate Discount Ordermemo 字段名 ProductName Spec Unit Productmemo 字段名 数据类型 varchar varchar varchar varchar float datetime float text 数据类型 varchar varchar varchar text 数据类型 表2 orders表(销售表) CustomerName varchar 商品规格单位 否 表3 products表(商品表) 商品规格单位 否 表4 sstock表(进货表)
ProviderName varchar ProductName Spec Unit Quantity UnitPrice StockDate Stockmemo 字段名 CompanyName ContactName Address City Region PostalCode Phone Fax Homepage varchar varchar varchar varchar float datetime text 数据类型 varchar varchar varchar varchar varchar varchar varchar varchar varchar 40 40 20 20 20 8 8 16 长度 40 30 60 15 10 10 24 24 50 16 商品公司名称 是 商品名称 商品规格 商品数量 商品单价 进货日期 备注 描述 是 否 否 否 否 否 是否主键 商品规格单位 否 表5 suppliers表(供应商表) 供应商公司名是 称 联系人姓名 联系地址 城市姓名 地区姓名 邮政编码 联系电话 传真 公司主页 备注信息 否 否 否 否 否 否 否 否 否 SuppplierMemo text 第 5 章 详细设计
5.1 程序结构的设计
数据流图(DFD)
本系统的数据流图如下图所示: 图1 顶级数据流图
11
图2 添加或删除相关信息数据流图
图3 查询信息数据流图
5.2 页面设计
5.2.1 登录界面
通过用户输入的用户名及密码,获取数据库中此用户名的详细信息,如果不存在,提示用户不存在错误;若密码不匹配,提示输入密码不正确;数据库链接不正常,记录日志;系统获取用户信息后,若用户名密码匹配,根据角色进入不同页面
下面是登录窗口:
12
5.2.2管理界面
管理员登录后,进入管理界面,可以通过左上面的菜单连接到不同的功能界面,实现不同的功能,此菜单是跟管理模块图对应的。
5.2.3用户管理
用户可以对当前密码进行修改,超级用户可以添加新的用户
13
5.2.4客户信息管理
销售的客户包括供货商和销售客户,所以客户信息管理对应了二者的添加、删除、修改和查询
14
5.2.5商品信息管理
商品信息的管理包括对商品的各种标准管理,可以添加新的商品或修改和删除就的商品
5.2.6营销信息管理
营销信息包括进货和销售,二者的添加修改和删除操作很多比较类似 因为进货的商品种类是固定的,所以只有数量和单价及备注是可以填写的,其他均是默认值
15
5.3编写代码
5.3.1 ADO连接
BOOL CTrade_MISApp::InitInstance() {
AfxEnableControlContainer();
// Init Login Count m_iLoginCount = 0;
// Create ADO Connection
if( FAILED(::CoInitialize(NULL)) ) //初始化COM环境 {
AfxMessageBox(\"ADO Init failed\"); return false; } try { ADOConn.CreateInstance(__uuidof(Connection));//创建连接对象实例 ADOConn->Open(\"DSN=Trade_MIS;Provider=MSDASQL\adConnectUnspecified);//ADOConn作为连接对象指针 }//打开数据库
16
// Catch Exceptions catch(_com_error &e) { CString err; err.Format(\"%s\ AfxMessageBox(err); }
catch(...) { AfxMessageBox(\"Unknown Error...\"); }
// Init ADO RecordSet
m_pADOSet.CreateInstance(__uuidof(Recordset));//创建记录集对象实例
SetRegistryKey(_T(\"Local AppWizard-Generated Applications\"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views.
// Popup Login Dialog CLoginDLG dlg;
if ( IDOK!=dlg.DoModal() ) return false;
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTrade_MISDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CTrade_MISView)); AddDocTemplate(pDocTemplate);
m_nCmdShow = SW_SHOWMAXIMIZED;//Max window when show
// Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE;
17
// The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->SetWindowText(_T(\"销售管理系统\")); m_pMainWnd->UpdateWindow();
return TRUE; }
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog {
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:
virtual void DoDataExchange(CDataExchange* pDX); support
//}}AFX_VIRTUAL
// Implementation protected:
//{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG
DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {
//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg)
18
// DDX/DDV
//}}AFX_DATA_MAP }
// App command to run the dialog
void CTrade_MISApp::OnAppAbout() {
CAboutDlg aboutDlg; aboutDlg.DoModal(); }
//执行SQL语句的函数如下:
bool CTrade_MISApp::ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL)//ADOSet作为引用,起到指针作用,是记录集对象指针 {
if ( ADOSet->State == adStateOpen) ADOSet->Close(); try {
ADOSet->Open(strSQL, ADOConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdUnknown);//打开记录集 return true;//执行成功返回真值 }
catch(_com_error &e) {
CString err;
err.Format(\"ADO Error: %s\ AfxMessageBox(err);
return false;//捕捉到错误返回假值 } }
int CTrade_MISApp::ExitInstance() //断开数据库连接的函数 {
// TODO: Add your specialized code here and/or call the base class
// Release ADO RecordSet//释放指针
if(adStateOpen==m_pADOSet->State) m_pADOSet->Close();//关闭记录集 m_pADOSet.Release();
// Release ADO Connection//断开连接
if( adStateOpen == ADOConn->State ) ADOConn->Close();//断开数据库连接
ADOConn.Release();
return CWinApp::ExitInstance();
19
}
5.3.2 更改密码
void CChangePwdDLG::OnOK() {
UpdateData(true); // 确保密码输入非空 if ( \"\"==m_sPWD1 ) { AfxMessageBox(_T(\"密码不能未空\"), MB_ICONEXCLAMATION); return; }
//判断两次输入的密码一致
if ( 0!=m_sPWD1.Compare(m_sPWD2) ) { AfxMessageBox(_T(\"两次输入密码不一样,请确认\"), MB_ICONEXCLAMATION); return; }
CDialog::OnOK(); }
BOOL CChangePwdDLG::OnInitDialog() {
CDialog::OnInitDialog();
((CEdit*)GetDlgItem(IDD_CHANGEPWD_PWD1))->SetLimitText(10); ((CEdit*)GetDlgItem(IDD_CHANGEPWD_PWD2))->SetLimitText(10);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE }
5.3.3 登录
void CLoginDLG::OnOK() {
// TODO: Add extra validation here // Check UserName Vadilaty UpdateData(true);
m_sUSER.TrimRight(\" \"); //删除空格
if ( \"\"==m_sUSER ) {//用户名输入为空 AfxMessageBox(_T(\"请填写用户名\"), MB_ICONEXCLAMATION); return; }
_variant_t Holder, strQuery;
20
strQuery = \"select user_ID, user_PWD from user_Info where user_ID='\"+m_sUSER+\"'\";//查询用户名和密码
theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询语句,获得记录集
int iCount = theApp.m_pADOSet->GetRecordCount();//获取记录条数 if (iCount==0)
{//若数据库中记录数为0 theApp.m_iLoginCount++;//登录计数 if ( theApp.m_iLoginCount>2 ) {//输入次数为三次 AfxMessageBox(\"没有这个用户\\n三次输入均不正确,请核对后再来\ CDialog::OnCancel(); return; } AfxMessageBox(\"没有这个用户,请重新输入用户名\MB_ICONEXCLAMATION); return; }
CString sPWD;
theApp.m_pADOSet->MoveFirst();//指向第一条记录
Holder = theApp.m_pADOSet->GetCollect(\"user_PWD\");//获取记录中user_PWD值
sPWD = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; if ( 0!=sPWD.Compare(m_sPWD) ) {//若sPWD和m_sPWD不相等 theApp.m_iLoginCount++;//登录次数加1 if ( theApp.m_iLoginCount>2 ) {//登录3次 AfxMessageBox(\"输入密码不正确\\n三次输入均不正确,请核对后再来\ CDialog::OnCancel(); return; } AfxMessageBox(\"输入密码不正确,请重新输入\MB_ICONEXCLAMATION); return; }
// Get Login User
theApp.m_sCurrentUser = m_sUSER; CDialog::OnOK(); }
5.3.4 客户管理
BOOL CCustomerDLG::OnInitDialog()
21
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// Set Windows Text
if (m_bAppend) SetWindowText(_T(\"添加客户信息\")); else SetWindowText(_T(\"修改客户信息\"));
m_sOldCompany = m_sCompany;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE }
void CCustomerDLG::OnOK() {
// TODO: Add extra validation here UpdateData(true);
m_sCompany.TrimRight(\" \"); m_sPerson.TrimRight(\" \"); m_sAddress.TrimRight(\" \"); m_sCity.TrimRight(\" \"); m_sArea.TrimRight(\" \"); m_sPostCode.TrimRight(\" \"); m_sPhone.TrimRight(\" \"); m_sFax.TrimRight(\" \");
m_sHomePage.TrimRight(\" \");
// Make sure all needed info is available CString sWarning=\"\";
if ( \"\"==m_sCompany ) sWarning=_T(\"公司名称\"); else if ( \"\"==m_sPerson ) sWarning=_T(\"联系人姓名\"); else if ( \"\"==m_sAddress ) sWarning=_T(\"联系地址\"); else if ( \"\"==m_sCity ) sWarning=_T(\"城市名称\"); else if ( \"\"==m_sArea ) sWarning=_T(\"地区名称\"); else if ( \"\"==m_sPostCode ) sWarning=_T(\"邮政编码\"); else if ( \"\"==m_sPhone ) sWarning=_T(\"联系电话\"); else if ( \"\"==m_sFax ) sWarning=_T(\"传真号码\");
else if ( \"\"==m_sHomePage ) sWarning=_T(\"公司主页\");
if ( \"\"!=sWarning ) {
22
sWarning += _T(\"不能为空\");
AfxMessageBox(sWarning, MB_ICONEXCLAMATION); return; }
_variant_t strQuery;
if ( m_bAppend || m_sCompany!=m_sOldCompany ) { // Judge Customer is unique strQuery = \"select * from customers where CompanyName='\"+m_sCompany+\"'\";
theApp.ADOExecute(theApp.m_pADOSet, strQuery); int iCount = theApp.m_pADOSet->GetRecordCount(); if ( 0!=iCount ) {
AfxMessageBox(_T(\"已经存在此公司记录!\"), MB_ICONEXCLAMATION); return; } }
if ( !m_bAppend ) // Not Append, delete old record first { strQuery = \"delete from customers where CompanyName='\"+m_sOldCompany+\"'\";
theApp.ADOExecute(theApp.m_pADOSet, strQuery); }
// Insert Record
strQuery = \"insert customers (CompanyName, ContactName, Address, City, Region, PostalCode, Phone,Fax, HomePage, CustomerMemo) \\ values ('\"+m_sCompany+\"', '\"+m_sPerson+\"', '\"+m_sAddress+\"', '\"+m_sCity+\"', '\"+m_sArea+\"', '\"+m_sPostCode+\"', '\"+m_sPhone+\"', '\"+m_sFax+\"', '\"+m_sHomePage+\"', '\"+m_sMemo+\"')\"; if ( theApp.ADOExecute(theApp.m_pADOSet, strQuery) ) {
if (m_bAppend) { AfxMessageBox(_T(\"添加客户信息成功!\"), MB_ICONINFORMATION); // Clear all input
m_sCompany=m_sPerson=m_sAddress=m_sCity=m_sArea=m_sPostCode=m_sPhone=m_sFax=m_sHomePage=m_sMemo=\"\";
23
UpdateData(false); } else AfxMessageBox(_T(\"修改客户信息成功!\"), MB_ICONINFORMATION); } else { if (m_bAppend) AfxMessageBox(_T(\"添加客户信息失败!\"), MB_ICONEXCLAMATION); else AfxMessageBox(_T(\"修改客户信息失败!\"), MB_ICONEXCLAMATION); }
strQuery = \"select * from customers\"; CTrade_MISView* p = (CTrade_MISView*)(((CMainFrame*)AfxGetMainWnd())->GetActiveView()); p->RefreshCustomer(strQuery);
if (!m_bAppend) CDialog::OnOK(); }
5.3.5 商品管理
BOOL CProductDLG::OnInitDialog() {
CDialog::OnInitDialog();
//设置对话框标题,m_bAppend设为true表示添加,false表示修改 if (m_bAppend) SetWindowText(_T(\"添加商品信息\")); else SetWindowText(_T(\"修改商品信息\"));
m_sOldName = m_sName;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE }
void CProductDLG::OnOK() {
UpdateData(true); //去掉字符串后的空格 m_sName.TrimRight(\" \"); m_sSpec.TrimRight(\" \"); m_sUnit.TrimRight(\" \"); m_sMemo.TrimRight(\" \");
//确定所有信息都输入,若存在没输入的信息,提出提示框
24
CString sWarning=\"\";
if ( \"\"==m_sName ) sWarning=_T(\"商品名称\"); else if ( \"\"==m_sSpec ) sWarning=_T(\"商品规格\"); else if ( \"\"==m_sUnit ) sWarning=_T(\"计量单位\"); //消息框 if ( \"\"!=sWarning ) {
sWarning += _T(\"不能为空\");
AfxMessageBox(sWarning, MB_ICONEXCLAMATION); return; }
_variant_t strQuery;
if ( m_bAppend || m_sName!=m_sOldName )
{//添加商品信息或修改商品名称时,检查商品名称是否唯一 strQuery = \"select * from products where ProductName='\"+m_sName+\"'\";
theApp.ADOExecute(theApp.m_pADOSet, strQuery); int iCount = theApp.m_pADOSet->GetRecordCount(); if ( 0!=iCount )//记录集非空,存在该商品信息 {
AfxMessageBox(_T(\"已经存在此商品记录!\"), MB_ICONEXCLAMATION); return; } }
if ( !m_bAppend ) //修改记录时,先删除原纪录 { strQuery = \"delete from products where ProductName='\"+m_sOldName+\"'\";
theApp.ADOExecute(theApp.m_pADOSet, strQuery); }
//插入新的记录
strQuery = \"insert products (ProductName, Spec, Unit, Productmemo) \\ values ('\"+m_sName+\"', '\"+m_sSpec+\"', '\"+m_sUnit+\"', '\"+m_sMemo+\"')\";
if ( theApp.ADOExecute(theApp.m_pADOSet, strQuery) ) {//插入成功
if (m_bAppend) { AfxMessageBox(_T(\"添加商品信息成功!\"), MB_ICONINFORMATION);
25
//清空已输入的信息,以便继续输入
m_sName=m_sSpec=m_sUnit=m_sMemo=\"\"; UpdateData(false); } else AfxMessageBox(_T(\"修改商品信息成功!\"), MB_ICONINFORMATION); }
else //插入失败 { if (m_bAppend) AfxMessageBox(_T(\"添加商品信息失败!\"), MB_ICONEXCLAMATION); else AfxMessageBox(_T(\"修改商品信息失败!\"), MB_ICONEXCLAMATION); }
//刷新商品信息列表
strQuery = \"select * from products\"; CTrade_MISView* p = (CTrade_MISView*)(((CMainFrame*)AfxGetMainWnd())->GetActiveView()); p->RefreshProduct(strQuery);
if (!m_bAppend) CDialog::OnOK(); }
5.3.6 销售管理
BOOL COrderDLG::OnInitDialog() {
CDialog::OnInitDialog();
m_sOldCustomerName = m_sCustomerName; m_sOldProductName = m_sProductName;
if (m_bAppend)//m_bAppend为TRUE添加销售信息 { //改变对话框标题 SetWindowText(_T(\"添加销售信息\")); //初始化顾客Combobox _variant_t strQuery, Holder; strQuery = \"select * from customers\";//从顾客表中查询所有信息
theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询语句,形成记录集
int iCount = theApp.m_pADOSet->GetRecordCount();//获取记录集中记录条数赋给icount theApp.m_pADOSet->MoveFirst();//移到第一条记录 for (int i=0; i Holder = theApp.m_pADOSet->GetCollect(\"CompanyName\");//从记录中获取公司名称 ((CComboBox*)GetDlgItem(IDC_ORDER_CUSTOMERNAME))->InsertString(i, Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder); //获取顾客其他信息 if (0==i) { //联系人姓名 Holder = theApp.m_pADOSet->GetCollect(\"ContactName\"); m_sCustomerPerson = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; //联系电话 Holder = theApp.m_pADOSet->GetCollect(\"Phone\"); m_sCustomerPhone = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; } theApp.m_pADOSet->MoveNext();//移到下一条记录 } ((CComboBox*)GetDlgItem(IDC_ORDER_CUSTOMERNAME))->SetCurSel(0);//Combobox中初始化为第一条记录信息 //初始化商品信息Combobox strQuery = \"select * from products\";//从商品表中查询所有信息 theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询语句,形成记录集 iCount = theApp.m_pADOSet->GetRecordCount();//获取记录集中记录条数 theApp.m_pADOSet->MoveFirst();//移到第一条记录 for (i=0; i ((CComboBox*)GetDlgItem(IDC_ORDER_PRODUCTNAME))->InsertString(i, Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder); //获取商品其他信息 if ( 0==i ) { // 商品规格 Holder = theApp.m_pADOSet->GetCollect(\"Spec\"); m_sProductSpec = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; //规格单位 Holder = theApp.m_pADOSet->GetCollect(\"Unit\"); 27 m_sProductUnit = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; } theApp.m_pADOSet->MoveNext();//移到下一条记录 } ((CComboBox*)GetDlgItem(IDC_ORDER_PRODUCTNAME))->SetCurSel(0);//Combobox中初始化为第一条记录信息 } else//m_bAppend为FALSE修改销售信息 { // 修改对话框标题 SetWindowText(_T(\"修改销售信息\")); //初始化顾客Combobox _variant_t strQuery, Holder; CString str; int iSel = 0; strQuery = \"select * from customers\";//从customers表中查询所有信息 theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询语句,并建立记录集 int iCount = theApp.m_pADOSet->GetRecordCount();//获取记录条数 theApp.m_pADOSet->MoveFirst();//移到第一条记录 for (int i=0; i str = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; ((CComboBox*)GetDlgItem(IDC_ORDER_CUSTOMERNAME))->InsertString(i, str); // 获取顾客其他信息 if ( str==m_sCustomerName)//编辑框中的公司名称和本条记录集中公司名称一致 { //获取联系人姓名 Get Person Holder = theApp.m_pADOSet->GetCollect(\"ContactName\"); m_sCustomerPerson = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; // 联系电话 Holder = theApp.m_pADOSet->GetCollect(\"Phone\"); m_sCustomerPhone = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; iSel = i; } 28 theApp.m_pADOSet->MoveNext();//移到下一条记录 } ((CComboBox*)GetDlgItem(IDC_ORDER_CUSTOMERNAME))->SetCurSel(iSel);//Combobox初始化为第iSel条记录的值 //初始化商品名称Combobox strQuery = \"select * from products\";//从products表中查询所有信息 theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询语句,创建记录集 iCount = theApp.m_pADOSet->GetRecordCount();//获取记录条数 theApp.m_pADOSet->MoveFirst();//移到第一条记录 for (i=0; i str = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; ((CComboBox*)GetDlgItem(IDC_ORDER_PRODUCTNAME))->InsertString(i, str); if ( str==m_sProductName ) iSel = i;//确定所选中的商品名称是记录集中的第几条记录 theApp.m_pADOSet->MoveNext();//移到下一条记录 } ((CComboBox*)GetDlgItem(IDC_ORDER_PRODUCTNAME))->SetCurSel(iSel);//Combobox初始化为第iSel条记录的值 } UpdateData(false); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COrderDLG::OnOrderCustomerNameSelChange() {//客户名称改变时 UpdateData(true); _variant_t strQuery, Holder; strQuery = \"select * from customers where CompanyName='\"+m_sCustomerName+\"'\";//在customers表中查询CompanyName为m_sCustomerName的信息 theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询,形成记录集 29 //获取联系人信息 Holder = theApp.m_pADOSet->GetCollect(\"ContactName\"); m_sCustomerPerson = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; //获取联系电话 Holder = theApp.m_pADOSet->GetCollect(\"Phone\"); m_sCustomerPhone = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; UpdateData(false); } void COrderDLG::OnOrderProductNameSelChange() {//商品名称改变时 UpdateData(true); _variant_t strQuery, Holder; strQuery = \"select * from products where ProductName='\"+m_sProductName+\"'\";//在products表中查询ProductName为m_sProductName的信息 theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询,形成记录集 // 获取规格 Holder = theApp.m_pADOSet->GetCollect(\"Spec\"); m_sProductSpec = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; // 获取单位 Holder = theApp.m_pADOSet->GetCollect(\"Unit\"); m_sProductUnit = Holder.vt==VT_NULL?\"\":(char*)(_bstr_t)Holder; UpdateData(false); } void COrderDLG::OnOK() { UpdateData(true); //删掉字符串后的空格 m_sQuantity.TrimRight(\" \"); m_sPrice.TrimRight(\" \"); m_sDiscount.TrimRight(\" \"); //检查所需信息是否都输入 CString sWarning=\"\"; if ( \"\"==m_sQuantity ) sWarning=_T(\"数量\"); else if ( \"\"==m_sPrice ) sWarning=_T(\"单价\"); else if ( \"\"==m_sDiscount ) sWarning=_T(\"折扣\"); if (\"\"!=sWarning) { 30 sWarning += _T(\"不能为空\"); AfxMessageBox(sWarning, MB_ICONEXCLAMATION); return; } //检查单价输入是否有意义 float fPrice=atof(m_sPrice); if ( 0==fPrice ) { AfxMessageBox(_T(\"单价:请输入非零数字\"), MB_ICONEXCLAMATION); return; } m_sPrice.Format(\"%.2f\ //检查折扣是否有意义 float fDiscount=atof(m_sDiscount); if ( 0==fDiscount ) { AfxMessageBox(_T(\"折扣:请输入非零数字\"), MB_ICONEXCLAMATION); return; } m_sDiscount.Format(\"%.2f\ if ( fDiscount>100 ) { AfxMessageBox(_T(\"折扣:不能大于100\"), MB_ICONEXCLAMATION); return; } _variant_t strQuery; if ( m_bAppend || m_sOldCustomerName!=m_sCustomerName || m_sOldProductName!=m_sProductName ) {//添加销售信息 // Judge Order is unique strQuery = \"select * from orders where CustomerName='\"+m_sCustomerName+\"' and ProductName='\"+m_sProductName+\"'\";//从CustomerName表中选择满足条件的信息 theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行查询语句,形成记录集 int iCount = theApp.m_pADOSet->GetRecordCount();//获取记录集中记录条数 if ( 0!=iCount) 31 {//记录非空,则说明此销售记录已存在 AfxMessageBox(_T(\"已经存在此销售记录!\"),MB_ICONEXCLAMATION); return; } } if ( !m_bAppend ) //修改销售信息 { strQuery = \"delete from orders where CustomerName='\"+m_sOldCustomerName+\"' and ProductName='\"+m_sOldProductName+\"'\";//删除满足条件的信息 theApp.ADOExecute(theApp.m_pADOSet, strQuery);//执行删除语句 } //添加销售信息 _variant_t Holder; CString Remain; int t; strQuery=\"select Quantity from sstock where ProductName='\"+m_sProductName+\"'\";//读取该商品剩余量信息 theApp.ADOExecute(theApp.m_pADOSet,strQuery); Holder=theApp.m_pADOSet->GetCollect(\"Quantity\"); Remain= (const char*)(_bstr_t)Holder; t=atoi(Remain)-atoi(m_sQuantity); // t=strcmp(R,); if(t<0) { MessageBox(\"库存不足!\"); return; } else Remain=Remain-m_sQuantity; //交易时间时间 CString sOrderDate = m_tOrderDate.Format(\"%Y-%m-%d\"); //插入元组 strQuery = \"insert orders (CustomerName, ProductName, Spec, Unit, Quantity, UnitPrice, OrderDate, Discount, Ordermemo) \\ values ('\"+m_sCustomerName+\"', '\"+m_sProductName+\"', '\"+m_sProductSpec+\"', '\"+m_sProductUnit+\"', \"+m_sQuantity+\\"+m_sPrice+\ 32 if ( theApp.ADOExecute(theApp.m_pADOSet, strQuery) ) {//插入元组成功 if (m_bAppend) { AfxMessageBox(_T(\"添加销售信息成功!\"), MB_ICONINFORMATION); //清空所有的输入信息,以便继续输入 m_sQuantity=m_sPrice=m_sMemo=m_sDiscount=\"\"; UpdateData(false); strQuery=\"update sstock SET Quantity='\"+Remain+\"'\"; theApp.ADOExecute(theApp.m_pADOSet,strQuery); } else AfxMessageBox(_T(\"修改销售信息成功!\"), MB_ICONINFORMATION); } else {//插入元组失败 if (m_bAppend) AfxMessageBox(_T(\"添加销售信息失败!\"), MB_ICONEXCLAMATION); else AfxMessageBox(_T(\"修改销售信息失败!\"), MB_ICONEXCLAMATION); } //更新数据库 strQuery = \"select * from orders\"; CTrade_MISView* p = (CTrade_MISView*)(((CMainFrame*)AfxGetMainWnd())->GetActiveView()); p->RefreshOrder(strQuery); if (!m_bAppend) CDialog::OnOK(); } 33 第 6 章 结论与展望 6.1结论 此系统主要完成客户管理、商品管理、销售基础数据维护、管理员的信息管理等 基本功能。 (一)客户管理:主要功能是对客户信息和供应商信息的添加、查询、修改和删除。 (二)商品信息管理:主要功能是对商品的添加、修改和删除。 (三)销售管理:对进货和销售信息的添加、修改、删除和查询。 本系统可以简单的对以上信息进行管理,经过两个星期的实际操作和搜索相关资料,终于让我们完成了这个重大任务。让我们对SQL SERVER和MFC有了更进一步的认识和了解,也让我们懂得了数据库设计的基本步骤有需求分析、概念结构设计、逻辑结构设计、数据库实施和数据库运行和维护等。 在本课程设计中,我们明白了理论与实际应用相结合的重要性,并提高了自己组织数据及编写大型程序的能力。培养了基本的、良好的程序设计技能以及合作能力。这次课程设计同样提高了我们的综合运用所学知识的能力 6.2 系统不足,待改进的地方,提出一些自己对系统的扩展构想 本系统还存在很多不足,还缺乏很多信息的管理例如: (1)客户退货的管理 在销售过程中,难免会有退货处理,所以,在系统中应该完善这项功能,客户退货时,系统能使该商品的库存量自动增加。 (2)对销售公司收益的管理 在系统中设置固定的资金基础,当有进货或销售时,根据货物的价格,可以在资金中自动加减。 (3)对一些添加或者删除的操作限制比较大,可以更加的人性化一点。 6.3致谢 我要衷心感谢各位老师在我的课程设计过程中给予我的极大帮助,使我能够及时、顺利地完成此次的数据库课程设计。同时,也要感谢我的同学及在本系统的设计过程中给予我大力支持和帮助的各位朋友。 参考文献 [1]http://www.cppblog.com/current/archive/2010/08/19/91069.html博客论坛 [2] http://wenku.baidu.com/view/a2604b1dfad6195f312ba692.html [3] http://baike.baidu.com/view/43014.htm百度百科 [4]王珊、萨师煊.数据库系统概论. 数据库系统概论(第四版)高等教育出版社 2006 [5]张忠帅. VC++ 2008专题应用程序开发实例精讲. 2006 电子工业出版社 [6]马晓梅 . SQL SERVER实验指导.清华大学出版社 2006 34 因篇幅问题不能全部显示,请点此查看更多更全内容