资源描述
安徽财经大学信息工程学院本科毕业设计
引言
随着现代图书流通时常竞争的愈演愈烈,如何以一种新的管理方式提高图书流通信息的反馈速度,降低存储占用,加快资金周转,提高工作效率,已经成为图书企业提高竞争力的关键所在。特别是数据库中的数据一致性问题更应引起人们的注意,试想:如果数据库中的数据都不一致,更别想系统能够正确的运行。
1 业务概述
1.1 传统业务处理模式介绍
在传统模式下,当一个人进入一家图书类超市以后。往往业务流程是这样的:顾客选择好自己需要的图书,然后拿到收银台。在收银台,收银员回记录下顾客购买的图书的一些相关信息,然后计算出该顾客购买的图书总的价值。当顾客付完帐后,给出找零,这样一笔买卖算是做完了。当一天的销售工作结束以后,下面的工作就是整理这天的销售情况,并且根据这些总结出一些经验,进而为以后的管理做好准备。若是要进行某段时间内的统计信息,那么工作量是相当的大。
1.2 现有信息系统应用情况
图书管理系统是典型的管理信息系统,是一个图书零售商店不可缺少的管理手段,它的管理信息对于图书零售商店的决策者和管理者来说都至关重要,所以图书管理系统应该能够为图书零售商店的用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:效率低、保密性差、检索烦琐等;另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。特别是随着管理信息系统的逐步成熟,使得计算机的数据处理效率大大提高,而且还由于有数据库和各种经济管理模型的支持才能够向企业的各级领导提供可用于决策企业的过去、现在和未来趋势的各种信息。
作为计算机应用的一部分,使用计算机对图书信息进行管理,具有着手工管理所无法比拟的优点,例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率,使得管理科学化、正规化,也是与世界接轨的重要条件。
因此,开发这样一套管理信息系统软件成为很有必要的事情,在下面的各章中我们将以开发一套图书管理系统为例,谈谈其开发过程和所涉及到的问题及解决方法。
2 系统需求
2.1 系统总体需求
本系统主要是为了满足图书行业不断增长的业务需要,降低从事该行业的人的工作量。对于一个书店的管理人员来说,DBA可先给予一个管理员级别帐号,有了这个管理员级别的帐号以后,管理员就可以根据自己商店内部的需要来增加新的帐号。在增加新的帐号的时候,有的级别底,有的则比较高。高级别参与的事务就多,而底级别的参与到的事务就少。当填加一个用户以后,是不可以把他从表中删除出去的,只能把该帐号冻结,当再需要的时候,可以将它激活。不同级别的用户拥有不同的权限。对于管理员级别的用户,他可以做的是管理工作:用户管理、销售管理、库存查询和进货提示、折扣管理、类别管理、图书信息管理。对于管理库存的人员,他的主要工作是管理库存以及查询库存中各种图书。而对于收银人员,他可以干的这能是收银范围以内的工作。在系统登陆后,系统能够按照数据库中的信息判断出是属于哪一类用户,进而给出相应的操作。对于所以的用户他们都有自己的密码,所以人都能够修改。对于管理人员,则更应该有更高的权限。
在一个书店开始营业前,首先必须有入库操作。而入库前,还要将某些图书基本信息添入数据库。在入库时,操作员必须先提交一份合理的入库单据,然后录入到数据库中。在该单据中,有些项目是必须填写的,如果这些项目没有填写,那么这个入库操作是不可以完成的。
在入库操作完成以后,书库中已经有了一些书,这个系统已经可以运行了,但是商店还是不能运用这个软件来管理,因为一些书籍中的其他数据还没有完全添加到数据库中。售价就是其中一类信息。在确定售价以后,图书的一些基本信息算是已经齐全了,下面就可以运行该系统了。
开始运行该系统以后,当一名顾客来到柜台以后,把书交给收银员。收银人员则输入书号,系统应该能够从数据库中提取出该书籍的相关信息。然后计算出价格(折扣后),用户付款以后,系统计算出找零。如果给的钱不够,那么这本书是不能出售的。如果能够完成该次交易,那么相应的库存信息就应该修改。对于买了多本书的顾客,也能够区分出那一本有没有成功售出。
一段时间以后,系统内已经有了相当数量的销售、库存数据。此时,管理人员就要能够从这些数据中找到自己想要的数据。
2.2 系统功能需求
(1)销售管理
系统处理销售业务时,应该能通过输入图书信息,然后给出该图书的一些信息,让用户能够直观的看到他/她所购买的图书的一些情况。当图书拿到收银台去后,如果能完成收银,则能计算出本次的业务的金额,并且打印出表单。如果没有完成,则应该能给出哪一本或则几本书没有成功。
销售结束以后就是销售统计,能够统计出一段时间内各书、各类书的销售情况。并且能够提示某些的是热门还是冷门。
(2)图书信息管理
当一个客人到商店以后,也许他/她不知道自己要什么样的书。这种情况下,系统就应能够给出当前的热门图书,或者让他/她能查询到自己要的书的信息。他/她可以输入书名、书号、书的类别来查找到自己想要。若记不全自己想要图书的全部信息,也可以通过模糊查询来实现。
(3)用户管理
对于管理用户来说,他/她有权决定一个用户是什么样级别,处于什么样的状态,他的密码;甚至能够决定其名字。当一个认为一个用户暂时不必使用系统就将其冻结,需要的时候再解冻。当一个人离开后,那么他在该数据库中的记录就要删除。
(4)库存管理
管理库存是仓库管理人员的事。他/她能够干的事有入库、库存信息查询以及进货提示。当有一批或来了之后,就要求把这批书提进库。这里的库涉及到两个库:一个是实际的库,另一个虚拟的数据库。如果提交的信息不满足要求,则不允许入库。在提交一类相同的书以后,可以迅速的清空所有内容准备下一次录入。
也许管理员还想要查询相关的信息,可以通过书名、书号、图书名字缩写。这些查询条件可以是全名,也可以是开头的几个字。书卖到一定的时间以后,库存就有可能变的很小,这时需要进货。系统必须能够给出需要进货的图书的一些信息,还能显示它现在的库存,以方便管理者根据实际情况来决定进多少。
(5)类别管理以及折扣管理
这两项管理功能都只有管理员级别的用户可以使用,它们的使用都是涉及到销售情况的。对于一本书,或是一类书,它的销售情况有可能是因为它的折扣不合理,也有可能是图书摆放的位置不合理。通过改变折扣和类别就能够改变这两项。
一批书在入库的时候就可以归类和给订折扣,也可以在后期编辑过程中改变这写选项。
2.3 系统性能需求
系统的反映速度应该比较快,在每次用户做了一次操作以后,系统应能够在5秒内完成操作并且给出提示。系统应该使用起来很方便,能快速从他能使用是一个功能模块快速的切换到另一个模块。
2.4 其他需求
系统能够适应将来的要求,能够增加扫描仪的接口。
3 系统数据分析与设计
3.1 系统数据分析
系统中涉及到的主要名词有:图书、用户级别、售价、数量、仓库、类别、折扣、书名、书号、销售情况、帐号等等。主要的动词有:入库、销售、库存查询、销售统计、收银等等。从中可以发现一些规律:比如说图书要入库,图书要销售,图书销售过后要统计。用户拥有用户级别,图书具有数量信息,图书也有类别和折扣。用户拥有帐号,用户可以做收银工作、统计数据等等。
图书都有自己的编号和名字、类别以及价格。对于书店内的图书,它们不仅有定价,还应该有售价。如果要涉及到折扣和类别管理,则应该添加两个实体:折扣与类别。每一个类别拥有自己固定的折扣。这样管理人员就能够管理类别与折扣了。图书入库后,如果需要查找,应该能够找到,所以库存管理中也有一个表示能够唯一的定位一本书。既然要看到库存信息和进货提示功能,那么库存中显然需要数目信息。具体如下:
实体有:图书、用户、折扣、类别、销售、入库管理、库存管理。
属性:
图书:{图书号,图书名,名字缩写,类别,定价,售价,备注}
用户:{用户名,口令,级别,状态}
折扣:{类别,折扣名}
类别:{类别号,类别名}
入库管理:{书号,入库时间、操作员、数目}
库存管理:{书号、数目}
3.2系统数据库设计
3.2.1 系统数据库设计环境配置说明
MICROSOFT 下 SQL2000
3.2.2 数据表及其结构
loader表
用途
记录登陆用户信息
字段名
类型
长度
键
中文名
备注
username
Varchar
10
主键
用户号
password
Varchar
10
口令
thelevel
Int
4
用户级别
BOOK表
记录各个书籍的信息
字段名
类型
长度
键
中文名
备注
Book_id
char
10
主键
书号
Book_name
Varchar
30
书名
shortening
Varchar
10
书名缩写
Category_id
char
10
类别号
Orderprice
Money
8
定价
默认为10
Salesprice
Money
8
售价
默认为10
Remark
Text
16
备注
Category表
记录图书类别信息
字段名
类型
长度
键
中文名
备注
Category_id
Char
10
主键
类别号
Category_name
Char
10
类别名
Discount 表
记录各类别折扣信息
字段名
类型
长度
键
中文名
备注
discount_id
Char
10
主键
类别号
discount_name
Char
10
类别名
Inhouse_manage表
管理入库信息
字段
类型
长度
键
中文名
备注
Book_id
Char
10
主键
书号
Intime
Datetime
8
入库时间
默认为当前时间
Operator
Char
10
操作员
Number
Int
4
入库数量
默认为0
Sales表
记录销售信息
字段
类型
长度
键
中文名
备注
Salesid
Char
10
主键
销售号
Bookid
Char
10
书号
Salesprice
Money
8
售价
默认为10
Number
Int
4
数目
默认为1
Moneysum
Money
8
总金额
默认为10
Selltime
Datetime
8
销售时间
默认为当前时间
Warehouse_manage表
管理库存信息
字段
类型
长度
键
中文名
备注
Book_id
Char
10
主键
书号
number
Int
4
数量
默认为1
4 系统功能分析与设计
4.1 系统功能结构分析
本系统主要的功能有:销售管理、库存管理、其他管理、用户管理。具体的功能见下面的表:
4.2 系统业务流程分析
该信息系统主要的使用者有管理人员、收银人员和仓库管理人员。他们的身份不同从系统获取的数据也就不同,当然他们能够录入系统的数据也自然不同。
下面是第二层数据流图:
下面是入库管理的子模块———库存信息查询:
管理员输入查询条件,系统根据这些查询条件到库存信息视图中找到所需要的数据信息,并将这些数据信息呈现给管理员看。
数据流图
下面是入库管理入库
管理员拿着入库的书要入库,填写了入库信息后,系统首先要将图书信息录入图书表,再将某些信息录入仓库管理表,最后在入库管理表中写下这次入库的一些信息。
数据流图:
销售管理之销售统计:
首先是管理人员录入查询的条件,进入系统以后,先要到图书表中取得图书信息,再去销售表中取得销售情况,然后两者比对,得出所要查询的图书的销售情况。
数据流图:
销售管理之收银:
收银员拿到顾客给他的图书,将图书号和数量录入系统后,系统自动取出该图书信息;包括名字、折扣等信息。将这些信息显示给顾客看过以后,并根据这些信息计算出该顾客所购买的图书的总金额。顾客付过款后,系统修改
库存里面的数目,并且将销售情况存入数据库。系统打印出表单,从而这笔交易完成。
折扣管理
不同类别的书拥有不同的折扣,一些书如果销售的不好,也许是一开始管理人员在定位这本书的类别是出了一些偏差,从而造成没有引起读者足够的注意。
类别管理
类别信息输入系统以后,系统根据这些数据,将一些修改录入数据库。
4.3 系统应用架构设计
4.4 系统功能模块实现说明
1:用户管理
该模块主要的作用:一是方便图书类企业管理自己的企业,二是方便系统管理员管理系统。主要的子模块有:添加用户、修改用户信息、冻结用户帐号、用户帐号的解冻。当业务需要,会有新的人员来使用系统,系统管理员就回增加新的用户。当有老的人员离开后,他的帐号就应该被冻结。如果再回来就可以用解冻操作来完成解冻,解冻过后的用户帐号与他被封之前的级别是相同的。有的人虽然没有离开,但是他的职能有了变化,所以他在系统中的使用情况就应该有所变化,来完成这步操作的显然是管理员用户。
2:销售管理
系统接受了收银员录入的数据,然后有系统管理人员来使用或者从这些数据中找到有用的信息。收银员将图书的识别信息输入后,系统会从数据库中取出数据并且展示给使用者看。计算完一次买卖的金额过后,可以选择打印凭据,也可以不打印。系统管理人员就可以使用录入的数据了。可以查询到一定时期内,某本或者全部图书的销售情况,并且可以打印报表。
实现如下:
收银:
{完成要做的主要有下列各种操作:1:提交数据到数据库;
........................2:初始化各种参数:............
........................包括交易成功笔数的STRINGGRID2.ROWCOUNT,....
....................以及各种输入控件的初始化和按钮的还原。................}
//下面首先来做传数据到各个数据库中去
{............首先做的是修改库存管理中的数量..................}
while m<j do
begin
if datamodule1.ADOTable2.locate('book_id',stringgrid2.Cells[1,m+1],[loCaseInsensitive]) then
begin
if datamodule1.ADOTable2.fieldbyname('number').AsInteger>strtoint(stringgrid2.Cells[4,m+1]) then
begin
datamodule1.ADOTable2.edit;
datamodule1.ADOTable2.fieldbyname('number').AsString:=inttostr(datamodule1.ADOTable2.fieldbyname('number').AsInteger-strtoint(stringgrid2.Cells[4,m+1]));
datamodule1.ADOTable2.post;
end;
//........其次是把数据传到销售 "库“...........
with datamodule1.adosales do
begin
insert;
fieldbyname('bookid').AsString:=stringgrid2.Cells[1,m+1];
fieldbyname('salesprice').AsString:=stringgrid2.Cells[3,m+1];
fieldbyname('number').asstring:=stringgrid2.Cells[4,m+1];
fieldbyname('moneysum').AsString:=stringgrid2.Cells[5,m+1];
post;
showmessage('操作成功');
number:=number+1;
end;
end;
m:=m+1;
end;
销售统计:
//若提供是编号,则直接查询
if q1.ItemIndex=0 then
s:=edid.Text
//若提供是名字,那么先找到它对应的编号
else if q1.ItemIndex=1 then
begin
with datamodule1.ADOTable1 do
begin
first;
if locate('book_name',edname.Text,[locaseinsensitive]) then
s:=fieldbyname('book_id').AsString;
end;
end
//若提供是名字缩写,那么先找到它对应的编号
else
begin
with datamodule1.ADOTable1 do
begin
first;
if locate('shortening',edSX.Text,[locaseinsensitive]) then
s:=fieldbyname('book_id').AsString;
end;
end;
with query.salesquery do
begin
if q2.ItemIndex=0 then
begin
if q3.ItemIndex=0 then
begin
//本月的销售额
close;
sql.clear;
sql.Add('select bookid as 书号,sum(moneysum) as 总额 from sales where ');
sql.Add(' bookid =:a');
sql.add(' and month(selltime)=month(getdate()) ');
sql.Add(' and year(selltime)=year(getdate()) ');
sql.Add(' group by bookid');
parameters.ParamByName('a').Value:=s;
prepared;
open;
end
//本月的销售量
else if q3.ItemIndex=1 then
begin
close;
sql.clear;
sql.Add('select bookid as 书号,sum(number) as 总数 from sales where ');
sql.Add(' bookid =:a');
sql.add(' and month(selltime)=month(getdate()) ');
sql.Add(' and year(selltime)=year(getdate()) ');
sql.Add(' group by bookid');
parameters.ParamByName('a').Value:=s;
prepared;
open;
end;
end
else if q2.ItemIndex=1 then
begin
if q3.ItemIndex=0 then
begin
//本季度的销售额
close;
sql.clear;
sql.Add('select bookid as 书号,sum(moneysum) as 总额 from sales where ');
sql.Add(' bookid =:a');
sql.add(' and month(selltime)>=month(getdate())-3 ');
sql.Add(' and year(selltime)=year(getdate()) ');
sql.Add(' group by bookid');
parameters.ParamByName('a').Value:=s;
prepared;
open;
end
//本季度的销售量
else if q3.ItemIndex=1 then
begin
close;
sql.clear;
sql.Add('select bookid as 书号,sum(number) as 总数 from sales where ');
sql.Add(' bookid = :a');
sql.add(' and month(selltime)>=month(getdate())-3 ');
sql.Add(' and year(selltime)=year(getdate()) ');
sql.Add(' group by bookid');
parameters.ParamByName('a').Value:=s;
prepared;
open;
end;
end
else
begin
if q3.ItemIndex=0 then
begin
//今年的销售额
close;
sql.clear;
sql.Add('select bookid as 书号,sum(moneysum) as 总额 from sales where ');
sql.Add(' bookid =:a');
sql.Add(' and year(selltime)=year(getdate()) ');
sql.Add(' group by bookid');
parameters.ParamByName('a').Value:=s;
prepared;
open;
end
//今年的销售量
else if q3.ItemIndex=1 then
begin
close;
sql.clear;
sql.Add('select bookid as 书号,sum(number) as 总数 from sales where ');
sql.Add(' bookid =:a');
sql.Add(' and year(selltime)=year(getdate()) ');
sql.Add(' group by bookid');
parameters.ParamByName('a').Value:=s;
prepared;
open;
end;
end;
end;
3.折扣与类别
这两项管理功能都只有管理员级别的用户可以使用,它们的使用都是涉及到销售情况的。对于一本书,或是一类书,它的销售情况有可能是因为它的折扣不合理,也有可能是图书摆放的位置不合理。通过改变折扣和类别就能够改变这两项。
一批书在入库的时候就可以归类和给订折扣,也可以在后期编辑过程中改变这写选项。
4.图书信息编辑
能使用该功能的人在一定的区域选择自己想要的图书编号,之后系统会自动展示给用户该图书的其他信息。如果要修该某些数据,就可以直接的修改,然后提交就可以了。
If datamodule2.adoedit.Locate('book_id',trim(cbcid.Text),[loCaseInsensitive]) then
begin
edname.Text:=datamodule2.adoedit.FieldByName('book_name').AsString;
edorderprice.Text:=datamodule2.adoedit.FieldByName('orderprice').AsString;
edsx.Text:=datamodule2.adoedit.FieldByName('shortening').AsString;
medsalesprice.Text:=datamodule2.adoedit.FieldByName('salesprice').AsString;
edca.Text:=datamodule2.adoedit.FieldByName('category_id').AsString;
memo1.Lines.Text:=datamodule2.adoedit.FieldByName('remark').AsString;
end;
5.库存信息管理
该模块主要是为系统管理员和仓库管理员准备的。销售一段时间后,库存必定发生了变化。用户可以输入自己要找的图书的一些基本信息,就可以找到他的库存状况。此外还可以从这个界面自动的走到另外的图书编辑界面。
var
s,ill,qua,words:string;
begin
//确定查询条件
if q1.ItemIndex=0 then
begin
qua:='book_id';
words:=edid.Text;
dbgrid1.DataSource:=datasource1;
end
else if q1.ItemIndex=1 then
begin
qua:='book_name';
words:=edname.Text;
dbgrid1.DataSource:=datasource1;
end
else
begin
qua:='shortening';
words:=edsx.Text;
dbgrid1.DataSource:=datasource1;
end;
with query.warehousequery do
begin
close;
sql.Clear;
{查询语句}
if cbc.Checked=true then
begin
ill:='like';
s:='select * from 库存 where' +' '+qua+' '+ill+' '+''''+words+'%'+'''';
end
else
begin
ill:='=';
s:='select * from 库存 where' +' '+qua+' '+ill+' '+''''+words+'''';
end;
sql.add(s);
prepared;
open;
end;
end;
procedure Tfmqueryofware.DBGrid1DblClick(Sender: TObject);
var form:TFmEditBook;
begin
if (dbgrid1.DataSource.DataSet.Active) and (not dbgrid1.DataSource.DataSet.IsEmpty) then
begin
form:=TFmEditBook.create(self);
form.show;
form.cbcid.ItemIndex:=dbgrid1.DataSource.DataSet.RecNo-1;
form.cbcid.OnChange(sender);
end;
end;
5 系统使用说明
5.1 系统安装及配置说明
5.1.1 系统运行环境
硬件配置:
内存:64MB
外存:10GB
CPU:Pentium 4 cpu 3.00ghz
软件配置:
操作系统:Win98/2000/xp
5.1.2 系统安装步骤
该系统是绿色软件,无须安装。
5.1.3 系统配置
系统一开始运行时,必须有用户信息:至少有三个级别的用户。因为不同的用户拥有不同的操作权限,即使是管理员用户也不是直接的无所不能。此外,库存表中也应该有一些数据,入库管理中也须有一些数据。
5.2 系统操作说明
5.2.1 SSSSSSSS
1.登陆
用户在用户名中输入自己的用户名,然后在口令栏中输入口令,按回车就可以进入系统。对于不同级别有不同的操作。灰色的按纽就代表不可用,黑色可用。
1.1.管理员级别的操作界面
1.2 仓库管理员的主界面
1.3 收银员级别的操作界面
2.用户管理
管理员用户进入该界面之后,先要输入用户名、口令,选择级别与状态就能完成填加用户操作。如果已经存在该用户名,而操作员有没有注意左边的显示,系统就会给出提示。
2.类别管理
这里的操作与上面的操作是基本一样,只不过是一样的。
3.折扣管理
4.修改密码
原始密码,顾名思义就是登陆时用的密码。新密码就是将要设定的密码,密码确认主要是为了用户对自己的密码有一个重视。新密码与密码确认相等。
5.图书信息查询
用户在文本框中输入自己要查询的名字,可以全部匹配,也可以模糊查询。
6.销售统计
先选择查询条件中的一项,再在时间与项目中选择一个,按一下个别查询就可以查到你想要的图书的销售情况。如果按了整体查询就查到根据时间和项目而确定的销售情况。比如上图就是表示本月图书销售额的总体情况。
7.库存查询
查询与上面的销售统计差不多,上面就查到了书号开头为tp0的图书的基本信息。
8.图书信息编辑
在入库时填写了一些信息,但后来还是允许修改的。从下拉框中找到自己要编辑的图书的编号就可以对其进行编辑修改。
9.销售提示
这一功能能够给出畅销书与滞销书的列表。
10.进货提示
列举出库存较少的图书信息
5.2.2 TTTTTTTT
比如,一个人买了三本书,书号分别叫:tp0000,tp0001,tp0002
输入TP0000加上数量后按确定,该图书的一些购买信息就到了界面上来了,如此做三次就可以将这三本书全
展开阅读全文