一、案例预览
运行该系统,主界面如图一所示,有“开销售单”、“开进货单”、“查看单据”等业务,下面按业务依次说明最后实现的程序界面和操作方法。
图一
(1)开销售单。单击程序主界面的【开销售单】按钮,弹出“销售单据”对话框,如图二所示。填完单据的各项内容后,单击【保持】按钮。如果程序提示保存成功,会返回主界面,单据列表中又增加了一张销售单据。
图二
(2)开进货单。单击程序主界面的【开进货单】按钮,弹出“进货单据”对话框,如图三所示。开单操作和销售单类似。
图三
(3)查看单据。在主界面中,选择要查看的单据,然后单击【查看单据】按钮,弹出对应的单据,如图四所示。此时单据不能被编辑,查看完后单击【关闭】按钮退出查看操作。
图四
二分析与创建数据库
本例采用Access 2002作为数据库,使用ADO方式访问数据库。 首先创建一个数据库,命名为“”,并且将该数据库文件放在本实例应用程序的根目录中,便于访问。
从前面的分析知道。本例需要两个数据表bill和goods。表bill用来保持单据,包括进货单据和销售单据,单据类型用一个数字类型的字段type来区分,0表示进货单,1表示销售单。表goods用来保持单据中填写的流通商品,通过字段billid来对应某张单据,字段index表示在该单据中的表格位置。表结构如图五和图六所示。
图五(bill表)
字段名称 数据类型 说明 id 文本 单据编号 type 数字 单据类型(0=进货单,1=销售单) time 日期/时间 制单日期 storage 文本 交易时使用的仓库 client 文本 交易的客户名称 operator 文本 经手人 account 文本 交易时使用的银行帐户 comment 文本 单据的附加说明 图六(goods表)
字段名称 数据类型 说明 name 文本 商品名称 unit 文本 商品的度量单位 account 数字 商品数量 price 数字 商品单价 comment 文本 商品说明 billid 文本 所在单据的编号 index 数字 所处单据表格的位置索引 三创建VC工程
创建给予对话框的应用程序,从第二步到第六步全部采用默认方式。
四引入控件
1、表格(Grid)控件
在用VC开发关于数据库的项目时,通常使用DataGrid作为数据库表格控件。本例中介绍另外一个共享表格控件CGridCtrl,非常好用,也很美观,进货单据和销售单据显示商品时使用的就是CGridCtrl控件。
CGridCtrl和一般的GRID的不同之处在于,一般的GRID并不适合显示大的数据量,如果一个查询结果有上万条记录的话,如果都要插入到GRID中,这将是个很慢的过程,并且
在GRID中移动滚动条的话,它的记录的滚动也是很慢的。而CGridCtrl并不会真正把这些记录的数据全部插入到控件中,当CGridCtrl的滚动条滚动时,它会根据CGridCtrl的显示面积的大小和查询得到的总的记录数计算当前应该显示哪些行,然后会把那几行的记录数据插入到表格中,这样速度当然是很快的,而且没有数据量多少的限制。
将表格控件CGridCtrl引入本例工程中需要如下步骤。
(1)将光盘中的相关文件拷贝到创建的工程目录下,它们位于本例工程的gridctrl_src目录中。
(2)选择菜单【Project】->【Add To Project】->【Files】,打开“Insert Files into Project”对话框。选中gridctrl_src目录下的所有文件,单击【OK】按钮,将表格控件CGridCtrlDE 所有相关文件都加入到工程中。
引入表格控件完成后,可以看到新增了数个与该控件相关的类。为了使工作区整洁,增加一个文件夹“grid”,将这些新增的文件拖入其中。如下图所示:
2、位图按钮
VC提供的默认按钮形态比较单调,这里介绍一个共享按钮控件CTrackLookButton。该按钮将图标和文字一起显示,并且呈flat形式。将控件CTrackLookButton引入本例工程中需要如下步骤。
(1)将光盘中的文件和拷贝到创建的工程目录中。 (2)选择菜单【Project】->【Add To Project】->【Files】,打开“Insert Files into Project”对话框,将文件和加入工程中。
五使用ADO连接数据库
(1)VC中通过在程序中使用预编译指令#import来告诉编译器将此指令中指定的动态链接库引入工程中。在应用程序的文件中加入如下语句:
#import \"c:\\program files\\common files\\system\\ado\\\" no_namespace rename(\"EOF\
(2)在应用程序类CBillsManagerAPP的头文件中分别声明一个_ConnectionPtr和_RecordsetPtr类型的指针,访问类型为public。其代码如下: public:
_ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset;
(3)在CBillsManagerApp::InitInstance()成员函数里,初始化OLE/COM库环境,创建连接对象,打开与数据源的连接,以及创建记录集对象。其代码如下:
BOOL CBillsManagerApp::InitInstance() {
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls(); return FALSE; }
(4)通过ClassWizard为类CBillsManagerApp增加ExitInstance() 成员函数,该函数在退出系统时被调用。在其中关闭数据库连接,并且还原OLE/COM库环境。其代码如下: int CBillsManagerApp::ExitInstance()
{
m_pConnection->Close();
etBuffer(0)) *
atof(nRow,m_nPriceCol).GetBuffer(0)); (\"%f\
(nRow,m_nMoneyCol,str);
.\" menu item to system menu.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) {
CString strAboutMenu; (IDS_ABOUTBOX); if (!()) {
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
The framework does this automatically
// when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here //设置按钮风格
(IDB_BUY_ADD,IDB_BUY_ADD,IDB_BUY_ADD); (CTrackLookButton::AlignRight);
(IDB_SALE_ADD,IDB_SALE_ADD,IDB_SALE_ADD); (CTrackLookButton::AlignRight);
(IDB_SHOW_BILL,IDB_SHOW_BILL,IDB_SHOW_BILL); (CTrackLookButton::AlignRight); (IDB_EXIT,IDB_EXIT,IDB_EXIT); (CTrackLookButton::AlignRight);
//设置ListCtr列表框风格 SetLstCtrlStyle(); AddLstCtrlHeader();
//罗列单据
ListBills();
return TRUE; // return TRUE unless you set the focus to a control }
(三)开销售单据
(1)在文件的开始处包含单据对话框CBillDlg的头文件,其代码如下:
#include \"\"
(2)双击主对话框中的【开销售单】按钮,增加其响应函数OnSaleAdd()。在该函数中设置类CBillDlg的变量m_nBillType为1(表示销售单),然后显示该单据对话框,增加完销售单后调用函数ListBills()刷新单据列表。其实现代码如下: void CBillsManagerDlg::OnSaleAdd() {
CBillDlg dlg; = 1; ();
ListBills(); }
(四)开进货单据
双击主对话框中的【开进货单】按钮,增加其响应函数OnBuyAdd()。在该函数中设置类CBillDlg的变量m_nBillType为0(表示进货单),然后显示该单据对话框,增加完进货单据后调用函数ListBills()刷新单据列表。其实现代码如下: void CBillsManagerDlg::OnBuyAdd() {
CBillDlg dlg; = 0; ();
ListBills(); }
(五)查看单据
双击主对话框中的【查看单据】按钮,增加其响应函数OnBillShow()。调用该函数时至少要在列表中选择一条单据,否则会提示用户。该函数先获得所选单据的单据类型,并且据此设置类CBillDlg的变量m_nBillType,然后获得单据的编号,并据此设置类CBillDlg的变量m_strBillID,最后显示单据对话框,查看所选单据。其实现代码如下: //查看单据
void CBillsManagerDlg::OnBillShow() {
POSITION pos = (); if(pos) {
int nFirstSelItem = (pos); CBillDlg dlg; = TRUE;
//判断单据类型
CString strBillType = (nFirstSelItem,1); if( strBillType== \"进货单\" ) = 0;
else if( strBillType== \"销售单\" ) = 1; else {
AfxMessageBox(\"未知单据类型,不能查看\"); return; }
//设置单据号
= (nFirstSelItem,0); (); } else {
AfxMessageBox(\"请选择一张单据!\"); return; } }
(六)退出程序
双击主对话框的【退出程序】按钮,增加其响应函数OnExitWindow()。其实现代码如下:
//退出程序
void CBillsManagerDlg::OnExitWindow() {
CDialog::OnCancel(); }
至此,本例的所有功能都实现了。
因篇幅问题不能全部显示,请点此查看更多更全内容