超市管理系统
目 录
II目 录
1一.课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
简介
11.1课程设计的目的
11.2课程设计的内容
32 系统分析
32.1 用户
工作流程
财务工作流程表财务工作流程怎么写财务工作流程图财务工作流程及制度公司财务工作流程
32.2 用户业务需求
43 系统设计
43.1 设计思想
43.2 系统功能结构图
53.3模块功能设计
64 系统数据库设计
64.1系统数据库的建立
64.2 系统E-R图
84.3存储过程设计
94.4 触发器的设计
104.5数据库的连接
115系统实现
115.1 系统实现工具与支持平台
115.2系统主要的功能界面与实现代码
215.3系统主要功能实现
226总结与展望
226.1收获与体会
226.2未来的展望
723源代码附录
237.1 系统与数据库交互代码
34参考文献
35致 谢
36课程设计检查表
一.课程设计简介
1.1课程设计的目的
随着人类社会的进步和科学技术的发展,人们生活水平也在不断的提高,拥有车的人越来越多,这又影响着油的耗量急剧增大,加油站也也来越多。现在人们进行信息交流的深度与广度不断增加,信息量急剧增长,传统的信息处理与决策的手段已不能适应社会的需要,信息的重要性和信息处理问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
的紧迫性空前提高了,面对着日益复杂和不断发展,变化的社会环境,人们已经习惯快速的获得信息以及完成各种事情,加油站的反战中当然也要考虑这些因素。本次设计的加油站管理系统就是为满足人们的需求而设计的,此加油占管理系统是为了解决人们生活中加油的快捷、方便以及减轻加油站管理人员和其他工作人员工作的负担,帮助他们很好的管理和工作的顺利进行。
1.2课程设计的内容
本系统采用的是微软公司的Microsoft Visual C++ 6.0开发工具做为开发系统程序。在连接数据库上,利用ADO对象模型,创建几个简单的对象和数据来源进行连接,然后从中取得所需要的数据,进行数据访问操作后保存。
在连接数据库上,以往在数据访问应用程序开发中,不管是使用DAO或RDO对象来访问数据来源,都会对这些对象模型众多而且复杂的组成结构印象深刻。但利用ADO对象模型,就可以只创建几个简单的对象和数据来源进行连接,然后从中取得所需要的数据,进行数据访问操作后保存。
ADO (ActiveX Data Objects)对象模型主要由三个对象成员:Connection、Command与Record set对象;以及三个集合对象:Errors、Parameters与Fields对象所组成。
ADO对象模型与DAO、RDO另一个较大的差异,在于某些ADO对象可以直接创建而不需依据上下层按顺序产生,比如我们可以直接创建一个Command对象而不需要先行创建该对象的上层Connection对象,ADO会在该Command对象产生时自动创建上层Connection对象。
此加油站要完成以下任务:
实现用户的登陆,以很好管理工作人员的分工。
实现系统的管理,包括管理工作人员信息,油库信息,会员信息,会员
等级信息等。
能够
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
油品购进和销售情况,剩余量等信息。
工作人员能够直接查询库存情况,会计人员能够对账目进行管理。
此系统还要能够实现数据库对个功能模块的访问。
其实现的具体任务还包括:在连接数据库后先要有登陆界面,在确认用用户身份后,符合身份的工作人员便可登陆,进入系统主界面,可以在主界面上访问个功能模块。各功能键包括:工作人员管理、油品信息管理、油品类型信息管理、会员信息管理、添加进货记录、添加销售记录、库存查询、账目管理;通过工作人员信息管理模块查询各工作人员信息;通过对油品的管理模块查询油品的单价,销售储量,存储地等,通过对会员的管理模块能查询顾客等级、花费等。
2 系统分析
2.1 用户工作流程
下面是对本企业的业务流程的描述:
图2.1系统业务流程图
2.2 用户业务需求
此系统要满足用户的如下需求:
(1)对不同工作类型的员工要能辨别其身份,根据身份限制其权限,设置完成其工作任务。
(2)当购进油时要记录油的相关信息,对不同的油放入相应的油库,同时记录其价格,储量等。
(3)要记录销售信息,同时根据销售情况对油库灯做相应的修改
(4)对不同的顾客根据其购买油量,消费金额等给其设置相应的会员等级,根据等级的不同给予不同的优惠政策
(5)对油库进行编号,不同的油库存放不同的油,可根据用户需要快速在相应油库找到所需的油。
3 系统设计
3.1 设计思想
(1)系统分成前台和后台几个相对进程,这些进程都进行集中式管理。
(2)整个系统采用模块化结构设计,并且有较强的可操作性和扩展性。
(3)采用合理的数据流设计思想,在应用系统设计中,相对独立的模块间以数据流相互连接,使各模块间的耦合性较低,方便系统运行,提高系统安全性。
3.2 系统功能结构图
根据对管理系统进行可行性分析和结构化程序设计的要求,可得到系统的总体结构如图3-1所示:
图3.1 加油站总功能模块图
加油站管理系统的分功能模块如图3.2所示:
图3.2 加油站分功能模块图
3.3模块功能设计
系统功能设计是设计一个加油站管理系统,要求满足油品管理的基本要求、油品销售管理的基本要求、工作人员管理的基本要求、油库管理的基本要求、销售管理的基本要求以及系统管理的基本要求。并且能够实现方便的扩张,满足加油站发展的需求,能够保障加油站管理数据的安全,准确对于工作人员有不同的职位,不同职位人员所拥有的工作权限也不一样,对于油有购油信息、出售情况、有的类别以及油量的多少等情况,能设置一些优惠政策,比如会员可以优惠。
本系统共包括五大模块,分别是用户登录模块、系统管理模块、经销操作模块、查询操作模块、数据库防护问模块。每个模块的功能如下:
(1)用户登陆,根据不同用户身份启用不同的职务
(2)系统管理,包括工作人员信息管理、油库信息管理、油品信息管理、会员信息、会员等级信息管理。
(3)进销操作,包括进货信息和销售信息。
(4)查询操作,包括库存查询和账目管理。
(5)数据库访问模块,提供各模块数据库操作接口。
4 系统数据库设计
4.1系统数据库的建立
数据库的设计尽量的实现与应用程序做到最低等级的耦合,按照三层模式两级联系的方式设计数据库,把数据库设计成层次清晰的,高效的实用数据库。在该系统的数据库设计方面,把数据库的设计分为四层:基本表、存储过程、触发器。其中触发器的作用是这个表修改后,自动触发到另外一个表,这样可以减少代码的编写。
因为该系统是采用三层架构设计的,可通过应用服务器的扩展来实现新功能的添加。而在该课程设计的内容定义方面,保证了数据的独立性,该系统对数据记录的操作也因为其课程设计中定义的数据操作方式和操作内容而注定不会产生脏数据及数据读写的不一致性,故在数据库设计方面采用触发器。
4.2 系统E-R图
1. 数据流图
根据系统的功能,得到该系统的数据流图,其中第一层数据流图如图4-1所示:
图4.1加油站管理系统一层数据流图
第二层数据流图如图4.2~4.4所示:
图4.2 送进购买情况
图4.3 处理顾客购油
图4.4 处理账款
2. E-R模型
根据数据流图设计E-R模型,如图4.5所示:
图4.5 加油站管理系统的总E-R图
3、将产生的E-R模型转化为关系模型如下:
工作人员(工作号,姓名,身份证号,员工类型,密码)
油库管理(油库编号,工作号)
油库(油库编号,名称,地点,容量)
油品(油品编号,名称,价格,储量,油库编号)
会员(会员编号,姓名,身份证号,等级名称,车牌号,总消费额)
会员等级(等级名称,折扣,最低消费额)
进货油品(油品编号,工作号,进货时间,油库编号,进货量,单价)
销售油品(油品编号,工作号,销售时间,油库编号,单价,客户,折扣,销售量)
4.3存储过程设计
1、创建用于油品入库的存储过程:
CREAT OR REPLACE ROCEDURE GAS_InfoAdd(
pgas_type IN number(8),
pdepot IN varchar(50),
pamount IN varchar(30),
pprice IN float ,
pget_date IN date,
pworker IN varchar(30)
)
AS
BEGIN
Insert into Gas _Info values(pgas_type,
pdepot,pamount,pprice,pprice,pget_date,pworker);
END GAS_InfoAdd;
2、创建添加工作人员的存储过程:
CREATE OR REPLACE PROCEDURE worker_InfoAdd(
pnumber IN number(8),
pname IN varchar(25),
pid IN numberr(18),
ptype IN varchar(20),
ppassword IN varchar(12)
)
AS
BEGIN
Insert into worker_Info values(pnumber,
pname,pid,ptype,ppassword
)
END worker_InfoAdd;
4.4 触发器的设计
1、创建一个触发器,实现当一个油库撤销时,修改相应的油品信息的触发器:
CREATE OR REPLACE TRRIGER UP_GAS(
BEFORE DELETE ON DEPOT FOR EACH ROW
BEGIN
Update Gastype where depot.number=Gastype.number
And number=:old number;
End UP_GAS;
4.5数据库的连接
应用程序与Oracle10g数据库的连接是通过创建ADO数据源,然后在程序中利用代码与数据库建立连接来实现的。具体实现方法是:在模块中声明调用ADO连接控件,这样便能在任何时间连接数据库了。使用ADOConnection对象连接到Oracle10g。在查询等按钮的单击事件中访问数据库。
可以使用应用程序配置文件建立一条到数据库服务器的连接,返回一个关键字ConnectionString,在实体数据链路层定义一个用于存储过程的一个基类DBdata.cs在这个基类中接受该关键字ConnectionString,使用SqlConnection连接数据库。配置文件连接数据库的代码:
。存储过程基类接受该关键字的代码:
System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString();
5系统实现
5.1 系统实现工具与支持平台
(1)用户界面:
本系统采用Microsoft Visual C++ 6.0设计,用户交互界面采用的是基于Windows的窗口界面。
(2)硬件要求:
运行本系统的硬件基本要求如下:
CPU:Intel P4及以上;
内存:1024MB及以上;
硬盘:40GB及以上。
(3)软件要求:
数据库服务器:Oracle10g。
5.2系统主要的功能界面与实现代码
下面为运行后的界面图:
1、系统的登录界面与代码:
图5.1 系统登录界面
实现代码如下:
void CgasStationDlg::OnLogin()
{
Cstring strBtnText;
m_btnLogin.GetWindowText(strBtnText);
if ( strBtnText== “登陆”) {CloginDlg loginDlg;
if (loginDlg.DoModal() != IDOK) return ;
if(!ADOSQLServer.IsValidWorkerPassword(loginDlg.m_nNumber, loginDlg.m_strPassword)) {MB_ERROR(“密码错误,登陆失败!”);return ;}
。。。。。。。。。。。
else {if (MB_QUERY(“确定要注销当前用户么?”) == IDNO)return ;
m_btnLogin.SetWindowText(“登陆”);
m_btnWorkerMgr.EnableWindow(FALSE);
。。。。。。。。。。。
m_btnLogin.EnableWindow(FALSE);}
}
2、加油站管理系统主窗口界面如下:
图5.2加油站管理系统主窗口
3、工作人员信息管理模块的界面与代码:
图5.3工作人员信息管理界面
实现代码如下:
BOOL CWorkerMgrDlg::OnInitDialog()
{
CDialog::OnInitDialog();
const char *list_column[] =
{
"编号",
"姓名",
"身份证号",
"类型",
""
};
int i=0;
while (*list_column[i] != 0x00) {
m_listWorker.InsertColumn(i, list_column[i++], LVCFMT_LEFT, 100);
}
m_listWorker.SetExtendedStyle(LVS_EX_FULLROWSELECT);
return TRUE; }
void CWorkerMgrDlg::OnAdd()
{
int nNumber = -1;
if (!ADOSQLServer.AutoAssignNumber("Worker", nNumber)) {
MB_ERROR(" 无法添加工作人员信息,可能是数据库已满!");
return ;
}
CWorkerInfoDlg workerInfoDlg;
workerInfoDlg.m_nNumber = nNumber;
if (workerInfoDlg.DoModal() == IDOK) {
if (!ADOSQLServer.AddNewWorker(
workerInfoDlg.m_nNumber,
workerInfoDlg.m_strName,
workerInfoDlg.m_strID,
workerInfoDlg.m_nWorkerType,
workerInfoDlg.m_strPassword))
{
MB_ERROR("添加工作人员信息失败!");
}
RefreshList();
}
}
void CWorkerMgrDlg::OnModify()
{
int nItem = m_listWorker.GetSelectionMark();
if (nItem == -1)
return ;
CWorkerInfoDlg workerInfoDlg;
CString strNumber = m_listWorker.GetItemText(nItem, 0);
GET_INT(workerInfoDlg.m_nNumber, strNumber);
ADOSQLServer.GetWorker(
workerInfoDlg.m_nNumber,
workerInfoDlg.m_strName,
workerInfoDlg.m_strID,
workerInfoDlg.m_nWorkerType,
workerInfoDlg.m_strPassword);
if (workerInfoDlg.DoModal() == IDOK) {
if (!ADOSQLServer.ModifyWorker(
workerInfoDlg.m_nNumber,
workerInfoDlg.m_strName,
workerInfoDlg.m_strID,
workerInfoDlg.m_nWorkerType,
workerInfoDlg.m_strPassword))
{
MB_ERROR("修改工作人员信息失败!");
}
RefreshList();
}
}
void CWorkerMgrDlg::OnRemove()
{
int nItem = m_listWorker.GetSelectionMark();
if (nItem == -1)
return ;
int nNumber;
CString strNumber = m_listWorker.GetItemText(nItem, 0);
GET_INT(nNumber, strNumber);
if (MB_QUERY("确定要删除此项么?") == IDYES) {
if (!ADOSQLServer.RemoveWorker(
nNumber))
{
MB_ERROR("删除工作人员信息失败!");
}
RefreshList();
}
}
void CWorkerMgrDlg::RefreshList()
{
m_listWorker.DeleteAllItems();
CStringArray strNumber, strName, strID, strType, strPassword;
ADOSQLServer.GetWorkers(strNumber, strName, strID, strType, strPassword);
for (int i=0;i
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
来开发系统是很有必要的,数据库的开发要避免产生读写数据时的冲突,应用程序开发遇到的问题要多参考网络上的资料,这是很有必要,在今后的系统开发中我们会把它们作为实施的重要参考。
源代码附录
7.1 系统与数据库交互代码
#include "StdAfx.h"
#include "ADODataBase_SQLServer.h"
HRESULT CADODataBase_SQLServer::Init()
{
if(FAILED(CADODataBase::Init()))
return E_UNEXPECTED;
SetProvider("sqloledb");
return S_OK;
}
_RecordsetPtr CADODataBase_SQLServer::ExecuteQuery(CString strQuery)
{
memset(m_lpQuery, 0, 1024);
strcpy(m_lpQuery, strQuery.GetBuffer(1024));
strQuery.ReleaseBuffer();
return CADODataBase::ExecuteQuery(m_lpQuery);
}
int CADODataBase_SQLServer::GetWorkers(CStringArray &strNumber, CStringArray &strName, CStringArray &strID, CStringArray &strType, CStringArray &strPassword)
{
CString strQuery;
strQuery.Format("select * from Worker");
if (!Query(strQuery)) {
return 0;
}
int nCount = 0;
while (!IsEndOfFile()) {
GetOneRow(5);
strNumber.Add(STRING(m_var[0]));
strName.Add(STRING(m_var[1]));
strID.Add(STRING(m_var[2]));
strType.Add(STRING(m_var[3]));
strPassword.Add(STRING(m_var[4]));
m_pRS->MoveNext();
nCount ++;
}
return nCount;
}
BOOL CADODataBase_SQLServer::AddNewDepot(int nNumber, CString strName, CString strLocation, float &fCapacity)
{
CString strQuery;
strQuery.Format("insert into Depot values(%d,'%s','%s',%.2f)",
nNumber,
strName,
strLocation,
fCapacity);
try {
Query(strQuery);
}
catch(...) {
return FALSE;
}
return TRUE;
}
BOOL CADODataBase_SQLServer::ModifyDepot(int nNumber, CString strName, CString strLocation, float &fCapacity)
{
CString strQuery;
strQuery.Format("update Depot set name = '%s', location = '%s', capacity = %.2f where number = %d",
strName,
strLocation,
fCapacity,
nNumber);
try {
Query(strQuery);
}
catch(...) {
return FALSE;
}
return TRUE;
}
BOOL CADODataBase_SQLServer::GetCurrentContent(int nDepotNumber, int nGasTypeNumber, float &fCurContent)
{
CString strQuery;
if (nGasTypeNumber <= 0)
strQuery.Format("select count(amount) from Storage where depot = %d", nDepotNumber);
else
strQuery.Format("select count(amount) from Storage where depot = %d and gas_type = %d", nDepotNumber, nGasTypeNumber);
if (!Query(strQuery)) {
return FALSE;
}
if (IsEndOfFile())
return FALSE;
GetOneRow(1);
if ((long)(m_var[0]) == 0) {
fCurContent = 0;
return TRUE;
}
if (nGasTypeNumber <= 0)
strQuery.Format("select sum(amount) from Storage where depot = %d", nDepotNumber);
else
strQuery.Format("select sum(amount) from Storage where depot = %d and gas_type = %d", nDepotNumber, nGasTypeNumber);
if (!Query(strQuery)) {
return FALSE;
}
if (IsEndOfFile())
return FALSE;
GetOneRow(1);
fCurContent = (float)m_var[0];
return TRUE;
}
BOOL CADODataBase_SQLServer::GetDepot(int nNumber, CString &strName, CString &strLocation, float &fCapacity)
{
CString strQuery;
strQuery.Format("select * from Depot where number = %d", nNumber);
if (!Query(strQuery)) {
return FALSE;
}
if (IsEndOfFile())
return FALSE;
GetOneRow(4);
strName = STRING(m_var[1]);
strLocation = STRING(m_var[2]);
fCapacity = (float)(m_var[3]);
return TRUE;
}
BOOL CADODataBase_SQLServer::GetDepotByName(CString strName, int &nNumber, CString &strLocation, float &fCapacity)
{
CString strQuery;
strQuery.Format("select * from Depot where name = '%s'", strName);
if (!Query(strQuery)) {
return FALSE;
}
if (IsEndOfFile())
return FALSE;
GetOneRow(4);
nNumber = (long)(m_var[0]);
strLocation = STRING(m_var[2]);
fCapacity = (float)(m_var[3]);
return TRUE;
}
BOOL CADODataBase_SQLServer::RemoveDepot(int nNumber)
{
CString strQuery;
strQuery.Format("delete from Depot where number = %d", nNumber);
Query(strQuery);
return TRUE;
}
int CADODataBase_SQLServer::GetDepots(CStringArray &strNumber, CStringArray &strName, CStringArray &strLocation, CStringArray &strCapacity)
{
CString strQuery;
strQuery.Format("select * from Depot");
if (!Query(strQuery)) {
return 0;
}
int nCount = 0;
while (!IsEndOfFile()) {
GetOneRow(4);
strNumber.Add(STRING(m_var[0]));
strName.Add(STRING(m_var[1]));
strLocation.Add(STRING(m_var[2]));
strCapacity.Add(STRING(m_var[3]));
m_pRS->MoveNext();
nCount ++;
}
return nCount;
}
BOOL CADODataBase_SQLServer::GetMember(int nNumber, CString &strName, CString &strID, CString &strCarNumber, float &fExp)
{
CString strQuery;
strQuery.Format("select * from Member where number = %d", nNumber);
if (!Query(strQuery)) {
return FALSE;
}
if (IsEndOfFile())
return FALSE;
GetOneRow(5);
strName = STRING(m_var[1]);
strID = STRING(m_var[2]);
strCarNumber = STRING(m_var[3]);
fExp = (float)(m_var[4]);
return TRUE;
}
BOOL CADODataBase_SQLServer::GetMemberAgio(int nNumber, float &fAgio)
{
CString strQuery;
float fExp;
strQuery.Format("select expenditure from Member where number = %d", nNumber);
if (!Query(strQuery)) {
return FALSE;
}
if (IsEndOfFile())
return FALSE;
GetOneRow(1);
fExp = (float)(m_var[0]);
CStringArray strTemp, strAgio, strExp;
int nCount = GetMemberLevels(strTemp, strTemp, strAgio, strExp);
if (nCount <= 1) {
fAgio = 1;
return TRUE;
}
float *agio = new float[nCount];
float *exp = new float[nCount];
fAgio = 1.0;
for (int i=0;i= exp[i]) {
fAgio = agio[i];
break;
}
}
delete[] agio;
delete[] exp;
return TRUE;
}
BOOL CADODataBase_SQLServer::AddNewGasType(int nNumber, CString strName, float &fPrice)
{
CString strQuery;
strQuery.Format("insert into GasType values(%d,'%s', %.2f)",
nNumber,
strName,
fPrice);
try {
Query(strQuery);
}
catch(...) {
return FALSE;
}
return TRUE;
}
BOOL CADODataBase_SQLServer::GetGasTypeByName(CString strName, int &nNumber, float &fPrice)
{
CString strQuery;
strQuery.Format("select * from GasType where name = '%s'", strName);
if (!Query(strQuery)) {
return FALSE;
}
if (IsEndOfFile())
return FALSE;
GetOneRow(3);
nNumber = (long)(m_var[0]);
fPrice = (float)(m_var[2]);
return TRUE;
}
BOOL CADODataBase_SQLServer::RemoveGasType(int nNumber)
{
CString strQuery;
strQuery.Format("delete from GasType where number = %d", nNumber);
Query(strQuery);
return TRUE;
}
BOOL CADODataBase_SQLServer::AddNewMemberLevel(int nNumber, CString strName, float &fAgio, float &fExp)
{
CString strQuery;
strQuery.Format("i