请同学选择课程【第9章】-【实战演练】“实验9 进销存管理信息系统”,在VB集成开发环境中认真完成实验。
实验完成后,将调试好的程序保存在以“姓名+实验名称”命名的文件夹下,并将该文件夹压缩成、rar或者、zip格式进行提交。 本次实验满分40分,提交后需要辅导教师批阅打分。
实验目的
1掌握利用SQL语句,通过ADO数据对象管理数据库的方法。
2理解数据库实用程序的框架体系。
3了解数据报表的制作方法。
实验内容
本实验主要开发一个“进销存”管理系统。要求同学们首先在SQL Server上创建名为“进销存”的数据库,并在该数据库上创建“物资台账”“物资入库”“物资出库”3张表。然后编写一个简单“进销存”数据库管理系统,它具有数据增加(Insert)、删除(Delete)、修改(Update)和查询(Select)功能,并能将查询结果在计算屏幕和打印机上输出。
实验步骤
1创建数据库
在进行本实验之前,请同学们先根据表9、4、表9、5、表9、6在SQL Server上创建“进销存”数据库。如果你不具备SQL Server实验环境,也可以在Access数据库上完成创建工作。无论采用哪种数据库,程序设计过程和代码基本相同。
表9、4 物资台账表结构
字段名
类型
长度
备注
物资编码
Char
4
1.主关键字为“物资编码”
2.在主关键字上创建聚集唯一索引
3.“物资编码”由4位组成,其中第1位使用英文字母表示物资类别,后3位使用数字表示流水号。物资类别如下:A表示钢笔类,B表示橡皮类
物资名称
Varchar
10
计量单位
Char
2
单价
Money
8
期初库存
Numeric
9
表9、5 物资入库表结构
字段名国开形考答案请进:opzy.net或请联系微信:1095258436
类型
长度
备注
物资编码
Char
4
在主关键字“物资编码”上创建聚集不唯一索引
入库时间
Datetime
8
入库数量
Numeric
9
表9、6 物资出库表结构
字段名
类型
长度
备注
物资编码
Char
4
在主关键字“物资编码”上创建聚集不唯一索引
出库时间
Datetime
8
出库数量
Numeric
9
同学们既可以利用SQL Server企业管理器,通过图形化界面完成数据库创建工作,也可以直接在SQL Server查询分析器中运行以下语句:
–创建“进销存”数据库容器
CREATE DATABASE 进销存
GO
USE 进销存
GO
–创建物资台账表
CREATE TABLE 物资台账 (
物资编码 char (4) NOT NULL ,
物资名称 varchar (10) NOT NULL ,
计量单位char (2) NOT NULL ,
单价 money NOT NULL ,
期初库存 numeric (18, 0) NOT NULL
) ON [PRIMARY]
GO
–创建物资入库表
CREATE TABLE 物资入库 (
物资编码 char (4) NOT NULL ,
入库时间 datetime NOT NULL ,
入库数量 numeric(18, 0) NOT NULL
) ON [PRIMARY]
GO
–创建物资出库表
CREATE TABLE 物资出库 (
物资编码 char (4) NULL ,
出库时间 datetime NOT NULL ,
出库数量 numeric(18, 0) NOT NULL
) ON [PRIMARY]
GO
2根据业务逻辑书写SQL语句
由于拟开发的应用程序具有对数据表的增加、删除、修改和查询4项基本功能,因此请同学们首先在实验报告上写出相应的SQL语句,比如:
–向物资台账表中新增数据
INSERT INTO 物资台账(物资编码,物资名称,计量单位,单价,期初库存)
VALUES(‘A001′,’英雄牌钢笔’,’只’,2、5,50)
–修改物资台账表中现有数据
UPDATE物资台账 SET 单价 = 3 ,期初库存= 60
WHERE 物资编码 = ‘A001’
–删除物资台账表中现有数据
DELETEFROM 物资台账
WHERE 物资编码 = ‘A001’
–查询物资台账表中现有数据
SELECT * FROM物资台账
WHERE 物资编码 = ‘A001’
–(其他略,请同学们自己完成)
3程序界面设计
(1)创建工程。新建一“标准EXE”工程,工程名为“进销存管理信息系统”。通过“工程-部件”或“工程-引用”菜单项添加ADO数据对象、工具条、MSFlexGrid等相关对象或控件,并按以下要求创建窗体,所有窗体的StartUpPosition属性均设置为:2?屏幕中心。
(2)创建主窗体(frmMain)。如图9、33所示,运用菜单技术、工具条技术创建窗体。窗体名frmMain,其他控件保留默认名称。
图9、33 主窗体(frmMain)运行界面
(3)创建“物资台账管理”窗体(frm台账)。如图9、34所示,使用图片(PictureBox)、表格(MSFlexGrid)、命令按钮(CommandButton)控件,添加并设计“新增记录”窗体。窗体名为“frm台账”,所有控件保留默认名称。
图9、34 “物资台账管理”窗体(frm台账)设计界面
(4)创建“物资台账数据增加”窗体(frmAdd台账)。如图9、35所示,使用标签、文本框、组合框、命令按钮控件,添加并创建“物资台账数据增加”窗体。窗体名为“frmAdd台账”。其中Text1为控件数组,Text1(4)控件的Enable属性为False。另外,在Combo1控件的List属性中输入一些常用的计量单位,比如“台”“个”“只”等,其他控件保留默认名称和设置。
图9、35 “物资台账数据增加”窗体(frmAdd台账)设计界面
(5)创建“物资台账数据修改”窗体(frmUpdate台账)。如图9、36所示,使用标签、组合框、命令按钮控件,添加并创建“物资台账数据修改”窗体。窗体名为“frmUpdate修改”。其中Text1为控件数组,Text1(0)和Text1(4)(物资编码和期初金额)控件的Enable属性设置为False,其他控件保留默认名称和设置。
图9、36 “物资台账数据修改”窗体(frmUpdate台账)运行界面
(6)创建“物资台账数据查询”窗体(frmQuery台账)。如图9、37所示,使用标签、组合框、命令按钮控件,添加并创建“物资台账数据查询”窗体。窗体名为“frmQuery台账”。其中Text1为控件数组,ComboBox控件的Style属性为2?Dropdown List。
图9、37 “物资台账数据查询”窗体(frmQuery台账)设计界面
(7)创建“物资台账报表”窗体(frmReport台账)。通过“工程-添加DataReport”菜单项添加报表窗体,命名为“frmReport台账”。按下列步骤完成设计工作(如图9、38所示):
图9、38 “物资台账”报表窗体设计界面
①在报表标头、页标头部分添加rptLabel控件,并修改它们的Caption属性。
②在细节部分添加rptTextBox控件,并修改它们的DataField属性。
③添加rptLine控件。
(8)按上述(3)~(7)步的方法创建“物资入库管理”“物资出库管理”界面。
4代码设计
(1)添加Module模块,编写Main过程:
‘声明全局对象变量ADOcn,用于创建与数据库的连接
Public ADOcn As Connection
‘声明全局变量strQuery1用于存储查询条件
Pubic strQuery1 As String
Public Sub Main()
‘定义数据库连接字符串
Dim strSQLServer As String
‘用于连接SQL Server数据库,其中:
‘Server为服务器名称
‘User ID为登录账号,Password为登录口令
‘Database为具体的数据库名
‘请根据具体的实验环境修改这些参数
strSQLServer = “Provider=SQLOLEDB;Server=bigdog;Us_
er ID=sa;Password=sa;Database=进销存”
‘连接SQL Server数据库
ADOcn、Open strSQLServer
‘显示主窗体
frmMain、Show
End Sub
将Main过程设为工程启动对象。
(2)FrmMain窗体主要代码。该窗体的代码主要用于调度其他各窗体,起串接作用。
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib、But_ton)
Select Case Button
Case “物资台账管理”
frm台账、Show 1
Case “物资入库管理”
frm入库、Show 1
Case “物资出库管理”
frm出库、Show 1
Case “退出系统”
Unload Me ‘或者使用End命令
End Select
End Sub
(3)“frm台账”窗体代码。
“通用”部分声明一个Sub过程,用于在MSFlexGrid中显示记录。
Private Sub DisplayGrid()
‘声明变量
Dim strGrid As String
Dim i As Integer
Dim ADOrs As New Recordset
ADOrs、ActiveConnection = ADOcn
‘打开物资台账
If strQuery1 <> “” Then
ADOrs、Open “Select * From 物资台账 Where ” + strQuery1 + ” Order By 物资编码”
Else
ADOrs、Open “Select * From 物资台账 order by 物资编码”
End If
‘设置MSFlexGrid控件的表头
MSFlexGrid1、Clear
MSFlexGrid1、Rows = 0
MSFlexGrid1、Cols = 6
strGrid = “物资编码” + vbTab + “物资名称” + vbTab + “计量单位” + vbTab
strGrid = strGrid + “单价” + vbTab + “期初库存” + vbTab + “期初金额”
i = 0
‘在第i行增加一列
MSFlexGrid1、AddItem strGrid, i
i = i + 1
‘通过循环显示表中所有记录
Do While Not ADOrs、EOF
strGrid = ADOrs(“物资编码”) + vbTab + ADOrs(“物资名称”) + vbTab + ADOrs(“计量单位”)
strGrid = strGrid + vbTab + Str(ADOrs(“单价”)) + vbTab + Str(ADOrs(“期初库存”))
strGrid = strGrid + vbTab + Str(ADOrs(“单价”) * ADOrs(“期初库存”))
MSFlexGrid1、AddItem strGrid, i
ADOrs、MoveNext ‘指针下移一条记录
i = i + 1
Loop
MSFlexGrid1、Rows = i + 1
MSFlexGrid1、FixedRows = 1
MSFlexGrid1、FixedCols = 1
End Sub
Private Sub Form_Load()
‘设置查询条件变量的初值
strQuery1 = “”
‘显示物资台账记录
DisplayGrid
End Sub
Private Sub Command1_Click()
‘调用增加记录窗体
FrmAdd台账、Show 1
DisplayGrid
End Sub
Private Sub Command2_Click()
‘删除一条记录
Dim strSQL As String
Dim i As Integer
‘取当前光标所在行
i = MSFlexGrid1、Row
‘取当前行的第0列单元值,即物资编码列
If MSFlexGrid1、TextMatrix(i, 0) = “” Then
MsgBox “请先选择一个记录!”, vbQuestion + vbOKOnly, “信息提示”
Exit Sub
End If
strSQL = “Delete From 物资台账”
strSQL = strSQL + ” Where 物资编码='” + MSFlexGrid1、TextMatr _
ix(i, 0) + “‘”
If MsgBox(“是否要删除?”, vbQuestion + vbOKCancel, “信息提示”) = vbOK Then
ADOcn、Execute strSQL ‘执行删除操作
End If
‘重新显示
DisplayGrid
End Sub
Private Sub Command3_Click()
‘调用修改记录窗体
Dim i As Integer
i = MSFlexGrid1、Row
If MSFlexGrid1、TextMatrix(i, 0) = “” Then
MsgBox “请先选择一个记录!”, vbQuestion + vbOKOnly, “信息提示”
Exit Sub
End If
‘对frmUpdate台账窗体赋值
With frmUpdate台账
、Text1(0) = MSFlexGrid1、TextMatrix(i, 0)
、Text1(1) = MSFlexGrid1、TextMatrix(i, 1)
、Combo1、Text = MSFlexGrid1、TextMatrix(i, 2)
、Text1(2) = MSFlexGrid1、TextMatrix(i, 3)
、Text1(3) = MSFlexGrid1、TextMatrix(i, 4)
、Show 1
End With
‘修改完后重新显示
DisplayGrid
End Sub
Private Sub Command4_Click()
‘调用设置查询条件窗体
FrmQuery查询、Show 1
‘设置完查询条件后重新显示记录
DisplayGrid
End Sub
Private Sub Command5_Click()
‘调用打印报表窗体
Dim ADOrs As New Recordset
ADOrs、ActiveConnection = ADOcn
If strQuery1 <> “” Then
ADOrs、Open “Select * From 物资台账 Where ” + strQuery1 +”Order By 物资编码”
Else
ADOrs、Open “Select * From 物资台账 Order By 物资编码”
End If
‘设置报表窗体的DataSource和DataMember属性
Set frmReport台账、DataSource = ADOrs、DataSource
FrmReport台账、DataMember = ADOrs、DataMember
FrmReport台账、Show 1
End Sub
Private Sub Command6_Click()
‘退出本窗体
Unload Me
End Sub
(4)“frmAdd台账”窗体代码。
Private Sub Command1_Click()
Dim strSQL As String
Dim ADOrs As New Recordset
Set ADOrs、ActiveConnection = ADOcn
‘首先查询主关键字“物资编码”是否重复
ADOrs、Open “Select 物资编码 From 物资台账 Where 物资编码='” + Text1(0) + “‘”
If Not ADOrs、EOF Then
MsgBox “物资编码已存在,请重新输入”, vbQuestion + vbOKOnly, “信息提示”
Exit Sub ‘退出本过程
End If
‘增加一条新记录
strSQL = “Insert Into 物资台账(物资编码,物资名称,计量单位,单价,期初库存) ”
strSQL = strSQL + ” Values(‘” + Text1(0) + “‘,'” + Text1(1) + “‘,'” + Combo1、Text + “‘,”
strSQL = strSQL + Text1(2) + “,” + Text1(3) + “)”
ADOcn、Execute strSQL
MsgBox “增加成功,请继续!”, vbQuestion + vbOKOnly, “信息提示”
End Sub
Private Sub Command2_Click()
‘退出本窗体
Unload Me
End Sub
Private Sub Form_Load()
‘赋初值
Text1(0) = “”
Text1(1) = “”
Text1(2) = “0”
Text1(3) = “0”
Combo1、ListIndex = 0
End Sub
Private Sub Text1_Change(Index As Integer)
‘当“单价”和“期初库存”值发生变化时,自动计算“期初金额”
If Index = 2 Or Index = 3 Then
Text1(4) = Trim(Str(Val(Text1(2)) * Val(Text1(3))))
End If
End Sub
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
‘将用户输入的回车键转换为Tab键,使焦点自动下移
If KeyAscii = 13 Then
SendKeys “{Tab}”
End If
‘对于“单价”和“期初库存”文本框只允许输入数字、小数点和退格键
If Index = 2 Or Index = 3 Then
If Not ((Chr(KeyAscii) >= “0” And Chr(KeyAscii) <= “9”) _Or Chr(KeyAscii) = “、” Or KeyAscii = 8) Then
KeyAscii = 0
End If
End If
End Sub
(5)“frmUpdate台账”窗体代码。主要代码是:
Private Sub Command1_Click()
Dim strSQL As String
strSQL = “Update 物资台账 Set 物资名称='” + Text1(1) + “‘,”
strSQL = strSQL + “计量单位='” + Combo1、Text + “‘,”
strSQL = strSQL + “单价=” + Text1(2) + “,”
strSQL = strSQL + “期初库存=” + Text1(3)
strSQL = strSQL + ” Where 物资编码='” + Text1(0) + “‘”
ADOcn、Execute strSQL
Unload Me
End Sub
(6)“frmQuery台账”窗体代码。
Private Sub Command1_Click()
‘拼写查询条件字符串
Dim str1, str2 As String
str1 = “”
str2 = “”
If Text1(0) <> “” Then
str1 = “物资编码” + Combo1、Text + “‘” + Text1(0) + “‘”
End If
If Text1(1) <> “” Then
str1 = “物资名称” + Combo2、Text + “‘” + Text1(1) + “‘”
End If
If str1 = “” And str2 = “” Then
strQuery1 = “”
ElseIf str1 = “” And str2 <> “” Then
strQuery1 = str2
ElseIf str1 <> “” And str2 = “” Then
strQuery1 = str1
Else
strQuery1 = str1 + ” And ” + str2
End If
Unload Me
End Sub
Private Sub Command2_Click()
‘退出本窗体
Unload Me
End Sub
Private Sub Form_Load()
‘对窗体对象赋初值
Combo1、Clear
Combo1、AddItem “=”
Combo1、AddItem “>=”
Combo1、AddItem “>”
Combo1、AddItem “<”
Combo1、AddItem “<=”
Combo1、AddItem “<>”
Combo2、Clear
Combo2、AddItem “=”
Combo2、AddItem “>=”
Combo2、AddItem “>”
Combo2、AddItem “<”
Combo2、AddItem “<=”
Combo2、AddItem “<>”
Text1(0)、Text = “”
Text1(1)、Text = “”
End Sub