vc++库存管理
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
系统功能模块设计
4.1公司库存管理功能模块设计目标
⑴ 实用性强:符合实际操作流程的习惯,易学易用的友好的用户界面,适合各层次工作人员的使用需求,实现计算机与多年积累起来的经验相结合科学化管理;
⑵ 先进的程序结构:使用当代前卫的软件编程,能延长其生命周期,易于维护与管理;
⑶ 安全可靠性高:登录密码口令,实现系统的可靠性;
⑷ 使用模块化设计的方法:使系统具有良好的可扩充性,以适应其不同阶段的发展需要;
⑸ 操作简单,维护方便:每个系统都具有系统维护功能,对可变化的项目可自行维护;
⑹ 查询功能强大:可以对文件按日期、部门、文件名和文件的编号等方式查询,使管理人员能及时准确地掌握公司库存的基本情况。 【买计算机毕业论文就到计算机毕业论文网】
4.2公司库存管理信息系统功能模块划分
根据需求分析与系统功能设计目标,结合实际情况本系统功能模块设计分为如下几个模块:
①基础信息管理模块
②日常业务管理模块
③查询统计模块
④系统管理模块 think58好,好think58
[来源:http://think58.com]
系统简介
库存管理系统是针对企业库存的商品货物的经常出入库和查询统计等方面工作而开发的管理软件。库存管理系统是用于完成众多库存管理业务所面临的日常工作。
根据用户的要求,实现库存的商品管理、出入库管理、查询管理及用户管理等功能。用户通过相应的模块,对库存里的商品的基本情况进行更新、删除和查询,对商品的出库和入库进行管理,对出入库明细进行查询,对使用该系统的用户进行更新、删除和查询,对库存数量进行查询,用户通过简单的操作即可轻松的管理库存。
库存管理系统开发的总体任务是实现企业物资设备管理的系统化、规范化和自动化,从而达到提高库存管理效率的目的。
简洁一致,操作便利
图形化界面,完备的物资管理功能
表格中的文字实时显示
本系统基于好用、易用、美观的原则设计了统一的人机界面
表格中的文字实时显示。
Visual C++6.0提供了多种多样的数据库访问技术—ODBC API、MFC ODBC、DAO、OLE DB、ADO等。它们提供了简单、灵活、访问速度快、可扩展性强的开发技术。
本软件针对企业物资供应管理业务范围及工作特点,设计了设备代码、设备入库、出库、还库、入库信息、出库信息、还库信息、设备需求、查看日志、修改密码等几个模块,这几个子模块包括了企业管理的主要业务,可以全面实现对物资的采购、出库、还库、统计和流通等业务的计算机管理,应用本系统可以在计算机上灵活、方便地管理库存物资,从而大大的提高了处理效率,使管理更加现代化。本系统是根据实际情况和具体内容,按一定的要求、科学、合理进行系统分析,设计,具体包括、数据输入、、删除、修改等各种设计。从而使本系统完全能满足经济性、灵活性、系统性及可靠性的要求。系统考虑到设计与用户两方面,使其尽量具有好的兼容性,速度快,功能强的特点,可让程序运行相对变得简单而方便,可以简便地运行正确操作。
think58好,好think58 [版权所有:http://think58.com]
5数据库设计
5.1数据库设计概述
Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式,则需要安装相应的ODBC驱动器及DBMS。 本文来自think58 [资料来源:http://THINK58.com]
用户使用自己的DBMS数据库管理功能生成新的数据库模式后,就可以使用ODBC来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC的联机帮助。
think58.com [版权所有:http://think58.com]
[版权所有:http://think58.com]一、MFC提供的ODBC数据库类
内容来自think58
[资料来源:THINK58.com]
Visual C++的MFC基类库定义了几个数据库类。在利用ODBC编程时,经常要使用到 CDatabase(数据库类)、CRecordSet(记录集类)和CRecordView(可视记录集类)。 think58好,好think58
[资料来源:www.THINK58.com]
CDatabase类对象提供了对数据源的连接,通过它可以对数据源进行操作。 think58好,好think58
CRecordSet类对象提供了从数据源中提取出的记录集。CRecordSet对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图。每种形式在记录集被打开时都提供一组记录,所不同的是,当在一个动态行集里滚动到一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来。 [版权所有:http://think58.com]
CRecordView类对象能以控件的形式显示数据库记录,这个视图是直接连到一个CRecordSet对象的表视图。
内容来自think58 [资料来源:http://THINK58.com]
二、应用ODBC编程
think58.com [来源:http://www.think58.com]
[资料来源:http://think58.com]应用Visual C++的AppWizard可以自动生成一个ODBC应用程序框架,步骤是:打开File菜单的New选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard的提示进行操作。
think58
[资料来源:THINK58.com]
当AppWizard询问是否包含数据库支持时,如果想读写数据库,那么选定Database view with file support;如果想访问数据库的信息而不想写回所做的改变,那么选定Database view without file support。
[版权所有:http://think58.com]
选好数据库支持之后,Database Source 按钮会被激活,选中它去调用Data Options对话框。在Database Options对话框中会显示出已向ODBC注册的数据库资源,选定所要操作的数据库,如:Super_ES,单击OK后出现Select Database Tables对话框,其中列举了选中的数据库包含的全部表;选择要操作的表后,单击OK。在选定了数据库和数据表之后,就可以按照惯例继续进行AppWizard操作。 think58.com [资料来源:http://www.THINK58.com]
特别需要指出的是:在生成的应用程序框架View类(如:CSuper_ESView)中,包含一个指向CSuper_ESSet对象的指针m_pSet,该指针由AppWizard建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。
本文来自think58
[资料来源:www.THINK58.com]
[版权所有:http://think58.com]
要使程序与数据源建立联系,需用CDateBase::OpenEx()或CDatabase::Open()函数来进行初始化。数据库对象必须在使用它构造记录集对象之前初始化。
三、实例
1.查询记录 内容来自think58 [资料来源:http://THINK58.com]
查询记录使用CRecordSet::Open()和CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open()函数,再次查询时就可以应用CRecordSet::Requery()函数。 内容来自think58
在调用CRecordSet::Open()函数时,如果将一个已经打开的CDatabase对象指针传给CRecordSet类对象的m_pDatabase成员变量,则使用该数据库对象建立ODBC连接;否则如果m_pDatabase为空指针,就新建一个CDatabase类对象,并使其与缺省的数据源相连,然后进行CRecordSet类对象的初始化。缺省数据源由GetDefaultConnect()函数获得。也可以提供所需要的SQL语句,并以它来调用CRecordSet::Open()函数,例如:Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
[资料来源:www.THINK58.com]
如果没有指定参数,程序则使用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语句进行操作:
本文来自think58
[资料来源:THINK58.com]
[版权所有:http://think58.com] CString CSuper_ESSet::GetDefaultSQL()
{return _T(″[BsicData],[MinSize]″);} think58好,好think58
[资料来源:http://www.THINK58.com]
对于GetDefaultSQL()函数返回的表名,对应的缺省操作是SELECT语句,即:
[来源:http://think58.com]
SELECT *FROM BasicData,MainSize
本文来自think58
[资料来源:http://THINK58.com]
[来源:http://www.think58.com]
在查询过程中,也可以利用CRecordSet的成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter为过滤字符串,存放着SQL语句中WHERE后的条件串;m_strSort为排序字符串,存放着SQL语句中ORDER BY后的字符串。如: 本文来自think58
[来源:http://think58.com]
Super_ESSet.m_strFilter=″TYPE=‘电动机’″;
Super_ESSet.m_strSort=″VOLTAGE″;
Super_ESSet.Requery(); 内容来自think58 [资料来源:www.THINK58.com]
对应的SQL语句为:
SELECT *FROM BasicData,MainSize
WHERE TYPE=‘电动机’
ORDER BY VOLTAGE copyright think58 [来源:http://www.think58.com]
除了直接赋值给m_strFilter以外,还可以使用参数化。利用参数化可以更直观、更方便地完成条件查询任务。使用参数化的步骤如下: copyright think58
S声明参变量: 本文来自think58
CString p1;
float p2;
S在构造函数中初始化参变量: think58.com
[资料来源:THINK58.com]
p1=_T(″″);
p2=0.0f;
m_nParams=2;
S将参变量与对应列绑定: think58.com
pFX->SetFieldType(CFieldExchange::param) [资料来源:www.THINK58.com]
RFX_Text(pFX,_T(″P1″),p1);
RFX_Single(pFX,_T(″P2″),p2); copyright think58
[资料来源:http://www.THINK58.com]
完成以上步骤后就可以利用参变量进行条件查询:
m_pSet->m_strFilter=″TYPE=? AND VOLTAGE=?″;m_pSet->p1=″电动机″;
m_pSet->p2=60.0;
m_pSet->Requery();
[资料来源:www.THINK58.com]
参变量的值按绑定的顺序替换查询字串中的“?”通配符。 think58.com
[来源:http://think58.com]
如果查询的结果是多条记录,可以用CRecordSet类的函数Move()、MoveNext()、MovePrev()、MoveFirst()和MoveLast()来移动光标。
copyright think58
[资料来源:http://www.THINK58.com]
[资料来源:http://www.THINK58.com]
2.增加记录 think58好,好think58
[来源:http://www.think58.com]
增加记录使用AddNew()函数,要求数据库必须是以允许增加的方式打开:
[资料来源:http://THINK58.com]
m_pSet->AddNew(); //在表的末尾增加新记录
m_pSet->SetFieldNull(&(m_pSet->m_type), FALSE);
m_pSet->m_type=″电动机″;
……
//输入新的字段值
m_pSet->update();
//将新记录存入数据库
m_pSet->Requery();
//重建记录集 本文来自think58
3.删除记录
think58.com
[来源:http://www.think58.com]
可以直接使用delete()函数来删除记录,并且在调用delete()函数之后不需调用update()函数: [资料来源:http://think58.com]
m_pSet->delete();
if (!m_pSet->IsEOF())
m_pSet->MoveNext();
else
m_pSet->MoveLast(); think58好,好think58
4.修改记录 think58
修改记录使用Edit()函数: copyright think58
m_pSet->Edit();
//修改当前记录
m_pSet->m_type=″发电机″;
//修改当前记录字段值
……
m_pSet->update(); //将修改结果存入数据库
m_pSet->Requery(); think58 [资料来源:http://think58.com]
5.撤消操作
copyright think58
如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用update()函数之前调用:
内容来自think58
CRecordSet::Move(AFX_MOVE_REFRESH)来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中,参数AFX_MOVE_REFRESH的值为零。 think58好,好think58
[资料来源:www.THINK58.com]
6.数据库连接的复用 think58好,好think58
[来源:http://think58.com]
在CRecordSet类中定义了一个成员变量m_pDatabase: copyright think58 [资料来源:THINK58.com]
CDatabase* m_pDatabase;
本文来自think58 [资料来源:www.THINK58.com]
[来源:http://think58.com]它是指向对象数据库类的指针。如果在CRecordSet类对象调用Open()函数之前,将一个已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同的CDatabase类对象。如:
[来源:http://think58.com]
CDatabase m_db;
CRecordSet m_set1,m_set2;
m_db.Open(_T(″Super_ES″)); //建立ODBC连接
m_set1.m_pDatabase=&m_db;
//m_set1复用m_db对象
m_set2.m_pDatabse=&m_db;
// m_set2复用m_db对象
[来源:http://think58.com]
7.SQL语句的直接执行 [资料来源:http://THINK58.com]
虽然我们可以通过CRecordSet类完成大多数的查询操作,而且在CRecordSet::Open()函数中也可以提供SQL语句,但是有时候我们还是希望进行一些其他操作,例如建立新表、删除表、建立新的字段等,这时就需要使用CDatabase类直接执行SQL语句的机制。通过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行:
think58.com
BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
{TRY
{m_pdb->ExecuteSQL(strSQL);
//直接执行SQL语句}
CATCH (CDBException,e)
{CString strMsg;
strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
strMsg+=strSQL;
return FALSE;}
END_CATCH
return TRUE;} think58好,好think58 [版权所有:http://think58.com]
应当指出的是,由于不同的DBMS提供的数据操作语句不尽相同,直接执行SQL语句可能会破坏软件的DBMS无关性,因此在应用中应当慎用此类操作。 copyright think58
[资料来源:http://www.THINK58.com]
8.动态连接表 [资料来源:http://think58.com]
表的动态连接可以利用在调用CRecordSet::Open()函数时指定SQL语句来实现。同一个记录集对象只能访问具有相同结构的表,否则查询结果将无法与变量相对应。
void CDB::ChangeTable()
{
if (m_pSet->IsOpen()) m_pSet->Close();
switch (m_id)
{
case 0:
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,″SELECT * FROM SLOT0″);
//连接表SLOT0
m_id=1;
break;
case 1:
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,″SELECT * FROM SLOT1″); //连接表SLOT1
m_id=0;
break;
}
}
think58 [资料来源:http://www.THINK58.com]
9.动态连接数据库 [资料来源:http://www.THINK58.com]
可以通过赋与CRecordSet类对象参数m_pDatabase来连接不同数据库的CDatabase对象指针,从而实现动态连接数据库。
内容来自think58
[版权所有:http://think58.com]
[来源:http://think58.com]void CDB::ChangeConnect()
{
CDatabase* pdb=m_pSet->m_pDatabase;
pdb->Close();
switch (m_id)
{
case 0:
if (!pdb->Open(_T(″Super_ES″)))
//连接数据源Super_ES
{
AfxMessageBox(″数据源Super_ES打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);
exit(0);
}
m_id=1;
break;
case 1:
if (!pdb->Open(_T(″Motor″)))
//连接数据源Motor
{
AfxMessageBox(″数据源Motor打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);
exit(0);
}
m_id=0;
break;
}
} 本文来自think58 [资料来源:http://think58.com]
本文来自think58 [资料来源:http://THINK58.com]
Visual C++中的ODBC类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC技术使得程序员从具体的DBMS中解脱出来,从而可以减少软件开发的工作量,缩短开发周期,并提高效率和软件的可靠性。
本文来自think58 [资料来源:http://think58.com]