物流单据管理系统_第1页
物流单据管理系统_第2页
物流单据管理系统_第3页
物流单据管理系统_第4页
物流单据管理系统_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、物流单据管理系统1、 案例预览运行该系统,主界面如图一所示,有“开销售单”、“开进货单”、“查看单据”等业务,下面按业务依次说明最后实现的程序界面和操作方法。图一(1) 开销售单。单击程序主界面的【开销售单】按钮,弹出“销售单据”对话框,如图二所示。填完单据的各项内容后,单击【保持】按钮。如果程序提示保存成功,会返回主界面,单据列表中又增加了一张销售单据。图二(2) 开进货单。单击程序主界面的【开进货单】按钮,弹出“进货单据”对话框,如图三所示。开单操作和销售单类似。图三(3) 查看单据。在主界面中,选择要查看的单据,然后单击【查看单据】按钮,弹出对应的单据,如图四所示。此时单据不能被编辑,查

2、看完后单击【关闭】按钮退出查看操作。图四二分析与创建数据库本例采用Access 2002作为数据库,使用ADO方式访问数据库。首先创建一个数据库,命名为“bills.mdb”,并且将该数据库文件放在本实例应用程序的根目录中,便于访问。从前面的分析知道。本例需要两个数据表bill和goods。表bill用来保持单据,包括进货单据和销售单据,单据类型用一个数字类型的字段type来区分,0表示进货单,1表示销售单。表goods用来保持单据中填写的流通商品,通过字段billid来对应某张单据,字段index表示在该单据中的表格位置。表结构如图五和图六所示。 id 文本 单据编号 type 数字 单据类

3、型(0=进货单,1=销售单) time 日期/时间 制单日期 storage 文本 交易时使用的仓库 client 文本 交易的客户名称 operator 文本 经手人 account 文本 交易时使用的银行帐户 comment 文本 单据的附加说明 字段名称 数据类型 说明图五(bill表)图六(goods表) 字段名称 数据类型 说明 name 文本 商品名称 unit 文本 商品的度量单位 account 数字 商品数量 price 数字 商品单价 comment 文本 商品说明 billid 文本 所在单据的编号 index 数字 所处单据表格的位置索引 三创建VC工程 创建给予对话框

4、的应用程序,从第二步到第六步全部采用默认方式。四引入控件 1、表格(Grid)控件在用VC开发关于数据库的项目时,通常使用DataGrid作为数据库表格控件。本例中介绍另外一个共享表格控件CGridCtrl,非常好用,也很美观,进货单据和销售单据显示商品时使用的就是CGridCtrl控件。CGridCtrl和一般的GRID的不同之处在于,一般的GRID并不适合显示大的数据量,如果一个查询结果有上万条记录的话,如果都要插入到GRID中,这将是个很慢的过程,并且在GRID中移动滚动条的话,它的记录的滚动也是很慢的。而CGridCtrl并不会真正把这些记录的数据全部插入到控件中,当CGridCtrl

5、的滚动条滚动时,它会根据CGridCtrl的显示面积的大小和查询得到的总的记录数计算当前应该显示哪些行,然后会把那几行的记录数据插入到表格中,这样速度当然是很快的,而且没有数据量多少的限制。将表格控件CGridCtrl引入本例工程中需要如下步骤。(1) 将光盘中的相关文件拷贝到创建的工程目录下,它们位于本例工程的gridctrl_src目录中。(2) 选择菜单【Project】-【Add To Project】-【Files】,打开“Insert Files into Project”对话框。选中gridctrl_src目录下的所有文件,单击【OK】按钮,将表格控件CGridCtrlDE 所有

6、相关文件都加入到工程中。引入表格控件完成后,可以看到新增了数个与该控件相关的类。为了使工作区整洁,增加一个文件夹“grid”,将这些新增的文件拖入其中。如下图所示: 2、位图按钮VC提供的默认按钮形态比较单调,这里介绍一个共享按钮控件CTrackLookButton。该按钮将图标和文字一起显示,并且呈flat形式。将控件CTrackLookButton引入本例工程中需要如下步骤。(1) 将光盘中的文件TrackLookButton.h和TrackLookButton.cpp拷贝到创建的工程目录中。(2) 选择菜单【Project】-【Add To Project】-【Files】,打开“Ins

7、ert Files into Project”对话框,将文件TrackLookButton.h和TrackLookButton.cpp加入工程中。五使用ADO连接数据库 (1)VC中通过在程序中使用预编译指令#import来告诉编译器将此指令中指定的动态链接库引入工程中。在应用程序的文件stdafx.h中加入如下语句:#import c:program filescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF)(2) 在应用程序类CBillsManagerAPP的头文件中分别声明一个_ConnectionPtr和_

8、RecordsetPtr类型的指针,访问类型为public。其代码如下: public: _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; (3)在CBillsManagerApp:InitInstance()成员函数里,初始化OLE/COM库环境,创建连接对象,打开与数据源的连接,以及创建记录集对象。其代码如下:BOOL CBillsManagerApp:InitInstance()AfxEnableControlContainer();/ Standard initialization/ If you are not usi

9、ng these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();/ Call this when using MFC in a shared DLL#elseEnable3dControlsStatic();/ Call this when linking to MFC

10、 statically#endif/初始化com环境:CoInitialize(NULL);/创建连接对象和记录集对象HRESULT hr;tryhr = m_pConnection.CreateInstance(ADODB.Connection);/创建Connection对 象 if(SUCCEEDED(hr)hr = m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=bills.mdb,adModeUnknown);/连接数据库/上面一句中连接字串中的Provider是针对ACCESS2000环境的,/对于AC

11、CESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51catch(_com_error e)/捕捉异常CString errormessage;errormessage.Format(连接数据库失败!rn错误信息:%s,e.ErrorMessage();AfxMessageBox(errormessage);/显示错误信息m_pRecordset.CreateInstance(_uuidof(Recordset);CBillsManagerDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (

12、nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the ap

13、plications message pump.return FALSE;(4) 通过ClassWizard为类CBillsManagerApp增加ExitInstance() 成员函数,该函数在退出系统时被调用。在其中关闭数据库连接,并且还原OLE/COM库环境。其代码如下: int CBillsManagerApp:ExitInstance() m_pConnection-Close();/还原com环境:CoUninitialize();return CWinApp:ExitInstance();六实现单据对话框功能该对话框用来开销售单、开进货单、查看单据。(1) 制作对话框 (1)为对

14、话框添加控件,最后效果如下:其中2个按钮都还只是普通按钮,但我们要重画它们,所以设置它们的“Owner draw”属性。灰色部分是Custom Control控件。就是控件工具栏中的人头控件。其具体设置如下所示:这里MFCGridCtrl是前面加入工程的表格控件CGridCtrl的窗口类,在GridCtrl.h中有定义。 (2)为单据对话框新建一个对话框类,命名为CBillDlg。 (3)为CBillDlg类作变量关联。相关的变量设置如下:上面的有些错误,其中保存和退出按钮的关联变量m_btSave和m_btExit都是CButton型的,而不是CTrackLookButton型。(2) 定义

15、成员变量 (1)为了使用前面引入的图标按钮CTrackLookButton和表格控件CGridCtrl,在BillDlg.h中的类CBillDlg定义前加入如下头文件,代码如下:#include GridCtrl_src/GridCtrl.h#include TrackLookButton.h(2) 在BillDlg.h中更改已经定义的变量m_btSave和m_btExit的类型,由原来的CButton型变为CTrackLookButton型: CTrackLookButtonm_btExit; CTrackLookButtonm_btSave;(3)在BillDlg.h中定义CGridCtr

16、l类型的变量m_Grid,然后在void CBillDlg:DoDataExchange(CDataExchange* pDX)中使其与对话框资源中的ID为IDC_GRID的Custom Control控件关联,代码分别如下:void CBillDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CBillDlg)/AFX_DATA_MAPDDX_GridControl(pDX, IDC_GRID, m_Grid);(4) 在BillDlg.h中定义表示表格控件m_Grid的行数、列数、

17、固定行数和固定列数,便用在程序中用代码灵活控制这些参数,定义如下: protected: int m_nRows,m_nCols,m_nFixRows,m_nFixCols; (5)在BillDlg.h中定义表格控件中商品名称、计量单位、数量、单价、金额和备注等所处的列,基数为0:/定义商品信息处于grid中的位置int m_nNameCol,m_nUnitCol,m_nAmountCol,m_nPriceCol,m_nMoneyCol,m_nCommentCol; (6)由于对话框CBillDlg既用来开销售单,又用来开进货单,因此为了区分开它们,在BillDlg.h中定义表示单据类型的变量

18、m_nBillType,并且是public类型的:int m_nBillType;/0表示进货单,1表示销售单 (7)由于对话框类CBillDlg既用来开单据,又用来查看单据,而且查看单据时编辑框和网格控件都是不能操作的。为了区分开来,在BillDlg.h中定义表示状态的变量m_bShowBill,并且是public类型的:BOOL m_bShowBill;/TRUE表示查看单据,FALSE表示是开进货单或者销售单(8) 在构造函数CBillDlg(CWnd* pParent)中初始化前面定义的所有变量,其代码如下:CBillDlg:CBillDlg(CWnd* pParent /*=NULL

19、*/): CDialog(CBillDlg:IDD, pParent)/AFX_DATA_INIT(CBillDlg)m_strAccount = _T();m_strBillID = _T();m_strClient = _T();m_strComment = _T();m_strStorage = _T();m_tTime = CTime:GetCurrentTime();m_strOperator = _T();/AFX_DATA_INITm_nRows = 16;m_nCols = 6;m_nFixRows = 1;m_nFixCols = 0;m_nNameCol = 0;m_nUn

20、itCol = 1;m_nAmountCol = 2;m_nPriceCol = 3;m_nMoneyCol = 4;m_nCommentCol = 5;m_nBillType = 1;/销售单m_bShowBill = FALSE;(3) 在BOOL CBillDlg:OnInitDialog() 函数中初始化对话框 通过ClassWizard引入对话框的OnInitDialog()函数,在该函数中加入一些初始化的代码,包括:根据单据类型设置窗口标题,设置图标按钮的风格,初始化表格控件的风格,设置表格控件的行数、列数、固定行数、固定列数等参数,设置列表控件的表头和列宽,如果是查看单据的话还显

21、示要查看的单据。其完整的代码如下:BOOL CBillDlg:OnInitDialog() CDialog:OnInitDialog();/根据单据类型,设置对话框的标题if(m_nBillType = 0)SetWindowText(进货单据);elseSetWindowText(销售单据);/设置按钮风格m_btSave.LoadBitmaps(IDB_SAVE,IDB_SAVE,IDB_SAVE);m_btSave.SetTextAlignment(CTrackLookButton:AlignRight);m_btExit.LoadBitmaps(IDB_EXIT,IDB_EXIT,ID

22、B_EXIT);m_btExit.SetTextAlignment(CTrackLookButton:AlignRight);/初始化grid并设置其风格m_Grid.EnableDragAndDrop(TRUE);m_Grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0);/设置grid的行数、列数、固定行数、固定列数m_Grid.SetRowCount(m_nRows);m_Grid.SetColumnCount(m_nCols);m_Grid.SetFixedRowCount(m_nFixRows);m_Grid.SetFixedColumnCount(m_n

23、FixCols);char gridHeader610 = 商品名称,单位,数量,单价,金额,备注;/填充表格的表头,并且设置列宽for (int col = 0; col EnableWindow(FALSE);pWnd = GetDlgItem(IDC_BILL_ID);pWnd-EnableWindow(FALSE);pWnd = GetDlgItem(IDC_COMMENT);pWnd-EnableWindow(FALSE);pWnd = GetDlgItem(IDC_CLIENT);pWnd-EnableWindow(FALSE);pWnd = GetDlgItem(IDC_ACCO

24、UNT);pWnd-EnableWindow(FALSE);pWnd = GetDlgItem(IDC_STORAGE);pWnd-EnableWindow(FALSE);pWnd = GetDlgItem(IDC_OPERATOR);pWnd-EnableWindow(FALSE);/将“Save”按钮隐藏,并且将“退出”按钮的Caption变为“关闭”pWnd = GetDlgItem(IDC_SAVE);pWnd-ShowWindow(FALSE);pWnd = GetDlgItem(IDC_EXIT);pWnd-SetWindowText(关闭);/让商品名称,编号等列不能编辑for

25、(int row = m_Grid.GetFixedRowCount(); row m_Grid.GetRowCount(); row+)for (int col = m_Grid.GetFixedColumnCount(); col m_pRecordset-Open(strSql.AllocSysString(),pApp-m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);if(!SUCCEEDED(hr)AfxMessageBox(打开bill表出错);return;if(pApp-m_pR

26、ecordset-adoEOF)AfxMessageBox(错误的单据编号);pApp-m_pRecordset-Close();return;m_strBillID = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(id);str = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(time);GetTimeFromStr(str,m_tTime);m_strClient = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect

27、(_variant_t(client);m_strAccount = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(account);m_strStorage = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(storage);m_strOperator = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(operator);m_strComment = (char*)(_bstr_t)pApp-m_

28、pRecordset-GetCollect(_variant_t(comment);pApp-m_pRecordset-Close();/填充表格内的数据strSql.Format(select * from goods where billid = %s,m_strBillID);hr = pApp-m_pRecordset-Open(strSql.AllocSysString(),pApp-m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);if(!SUCCEEDED(hr)AfxMessage

29、Box(打开goods表出错);return;while(!pApp-m_pRecordset-adoEOF)/该商品条目在表格中的位置str = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(index);int nRow = atoi(str.GetBuffer(0);/商品名称str = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(name);m_Grid.SetItemText(nRow,m_nNameCol,str);/计量单位str = (char*

30、)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(unit);m_Grid.SetItemText(nRow,m_nUnitCol,str);/数量str = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(amount);m_Grid.SetItemText(nRow,m_nAmountCol,str);/单价str = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(price);m_Grid.SetItemTex

31、t(nRow,m_nPriceCol,str);/金额double fMoney = atoi(m_Grid.GetItemText(nRow,m_nAmountCol).GetBuffer(0) * atof(m_Grid.GetItemText(nRow,m_nPriceCol).GetBuffer(0);str.Format(%f,fMoney);m_Grid.SetItemText(nRow,m_nMoneyCol,str);/备注str = (char*)(_bstr_t)pApp-m_pRecordset-GetCollect(_variant_t(comment);m_Grid.

32、SetItemText(nRow,m_nCommentCol,str);pApp-m_pRecordset-MoveNext();pApp-m_pRecordset-Close();/更新对话框的显示UpdateData(FALSE);由于从数据库中获得的“录单日期”是一个字符串,需要将它转换为一个CTime类型的变量,才能将它赋给m_tTime。于是给类CBillDlg增加一个Protected类型的函数GetTimeFromStr,该函数在上面的ShowBill()函数中被调用,它将一个CString类型的变量转换为CTime类型的变量,其实现代码如下:void CBillDlg:GetT

33、imeFromStr(CString strTm, CTime &tm)int nPos = strTm.Find(-);CString strYear = strTm.Left(nPos);CString strRight = strTm.Right(strTm.GetLength()-nPos-1);nPos = strRight.Find(-);CString strMonth = strRight.Left(nPos);CString strDay = strRight.Right(strRight.GetLength()-nPos-1);int nYear,nMonth,nDay;n

34、Year = atoi(strYear.GetBuffer(0);if(nYear iRow iColumn = m_nAmountCol | pItem-iColumn = m_nPriceCol)CString strAmount = m_Grid.GetItemText(pItem-iRow,m_nAmountCol);CString strPrice = m_Grid.GetItemText(pItem-iRow,m_nPriceCol);int nAmount = 0;double fPrice = 0;if(strAmount != )nAmount = atoi(strAmoun

35、t.GetBuffer(0);if(strPrice != )fPrice = atof(strPrice.GetBuffer(0);double fMoney = fPrice * (double)nAmount;/金额if(fMoney != 0)CString strMoney;strMoney.Format(%f,fMoney);m_Grid.SetItemText(pItem-iRow,m_nMoneyCol,strMoney);/检查数量值的合理性,并重新赋值if(nAmount 0)strAmount.Format(%d,nAmount);m_Grid.SetItemText(p

36、Item-iRow,m_nAmountCol,strAmount);elsem_Grid.SetItemText(pItem-iRow,m_nAmountCol,);/检查单价值的合理性,并重新赋值if(fPrice 0)strPrice.Format(%f,fPrice);m_Grid.SetItemText(pItem-iRow,m_nPriceCol,strPrice);elsem_Grid.SetItemText(pItem-iRow,m_nPriceCol,);m_Grid.Refresh(); (5) 保存单据功能 1、保存单据前,判断单据数据的合理性 包括:保证表格外的信息完整,

37、如单据号、客户等一个都不能漏,只有附加说明可以不用填写;保证表格中每一行的数据都必须完整,除了备注以外的其他各项都必须填写。为了实现该功能,给CBillDlg类增加一个Protected类型的函数BOOL CBillDlg:JudgeInputReasonable(BOOL *RowReasonable)。其中参数RowReasonable是一个BOOL类型数组的地址指针,数组大小为表格的行数。该数组的元素与单据各表格行一一对应,用元素的取值标记单据表格行中是否有合法数据,便于在保存数据信息时只考虑这些标记了有合法数据的表格行。BOOL CBillDlg:JudgeInputReasonabl

38、e(BOOL *RowReasonable)/保证表格外的信息完整if(m_strBillID = )AfxMessageBox(请填写单据编号);return FALSE;if(m_strClient = )AfxMessageBox(请填写客户);return FALSE;if(m_strAccount = )AfxMessageBox(请填写帐户);return FALSE;if(m_strStorage = )AfxMessageBox(请填写仓库);return FALSE;if(m_strOperator = )AfxMessageBox(请填写经手人);return FALSE;

39、/让每一行的数据都合理BOOL bReasonable = FALSE;for (int row = m_Grid.GetFixedRowCount(); row m_Grid.GetRowCount(); row+)int nUnEmptyCount = 0;/该行输入信息的列数,其中comment不算for (int col = m_Grid.GetFixedColumnCount(); col 0 & nUnEmptyCount m_pRecordset-Open(strSql.AllocSysString(),pApp-m_pConnection.GetInterfacePtr(),a

40、dOpenDynamic,adLockOptimistic,adCmdText);if(!SUCCEEDED(hr)AfxMessageBox(打开bill表出错);return FALSE;if(!pApp-m_pRecordset-adoEOF)AfxMessageBox(已经存在该单据编号的记录);CEdit* pEdit = (CEdit*)GetDlgItem(IDC_BILL_ID);pEdit-SetFocus();pEdit-SetSel(0,m_strBillID.GetLength();pApp-m_pRecordset-Close();return FALSE;pApp-

41、m_pRecordset-Close();/新增一条记录strSql = SELECT * FROM bill;hr = pApp-m_pRecordset-Open(strSql.AllocSysString(),pApp-m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);if(!SUCCEEDED(hr)AfxMessageBox(打开bill表出错);return FALSE;CString str;pApp-m_pRecordset-AddNew();pApp-m_pRecordset-PutCollect(id,_variant_t(m_strBillID);str.Format(%d,m_nBillType);pApp-m_pRecordset-PutCollect(type,_variant_t(str);str = m_tTime.Format(%Y-%m-%d);pApp-m_pRecordset-PutCollect(time,_variant_t(str);p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论