vc++管理系统实例.docx
《vc++管理系统实例.docx》由会员分享,可在线阅读,更多相关《vc++管理系统实例.docx(55页珍藏版)》请在冰豆网上搜索。
![vc++管理系统实例.docx](https://file1.bdocx.com/fileroot1/2023-2/1/b595ca3e-6f55-4bfd-b2a6-9dfc2a404626/b595ca3e-6f55-4bfd-b2a6-9dfc2a4046261.gif)
vc++管理系统实例
实例实现效果
ODBCDemo2是本书用于阐述MFCODBC数据库编程的实例应用程序,该应用程序实现了对某销售公司日常销售业务的信息浏览和报表操作。
应用程序运行界面如图6-1所示。
图6-1ODBCDemo2实例应用程序的运行界面
6.3.2实例实现过程
数据库设计
我们利用MicrosoftAccess工具设计本实例的数据库结构。
在本实例里,我们需要利用数据库存放销售公司的如下信息:
∙日常销售信息:
指公司日常销售帐单中的客户信息、雇员信息、订购日期、货主信息、运货商信息。
∙产品信息:
指公司现经营产品的产品名称、供应商信息、类别信息、单价以及库存量等信息。
∙客户信息:
指公司客户的客户名称、联系人信息和客户的地址信息。
∙雇员信息:
指公司雇员的雇员姓名、头衔、尊称、出生日期、雇佣日期、联系信息及其上级等信息。
∙供应商信息:
指与公司合作的供应商的名称、地址、联系人等信息。
∙运货商信息:
指与公司合作的运货商的名称、电话信息。
∙产品类别信息:
指公司所经营产品的类别。
我们为数据库设计了八个表,表“订单”和表“订单明细”存放公司日常销售信息,表“产品”存放公司的产品信息,表“客户”存放公司的客户信息,表“雇员”存放公司的雇员信息,表“供应商”存放公司的产品供应商信息,表“运货商”存放公司的运货商信息,表“类别”存放公司经营产品的类别信息。
为了便于数据访问,我们还定义了三个视图,“SalesByCustomer”视图管理着以客户为统计方式的销售信息,“SalesByEmployee”视图管理着以雇员为统计方式的销售信息,“SalesByProduct”视图管理着以产品为统计方式的销售信息。
下面的表6-1列出了表“订单”的结构,表6-2列出了表“订单明细”的结构,表6-3列出了表“产品”的结构,表6-4列出了表“客户”的结构,表6-5列出了表“雇员”的结构,表6-6列出了表“供应商”的结构,表6-7列出了表“运货商”的结构,表6-8列出了表“类别”的结构。
表6-1表“订单”的结构
字段名称
类型
字段名称
类型
订单ID(key)
自动编号
运货费
货币
客户ID
文本
货主名称
文本
雇员ID
数字
货主地址
文本
订购日期
日期/时间
货主城市
文本
到货日期
日期/时间
货主地区
文本
发货日期
日期/时间
货主邮政编码
文本
运货商
数字
货主国家
文本
表6-2表“订单明细”的结构
字段名称
类型
字段名称
类型
订单ID
自动编号
数量
数字
产品ID
数字
折扣
数字
单价
货币
表6-3表“产品”的结构
字段名称
类型
字段名称
类型
产品ID(key)
自动编号
单价
货币
产品名称
文本
库存量
数字
供应商ID
数字
订购量
数字
类别ID
数字
再订购量
数字
单位数量
文本
中止
是/否
表6-4表“客户”的结构
字段名称
类型
字段名称
类型
客户ID(key)
自动编号
地区
文本
公司名称
文本
邮政编码
文本
联系人姓名
文本
国家
文本
联系人头衔
文本
电话
文本
地址
文本
传真
文本
城市
文本
表6-5表“雇员”的结构
字段名称
类型
字段名称
类型
名字ID
自动编号
国家
文本
头衔
文本
邮政编码
文本
尊称
文本
家庭电话
文本
出生日期
日期/时间
分机
文本
雇用日期
日期/时间
照片
OLE对象
地址
文本
备注
备注
城市
文本
上级
文本
地区
文本
表6-6表“供应商”的结构
字段名称
类型
字段名称
类型
供应商ID(key)
自动编号
地区
文本
公司名称
文本
邮政编码
文本
联系人姓名
文本
国家
文本
联系人头衔
文本
电话
文本
地址
文本
传真
文本
城市
文本
主页
超级链接
表6-7表“运货商”的结构
字段名称
类型
字段名称
类型
运货商ID(key)
自动编号
电话
货币类型
公司名称
文本
表6-8表“类别”的结构
字段名称
类型
字段名称
类型
类别ID
自动编号
说明
备注
类别名称
文本
图片
OLE对象
在实例光盘的Database目录下,stocks.mdb文件是存放公司销售信息的Access数据库文件,读者可以查看这个文件,了解详细信息。
创建ODBCDemo2工程
ODBCDemo2工程是一个基于单文档的应用程序,创建应用程序工程时需要选择基于单文档的应用程序类型。
操作步骤:
(1)打开VC++的工程创建向导。
从VC++的菜单中执行“File>New”命令,将VC++6.0工程创建向导显示出来。
如果当前的选项标签不是Project,单击Project选项标签将它选中。
在左边的列表里选择MFCAppWizard(exe)项,在ProjectName编辑区里输入工程名称“ODBCDemo2”,并在Location编辑区里调整工程路径,如图6-2所示。
图6-2工程创建向导
(2)选择应用程序的框架类型。
单击“工程创建向导”窗口的OK按钮,进入“MFCAppWizard–Step1”对话框。
首先选择应用程序的框架类型。
如图6-3所示。
在本工程里,选择“Singledocument”,保持资源的语言类型为“中文”,单击“Next>”按钮。
图6-3选择应用程序的框架类型
(3)进入“MFCAppWizard–Step2of6”对话框,设置应用程序数据库特性。
在对话框里选择None,如图6-4所示。
(4)设置应用程序对复杂文档的支持。
在“MFCAppWizard–Step2of6”对话框里,单击“Next>”按钮,进入“MFCAppWizard–Step3of6”对话框。
在对话框里选择如下两项:
∙None
∙ActiveXControls
图6-4设置应用程序数据库特性
如图6-5所示,单击“Next>”按钮。
图6-5设置应用程序对复杂文档的支持
(5)进入“MFCAppWizard–Step4of6”对话框,设置应用程序的特征信息。
如图6-6所示对话框是工程的特征信息,在本例中,ODBCDemo2工程有如下特征:
∙Dockingtoolbar
∙Initialstatusbar
∙Printingandprintpreview
∙3Dcontrols
∙Normal
(6)在“MFCAppWizard–Step4of6”对话框里单击“Next>”按钮,进入“MFCAppWizard–Step5of6”对话框,选择工程风格和MFC类库的加载方式。
在对话框里设置如下三项:
∙MFCStandard
∙Yes,Please
∙AssharedDLL
如图6-7所示,单击“Next>”按钮,进入“MFCAppWizard–Step6of6”对话框。
图6-7设置应用程序特征信息
图6-8选择工程风格和MFC类库的加载方式
(7)“MFCAppWizard–Step6of6”对话框显示工程创建中的类信息。
ODBCDemo2工程包含了四个类:
∙CODBCDemo2View类,工程视图类
∙CODBCDemo2App类,工程的应用类
∙CMainFrame类,工程主框架类
∙CODBCDemo2Doc类,工程文档类
这四个类构成了应用程序工程的主要框架。
我们为CODBCDemo2View类选择ClistView基类,如图6-9所示。
图6-9显示工程创建中的类信息
(8)在对话框“MFCAppWizard–Step6of6”里单击Finish按钮,完成工程创建。
工程创建向导将该次工程创建的信息显示在一个“NewProjectInformation”对话框里,如图6-10所示。
在对话框里单击“OK”按钮,ODBCDemo2工程创建完成。
图6-10工程创建信息
建立数据源
建立数据源的方法在6.3.2节里已经进行了介绍,这里只说明本实例在建立数据源时的不同之处。
本实例用到的数据源名称是“ODBCDemo2”,其描述为“DatasourceforODBCMFCprogramming”,创建数据源时在“配置创建的新数据源”步骤里需要同ODBCDemo1数据源有所区别。
另外,数据源所支持的数据库为stocks.mdb文件,我们已经在6.3.2节里完成了它的设计。
设计应用程序界面
在6.3.2节里,我们利用工程创建向导创建了一个基于单文档界面的工程,本节应用程序界面的设计工作主要是菜单和按钮的添加。
为了为报表设置报表的内容和格式,我们还需要为应用程序设计一个报表向导,这个向导由三个步骤组成,因此我们需要设计三个对话框以实现这三个步骤的界面。
1.设计应用程序的主菜单
需要为应用程序设计的菜单包括:
销售报告菜单、产品信息菜单、客户信息菜单、雇员信息菜单、供应商信息菜单、运货商信息菜单、类别菜单以及报表操作菜单。
这些菜单的标识、标题以及提示信息如表6-9所示。
表6-9工程的菜单资源
标识
标题
提示信息
文件
ID_OPTION
选项
应用程序设置选项
ID_APP_EXIT
退出
退出应用程序;提示保存文档\n退出
销售报告
ID_SALE_PRODUCT
按产品
按照产品显示销售报告。
\n产品销售报告
ID_SALE_CUSTOMER
按客户
按照客户显示销售报告。
\n客户销售报告
ID_SALE_EMPLOYEE
按雇员
按照雇员显示销售报告。
\n雇员销售报告
产品
ID_VIEW_PRODUCT
产品信息
显示产品信息
客户
ID_VIEW_CUSTOMER
客户信息
显示客户信息
雇员
ID_EXPLOYEE
雇员信息
显示雇员信息
运货商
ID_VIEW_TRANSPORTOR
运货商信息
显示运货商信息
供应商
ID_VIEW_PROVIDER
供应商信息
显示供应商信息
报表
ID_REPORT_SETUP
设置
设置报表标题、字段内容、注脚等内容的字体。
\n报表设置
ID_FILE_PRINT_PREVIEW
打印预览
显示整页\n打印预览
ID_FILE_PRINT_SETUP
打印设置
改变打印机及打印选项\n打印设置
ID_FILE_PRINT
打印
打印活动文档\n打印
2.设计应用程序的按钮
需要为应用程序设计的按钮主要是销售报告的三种显示方式。
这三个按钮的标识、图标以及提示信息如表6-10所示。
表6-10工程的按钮资源
标识
图标
提示信息
ID_SALE_PRODUCT
按照产品显示销售报告。
\n产品销售报告
ID_SALE_EMPLOYEE
按照雇员显示销售报告。
\n雇员销售报告
ID_SALE_CUSTOMER
按照客户显示销售报告。
\n客户销售报告
3.设计应用程序的报表向导
需要设计三个对话框:
IDD_WZDFIELD,IDD_WZDFORMAT和IDD_WZDPREVIEW。
这三个对话框分别代表了报表向导的三个步骤:
报表字段选择、格式设置以及设置信息浏览三个步骤。
(1)设计IDD_WZDFIELD对话框。
使用VC++的“Insert>Resource”菜单命令可以将Dialog(对话框)资源加入到工程里。
IDD_WZDFIELD对话框供用户选择报表字段,它的标题是“选择报表字段信息”,字段选择对话框的其它资源如表6-11所示。
表6-11IDD_WZDFIELD对话框的资源
资源类型
资源ID
标题
功能
编辑框
IDC_MAINTITLE
报表的大标题
编辑框
IDC_FOOTER
报表的脚注
编辑框
IDC_FIELDTITLE
报表的字段标题
列表框
IDC_LISTPRE
候选的报表字段列表
列表框
IDC_LISTSEL
选用的报表字段列表
组合框
IDC_CBPNFORMAT
页码类型组合框
复选框
IDC_CHKPAGENUM
使用页码
表示是否使用页码
标签
IDC_STATIC
报表标题:
报表标题标签
标签
IDC_STATIC
供选择报表字段:
候选报表字段列表标题
标签
IDC_STATIC
选用的报表字段:
选用报表字段列表标题
标签
IDC_STATIC
字段标题:
字段标题标签
标签
IDC_STATIC
注脚文本:
注脚文本标签
标签
IDC_STATIC
页码格式:
页码格式标签
按钮
IDC_SELECT
>
选用候选字段按钮
按钮
IDC_DESELECT
<
删除选用字段按钮
按钮
IDC_SELECTALL
>|
全部选中候选字段按钮
按钮
IDC_DESELECTALL
|<
全部删除选用字段按钮
设计完成后,字段选择对话框如图6-11所示。
图6-11设计完成后的字段选择对话框
(2)设计IDD_WZDFORMAT对话框。
使用VC++的“Insert>Resource”菜单命令可以将Dialog(对话框)资源加入到工程里。
IDD_WZDFORMAT对话框供用户选择报表格式,它的标题是“设置报表格式”。
报表格式设置对话框的其它资源如表6-12所示。
表6-12IDD_WZDFORMAT对话框的资源
资源类型
资源ID
标题
功能
组合框
IDC_CBTITLEFONT
提供标题字体选择
组合框
IDC_CBHEADFONT
提供字段标题字体选择
组合框
IDC_CBNORMALFONT
提供正文字体选择
组合框
IDC_CBFOOTERFONT
提供注脚字体选择
组合框
IDC_CBTITLESIZE
提供标题字体大小选择
组合框
IDC_CBHEADSIZE
提供字段标题字体大小选择
组合框
IDC_CBNORMALSIZE
提供正文字体大小选择
组合框
IDC_CBFOOTERSIZE
提供注脚字体大小选择
静态控件
IDC_PREVIEWAREA
设置效果预览区域
标签
IDC_STATIC
字体名称:
字体标签
标签
IDC_STATIC
字体大小:
字体大小标签
标签
IDC_STATIC
标题(&T):
标题标签
标签
IDC_STATIC
列头(&M):
列头标签
标签
IDC_STATIC
正文(&M):
正文标签
标签
IDC_STATIC
注脚(&F):
注脚标签
标签
IDC_STATIC
预览:
预览区域标签
设计完成后,报表格式设置对话框如图6-12所示。
图6-12设计完成后的设置报表格式对话框
(3)设计IDD_WZDPREVIEW对话框。
使用VC++的“Insert>Resource”菜单命令可以将Dialog(对话框)资源加入到工程里。
IDD_WZDPREVIEW对话框供用户选择报表信息的显示与确认,它的标题是“报表预览”。
设置信息浏览对话框的其它资源如表6-13所示。
6-13IDD_WZDPREVIEW对话框的资源
资源类型
资源ID
标题
功能
标签
IDC_REPORTINFO
Info
信息显示区域
静态控件
IDC_STATIC
信息
标签
设计完成后,设置信息浏览对话框如图6-13所示。
图6-13设计完成后的“报表预览”对话框
编写工程代码
1.创建CCommonRs类
CCommonRs类由CRecordset类派生而来。
创建CCommonRs类的操作步骤:
(1)执行菜单命令“Insert>NewClass…”,VC++弹出“NewClass”对话框,如图6-14所示。
图6-14NewClass对话框
(2)在“NewClass”对话框里保持ClassType项为MFCClass,在Name编辑框里输入“CCommonRs”,然后在Baseclass下拉列表框里选择派生的父类CRecordset,如图6-15所示。
图6-15设置派生的类名称与父类
(3)在“NewClass”对话框里单击OK按钮,VC++弹出DatabaseOptions对话框,在这里,为CCommonRs设置缺省的数据源。
选择ODBC数据源为刚刚创建的ODBCDemo2,保持其它设置,如图6-16所示。
图6-16DatabaseOptions对话框
(4)在DatabaseOptions对话框里按下OK按钮,VC++弹出SelectDatabaseTables对话框,为CCommonRs设置缺省的表,如图6-17所示。
(5)这里的表并不表示对类CCommonRs的操作只能在这个表上进行,这只是一个缺省的设置,因此可以任意选择一个表,注意,如果不选择任何表,单击OK按钮时操作是不能进行下去的。
选择任一个表,单击OK按钮,完成类CCommonRs的创建。
图6-17SelectDatabaseTables对话框
2.创建全局变量
整个应用程序是通过一个CCommonRs对象对数据库进行操作的,这个对象不仅应用在视图类里,还被报表向导引用,以获取结果集的字段信息。
因此有必要将这个CCommonRs对象声明为全局对象。
我们在ODBCDemo2View.cpp文件的头部对CCommonRs对象声明如下:
#include"CommonRs.h"
CCommonRs*m_pCommonRS;
第一条语句将类CCommonRs的声明包括到ODBCDemo2View.cpp文件里,第二条语句声明CCommonRs对象的引用指针。
3.在CODBCDemo2View类里声明报表信息变量
为了将报表设置信息保存起来,下面为CODBCDemo2View类声明如下的报表信息变量:
public:
//报表信息设置变量
//标题和注脚
CStringm_strReportTitle;
CStringm_strReportFooter;
BOOLm_fHavePage;
UINTm_uPageType;
//报表字段
CStringArraym_saSelectedFields;
CStringArraym_saSelectedFieldsTitle;
//报表格式
//报表字体
CStringm_strFontTitle;
CStringm_strFontContentHead;
CStringm_strFontContent;
CStringm_strFontFooter;
//字体大小
UINTm_uSizeTitle;
UINTm_uSizeContentHead;
UINTm_uSizeContent;
UINTm_uSizeFooter;
当报表向导完成了报表信息设置后,这些信息将保存到上述变量里。
4.编写CODBCDemo2View类的消息响应函数
对所有菜单命令,应用程序都将在CODBCDemo2View类里响应。
前面,我们已经介绍了使用VC++的ClassWizard工具添加菜单命令响应函数的方法,这里只介绍如何为这些响应函数编写操作代码。
(1)编写“销售报告>按产品”菜单命令响应函数OnSaleProduct()。
OnSaleProduct()函数将销售报告按照产品进行统计,并将结果显示到视图里,它的代码如下:
CListCtrl&ctrlList=(CListCtrl&)GetListCtrl();
ctrlList.DeleteAllItems();
while(ctrlList.DeleteColumn(0));
UpdateWindow();
CStringstrSQL;
strSQL=_T("SELECT*FROMSalesByProduct;");
if(!
ShowInformation(strSQL))AfxMessageBox("数据获取失败!
");
m_uStatus=TABLE_SPRODUCTS;
SQL语句“SELECT*FROMSalesByProduct”从数据库视图SalesByProduct里将所有数据检索出来,SalesByProduct视图是数据库设计阶段创建的一个数据库视图,它的意义就在于将销售报告(订单)按照产品进行统计。
函数ShowInformation()将strSQL里的SQL语句检索结果显示到视图里。
(2)编写“销售报告>按客户”菜单命令响应函数OnSaleCustomer()。
OnSaleProduct()函数将销售报告按照客户进行统计,并将结果显示到视图里,它的代码如下:
CListCtrl&ctrlList=(CListCtrl&)GetListCtrl();
ctrlList.DeleteAllItems();
while(ctrlList.DeleteColumn(0));
UpdateWindow();
CStringstrSQL(_T("select*fromSalesByCustomer"));
if(!
ShowInformation(strSQL))AfxMessageBox("数据获取失败!
");
m_uStatus=TABLE_SCUSTOMERS;
该函数操作方法同OnSaleProduct()函数类似,不同的是,它从SalesByCustomer数据库视图里检索数据。
SalesByCustomer数据库视图能够将销售报告(订单)按照客户进行统计。
(3)编写“销售报告>按雇员”菜单命令响应函数OnSaleEmployee()。
OnSaleEmployee()函数将销售报告按照雇员进行统计,并将结果显示到视图里,它的代码如下:
CListCtrl&ctrlList=(CListCtrl&)GetListCtrl();
ctrlList.DeleteAllItems();
while(ctrlList.DeleteColumn(0));
UpdateWindow();
CStringstrSQL(_T("select*fromSalesByEmployee"));
if(!
ShowInformation(strSQL))AfxMessageBox("数据获取失败!
");
m_uStatus=TABLE_SIMPLOYEES;