您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页企业设备管理系统

企业设备管理系统

来源:华佗小知识


第 4 章 企业设备管理系统

公司经常需要采购一些设备,用以满足公司正常运营的需要,采购回来的设备不能堆

放在库房里就不管了,谁想用的时候就去拿,谁想换的时候就去换。这样,公司的设备恐

怕会越来越少,公司正常的运营就会受到影响。因此,需要对公司的设备进行库存管理,

保证设备借出和归还有序,还要能查到设备的借出情况。企业设备管理系统正好能满足这

个需求,它提供了对设备库存、设备借出、设备归还和设备统计信息的管理。

4.1 系统设计

系统设计是系统开发最为关键的一环,良好的系统设计需要把握系统的需求,并合理

地划分功能模块。企业设备管理系统的系统设计还需要把握一个关键点,就是明确设备的

惟一性,尽管设备可能一模一样,但是也应该区别开来,因为我们的借出、归还以及借出

历史的统计都是要具体到某一个设备的,需要对每一个设备赋予不同的设备编号,通

2021123

常会

制作标签贴在设备上,这恐怕是库房管理员常做的工作,设备编号的方式可以根据公司具

体决定。

4.1.1 功能描述

企业设备管理系统包括设备库存管理、设备借出归还管理和设备统计信息管理,详细

的功能描述如下。

1. 设备库存管理

设备库存管理包括新设备入库、修改设备信息和陈旧设备的库存清理。新设备入库是

对新采购的设备进行入库的操作。修改设备信息是对入库设备的名称、购买人、入库时间、

设备说明等信息的修改。库存清理,是清理库存中不能再用的设备。

2. 设备借出归还管理

设备借出归还管理包括设备借出管理和设备归还管理。对于设备借出管理,如果设备

2021123

已经借出,要提示用户谁借走了设备。当借出成功的时候,需要在列表中显示借出人、借

出时间和借出设备信息,如果归还成功,还需要显示设备归还时间。

3. 设备统计信息管理

设备统计信息管理包括对设备借出历史信息、设备使用频率信息和未归还设备列表信

息的管理。设备借出历史统计显示了一个设备所有的借出历史,便于跟踪设备的使用情况

如果设备出现问题,还可以顺藤摸瓜,查到谁有可能把设备弄坏了,从而找到设备损坏的

原因,便于及时修理。设备使用频率统计提供了设备借出次数的统计信息,如果一个设备

借出的非常频繁,那么企业可以考虑多购买这种设备,从而提高公司的效率。未归还设备

列表提供了尚未归还的设备信息,企业可以知道借出设备的使用情况。

4.1.2 功能模块设计

从上面的功能描述中,可以把企业设备管理系统分为 3 个模块:设备库存管理、设备

2021123

借出归还管理和设备统计信息管理。在每一个模块下又提供了更为具体的功能。详细的企

业设备管理系统的功能模块图,如图 4-1 所示。

图 4-1 系统功能模块图

4.2 数据库设计与实现

数据库设计的一个巧妙之处就是表的数量不能太多,逻辑层次也不能太多;否则

统的升级和维护将会非常困难。

4.2.1 数据库需求设计

通过对系统功能的分析,企业设备管理系统需要包含以下数据库信息。

2021123

1. 设备信息

包括设备编号、设备名称、设备描述、设备入库时间、设备购买人、设备借出状

设备借出 ID。

2. 设备借出信息

包括设备借出 ID、设备编号、借出人、借出时间和归还时间。

4.2.2 数据库表的设计

通过数据库的需求,可以创建以下数据表。

1. 设备信息表(device_info_tab)

设备信息表包含了设备的一些基本信息,还包括设备的借出信息,设备的库存管理和

设备的借出归还管理都需要操作这个数据表,表的结构见表 4-1。

表 4-1 设备信息表

字段名称 数据类型 可否为空 约束条件 说 明

device_code VARCHAR2(24) NOT NULL 主键 设备编号,要惟一

2021123

device_name VARCHAR2(24) NOT NULL 无 设备名称

description VARCHAR2(1000) NULL 无 设备描述

oper_date DATE NOT NULL 无 设备入库时间

buyer VARCHAR2(24) NULL 无 设备购买人

Lend_status INTEGER NULL 无 设备借出状态

lend_id INTEGER NULL 无 设备借出 ID,借出 ID 是惟一的但可以为空

2. 设备借出信息表(device_lend_info_tab)

设备借出信息表包含了设备的借出和归还信息,设备借出、设备归还,以及统计信息

的管理都需要用到这个数据表,表的结构见表 4-2。

表 4-2 设备借出信息表

字段名称 数据类型 可否为空 约束条件 说 明

lend_id INTEGER NOT NULL 主键 借出 ID,ID 值从系列中获取)

device_code VARCHAR2(24) NOT NULL 外键(device_info_tab) 设备编号

2021123

borrower VARCHAR2(24) NOT NULL 无 借出人

borrow_date DATE NULL 无 设备借出时间

return_date DATE NULL 无 设备归还时间

4.2.3 数据库表的创建

利用第 3 章中讲述的方法创建表空间 dbdevice 和数据库用户 dbdevice,其中数据库用

户的密码为 dbdevice,选择的默认表空间为 dbdevice。

创建企业设备管理系统的所有数据表的 SQL 语句如下:

--创建设备信息表

CREATE TABLE device_info_tab(

device_code VARCHAR2(24) NOT NULL,

device_name VARCHAR(24) NOT NULL,

description VARCHAR(1000) NULL,

oper_date DATE NOT NULL,

2021123

buyer VARCHAR2(24) NULL,

lend_status INTEGER NULL

CHECK (lend_status IN (0, 1)),

lend_id INTEGER NULL

);

--添加设备编号主键

ALTER TABLE device_info_tab

ADD ( PRIMARY KEY (device_code) ) ;

--创建设备借出信息表

CREATE TABLE device_lend_info_tab(

lend_id INTEGER NOT NULL,

device_code VARCHAR2(24) NOT NULL,

borrower VARCHAR(24) NOT NULL,

2021123

borrow_date DATE NULL,

return_date DATE NULL

);

--添加借出 ID 主键

ALTER TABLE device_lend_info_tab

ADD ( PRIMARY KEY (lend_id) ) ;

--添加设备编号外键

ALTER TABLE device_lend_info_tab

ADD ( FOREIGN KEY (device_code)

REFERENCES device_info_tab ) ;

--创建可以递增的系列号供 lend_id 使用

CREATE SEQUENCE seq_lend_id INCREMENT BY 1 START WITH 1

2021123

NOMAXVALUE NOMINVALUE NOCYCLE;

利用 Oracle SQLPlus WorkSheet 工具执行上述的 SQL 语句从而创建数据库表。需要说

明的是,在打开 Oracle SQLPlus Worksheet 的“Oracle Enterprise Manager 登录”窗口的时

候,需要在“用户名”文本框中输入企业设备管理系统的用户名 dbdevice,在“口令”文

本框中输入用户密码 dbdevice,在“服务”文本框中输入数据库的本地服务名 ORADB,

选择连接方式 Normal,登录成功后,再运行上述的 SQL 语句。

4.3 系统的实现

完成了系统功能模块的设计和数据库表的创建后,就可以创建一个企业设备管理系

统。

4.3.1 创建应用程序

运行 Visual C++,选择 File|New 命令,弹出 New 对话框。从 Projects 列表中选择 MFC

2021123

AppWizard(exe)向导,在 Location 文本框中选择项目工程的目录“D:\\VCSAMPLE\\”,在

Project name 文本框中输入工程文件的名称 DeviceDBS,单击 OK 按钮,进入 MFC

AppWizard – Step 1 页面,从应用程序的类型中选择 Dialog based 选项,从语言列表中选择

“中文(中国)(APPWZCHS.DLL)”,单击 Finish 按钮,DeviceDBS 对话框的应用程序创建完

毕。

4.3.2 创建主对话框的界面

主对话框的布局如图 4-2 所示。其中包括设备库存管理、设备借出归还管理和设备统

计信息管理 3 个部分。

2021123

3. 设备库存管理

控件类型、ID 及说明见表 4-3。

表 4-3 设备库存管理控件列表

控件类型 ID 属 性 变量或函数

Group Box IDC_STATIC 设备库存管理 无

Label IDC_STATIC 设备编号 无

2021123

Edit Box IDC_EDIT_DEVICECODE 无 CString 类型变量 m_strDeviceCode

Label IDC_STATIC 设备名称 无

Edit Box IDC_EDIT_DEVICENAME 无 CString 类型变量 m_strDeviceName

Label IDC_STATIC 购买人 无

Edit Box IDC_EDIT_BUYER 无 CString 类型变量 m_strBorrower

Label IDC_STATIC 入库时间 无

Date Time Picker IDC_DT_DATE Short Date COleDateTime 类型变量 m_oleOperDate

Date Time Picker IDC_DT_TIME Time COleDateTime 类型变量 m_oleOperTime

Label IDC_STATIC 设备说明 无

Edit Box IDC_EDIT_DESCRIPTION 无 CString 类型变量 m_strDescription

Button IDC_BTN_DEVICE_ADD 新设备入库 函数 OnBtnDeviceAdd ()处理新设备的入库管理

Button IDC_BTN_DEVICE_MOD 修改设备信息 函数 OnBtnDeviceMod ()修

2021123

改设备信息

Button IDC_BTN_DEVICE_DEL 库存清理 函数 OnBtnDeviceDel ()处理库存设备的清理管理

Group Box IDC_STATIC 设备信息 无

List Control IDC_LIST_DEVICE 无 列表框控件类型变量 m_listDevice

4. 设备借出归还管理

控件类型、ID 及说明见表 4-4。

表 4-4 设备借出归还管理控件列表

控件类型 ID 属 性 变量或函数

Group Box IDC_STATIC 设备借出归还管理 无

Label IDC_STATIC 请输入借书人 无

Edit Box IDC_EDIT_BORROWER 无 CString 类型变量 m_strBorrower

Label IDC_STATIC 请选择设备名称 无

Combo Box IDC_COMBO_NAME 无 列表框控件变量 m_comboName,

2021123

CString 类型变量

m_strSelectedName

Label IDC_STATIC 请选择设备编号 无

Combo Box IDC_COMBO_CODE 无 列表框控件变量 m_comboCode,CString 类型变量

m_strSelectedCode

Button IDC_BTN_LEND 借出 函数 OnBtnLend ()处理设备借出管理

Button IDC_BTN_RETURN 归还 函数 OnBtnReturn ()处理设备归还管理

Group Box IDC_STATIC 借出信息 无

List Control IDC_LIST_LEND 无 列表框控件类型变量 m_listLend

5. 设备统计信息管理

控件类型、ID 及说明见表 4-5。

表 4-5 设备统计信息管理控件列表

控件类型 ID 属 性 变量或函数

2021123

Group Box IDC_STATIC 设备统计信息管理 无

Button IDC_BTN_LEND_LIST 设备借出历史统计 函数 OnBtnLendList ()处理设备借出历史统计

Button IDC_BTN_FREQUENCY_LIST 设备使用频率统计 函数 OnBtnFrequencyList ()处理设备使用频率统计

Button IDC_BTN_LENT_DEVICE 未归还设备列表 函数 OnBtnLentDevice ()处理未归还设备统计

Button IDC_SYS_EXIT 退出 函数 OnSysExit()处理系统退出代码

主对话框类名称为 CDeviceDBSDlg,资源 ID 为 IDD_DEVICEDBS_DIALOG,对话框

名称为“企业设备管理系统”。主界面用到了两个列表框控件分别显示设备信息和借出信息。

需要为这两个列表框控件添加显示的列,从而显示相应的数据信息。为了代码设计的清晰,

在CDeviceDBSDlg类中定义了一个InitControl私有函数负责添加控件的显示列, InitControl

函数的代码如下:

2021123

void CDeviceDBSDlg::InitControl()

{{

//设置列表框控件扩展风格

DWORD dwExStyle = 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,\"设备编号\

m_listDevice.InsertColumn(1,\"设备名称\

m_listDevice.InsertColumn(2,\"设备入库时间\

m_listDevice.InsertColumn(3,\"设备购买人\

m_listDevice.InsertColumn(4,\"设备描述\

2021123|

//初始化议题列表框控件

m_listLend.InsertColumn(0,\"借出 ID\

m_listLend.InsertColumn(1,\"设备编号\

m_listLend.InsertColumn(2,\"设备名称\

m_listLend.InsertColumn(3,\"借出人\

m_listLend.InsertColumn(4,\"设备借出时间\

m_listLend.InsertColumn(5,\"设备归还时间\

}

在 OnInitDialog 函数末尾处添加 InitControl 函数的调用,这样系统在启动的时候,就

可以看到已添加显示列的列表框控件。

4.3.3 显示数据到界面上

当系统启动之后,可以将数据库中的数据显示到界面上,需要处理数据库的连接和显

示数据到界面上的两个过程。

2021123

1. 数据库的连接

数据库的连接需要 3 个参数: ODBC 数据源名称、数据库用户名称和数据库用户密码。

其中数据源名称为 ORADB,数据库用户的名称和密码均为 dbdevice。考虑到读者配置的

数据源和用户名可能不一样,可以从配置文件中获取这些参数信息,配置文件的格式如下:

[General]

数据库数据源=oradb

数据库用户=dbdevice

数据库密码=dbdevice

把这段文字保存为 DeviceDBS.ini 文件,可以根据读者自己配置的数据源、数据用户

和密码修改文件中的相应设置,并把 DeviceDBS.ini 文件放在 DeviceDBS.exe 运行程序的

同一目录下。

2021123

在 CDeviceDBSDlg 类中定义了一个私有类型的 ConnectDB 函数,处理数据库的连接,

代码如下:

void CDeviceDBSDlg::ConnectDB()

{

char szPath[255];

//获取应用程序完全路径

::GetModuleFileName(NULL,szPath,255);

CString strFileName = szPath;

//获取所在的目录名称

strFileName.Delete(strFileName.ReverseFind(’\\\\’)+1,strFileName.GetLengt

h ()-strFileName.ReverseFind(’\\\\’)-1);

//构造配置文件的完全路径

strFileName += \"DeviceDBS.ini\";

2021123

TCHAR sz[101];

memset(sz,0,sizeof(TCHAR)*101);

//获取配置文件中数据库数据源的值,如果没有,默认值为 oradb

GetPrivateProfileString(_T(\"General\"),_T(\" 数 据 库 数 据 源

\"),_T(\"oradb\"),sz,100,strFileName);

CString strSource(sz);

GetPrivateProfileString(_T(\"General\"),_T(\" 数 据 库 用 户

\"),_T(\"dbdevice\"),sz,100,strFileName);

CString strUser(sz);

GetPrivateProfileString(_T(\"General\"),_T(\" 数 据 库 密 码

\"),_T(\"dbdevice\"),sz,100,strFileName);

CString strPwd(sz);

//创建连接字符串.

2021123

CString strConnect;

strConnect.Format(\"DSN=%s;UID=%s;PWD=%s\

//打开数据库的连接,并且捕获异常

TRY{

m_db.OpenEx(strConnect,CDatabase::noOdbcDialog);

}

CATCH(CDBException,ex)

{

AfxMessageBox (ex->m_strError);

AfxMessageBox (ex->m_strStateNativeOrigin);

}

AND_CATCH(CMemoryException,pEx)

{

2021123

pEx->ReportError();

AfxMessageBox (\"memory exception\");

}

AND_CATCH(CException,e)

{

TCHAR szError[100];

e->GetErrorMessage(szError,100);

AfxMessageBox (szError);

}

END_CATCH

InitCtrlData();

}

函数ConnectDB利用系统的GetPrivateProfileString函数从文件中获取数据库的配置参

2021123

数, GetPrivateProfileString 函数的原型如下:

DWORD GetPrivateProfileString(

LPCTSTR lpAppName,

LPCTSTR lpKeyName,

LPCTSTR lpDefault,

LPTSTR lpReturnedString,

DWORD nSize,

LPCTSTR lpFileName

);

其中第 1 个参数是 Section 的名称,对应 DeviceDBS.ini 文件中的 General,即中括号

所包含的内容 General;第 2 个参数是键的名称,如 DeviceDBS.ini 文件中的“数据库数据

源”、“数据库用户”和“数据库密码”;第 3 个参数是默认值,如果没用成功获得键值,那

2021123

么就取lpDefault代表的数据;第 4 个参数是保存键值的缓冲区;第 5 个参数是缓冲区的大

小;第 6 个参数是文件的完全路径。

由于第 6 个参数需要获取文件 DeviceDBS.ini 的完全路径,因而需要利用系统的

GetModuleFileName 函数先获取应用程序 DeviceDBS.exe 所在的路径(因为 DeviceDBS.ini

文件和应用程序 DeviceDBS.exe 在同一目录下),然后构造配置文件 DeviceDBS.ini 的完全

路径。当从文件中获取到数据库配置参数之后,就可以创建数据库连接字符串,利用

CDatabase 的 OpenEx 方法打开数据库的连接,并处理数据库的异常。

2. 显示数据到界面上

连接数据库之后,需要把数据库中的设备信息显示到设备信息列表框控件中,并刷新

借出归还管理中的设备名称和设备编号两个列表框中的显示数据。因而在 CDeviceDBSDlg

类中定义了一个 InitCtrlData 私有函数,负责显示这些数据。同时还定义一个

2021123

RefreshComboNameData 函数,根据数据库的最新数据刷新借出归还管理中的两个列表框

的数据。在对设备信息添加、修改和删除之后都需要调用 RefreshComboNameData 函数来

更新列表框中的显示数据。同时还需要定义两个分别把数据插入到列表框控件中的函数,

分别为:InsertDeviceInfoItem 和 InsertLendInfoItem。在连接数据库成功之后,不需要显示

借出信息,因为比较多,也不是很重要,只需在借出和归还成功之后显示借出信息。在

DeviceDBSDlg.h 文件中添加这 4 个私有函数的定义,代码如下:

//从数据库获取设备信息并更新到控件中

void InitCtrlData();

//更新设备名称和设备编号列表框的信息

void RefreshComboNameData();

//向设备信息控件中添加信息

2021123

void InsertDeviceInfoItem(CString code, CString name, CString date, CString

buyer, CString description);

//向借出信息控件中添加借出信息

void InsertLendInfoItem(int id,CString code,CString name,CString

borrower,CString lendDate,CString returnDate);

向设备信息列表框控件中添加设备信息的函数是 InsertDeviceInfoItem,代码如下:

void CDeviceDBSDlg::InsertDeviceInfoItem(CString code, CString name, CString

date, CString buyer, CString description)

{ //获取当前的记录条数.

int nIndex = m_listDevice.GetItemCount();

LV_ITEM lvItem;

lvItem.mask = LVIF_TEXT ;

lvItem.iItem = nIndex; //行数

2021123

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,代码如下:

void CDeviceDBSDlg::InsertLendInfoItem(int id,CString code,CSt

name,CString borrower,CString lendDate,CString returnDate)

2021123

{

//获取当前的记录条数.

int nIndex = m_listLend.GetItemCount();

LV_ITEM lvItem;

lvItem.mask = LVIF_TEXT ;

lvItem.iItem = nIndex; //行数

lvItem.iSubItem = 0;

CString temp ;

temp.Format(\"%d\

lvItem.pszText = (char*)(LPCTSTR)temp; //第一列

//在最后一行插入记录值.

m_listLend.InsertItem(&lvItem);

//设置该行的其他列的值.

2021123

m_listLend.SetItemText(nIndex,1,code);

m_listLend.SetItemText(nIndex,2,name);

m_listLend.SetItemText(nIndex,3,borrower);

m_listLend.SetItemText(nIndex,4,lendDate);

m_listLend.SetItemText(nIndex,5,returnDate);

}

把数据库中的数据显示到界面上的函数为 InitCtrlData,代码如下:

void CDeviceDBSDlg::InitCtrlData(){

if(!m_db.IsOpen()){

MessageBox(\"数据库未打开\");

return;

}

m_listDevice.DeleteAllItems();

2021123

TRY{

CRecordset rs(&m_db);

//打开所有的设备信息记录.

rs.Open(CRecordset::dynaset, \"select * from device_info_tab\");

while (!rs.IsEOF()) {

CString strCode,strName,strBuyer,strDate,st

//获取设备编号字段值

rs.GetFieldValue((short)0, strCode);

//获取设备名称字段值

rs.GetFieldValue(1, strName);

//获取设备描述字段值

rs.GetFieldValue(2, strDescription);

//获取入库时间字段值

2021123

rs.GetFieldValue(3, strDate);

//获取设备购买人字段值

2021123

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务