企业设备管理系统.docx
《企业设备管理系统.docx》由会员分享,可在线阅读,更多相关《企业设备管理系统.docx(17页珍藏版)》请在冰豆网上搜索。
企业设备管理系统
第4章企业设备管理系统公司经常需要采购一些设备,用以满足公司正常运营的需要,采购回来的设备不能堆放在库房里就不管了,谁想用的时候就去拿,谁想换的时候就去换。
这样,公司的设备恐怕会越来越少,公司正常的运营就会受到影响。
因此,需要对公司的设备进行库存管理,保证设备借出和归还有序,还要能查到设备的借出情况。
企业设备管理系统正好能满足这个需求,它提供了对设备库存、设备借出、设备归还和设备统计信息的管理。
4.1系统设计系统设计是系统开发最为关键的一环,良好的系统设计需要把握系统的需求,并合理地划分功能模块。
企业设备管理系统的系统设计还需要把握一个关键点,就是明确设备的惟一性,尽管设备可能一模一样,但是也应该区别开来,因为我们的借出、归还以及借出历史的统计都是要具体到某一个设备的,需要对每一个设备赋予不同的设备编号,通常会制作标签贴在设备上,这恐怕是库房管理员常做的工作,设备编号的方式可以根据公司具体决定。
4.1.1功能描述企业设备管理系统包括设备库存管理、设备借出归还管理和设备统计信息管理,详细的功能描述如下。
1.设备库存管理设备库存管理包括新设备入库、修改设备信息和陈旧设备的库存清理。
新设备入库是对新采购的设备进行入库的操作。
修改设备信息是对入库设备的名称、购买人、入库时间、设备说明等信息的修改。
库存清理,是清理库存中不能再用的设备。
2.设备借出归还管理设备借出归还管理包括设备借出管理和设备归还管理。
对于设备借出管理,如果设备已经借出,要提示用户谁借走了设备。
当借出成功的时候,需要在列表中显示借出人、借
出时间和借出设备信息,如果归还成功,还需要显示设备归还时间。
3.设备统计信息管理设备统计信息管理包括对设备借出历史信息、设备使用频率信息和未归还设备列表信息的管理。
设备借出历史统计显示了一个设备所有的借出历史,便于跟踪设备的使用情况如果设备出现问题,还可以顺藤摸瓜,查到谁有可能把设备弄坏了,从而找到设备损坏的原因,便于及时修理。
设备使用频率统计提供了设备借出次数的统计信息,如果一个设备借出的非常频繁,那么企业可以考虑多购买这种设备,从而提高公司的效率。
未归还设备列表提供了尚未归还的设备信息,企业可以知道借出设备的使用情况。
4.1.2功能模块设计
从上面的功能描述中,可以把企业设备管理系统分为3个模块:
设备库存管理、设备借出归还管理和设备统计信息管理。
在每一个模块下又提供了更为具体的功能。
详细的企业设备管理系统的功能模块图,如图4-1所示。
图4-1系统功能模块图
4.2数据库设计与实现
数据库设计的一个巧妙之处就是表的数量不能太多,逻辑层次也不能太多;否则统的升级和维护将会非常困难。
4.2.1数据库需求设计
通过对系统功能的分析,企业设备管理系统需要包含以下数据库信息。
1.设备信息
包括设备编号、设备名称、设备描述、设备入库时间、设备购买人、设备借出状设备借出ID。
2.设备借出信息
包括设备借出ID、设备编号、借出人、借出时间和归还时间。
4.2.2数据库表的设计
通过数据库的需求,可以创建以下数据表。
1.设备信息表(device」nfo_tab)
表4-1设备信息表
字段名称数据类型可否为空
device_codeVARCHAR2(24)device_nameVARCHAR2(24)descriptionVARCHAR2(1000)oper_dateDATENOTNULLbuyerVARCHAR2(24)NULLLend_statusINTEGERNULLlend_idINTEGERNULL无
设备信息表包含了设备的一些基本信息,还包括设备的借出信息,设备的库存管理和设备的借出归还管理都需要操作这个数据表,表的结构见表4-1。
约束条件说明
NOTNULL主键设备编号,要惟一
NOTNULL无设备名称
NULL无设备描述
无设备入库时间
无设备购买人
无设备借出状态
设备借出ID,借出ID是惟一的但可以为空
2.设备借出信息表(device_lend」nfo_tab)
设备借出信息表包含了设备的借出和归还信息,设备借出、设备归还,以及统计信息的管理都需要用到这个数据表,表的结构见表4-2。
表4-2设备借出信息表
字段名称数据类型可否为空约束条件说明
lend_idINTEGERNOTNULL主键借出ID,ID值从系列中获取)device_codeVARCHAR2(24)NOTNULL外键(device_info_tab)设备编号borrowerVARCHAR2(24)NOTNULL无借出人borrow_dateDATENULL无设备借出时间return_dateDATENULL无设备归还时间
4.2.3数据库表的创建
利用第3章中讲述的方法创建表空间dbdevice和数据库用户dbdevice,其中数据库用
户的密码为dbdevice,选择的默认表空间为dbdevice。
创建企业设备管理系统的所有数据表的SQL语句如下:
--创建设备信息表
CREATETABLEdevice_info_tab(device_codeVARCHAR2(24)NOTNULL,device_nameVARCHAR(24)NOTNULL,descriptionVARCHAR(1000)NULL,oper_dateDATENOTNULL,
buyerVARCHAR2(24)NULL,lend_statusINTEGERNULL
CHECK(lend_statusIN(0,1)),lend_idINTEGERNULL
);
--添加设备编号主键
ALTERTABLEdevice_info_tab
ADD(PRIMARYKEY(device_code));
--创建设备借出信息表
CREATETABLEdevice_lend_info_tab(lend_idINTEGERNOTNULL,device_codeVARCHAR2(24)NOTNULL,borrowerVARCHAR(24)NOTNULL,borrow_dateDATENULL,return_dateDATENULL
);
--添加借出ID主键
ALTERTABLEdevice_lend_info_tab
ADD(PRIMARYKEY(lend_id));
--添加设备编号外键
ALTERTABLEdevice_lend_info_tab
ADD(FOREIGNKEY(device_code)
REFERENCESdevice_info_tab);
--创建可以递增的系列号供lend_id使用
CREATESEQUENCEseq_lend_idINCREMENTBY1STARTWITH1NOMAXVALUENOMINVALUENOCYCLE;
利用OracleSQLPlusWorkSheet工具执行上述的SQL语句从而创建数据库表。
需要说
明的是,在打开OracleSQLPIusWorksheet的"OracleEnterpriseManager登录”窗口的时
候,需要在“用户名”文本框中输入企业设备管理系统的用户名dbdevice,在“口令”文
本框中输入用户密码dbdevice,在“服务”文本框中输入数据库的本地服务名ORADB,
选择连接方式Normal,登录成功后,再运行上述的SQL语句。
4.3系统的实现
完成了系统功能模块的设计和数据库表的创建后,就可以创建一个企业设备管理系
统。
4.3.1创建应用程序
运行VisualC++,选择File|New命令,弹出New对话框。
从Projects列表中选择MFCAppWizard(exe)向导,在Location文本框中选择项目工程的目录“",在
Projectname文本框中输入工程文件的名称DeviceDBS,单击OK按钮,进入MFC
AppWizard-Step1页面,从应用程序的类型中选择Dialogbased选项,从语言列表中选
择
“中文仲国)(APPWZCHS.DLL)”,单击Finish按钮,DeviceDBS对话框的应用程序创建
宀
完
毕。
4.3.2创建主对话框的界面
主对话框的布局如图4-2所示。
其中包括设备库存管理、设备借出归还管理和设备统
计信息管理3个部分。
图去:
“企W设希口冒照腴”対沂杠
3.设备库存管理
控件类型、ID及说明见表4-3。
表4-3设备库存管理控件列表
控件类型ID属性变量或函数
GroupBoxIDC_STATIC设备库存管理LabelIDC_STATIC设备编号无
LabelIDC_STATIC购买人
LabelIDC_STATIC入库时间
GroupBoxIDC_STATIC设备信息无
ListControlIDC_LIST_DEVICE无列表框控件类型变量m_listDevice
4.设备借出归还管理控件类型、ID及说明见表4-4。
表4-4设备借出归还管理控件列表
控件类型ID属性变量或函数
GroupBoxIDC_STATIC设备借出归还管理无
LabelIDC_STATIC请输入借书人无
EditBoxIDC_EDIT_BORROWER无CString类型变量m_strBorrower
LabelIDC_STATIC请选择设备名称无
ComboBoxIDC_COMBO_NAME无列表框控件变量m_comboName,CString类型变量
m_strSelectedName
LabelIDC_STATIC请选择设备编号无
ComboBoxIDC_COMBO_CODE无列表框控件变量m_comboCode,CString类型变量
m_strSelectedCode
ButtonIDC_BTN_LEND借出函数OnBtnLend()处理设备借出管理
ButtonIDC_BTN_RETURN归还函数OnBtnReturn()处理设备归还管理
GroupBoxIDC_STATIC借出信息无
ListControlIDC_LIST_LEND无列表框控件类型变量m_listLend
5.设备统计信息管理控件类型、ID及说明见表4-5。
表4-5设备统计信息管理控件列表控件类型ID属性变量或函数
GroupBoxIDC_STATIC设备统计信息管理无
ButtonIDC_BTN_LEND_LIST设备借出历史统计函数OnBtnLendList()处理设备借出历史统计
ButtonIDC_BTN_FREQUENCY_LIST设备使用频率统计函数OnBtnFrequencyList()处理设备使用频率统计
ButtonIDC_BTN_LENT_DEVICE未归还设备列表函数OnBtnLentDevice()处理未归还设备统计
ButtonIDC_SYS_EXIT退出函数OnSysExit()处理系统退出代码主对话框类名称为CDeviceDBSDlg,资源ID为IDD_DEVICEDBS_DIALOG,对话框名称为“企业设备管理系统”。
主界面用到了两个列表框控件分别显示设备信息和借出信息。
需要为这两个列表框控件添加显示的列,从而显示相应的数据信息。
为了代码设计的清晰,在CDeviceDBSDlg类中定义了一个InitControl私有函数负责添加控件的显示列,InitControl函数的代码如下:
voidCDeviceDBSDlg:
:
InitControl()
{{
//设置列表框控件扩展风格
DWORDdwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|
LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_UNDERLINEHOT;
m_listDevice.SetExtendedStyle(dwExStyle);
m_listLend.SetExtendedStyle(dwExStyle);
//初始化设备信息列表框控件
m_listDevice.InsertColumn(0,"设备编号",LVCFMT_CENTER,80);m_listDevice.InsertColumn(1,"设备名称",LVCFMT_CENTER,80);
m_listDevice.InsertColumn(2,"设备入库时间",LVCFMT_CENTER,140);
m_listDevice.InsertColumn(3,"设备购买人",LVCFMT_CENTER,80);
m_listDevice.InsertColumn(4,"设备描述",LVCFMT_CENTER,200);
//初始化议题列表框控件
ID",LVCFMT_CENTER,80);
m_listLend.InsertColumn(0,"借出
m_listLend.InsertColumn(1,"设备编号",LVCFMT_CENTER,80);m_listLend.InsertColumn(2,"设备名称",LVCFMT_CENTER,80);
m_listLend.InsertColumn(3,"借出人",LVCFMT_CENTER,80);m_listLend.InsertColumn(4,"设备借出时间",LVCFMT_CENTER,140);
m_listLend.InsertColumn(5,"
设备归还时间",LVCFMT_CENTER,140);
}
在OnInitDialog函数末尾处添加InitControl函数的调用,这样系统在启动的时候,就可以看到已添加显示列的列表框控件。
4.3.3显示数据到界面上当系统启动之后,可以将数据库中的数据显示到界面上,需要处理数据库的连接和显示数据到界面上的两个过程。
1.数据库的连接数据库的连接需要3个参数:
ODBC数据源名称、数据库用户名称和数据库用户密码。
其中数据源名称为ORADB,数据库用户的名称和密码均为dbdevice。
考虑到读者配置的
数据源和用户名可能不一样,可以从配置文件中获取这些参数信息,配置文件的格式如下:
[General]
数据库数据源=oradb
数据库用户=dbdevice
数据库密码=dbdevice
把这段文字保存为DeviceDBS.ini文件,可以根据读者自己配置的数据源、数据用户和密码修改文件中的相应设置,并把DeviceDBS.ini文件放在DeviceDBS.exe运行程序的同一目录下。
在CDeviceDBSDlg类中定义了一个私有类型的ConnectDB函数,处理数据库的连接,代码如下:
voidCDeviceDBSDlg:
:
ConnectDB()
{
charszPath[255];
//获取应用程序完全路径
:
:
GetModuleFileName(NULL,szPath,255);CStringstrFileName=szPath;
//获取所在的目录名称
strFileName.Delete(strFileName.ReverseFind(')+1,strF'ileName.GetLength()-strFileName.ReverseFind('-)1');
//构造配置文件的完全路径
strFileName+="DeviceDBS.ini";
TCHARsz[101];
memset(sz,0,sizeof(TCHAR)*101);
//获取配置文件中数据库数据源的值,如果没有,默认值为oradb
"),_T("dbdevice"),sz,100,strFileName);
CStringstrPwd(sz);
//创建连接字符串
CStringstrConnect;strConnect.Format("DSN=%s;UID=%s;PWD=%s",strSource,strUser,strPwd);//打开数据库的连接,并且捕获异常
TRY{m_db.OpenEx(strConnect,CDatabase:
:
noOdbcDialog);
}
CATCH(CDBException,ex)
{
AfxMessageBox(ex->m_strError);
AfxMessageBox(ex->m_strStateNativeOrigin);
}
AND_CATCH(CMemoryException,pEx)
{
pEx->ReportError();
AfxMessageBox("memoryexception");
}
AND_CATCH(CException,e)
{
TCHARszError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox(szError);
}
END_CATCH
InitCtrlData();
}
函数ConnectDB利用系统的GetPrivateProfileString函数从文件中获取数据库的配置参
数,GetPrivateProfileString函数的原型如下:
DWORDGetPrivateProfileString(
LPCTSTRlpAppName,
LPCTSTRlpKeyName,
LPCTSTRlpDefault,
LPTSTRlpReturnedString,
DWORDnSize,
LPCTSTRlpFileName
);
其中第1个参数是Section的名称,对应DeviceDBS.ini文件中的General,即中括号
所包含的内容General;第2个参数是键的名称,如DeviceDBS.ini文件中的“数据库数
据
源”、“数据库用户”和“数据库密码”;第3个参数是默认值,如果没用成功获得键值,那么就取lpDefault代表的数据;第4个参数是保存键值的缓冲区;第5个参数是缓冲区的大
小;第6个参数是文件的完全路径。
由于第6个参数需要获取文件DeviceDBS.ini的完全路径,因而需要利用系统的
GetModuleFileName函数先获取应用程序DeviceDBS.exe所在的路径(因为DeviceDBS.ini
文件和应用程序DeviceDBS.exe在同一目录下),然后构造配置文件DeviceDBS.ini的完全路径。
当从文件中获取到数据库配置参数之后,就可以创建数据库连接字符串,利用
CDatabase的OpenEx方法打开数据库的连接,并处理数据库的异常。
2.显示数据到界面上连接数据库之后,需要把数据库中的设备信息显示到设备信息列表框控件中,并刷新借出归还管理中的设备名称和设备编号两个列表框中的显示数据。
因而在CDeviceDBSDlg
类中定义了一个InitCtrlData私有函数,负责显示这些数据。
同时还定义一个
RefreshComboNameData函数,根据数据库的最新数据刷新借出归还管理中的两个列表框的数据。
在对设备信息添加、修改和删除之后都需要调用RefreshComboNameData函数来更新列表框中的显示数据。
同时还需要定义两个分别把数据插入到列表框控件中的函数,分别为:
InsertDeviceInfoItem和InsertLendInfoItem。
在连接数据库成功之后,不需要显示借出信息,因为比较多,也不是很重要,只需在借出和归还成功之后显示借出信息。
在DeviceDBSDlg.h文件中添加这4个私有函数的定义,代码如下:
//从数据库获取设备信息并更新到控件中
voidInitCtrlData();
//更新设备名称和设备编号列表框的信息
voidRefreshComboNameData();
//向设备信息控件中添加信息
voidInsertDeviceInfoItem(CStringcode,CStringname,CStringdate,CString
buyer,CStringdescription);
//向借出信息控件中添加借出信息
voidInsertLendInfoItem(intid,CStringcode,CStringname,CStringborrower,CStringlendDate,CStringreturnDate);向设备信息列表框控件中添加设备信息的函数是InsertDeviceInfoItem,代码如下:
voidCDeviceDBSDlg:
:
InsertDeviceInfoItem(CStringcode,CStringname,CStringdate,CStringbuyer,CStringdescription)
{//获取当前的记录条数.
intnIndex=m_listDevice.GetItemCount();
LV_ITEMlvItem;
lvItem.mask=LVIF_TEXT;
lvItem.iItem=nIndex;//行数
lvItem.iSubItem=0;
lvItem.pszText=(char*)(LPCTSTR)code;//第一列
//在最后一行插入记录值.
m_listDevice.InsertItem(&lvItem);
//设置该行的其他列的值.
m_listDevice.SetItemText(nIndex,1,name);
m_listDevice.SetItemText(nIndex,2,date);
m_listDevice.SetItemText(nIndex,3,buyer);
m_listDevice.SetItemText(nIndex,4,description);
}
向借出信息列表框控件中添加借出信息的函数是InsertLendInfoItem,代码如下:
voidCDeviceDBSDlg:
:
InsertLendInfoItem(intid,CStringcode,CStname,CStringborrower,CStringlendDate,CStringreturnDate)
{
//获取当前的记录条数.
intnIndex=m_listLend.GetItemCount();
LV_ITEMlvItem;
lvItem.ma