开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2010.07.14
摘要:小型超市管理系统在现代社会中的应用十分广泛,它是用delphi开发的基于windows的小型数据库管理软件。后台数据库的设计采用SQLserver2000,这些流行软件的应用也使系统更容易维护。该系统使用结构化方法,按照系统调查、系统分析、系统设计、系统实施的步骤,采用结构化的编程方法而完成的。在设计中,对系统总体方案的设计,采用了“自上而下”的方法,而对于信息系统具体业务采用了“自下而上”的方法。尤其是数据窗口这一方便而简洁操纵数据库的智能化对象,从而建立一套完善科学的管理信息系统,对超市进行进货、销售发货、库存等实现全面、动态、及时的管理。因此,该设计的方案基本上满足了系统的业务需求,具有一定的可用性。
关键词:数据表;SQLserver2000;控件绑定ODBC数据源
1、需求分析
1.1应用背景
最初的超市资料管理,都是靠人力来完成的。但近几年我国超市经营规模日趋扩大,销售额和门店数量大幅度增加,而且许多超市正在突破以食品为主的传统格局,向品种多样化发展。小型超市在业务上需要处理大量的库存信息,还要时刻更新产品的销售信息,不断添加商品信息,并对商品各种信息进行统计分析。因此,在超市管理中引进现代化的办公软件,实现超市庞大商品的控制和传输,从而方便销售行业的管理和决策,为超市和超市管理人员解除后顾之忧。
1.2设计目标
开发这个系统的目的就是帮助超市管理部门提高工作效率。通过本管理系统软件,能帮助超市工作人员利用计算机,极为方便的对超市的有关数据进行管理、输入、输出、查找等有关操作,使杂乱的超市数据能够具体化、直观化、合理化等。
2、总体方案设计
2.1系统的目标
小型超市管理系统能减少很多不必要的资源,不用象以前那样用冗余的纸张式管理。大大节省了管理人员的工作量,并且计算机的存储与系统快速查询功能大大提高了,提高管理人员的效率。
方便快捷的操作界面,提高工作效率。
2.2系统处理流程
1.启动系统,激活登陆口令界面;
2.通过验证后,对系统进行初始化;
3.进入系统,通过事件驱动机制激活相应的功能模块,并执行相应的功能;
4.通过关闭系统事件,激活关闭系统模块,退出系统。
系统处理流程如图2.2所示:
启动系统
登陆口令界面
否
密码
是
退出系统
通过事件驱动机制激活相应的功能模块,并执行相应的功能
图2.2系统处理流程图
2.3系统功能模块设计
通过对上面有关小型超市管理系统的功能需求分析以后,可知小型超市管理系统的功能有:系统管理,商品管理,销售管理。系统功能菜单按以下方法进行设计。
小型超市管理系统
系统管理
用户管理
备份管理
------------
商品管理
商品报表
销售管理
销售商品
销售报表
销售历史
今日盘点
系统功能模块设计如图2.3所示:
图2.3系统功能模块设计层次图
2.4系统设计分析
用户管理:添加用户账号,密码,类型等信息。
备份管理:数据库的备份,数据库还原。
商品管理:商品的信息录入,包括商品的编号、名称、单价、单位等。
销售管理:商品的销售信息,销售金额等。
今日盘点:商品的当日销售总额。
3、数据库设计
作为Windows数据库家族中出类拔萃的成员,SQLServer2000这种关系型数据库管理系统能够满足各种类型的企业客户和独立软件供应商构建商业应用程序的需要。SQL的主要功能之一是实现数据库查询。你使用查询来取得满足特定条件的信息。在逻辑查询中,你可以包括特殊的运算符如AND、OR和NOT,你使用这些运算符来选择特定的记录。例如,你可以用AND来限制查询结果。SQL的另一主要功能是数据更新,它通过INSERT、DELETE、UPDATE等语句实现。另外,利用SQLServer我们可以很轻松地进行建表、维护等数据库操作。[2]
3.1系统数据流程图描述
系统数据流程图分别由图3.1所示。
超
市
管
理
人
员
商品基本信息
数
据
库
商品销售信息
商品销售历史信息
图3.1浏览与录入管理
3.2数据字典:
是关于数据的信息的集合,对数据流程图中的各个元素做完整的定义与说明。
下面是超市管理系统几个数据元素的字典卡片与具体数据卡片的含义:
名称:商品信息表
描述:商品的基本信息
定义:编号+名称+单价+单位+货架号+库存+销售
名称:商品销售报表
描述:商品销售情况
3.3系统设计具体实现
目的:设计系统结构,根据需求分析给出的功能得出系统体系结构。如划分模块。
目标:通过本系统软件,能帮助超市管理人员利用计算机,快速方便的对商品信息管理进行维护、输入、输出、查找的所需操作。
运行环境
操作系统:Windows2000/XP或更高的版本。
支持环境:BorlandDelphi7。
3.4模块具体分析
商品信息数据录入模块:主要用于商品基本信息的录入与初始化。实体E-R图
如下:
商品信息录入
商品名称
商品单价
单位
商品库存
商品销量
3.4商品信息数据E-R图
3.5出错处理设计
本系统采用了典型的人-机对话模式,若操作失败则弹出对话框(如:出错信息等)。
出错处理对策:用户可以根据弹出的对话框的提示信息进行相应的处理。
安全保密设计:本系统设计了密码验证登陆窗口,具有权限控制。
3.6程序逻辑
模块功能实现的算法流程图(数据录入)。
输入信息
条件
显示提示信息
退出
不符合条件
图3.6数据录入模块流程图
4.1功能模块简介4.1.1系统功能维护模块用户管理:设定本系统的系统操作员,可以一个也可以多个管理员。口令管理:在不退出系统的情况下,凭借原来的密码,可以修改管理员密码。退出系统:在使用完系统之后,可以退出系统。
4.1.2基本资料管理模块商品资料管理:商品资料的添加、删除、编辑。资料管理:新增、删除和编辑。初期建帐:对采集到的数据在后台进行数据库管理。
4.1.3商品流通管理模块
进货管理:当超市进货的时候,分为以下几个步骤:商品编号录入后台数据库在价格定义模块中使商品编号码和价格相对应,即使商品编号码一个码一个价格,保存之后,后台数据库中库存自动更新。
库存管理:当进货时,库存自动增加,当销售时,库存自动减少。
库存报警:设定库存的上限和下限值之后,当库存不符合要求的时候,系统报警。盘点管理:系统自动产生盘点信息。4.1.4销售实时控制模块
由于超市要实时交易,所以对交易有一个界面实时控制商品的流出,当操作员扫描一个物品的条形码之后,输入数量,再扫描下一个物品,输入数量,直到客户需要的物品输入完之后,点击一个按钮,系统自动产生每个货物应付款,总应收款,实收款和找零信息,并控制打印机打印一张热敏纸收据。此时,在系统的后台数据库中自动减少相应库存。
4.1.5报表生成模块
报表生成模块将担当起智能化的报表生成的任务。此模块将利用SQLserver2000和数据库功能,一步一步地完成所要求的动态统计结果。可以完成商品基本信息报表、销售报表等不同条件下任意组合而成的报表,能够以快速、准确等优点取代人工操作,提高了管理工作效率。
4.1.6查询模块可以根据某个条件进行查询,如:日期\产品等,查询日销售量\产品销售量等。
4.1.7本软件可以实现的功能如下:用户管理,包括用户的添加、删除、密码和权限的修改;
商品管理,商品的添加、删除、修改、销量统计和分类查询;商品报表;
销售商品:通过输入货物编号和数量实现商品销售,并提供库存判断、找零计算等功能;销售报表和销售历史;今日盘点,告诉用户当天的销售额是多少;
5、系统运行与调试
5.1数据复制
数据复制实际上是为了提高查询处理的本地性,对同一数据复制多个副本,根据需要将副本存放在不同的电脑中.
数据信息包括商品名、库存量、销售量、商品单价、生产日期、生产厂家等.通过事务提交的方式保证避免由于其它一些电脑故障造成的在数据库更新过程中数据的不一致.
5.2.数据库备份
对数据库进行备份是一项很重要的工作,本系统采用在启动数据上传模块的同时自动备份数据库的方法,从而既提高了数据库的可靠性和安全性,同时也减轻了数据库管理员的工作,降低了备份的复杂性.当数据库中的数据遭到破坏需要恢复时,可以从自动备份中恢复.
本系统利用SQLDMO(DatabaseManagementObject)实现数据库备份.SQLDistributedManagementFramework
(SQL—DMF,即SQL分布式管理框架)是一组集成API和服务,用与管理SQLServer.SQL_DMO是SQL_DMF中的一个组件.本系统实现数据库备份程序示例如下:
DimmySvrAsNewSQLDMO.SQLServer
DimmyDBAsSQLDMO.Database
DimmyBKAsNewSQLDMO.Backup
DimmyDvAsNew
SQLDMO.BaekupDevice
SetmySvr=NewSQLDMO.SQLServer
mySvr.Connect”DAQING”,”8a”,”1111”
生成SQLSerwr对象,传递服务器名、用户名和口令
SetmyDB=mySw.Databases(”DAQING”)
MyDvType=SQLDMODevice_DiskDump备份设备的类型
myDv.Name=”ZxDB_baekup”
myDv.Physical.location=”D:\中心数据库备份\ZxDB—back.Up”’备份设备的逻辑位置
OnErrorResumeNext
mySvr.BackupDevices.AddmyDv
OnErrorGoTo0
myBK.Database=”DAQING”
myBK.Devices=“ZxDB_backup”
myBK.Initialize=True
myBK.SQLBackupmySvr
mySvr.
BackupDcwices.Remove”DB_backup”
mySw.DisConnect
5.3系统测试
5.3.1测试的意义
5.3.2本系统的测试结果
各子系统的测试
进入主界面后,对不同的子系统进行操作。先正确输入各项信息,点击运行按钮后,发现系统运行正常,结果显示正确;然后错误输入某些信息,或者进行某些错误操作,发现有的能够给出错误提示,并返回让用户重新操作,有的则直接显示错误信息,而后自动退出系统。这说明软件的某些地方容错性不够完善,影响了它的易操作性。于是着手进行修改。后重新进行测试,结果显示软件的容错性基本达到了用户要求。经过对各个子系统全部功能项的不同测试,结果显示以基本达到设计要求。
6.结束语
经过1个多月的调查与研究,小型超市管理系统基本完成。它的特点是实时性强,能够帮助超市管理人员及时方便地管理超市信息。但由于开发者水平有限,仍存在系统功能不够完善,设计步骤欠完整等不足,这些需要在今后的设计中加以改进。
参考文献
[1]许志清,赵博.精通SQLSERVER2005数据库系统管理.[M].北京:北京电子工业出版社,2006
[2]王晟,马里杰SQLServer数据库开发经典案例解[M].北京:清华大学出版社,2006
[3]常利,肖立洪Delphi6编程--数据库篇[M].中国电力出版社,2002
附录:主要程序清单
用户登陆
unitUnitLogin;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,ExtCtrls,StdCtrls,ADODB,jpeg,DB;
type
TForm1=class(TForm)
Image1:TImage;
Label1:TLabel;
Label2:TLabel;
Edit1:TEdit;
Edit2:TEdit;
Image2:TImage;
Image3:TImage;
Image4:TImage;
Image5:TImage;
ADOQuery1:TADOQuery;
procedureFormCreate(Sender:TObject);
procedureImage5MouseDown(Sender:TObject;Button:TMouseButton;
Shift:TShiftState;X,Y:Integer);
procedureImage4Click(Sender:TObject);
procedureEdit2KeyPress(Sender:TObject;varKey:Char);
procedureEdit1KeyPress(Sender:TObject;varKey:Char);
procedureImage1MouseMove(Sender:TObject;Shift:TShiftState;X,
Y:Integer);
procedureImage2Click(Sender:TObject);
procedureImage3Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Form1:TForm1;
LogTimes:Integer;
UserType:String;
ExeRoot:String;
DataFile:String;
UserName:String;
implementation
usesUnitMain;
{$R*.dfm}
procedureTForm1.FormCreate(Sender:TObject);
begin
LogTimes:=0;
procedureTForm1.Image5MouseDown(Sender:TObject;Button:TMouseButton;
application.Terminate;
procedureTForm1.Image4Click(Sender:TObject);
if(edit1.Text<>'')and(edit2.Text<>'')then
ChDir(ExtractFilePath(Application.ExeName));
ChDir('..');
ExeRoot:=GetCurrentDir;
DataFile:=GetCurrentDir+'\Data\dzyv1.mdb';
ADOQuery1:=TADOQuery.Create(self);
ADOQuery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;DataSource='+DataFile+';PersistSecurityInfo=False;';
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select*fromt_userwhereuser_name="'+edit2.Text+'"anduser_pass="'+edit1.Text+'"');
ADOQuery1.Open;
ifADOQuery1.Eofthen
LogTimes:=LogTimes+1;
ifmessagebox(handle,'您填写的用户或密码有错误!是否重新输入?','出错提示',mb_iconinformation+mb_okcancel)=IDcancelthenapplication.Terminate;
ifLogTimes>=3then
end
else
UserType:=ADOQuery1.FieldByName('user_type').AsString;
UserName:=ADOQuery1.FieldByName('user_name').AsString;
ADOQuery1.Free;
Form1.Hide;
form2.ShowModal;
messagebox(handle,'您没有填写用户和密码!','出错提示',mb_iconinformation+mb_ok)
procedureTForm1.Edit2KeyPress(Sender:TObject;varKey:Char);
ifkey=#13thenEdit1.SetFocus;
procedureTForm1.Edit1KeyPress(Sender:TObject;varKey:Char);
ifkey=#13thenImage4Click(self);
procedureTForm1.Image1MouseMove(Sender:TObject;Shift:TShiftState;X,
if(ssleftinshift)then
releasecapture;
perform(wm_syscommand,$f012,0);
procedureTForm1.Image2Click(Sender:TObject);
procedureTForm1.Image3Click(Sender:TObject);
application.Minimize;
end.
数据库还原,备份
unitUnitDbBuckup;
Dialogs,ComCtrls,Gauges,ExtCtrls,StdCtrls;
TFrameDbBuckup=class(TFrame)
GroupBox1:TGroupBox;
SaveDialog1:TSaveDialog;
Gauge1:TGauge;
OpenDialog1:TOpenDialog;
usesUnitLogin;
procedureTFrameDbBuckup.Image2Click(Sender:TObject);
i:integer;
try
ifnotsavedialog1.Executethenexit;
ifFileExists(savedialog1.FileName+'.mdb')then
ifMessagebox(handle,'存在数据库重名,是否覆盖?','存盘选项',mb_iconquestion+mb_yesno)=IDNothenExit;
fori:=Gauge1.MinValuetoGauge1.MaxValuedo
Gauge1.Progress:=i;
CopyFile(PChar(DataFile),PChar(SaveDialog1.FileName+'.mdb'),True);
Messagebox(handle,'数据库备份成功!','备份数据',mb_iconinformation+mb_ok);
except
Messagebox(handle,'警告:数据库备份失败!','存盘错误',mb_iconwarning+mb_ok);
procedureTFrameDbBuckup.Image3Click(Sender:TObject);
ifnotopendialog1.Executethenexit;
ifMessagebox(handle,'警告:现有数据有可能丢失,确定还原?','确定还原',mb_iconquestion+mb_yesno)=IDNothenExit;
Messagebox(handle,'数据库还原成功!','还原数据',mb_iconinformation+mb_ok);
Messagebox(handle,'警告:数据库还原失败!','读取错误',mb_iconwarning+mb_ok);
商品信息
unitUnitProdList;
Dialogs,Grids,DBGrids,DB,ADODB,ExtCtrls,StdCtrls,Mask,DBCtrls;
TFrameProdList=class(TFrame)
DataSource1:TDataSource;
DBGrid1:TDBGrid;
DBEdit1:TDBEdit;
DBEdit2:TDBEdit;
DBEdit3:TDBEdit;
Label3:TLabel;
DBEdit4:TDBEdit;
Label4:TLabel;
DBEdit5:TDBEdit;
Label5:TLabel;
Image6:TImage;
GroupBox2:TGroupBox;
Label6:TLabel;
Image7:TImage;
Label7:TLabel;
procedureImage5Click(Sender:TObject);
procedureImage6Click(Sender:TObject);
procedureImage7Click(Sender:TObject);
functionIsAllNum(s:string):bool;
procedureLabel7Click(Sender:TObject);
procedureDBEdit1KeyPress(Sender:TObject;varKey:Char);
procedureDBEdit2KeyPress(Sender:TObject;varKey:Char);
procedureDBEdit3KeyPress(Sender:TObject;varKey:Char);
procedureDBEdit4KeyPress(Sender:TObject;varKey:Char);
procedureDBEdit5KeyPress(Sender:TObject;varKey:Char);
procedureTFrameProdList.Image2Click(Sender:TObject);
{添加商品}
Image2.Enabled:=False;
Image3.Enabled:=False;
Image4.Enabled:=False;
DBEdit1.Color:=clWhite;
DBEdit2.Color:=clWhite;
DBEdit3.Color:=clWhite;
DBEdit4.Color:=clWhite;
DBEdit5.Color:=clWhite;
DBEdit1.Enabled:=True;
DBEdit2.Enabled:=True;
DBEdit3.Enabled:=True;
DBEdit4.Enabled:=True;
DBEdit5.Enabled:=True;
Image5.Visible:=True;
Image6.Visible:=True;
DBEdit1.SetFocus;
ADOQuery1.Append;
procedureTFrameProdList.Image5Click(Sender:TObject);
{提交数据}
if(DBEdit1.Text<>'')and(DBEdit2.Text<>'')and(DBEdit3.Text<>'')and(DBEdit4.Text<>'')and(DBEdit5.Text<>'')then
ADOQuery1.Post
ifmessagebox(handle,'您的输入不正确(空值),放弃输入?','检查输入',mb_iconquestion+mb_yesno)=IDyesthen
ADOQuery1.Cancel
exit;
Image2.Enabled:=True;
Image3.Enabled:=True;
Image4.Enabled:=True;
DBEdit1.Color:=$00FFF0DC;
DBEdit2.Color:=$00FFF0DC;
DBEdit3.Color:=$00FFF0DC;
DBEdit4.Color:=$00FFF0DC;
DBEdit5.Color:=$00FFF0DC;
DBEdit1.Enabled:=False;
DBEdit2.Enabled:=False;
DBEdit3.Enabled:=False;
DBEdit4.Enabled:=False;
DBEdit5.Enabled:=False;
Image5.Visible:=False;
Image6.Visible:=False;
procedureTFrameProdList.Image3Click(Sender:TObject);
ifmessagebox(handle,'删除的商品不能被恢复,是否删除?','确认删除',mb_iconquestion+mb_yesno)=IDyesthenADOQuery1.Delete;
procedureTFrameProdList.Image4Click(Sender:TObject);
{修改用户}
ADOQuery1.Edit;
procedureTFrameProdList.Image6Click(Sender:TObject);
{放弃提交}
ADOQuery1.Cancel;
procedureTFrameProdList.Image7Click(Sender:TObject);
sqlstr:string;
ifEdit1.Text<>''then
sqlstr:='select*fromt_prodwhereprod_namelike"%'+Edit1.Text+'%"';
ifIsAllNum(Edit1.Text)thensqlstr:=sqlstr+'orprod_id='+Edit1.Text;
ADOQuery1.Close;
ADOQuery1.SQL.Add(sqlstr);
messagebox(handle,'请输入查询条件!','检查输入',mb_iconwarning+mb_ok)
procedureTFrameProdList.Edit1KeyPress(Sender:TObject;varKey:Char);
ifkey=#13thenImage7Click(self);
functionTFrameProdList.IsAllNum(s:string):bool;
fori:=1ToLength(s)do
if(s[i]<'0')or(s[i]>'9')then
IsAllNum:=False;
Exit;
IsAllNum:=True;
procedureTFrameProdList.Label7Click(Sender:TObject);
sqlstr:='select*fromt_prod';
procedureTFrameProdList.DBEdit1KeyPress(Sender:TObject;varKey:Char);
ifkey=#13thenDBEdit2.SetFocus;
procedureTFrameProdList.DBEdit2KeyPress(Sender:TObject;varKey:Char);
ifkey=#13thenDBEdit3.SetFocus;
procedureTFrameProdList.DBEdit3KeyPress(Sender:TObject;varKey:Char);
ifkey=#13thenDBEdit4.SetFocus;
procedureTFrameProdList.DBEdit4KeyPress(Sender:TObject;varKey:Char);
ifkey=#13thenDBEdit5.SetFocus;
procedureTFrameProdList.DBEdit5KeyPress(Sender:TObject;varKey:Char);