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 物资入库表结构字段名 | 类型 | 长度 | 备注 |
物资编码 | 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