1、本实例根据上面的设计规划出的实体有库存实体、入库实体、出库实体、采购实体、还库实体和需XX体,各实体的E-R图及其关系描述如下:图1-3 库存实体E-R图图1-4 入库实体E-R图图1-5 出库实体E-R图图1-6 部门需XX体E-R图图1-7 还库实体E-R图图1-8计划采购实体E-R图图1-9实体和实体之间的关系E-R图2、3数据库逻辑结构设计在上面的实体以及实体之间的关系的基础上,形成数据库中的表格和各个表格之间的关系。仓库管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。表1-1 设备代码表device_code 列名数据类型可否为空说明codeV
2、ARCHAR2(6)NOTNULL设备号(主键)nameVARCHAR2(20)NULL设备名称表1-2 设备入库表device_in设备号in_dateDATE NOTNULL入库时间(主键)provider供应商 telenoVARCHAR2(10)in_numberNUMBER(6) NULL入库数量 price价格 buyer采购员表1-3 设备出库表device_outdepartment使用部门out_date出库时间(主键)out_stateNUMBER(1)出库状态out_person经手人out _number出库数量 taker领取人 usage用途表1-4 现有库存表de
3、vicenow_number现有库存high _number最大库存low _number最少库存total _number总数表1-5 部门需求表device_need部门名称need _number需求数量begin_date需求开始时间end_date需求结束时间表1-6 设备还库表device_returnreturn_date还库时间(主键) keeper仓库管理员 return_ number归还数量 return_date归还人表1-7 操作日志表 howdodo_user操作员do_whatVARCHAR2(40)操作内容do_date操作时间表1-8 设备采购计划表devic
4、e_wantbuytotal_number总库存max_numberbuy_number购买数量buy_date计划采购时间(主键)3、数据库结构的实现4、创建应用程序(1)(1) 选择“FileNew”中的“新建项目”选项卡中“MFC AppWizard(exe)”,设置合适的目录和项目名,比如“E:Project”目录下的“DMS”项目。(2)(2) 创建一个对话框应用程序(“Dialog Based”),单击“Next”按钮。(3)(3) 由于在这个项目中将要使用ADO,所以在MFC AppWizard的第二步,需要选中“Automation”选项,使应用程序能够支持自动化对象。如图1-
5、10所示(4)(4) 单击“Finish”按钮结束项目的创建。主对话框名为CDMSDlg。(5)(5) 项目创建完毕后,在头文件stdafx.h中加入下面4行:#import“c:programfilesmonfilessystemadomsado15.dll”no_namespace(”EOF”,”adoEOF”)#include”icrsint.h”inline void TESTHR(HRESULT x)if FAILED(x)_issue_error(x);#define DATEFMT Cstring(“%s”)5、操作日志模块的设计(1)写日志模块图1-10 使应用程序支持自动化先
6、定义一个名为ClogMngr的类/LogMngr.h/定义一个Log管理器class CLogMngr public: CLogMngr(); virtual CLogMngr(); bool AddLog(LPCSTR op); void Setup(_ConnectionPtr nt, CString& user) m_DBt = nt; m_user = user; protected: _ConnectionPtr m_DBt; CString m_user;下面是ClogMngr:AddLog内部实现详细过程。/LogMngr.cpp/向数据库中添加Log记录的代码。bool CLo
7、gMngr:AddLog(LPCSTR op) CTime tm = CTime:GetCurrentTime(); CString sql_; sql_.Format(INSERT INTO HOWDO (do_user,do_what,do_date) VALUES(%s,%d-%d-%d %d:%d:%d), m_user, op, tm.GetYear(), tm.GetMonth(), tm.GetDay(), tm.GetHour(), tm.GetMinute(), tm.GetSecond(); _bstr_t sql = sql_; try m_DBt-Execute(sql
8、,NULL,adCmdText); catch(_error& e) CString Error = e.ErrorMessage(); AfxMessageBox(e.ErrorMessage(); return false; return true;(2)读日志模块图1-11 查看日志窗口初始化界面代码如下:BOOL CDlgViewLog:OnInitDialog() CDialog:OnInitDialog(); m_list.InsertColumn(0,操作员); m_list.InsertColumn(1,操作日期 m_list.InsertColumn(2,操作内容 RECT
9、rect; m_list.GetWindowRect(&rect); int wid = rect.right - rect.left; m_list.SetColumnWidth(0,wid/3); m_list.SetColumnWidth(1,wid/3); m_list.SetColumnWidth(2,wid/3); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT); RefreshData(); return TRUE; / return TRUE unless you set the focus to a control / EXCEPT
10、ION: OCX Property Pages should return FALSEvoid CDlgViewLog:RefreshData() m_list.DeleteAllItems(); m_list.SetRedraw(FALSE); _bstr_t strSQL(SELECT * FROM HOWDO _RecordsetPtr MySet; int i = 0; MySet.CreateInstance(_uuidof(Recordset); MySet = m_DBt-Execute(strSQL,NULL,adCmdText); _variant_t Holder; whi
11、le(!MySet-adoEOF) Holder = MySet-GetCollect(do_user if(Holder.vt!=VT_NULL) m_list.InsertItem(i, (char*)(_bstr_t)Holder); Holder = MySet-do_date if (Holder.vt! m_list.SetItemText(i, 1, (char*)(_bstr_t)Holder);do_what m_list.SetItemText(i, 2, (char*)(_bstr_t)Holder); MySet-MoveNext(); MySet-Close(); m
12、_list.SetRedraw(TRUE); return; m_list.SetRedraw(TRUE);OnClickListVllog(NMHDR* pNMHDR, LRESULT* pResult) int i = m_list.GetSelectionMark(); m_opr = m_list.GetItemText(i,0); m_date = m_list.GetItemText(i,1); m_op = m_list.GetItemText(i,2); UpdateData(FALSE); *pResult = 0;/DlgViewLog.cpp/删除所有日志记录的函数。On
13、BtnVlrmall() TRUNCATE TABLE HOWDO EndDialog(0);6、登录窗口的设计和程序初始化在CDMSDlg:OnInitDialog()中加入这样一段代码:/DMSDlg.cpp/弹出登录界面CDlgLogIn dlg; do if (!dlg.DoModal() EndDialog(0); while (dlg.m_UsrName.GetLength()=0);它的目的是弹出图1-12所示的登录对话框,并从中获得一个有效的用户名。图1-12 登录界面得到有效用户名后,程序用如下代码:/ DMSDlg.cpp/建立数据库连接,初始化成员变量/登录数据库,若失败
14、,则关闭程序。 m_DBt.CreateInstance(_uuidof(Connection); CString sql_; sql_.Format(DSN=DMS;UID=%s;PWD=%s,dlg.m_UsrName,dlg.m_UsrPwd); _bstr_t sql=sql_;/建立连接Open(sql,-1);/初始化日志管理器 m_logMngr.Setup(m_DBt,dlg.m_UsrName);/记录此次登录 m_logMngr.AddLog(登录数据库 AfxMessageBox(e.ErrorMessage(); this-EndDialog(0);在程序结束时关闭数据
15、库连接。/关闭数据库连接void CDMSDlg:OnDestroy() OnDestroy(); m_DBt-7、主对话框界面的设计登录完成后,显示出主对话框。它的界面设计如图1-13所示,单击某个按钮就能弹出某个功能的界面。图1-13 主对话框界面以其中“设备代码”按钮为例,说明它的事件处理函数。代码如下:/显示设备代码管理界面OnBtnDevcode() CDlgDevcode dlg; dlg.Setup(m_DBt,&m_logMngr); this-ShowWindow(SW_HIDE); dlg.DoModal();ShowWindow(SW_SHOW);其他按钮的事件处理函数,
16、代码与“设备代码”按钮的事件处理函数相同。8、设备代码管理窗口的建立对话框类名为CdlgDevcode设计如图1-14所示图1-14 设备代码管理窗口/DlgDevcode.cpp/对话框的初始化BOOL CDlgDevcode:/切分列表控件设备号设备名 m_list.SetColumnWidth(0,wid/2); m_list.SetColumnWidth(1,wid/2);/读取已有数据/ DlgDevcode.cpp/消息映射部分BEGIN_MESSAGE_MAP(CDlgDevcode, CDialog) /AFX_MSG_MAP(CDlgDevcode) ON_NOTIFY(NM
17、_CLICK, IDC_LIST_DEVCODE, OnClickListDevcode) /AFX_MSG_MAPEND_MESSAGE_MAP()/事件处理部分void CDlgDevcode:OnClickListDevcode(NMHDR* pNMHDR, LRESULT* pResult) m_code = m_list.GetItemText(i,0); m_name = m_list.GetItemText(i,1);其余程序的清单如下:/ DlgDevcode.cpp : implementation file/#include stdafx.hDMS.hDlgDevcode.
18、h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CDlgDevcode dialogCDlgDevcode:CDlgDevcode(CWnd* pParent /*=NULL*/) : CDialog(CDlgDevcode:IDD, pParent) /AFX_DATA_INIT(CDlgDevcode) m_code = _T( m_name = _T( /AFX_DATA_INIT m_DBt = NULL; m_log = NULL;DoDataExchange(CDataExchange* pDX)DoDataExchange(pDX); /AFX_DATA_MAP(CDlgDevcode) DDX_Control(pDX, IDC_LIST_DEVCODE, m_list); DDX_Text(pDX, IDC_EDIT_DCCODE, m_code); DDX_Text(pDX, IDC
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1