综合案例六 小型超市零售管理系统
【实验目的与要求】
1.熟练使用VFP的操作环境
2.熟练使用项目管理器管理各种文件
3.掌握数据库的设计方法和步骤
4.熟练掌握数据库表及其表之间关系的创建与使用
5.掌握查询与视图的创建与使用
6.掌握程序设计的基本方法
7.掌握表单及其表单中各种控件的设计与使用
8.掌握菜单的创建和使用
【系统功能模块】
1) 进货管理: 根据销售情况及库存情况,自动制定进货计划(亦可手工制定修改),可以避免盲目进货造成商品积压。 按计划单有选择性地进行自动入库登记。 综合查询打印计划进货与入库记录及金额。
2) 销售管理: 商品正常销售、促销与限量、限期及禁止销售控制。 综合查询各种销售明细记录、各地收银员收银记录以及交结帐情况等。 按多种方式统计生成销售排行榜,灵活察看和打印商品销售日、月、年报表。
3) 库存管理: 综合查询库存明细记录。 库存状态自动告警提示。如库存过剩、少货、缺货等。软件为您预警,避免库存商品积压损失和缺货。 库存自动盘点计算。
4) 人员管理: 员工、会员、供货商、厂商等基本信息登记管理。 员工操作权限管理。 客户销售权限管理。
【功能模块说明】
1)输入单据:出库、入库、产成品清单
2)查询:出库查询、入库查询、产成品查询
3)销售:销售费用、销售退款、进/退货
4)打印报表:入库报表、出库报表、产成品清单报表、销售退款单报表进/退货报表
5)人员管理:员工、会员、供货商、厂商等基本信息登记管理。 员工操作权限管理。客户销售权限管理。
【实验内容】
1、数据库设计
本应用系统的数据库主要包括以下基本表,数据结构设计如下。
表1:厂商信息表
字段名 数据类型 长度(字节) 备注
厂商编号 文本 20 主键
厂商名称 文本 50
厂商地址 文本 50
联系电话 数字 20
法人地表 文本 20
表2:员工信息表
字段名 数据类型 长度(字节) 备注
员工编号 文本 20 主键
姓 名 文本 20
性 别 文本 20
年 龄 数字 8
身 高 数字 8
政治面貌 文本 20
家庭住址 文本 50
所属部门 文本 20
聘用日期 日期 16
编制日期 日期 16
表3:用户表
字段名 数据类型 长度(字节) 备注
用户名 文本 20
密码 数字 8
表4:销售单
字段名 数据类型 长度(字节) 备注
单据编号 文本 20 主键
商品型号 文本 20
计量单位 文本 8
单价 货币 16
数量 数字 16
金额 货币 16
生产厂商 文本 50 外键
销售日期 日期 16
营业员 文本 20 外键
表5:入库单
字段名 数据类型 长度(字节) 备注
入库编号 文本 20 主键
商品型号 文本 20
计量单位 文本 8
单价 货币 16
数量 数字 16
金额 货币 16
生产厂商 文本 50 外键
出厂日期 日期 16
仓管员 文本 20 外键
表6:进货单
字段名 数据类型 长度(字节) 备注
单据编号 文本 20 主键
厂商编号 文本 20 外键
进货厂商 文本 50
商品型号 文本 20
计量单位 文本 8
单价 货币 16
数量 数字 16
金额 货币 16
进货日期 日期 16
采购员 文本 20 外键
备注 备注 20
各模块界面设计与主要模块的程序代码
一、输入板块
1、表单(输入入库单据)
实现功能:可通过这个表单将商品的相关信息输入,例如编号、单价、数量等, 起到一个存储信息的作用,方便以后查询、总结等工作需要。
实现过程:实现过程:
① 单击“文件”下拉菜单,再点击“新建”,选择“表单”,再单击“新建文件”后开始表单输入入库单据的设计。
设计界面如下:
②输入入库单据的设计的基本结构如下图:
“输入”按钮代码
e=ntom(val(alltrim(thisform.text5.value)))
f=alltrim(thisform.Text6.value)
g=alltrim(thisform.text7.value)
h=val(alltrim(thisform.text8.value))
i=ctod(alltrim(thisform.Text9.value))
if empty(a).or.empty(b).or.empty(c).or.empty(d).or.empty(e).or.empty(f).or.empty(g).or.empty(h).or.empty(i)
messagebox('请输入完整信息')
return
endif
insert into 表¥入库单;
(入库编号,商品型号,计量单位,单价,金额,生产厂商,仓管员,数量,出厂日期) value(a,b,c,d,e,f,g,h,i)
z=0
scan for 商品库存表.商品型号=b
z=1
endscan
use
if z=1
update 商品库存表 set 数量=数量+h where 商品型号=b
messagebox('输入入库单据成功!',64,'系统提示')
return
else
insert into 表¥商品库存表;
(商品型号,数量) value (b,h)
insert into 表¥商品资料单;
(商品型号) value (b)
messagebox('你所输入的是新商品,请输入商品名称')
use
do form 表单¥输入新商品名
return
endif
“取消”按钮代码
Thisform.release
2、表单(输入出库单据)(萧巧谊、李喜仙、梁思音)
实现功能:可通过这个表单将出库的商品相关信息输入,例如编号、单价、数量等, 起到一个存储信息的作用,方便以后查询,总结等工作需要。
实现过程:实现过程:
① 单击“文件”下拉菜单,再点击“新建”,选择“表单”,再单击“新建文件”后开始表单输入入库单据的设计。
设计界面如下:
② 表单输入入库单据的设计的基本结构如下图:
“输入”按钮代码
a=alltrim(thisform.text1.value)
b=alltrim(thisform.Text2.value)
c=alltrim(thisform.text3.value)
d=ntom(val(alltrim(thisform.Text4.value)))
e=ntom(val(alltrim(thisform.text5.value)))
f=alltrim(thisform.Text6.value)
g=alltrim(thisform.text7.value)
h=val(alltrim(thisform.text8.value))
i=ctod(alltrim(thisform.Text9.value))
if empty(a).or.empty(b).or.empty(c).or.empty(d).or.empty(e).or.empty(f).or.empty(g).or.empty(h).or.empty(i)
messagebox('请输入完整信息')
return
endif
z=0
x=0
use 表¥商品库存表
scan for 商品库存表.商品型号=b
z=1
x=数量-h
endscan
if z=0
messagebox('库存不足,无法出库!')
else
if x<0
messagebox('库存不足,无法出库!')
else
update 表¥商品库存表 set 数量=数量-h where 商品型号=b
insert into 出库单;
(出库编号,商品型号,计量单位,单价,金额,生产厂商,仓管员,数量,出库日期) value(a,b,c,d,e,f,g,h,i)
messagebox('输入出库单据成功!',64,'系统提示')
endif
endif
取消按钮代码
thisform.release
3、表单(输入新商品名称)(巫秋金、江映霞)
实现功能:可通过这个表单输入新商品名,添加到数据库中,方便以后相关工作。
① 单击“文件”下拉菜单,再点击“新建”,选择“表单”,再单击“新建文件”后开始表单输入入库单据的设计。
设计界面如下:
② 表单输入入库单据的设计的基本结构如下图:
确认按钮代码
a=alltrim(thisform.text1.value)
update F:¥vf¥死都要做出来¥表¥商品库存表 set 商品名称=a where 商品型号=b
update F:¥vf¥死都要做出来¥表¥商品资料单 set 商品名称=a where 商品型号=b
messagebox('输入入库单据成功!',64,'系统提示')
thisform.release
取消按钮代码
thisform.release
二、数据查询模块
1、项目详细设计
查询模块:出库查询、入库查询、库存查询、商品资料查询
例:入库查询表单
2、界面操作说明:
按钮控制策略:组合框内有9个选项,编辑框为空,查询按钮及取消按钮一直为亮。
查询处理过程:此查询为模糊查询,按下组合框内的选项,在编辑框内输入内容,点击查询,屏幕上将显示一系列与输入内容相关的记录。取消后将返回原界面。注意:出厂时间的输入需要符合格式才能正确查询,否则将出现运行错误的提醒。(王亚编写)
3、项目具体实现
例:入库查询表单
本表单用于查询入库商品情况。在组合框中选择要查询的条件,如入库编号、商品型号等,在文本框中输入信息,按查询按钮,即可显示出相关信息。如若输入信息有误则会有信息“数据库中不存在您所要查询的记录”提示。而按取消键则返回到主菜单。
在表单上设计如下事件过程:
1、新建表单form1,并将其caption属性值设为“入库查询”,width属性值设置为290,height属性值设置为175,AutoCenter属性值设置为.t.,并将其保存为“入库查询.scx”。
2、向表单添加一个grid控件,并将其width属性值设置为290,height属性值设置为100。
3、在grid控件的下方添加一个组合框控件Combo1和一个文本框控件, 并将组合框控件的RowSourceType属性值设置为“8-结构”,RowSource属性值设置为“入库单”。
4、在文本框的右侧再添加两个命令按钮command1和command2,并将command1和command2的caption属性值分别设置为“查找”和“取消”。
5、对表单上各控件的位置进行适当的调整,调整后的表单设计器如图1
重点:(1)“查找”按钮(command1)
的click事件如下 :
if empty(thisform.Text1.value)=.f.
go top
a=thisform.Combo1.value
b=alltrim(thisform.Text1.value)
local c as integer
if a='入库编号'
Select * from 入库单 where 入库
编号 like b +'%' into cursor bas
sele bas
c=reccount()
if c<1
①“查询”按钮(command2)的click事件如下:
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='商品型号'
Select * from 入库单 where 商品型号 like b +'%' into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='计量单位'
Select * from 入库单 where 计量单位 like b +'%' into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='生产厂商'
Select * from 入库单 where 生产厂商 like b +'%' into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='仓管员'
Select * from 入库单 where 仓管员 like b +'%' into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='单价'
b=ntom(val(alltrim(thisform.text1.value)))
Select * from 入库单 where 单价 =b into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='金额'
b=ntom(val(alltrim(thisform.text1.value)))
Select * from 入库单 where 金额 =b into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='数量'
b=val(alltrim(thisform.text1.value))
Select * from 入库单 where 数量 =b into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
if a='出厂日期'
b=ctod(alltrim(thisform.text1.value))
Select * from 入库单 where 出厂日期 =b into cursor bas
sele bas
c=reccount()
if c<1
use
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
thisform.command2.click()
return
endif
endif
with thisform.grd入库单
.width=588
.height=200
.left=10
.recordsource='bas'
.deletemark=.f.
.visible=.t.
.readonly=.t.
.ColumnCount=9
.Column1.Header1.Caption='入库编号'
.Column1.Header1.BackColor=RGB(255,255,190)
.Column2.Header1.BackColor=RGB(255,255,190)
.Column2.Header1.Caption='商品型号'
.Column3.Header1.BackColor=RGB(255,255,190)
.Column3.Header1.Caption='计量单位'
.Column4.Header1.BackColor=RGB(255,255,190)
.Column4.Header1.Caption='单价'
.Column5.Header1.BackColor=RGB(255,255,190)
.Column5.Header1.Caption='数量'
.Column6.Header1.BackColor=RGB(255,255,190)
.Column6.Header1.Caption='金额'
.Column7.Header1.BackColor=RGB(255,255,190)
.Column7.Header1.Caption='生产厂商'
.Column8.Header1.BackColor=RGB(255,255,190)
.Column8.Header1.Caption='出厂日期'
.Column9.Header1.BackColor=RGB(255,255,190)
.Column9.Header1.Caption='仓管员'
.Column1.width=80
.Column2.width=80
.Column3.width=80
.Column4.width=80
.Column5.width=80
.Column6.width=80
.Column7.width=80
.Column8.width=80
.Column9.width=80
endwith
thisform.grd入库单.Setall('DynamicBackColor','RGB(224,225,255)','Column')
thisform.grd入库单.setfocus
else
messagebox('请输入要查找的内容!',16,'系统提示')
thisform.Text1.value=''
thisform.Text1.Setfocus
endif
②“取消”按钮(command2)的click事件如下:
Thisform.release
下图为查询模块其余的出库查询、库存查询和商品资料查询的界面设计,其制作过程与入库查询相似。
三、数据修改模块
1、项目详细设计
修改模块:出库修改、入库修改、商品资料修改
例:入库修改
2、界面操作说明:
按钮控制策略:查找方式组合框共有9个选项,查找内容为空,查找、修改、取消按钮一直为亮。
修改处理过程:需要修改时,在组合框中选择要查找的条件,在文本框中输入相应信息(输入信息要正确,否则系统会出现错误提示),按按钮查找,即下面的文本框中会出现所要查找的记录的详细信息(其中入库编号是固定的)。对相应信息进行修改后,按按钮修改,即可保存修改好的信息。
3、项目具体实现
例:入库修改
本表单用于对入库商品的相关信息进行修改。在组合框中选择要查找的条件,在文本框中输入相应信息(输入信息要正确,否则系统会出现错误提示),按按钮查找,即下面的文本框中会出现所要查找的记录的详细信息(其中入库编号是固定的)。对相应信息进行修改后,按按钮修改,即可保存修改好的信息。按取消按钮则返回主菜单。
本表单使用的数据环境为入库单和厂商信息表。
在表单上设计如下事件过程:
1、新建表单form1,并将其caption属性设置为“入库修改”,width属性值设为290,height属性值设为226,AutoCenter属性值设为.t.,并将其保存为“入库修改.scx”。
2、向表单添加一个grid控件,将其readonly属性设置为.t.,其RecordSourceType值采用默认的“1-别名”,在表单设计器中将其宽和高粗略调小一些即可,具体属性值我们将在表单的init事件代码中对其进行设置。
3、在grid控件下方添加两个Label控件,使其排成一行,并将其caption属性依次设为“请选择查找方式”和“请输入要查找的内容”。
4、在label控件下方添加一个组合框控件Combo1及一个文本框控件Text1,文本框控件的属性值采用默认即可,组合框控件Combo1的RowSourceType属性值设置为“1-值”,RowSource属性值设置为“入库编号、商品型号、计量单位、单价、数量、金额、生产厂商、生产日期和仓管员”,这样在运行时我们可以在该组合框中选择要查询的字段。
5、在表单上添加3个命令按钮command1 command2和command3,将其caption属性依次设为“查找”、“修改”和“取消“。
6、在命令按钮下方添加9个label控件,将这9个label控件排成两行,并将其caption属性依次设置为“入库编号”、“商品型号”和“计量单位”等等。
7、在这两行label控件下方添加9个文本框控件,属性值采用默认,并把这9个文本框排成两行。
8、调整表单上各个控件的位置,调整后的表单设计器如图2:
重点:
①“查找”按钮(command1)的click事件如下:
if empty(thisform.Text1.value)=.f.
go top
a=thisform.Combo1.value
b=alltrim(thisform.Text1.value)
c=.f.
if a='入库编号'
locate for 入库编号=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else (图2)
c=.t.
endif
endif
if a='商品型号'
locate for 商品型号=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if a='计量单位'
locate for 计量单位=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if a='单价'
b=ntom(val(alltrim(thisform.text1.value)))
locate for 单价=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if a='数量'
b=val(alltrim(thisform.text1.value))
locate for 数量=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if a='金额'
b=ntom(val(alltrim(thisform.text1.value)))
locate for 金额=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if a='生产厂商'
locate for 生产厂商=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if a='出厂日期'
b=ctod(val(alltrim(thisform.text1.value)))
locate for 出厂日期=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if a='仓管员'
locate for 仓管员=b
if eof()
messagebox('数据库中不存在您所要查询的记录',16,'系统提示')
go top
return
else
c=.t.
endif
endif
if c
thisform.Text1.enabled=.f.
go recno()
thisform.Text2.visible=.t.
thisform.Text2.enabled=.f.
thisform.Text3.visible=.t.
thisform.Text4.visible=.t.
thisform.Text5.visible=.t.
thisform.Text6.visible=.t.
thisform.Text7.visible=.t.
thisform.Text8.visible=.t.
thisform.Text9.visible=.t.
thisform.Text10.visible=.t.
thisform.Label3.visible=.t.
thisform.label4.visible=.t.
thisform.Label5.visible=.t.
thisform.Label6.visible=.t.
thisform.Label7.visible=.t.
thisform.Label8.visible=.t.
thisform.Label9.visible=.t.
thisform.Label10.visible=.t.
thisform.Label11.visible=.t.
thisform.Text2.value=入库单.入库编号
thisform.Text3.value=入库单.商品型号
thisform.Text4.value=入库单.计量单位
thisform.Text5.value=入库单.单价
thisform.Text6.value=入库单.数量
thisform.Text7.value=入库单.金额
thisform.Text8.value=入库单.生产厂商
thisform.Text9.value=入库单.出厂日期
thisform.Text10.value=入库单.仓管员
thisform.grd入库单.setfocus
this.enabled=.f.
thisform.command2.enabled=.t.
endif
else
messagebox('请输入要查找的内容!',16,'系统提示')
thisform.Text1.value=''
thisform.Text1.Setfocus
endif
thisform.refresh
②“修改”按钮的click的事件如下:
thisform.text3.readonly=.f.
thisform.text4.readonly=.f.
thisform.text5.readonly=.f.
thisform.text6.readonly=.f.
thisform.text7.readonly=.f.
thisform.text8.readonly=.f.
thisform.text9.readonly=.f.
thisform.text10.readonly=.f.
③“取消”按钮的click的事件如下:
thisform.release
下图为修改模块的其余的出库修改和商品资料修改的界面设计,其制作过程与入库修改的制作过程相似。
销售部分
部分数据库设计
表 销售单
字段名 |
数据类型 |
长度(字节) |
备注 |
单据编号 |
文本 |
20 |
主键 |
商品型号 |
文本 |
20 |
|
计量单位 |
文本 |
8 |
|
单价 |
货币 |
16 |
|
数量 |
数字 |
16 |
|
金额 |
货币 |
16 |
|
生产厂商 |
文本 |
50 |
外键 |
销售日期 |
日期 |
16 |
|
营业员 |
文本 |
20 |
外键 |
表 退货单
字段名 |
数据类型 |
长度(字节) |
备注 |
单据编号 |
文本 |
20 |
主键 |
商品型号 |
文本 |
20 |
|
计量单位 |
文本 |
8 |
|
单价 |
货币 |
8 |
|
数量 |
数字 |
16 |
|
金额 |
货币 |
16 |
|
退货日期 |
日期 |
16 |
|
四、销售数据模块
1、表单 销售情况记录表
实现功能: 商品正常销售管理。销售情况的明细记录、各地收银员收银记录以及交结帐情况等,实现对数据库添加销售记录 。
实现过程:
单击“文件”下拉菜单,再点击“新建”,选择“表单”, 再单击“新建文件”后开始表单输入入库单据的设计。
设计界面如下:
表单销售情况记录表的设计的基本结构如下图:
数据环境(如图)
“输入”按钮代码:
对象:command1 过程:click
a=alltrim(thisform.text1.value)
b=alltrim(thisform.Text2.value)
c=alltrim(thisform.text3.value)
d=ntom(val(alltrim(thisform.Text4.value)))
e=ntom(val(alltrim(thisform.text5.value)))
f=alltrim(thisform.Text6.value)
g=alltrim(thisform.text7.value)
h=val(alltrim(thisform.text8.value))
i=ctod(alltrim(thisform.Text9.value))
if empty(a).or.empty(b).or.empty(c).or.empty(d).or.empty(e).or.empty(f).or.empty(g).or.empty(h).or.empty(i)
messagebox('请输入完整信息')
return
endif
z=0
x=0
use 表¥商品库存表
scan for 商品库存表.商品型号=b
z=1
x=数量-h
endscan
if z=0
messagebox('库存不足,无法销售!')
else
if x<0
messagebox('库存不足,无法销售!')
else
update 表¥商品库存表 set 数量=数量-h where 商品型号=b
insert into 出库单;
(出库编号,商品型号,计量单位,单价,金额,生产厂商,仓管员,数量,出库日期) value(a,b,c,d,e,f,g,h,i)
messagebox('输入销售情况成功!',64,'系统提示')
endif
endif
“取消”按钮:
对象:command2 过程:click
thisform.release
2、表单 退货情况记录表
实现功能: 对退货商品的管理,记录退货情况,把退货的商品入库,增加到入库单,同时也改变库存。
实现过程:单击“文件”下拉菜单,再点击“新建”,选择“表单”,再单击“新建文件”后开始表单输入入库单据的设计。
设计界面如下:
表单退货情况记录表的设计的基本结构如下图:
数据环境(如图)
“记录”按钮代码:
对象:command1 过程:click
a=alltrim(thisform.text1.value)
b=alltrim(thisform.text2.value)
c=alltrim(thisform.text3.value)
d=ntom(val(alltrim(thisform.text4.value)))
e=ntom(val(alltrim(thisform.text5.value)))
f=alltrim(thisform.text6.value)
g=alltrim(thisform.text7.value)
h=val(alltrim(thisform.text8.value))
i=ctod(alltrim(thisform.text9.value))
if empty(a).or.empty(b).or.empty(c).or.empty(d).or.empty(e).or.empty(f).or.empty(g).or.empty(h).or.empty(i)
messagebox('请输入完整信息')
return
endif
insert into 入库单;
(入库编号,商品型号,计量单位,单价,金额,生产厂商,仓管员,数量) value (a,b,c,d,e,f,g,h)
insert into 退货单;
(单据编号,商品型号,计量单位,单价,金额,数量,退货日期) value (a,b,c,d,e,h,i)
messagebox('记录成功')
“取消”按钮代码:
对象:command2 过程:click
thisform.release