商品信息管理系统.docx
《商品信息管理系统.docx》由会员分享,可在线阅读,更多相关《商品信息管理系统.docx(17页珍藏版)》请在冰豆网上搜索。
商品信息管理系统
商品信息管理系统
1.SQLServer服务器端数据处理
1)存储过程proc_Prd设计
存储过程proc_Prd的作用是:
当触发器tr_UpPrd调用存储过程proc_Prd时,proc_Prd接受调用时参数传来的商品信息编码,并将该值写入商品信息修改表Update_Log中,商品信息修改时间取默认值,即修改时的时间,由getdate()获得,创建存储过程proc_Prd的代码如下:
USEGoods
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='proc_Prd'andtype='p')
DROPPROCEDUREproc_Prd
Go
CREATEPROCEDUREproc_Prd@ProductsNoint
AS
INSERTUpdate_LogVALUES(@ProductsNo,DEFAULT)
GO
2)触发器tr_UpPrd设计
触发器tr_UpPrd的作用是:
当用户删除、更新商品信息的时候,该触发器触发,触发器从deleted表中取出商品编码,并调用存储过程proc_Prd完成商品修改信息的记录,其代码如下:
USEGoods
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='tr_UpPrd'andtype='TR')
DROPPROCEDUREtr_UpPrd
Go
CREATETRIGGERtr_UpPrd
ONProducts
FORDELETE,UPDATE
AS
DECLARE@ProductsNoint
SELECT@ProductsNo=编码FROMdeleted
EXECproc_Prd@ProductsNo
GO
2.VB创建工程与主窗体
1)创建VB工程与设置窗体属性
2)创建工程模块
在modulel模块的全局说明区定义公共变量,代码如下:
OptionExplicit
PublicgConnStrAsString
在modulel模块中,定义Main子程序,当第一次进入应用程序时,Main子程序将激活,代码如下:
PublicSubMain()
gConnStr="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurity
Info=False;InitialCatalog=Goods"
frmLogin.Show
EndSub
在modulel模块中,定义函数ExecSQL,用于处理数据库的连接和访问操作,代码如下。
PublicFunctionExecSQL(ByValsqlAsString)AsADODB.Recordset
OnErrorGoToErrHandler:
DimcnAsADODB.Connection
DimrsAsADODB.Recordset
DimstrArray()AsString
Setcn=NewADODB.Connection
Setrs=NewADODB.Recordset
strArray=Split(sql)
cn.OpengConnStr'与数据库Goods建立连接
IfStrComp(UCase$(strArray(0)),"select",vbTextCompare)=0Then
rs.OpenTrim$(sql),cn,adOpenKeyset,adLockOptimistic
SetExecSQL=rs'返回查询结果集
Else
cn.Executesql
EndIf
ExecSQl_Exit:
Setrs=Nothing
Setcn=Nothing
ExitFunction
ErrHandler:
'显示错误信息
MsgBox"错误号:
"&Err.Number&"错误信息:
"&Err.Description,vbExclamation
ResumeExecSQl_Exit
EndFunction
在modulel模块中,定义过程ChangeFormPos,确定调用窗体在主窗体frmMain中的显示位置。
PublicSubChangeFormPos(frmMainAsMDIForm,frmAsForm)
DimTopAsInteger
Top=(frmMain.ScaleHeight-frm.Height)/2-600
IfTop>0Then
frm.Top=Top
Else
frm.Top=0
EndIf
frm.Left=(frmMain.ScaleWidth-frm.Width)/2
EndSub
3)创建主窗体
以下代码是对“数据录入”模块的权限验证及调用。
PrivateSubmnuInsert_Click()
'判断权限
IffrmLogin.intAuthority<5Then
MsgBox"对本起,你没有该权限!
",vbExclamation
ExitSub
EndIf
frmInsert.Show
EndSub
3.实现用户登录功能
“登录”窗体的用户验证在“确认”按钮中执行,其代码如下:
'定义全局变量strUserName、intAuthority,用于进入系统后的模块权限验证
PublicstrUserNameAsString
PublicintAuthorityAsInteger
'当单击“取消”按钮时,执行cmdCancel_Click()事件
PrivateSubcmdCancel_Click()
UnloadMe
EndSub
'当单击“确认”按钮时,执行cmdOk_Click()事件
PrivateSubcmdOk_Click()
OnErrorGoToErrHandler:
DimsqlAsString
DimrsAsADODB.Recordset
DimintUserKeyAsInteger
DimintJobIdAsInteger
IfTrim(txtUserName.Text="")Then
MsgBox"请输入用户名称!
",vbExclamation
txtUserName.SetFocus
Else
sql="select*fromUserswhere用户名='"&txtUserName.Text&"'"
Setrs=ExecSQL(sql)'从Users表中提取输入的用户名信息
Ifrs.EOF=TrueThen
MsgBox"没有此用户,请重新输入用户名!
",vbExclamation
txtUserName.SetFocus
Else
IfTrim(rs!
密码)=Trim(txtUserKey.Text)Then
intAuthority=rs!
权限等级
strUserName=txtUserName.Text
rs.Close
Me.Hide
frmMain.Show
UnloadMe
Else
MsgBox"密码不正确,请重新输入密码!
",vbExclamation
txtUserKey.SetFocus
txtUserKey.Text=""
EndIf
EndIf
EndIf
ExitSub
ErrHandler:
MsgBox"错误号:
"&Err.Number&"错误描述:
"&Err.Description
EndSub
4.实现用户管理功能
1)添加用户
要在系统中添加新用户,必须在frmUser窗体的“添加”按钮中添加以下代码:
PrivateSubcmdAdd_Click()
DimsqlAsString
DimrsAsADODB.Recordset
DimintAuthAsInteger
IftxtUserName.Text=""Then'判断用户名是否为空,为空则重新输入用户名
MsgBox"请输入用户名!
",vbExclamation
txtUserName.SetFocus
ExitSub
Else
IftxtPassword1.Text=""Then'判断密码是否为空,为空则重新输入用户名
MsgBox"请输入密码!
",vbExclamation
txtPassword1.SetFocus
ExitSub
Else
IftxtPassword2.Text=""Then
MsgBox"请输入确认密码!
",vbExclamation
txtPassword2.SetFocus
ExitSub
Else
IftxtPassword1.Text<>txtPassword1.TextThen
MsgBox"确认密码不正确!
",vbExclamation
txtPassword2.SetFocus
ExitSub
EndIf
EndIf
EndIf
EndIf
'判断是否选择权限
IfcboAuthority.Text=""Then
MsgBox"请选择权限!
",vbExclamation
cboAuthority.SetFocus
ExitSub
EndIf
SelectCasecboAuthority.Text
Case"系统管理员"
intAuth=10
Case"管理人员"
intAuth=9
Case"数据录入者"
intAuth=5
Case"数据修改者"
intAuth=6
Case"一般人员"
intAuth=0
EndSelect
sql="insertUsers(用户名,密码,权限,权限等级)values('"
sql=sql&txtUserName.Text&"','"&txtPassword1.Text&"','"
sql=sql&cboAuthority.Text&"','"&intAuth&"')"
ExeSQL(sql)
Adodc1.Refresh
EndSub
以下代码将数据更新到Users表中。
sql="updateUsersset密码='"&txtPassword1.Text&"'where用户名='"_
&txtUserName.Text&"'"
ExeSQL(sql)
Adodc1.Refresh
2)窗体初始化
窗体frmUser载入时,应先初始化,以确定frmUser在屏幕的位置,以及该用户是否有权限添加新用户及修改其他用户的权限,代码如下:
PrivateSubForm_Load()
ChangeFormPosfrmMain,frmUser
'判断用户的权限,如果是系统管理员则可以添加用户
IffrmLogin.intAuthority<8Then
cmdAdd.Enabled=False'禁用“添加”用户按钮
cmdDelete.Enabled=False'禁用“删除”用户按钮
cboAuthority.Enabled=False'禁用权限
txtUserName.Text=frmLogin.strUserName
txtUserName.Enabled=False'禁止输入用户名称
EndIf
EndSub
5.实现数据录入功能
为frmInsert窗体的“确认”按钮添加以下代码:
PrivateSubcmdOk_Click()
DimsqlAsString
DimiAsInteger
'判断是否有未填项
Fori=0To4
IftxtProductInfo(i).Text=""Then
MsgBox"请填完此项!
",vbExclamation
txtProductInfo(i).SetFocus
ExitSub
EndIf
Nexti
sql="insertProducts(编码,名称,单位,数量,供应商,备注,价格,进货时间)values('"
Fori=0To4
sql=sql&txtProductInfo(i).Text&"','"
Nexti
IftxtProductInfo(5).Text=""Then
sql=sql&Null&"',"
Else
sql=sql&txtProductInfo(i).Text&"',"
EndIf
sql=sql&txtProductInfo(6).Text&",'"&cboDate.Value&"')"
ExeSQL(sql)
MsgBox"数据录入成功!
",vbExclamation
Init
EndSub
'初始化过程Init
PrivateSubInit()
DimiAsInteger
Fori=0To6
txtProductInfo(i).Text=""
Nexti
cboDate.Value=Now
txtProductInfo(0).SetFocus
EndSub
当窗体第一次被打开时,需要确定窗体的位置和进货时间的值设置为当前日期。
代码如下:
PrivateSubForm_Load()
ChangeFormPosfrmMain,frmInsert
'初始化进货日期时间
cboDate.Value=Now
EndSub
当窗体单击“取消”按钮时,应去掉当前窗体上的数据,让用户重填,只要调用Init过程即可,代码如下:
PrivateSubcmdCancel_Click()
Init
EndSub
6.实现数据查询功能
表3-8中,数据控件Adodc1的属性CommandType为1-adCmdText,属性RecordSource为“select*fromProducts”;属性ConnectionString为:
“Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurity
Info=False;InitialCatalog=Goods”
这样可以通过SQL语句设置不同的查询条件。
下面是窗体frmQuery的功能实现代码。
(1)在代码编辑器的全局说明区为窗体frmQuery定义变量,代码如下:
OptionExplicit
DimcnAsADODB.Connection
(2)当第一次打开frmQuery时,要求连接数据并在frmQuery中显示Products表的所有记录,其代码如下:
PrivateSubForm_Load()
DimrsAsNewADODB.Recordset
ChangeFormPosfrmMain,frmQuery'设置frmQuery在frmMain中的显示位置
'初始化进货时间,缺省值为当天日期。
cboStartDate.Value=Now
cboEndDate.Value=Now
'初始化组合框cboProductNo的项为Products表的编码,
'初始化组合框cboSupplier的项为Products表的供应商。
Setrs=ExeSQL("selectdistinct编码fromProducts")
DoUntilrs.EOF
cboProductNo.AddItemrs!
编码
rs.MoveNext
Loop
Setrs=ExeSQL("selectdistinct供应商fromProducts")
DoUntilrs.EOF
cboSupplier.AddItemrs!
供应商
rs.MoveNext
Loop
EndSub
当用户选择用“编号”为条件查询时,单击cboProductNo的下拉按钮,可以从下拉列表中选择一个编号值,去查询Products表中该编号值的商品信息,这样不仅准确而且方便,不必用户输入编号。
同样,在cboSupplier中可以选择供应商,以查询该供应商的商品信息。
(3)当设置了查询条件后,单击“查询”按钮时,程序将执行以下代码:
PrivateSubcmdQuery_Click()
DimsqlAsString
'按商品编号查询
IfchkProductNoThen
IfcboProductNo.Text=""Then
MsgBox"请选择商品编号!
",vbExclamation
cboProductNo.SetFocus
ExitSub
EndIf
'按chkTime若为已选择,则按时间段查询
IfchkTime=vbCheckedThen
sql="select*fromProductswhere编码='"
sql=sql&cboProductNo.Text&"'and进货时间between'"
sql=sql&cboStartDate.Value&"'and'"&cboEndDate.Value
sql=sql&"'orderby进货时间"
Adodc1.RecordSource=sql
Adodc1.Refresh
'数据网格控件dbgrdProducts刷新,显示查询结果
dbgrdProducts.Refresh
Else
sql="select*fromProductswhere编码='"
sql=sql&cboProductNo.Text&"'orderby进货时间"
Adodc1.RecordSource=sql
Adodc1.Refresh
dbgrdProducts.Refresh
EndIf
EndIf
'按供应商查询
IfchkSupplierThen
IfcboSupplier.Text=""Then
MsgBox"请选择供应商品!
",vbExclamation
cboSupplier.SetFocus
ExitSub
EndIf
IfchkTime=vbCheckedThen
sql="select*fromProductswhere供应商='"
sql=sql&cboSupplier.Text&"'and进货时间between'"
sql=sql&cboStartDate.Value&"'and'"
sql=sql&cboEndDate.Value&"'orderby进货时间"
Adodc1.RecordSource=sql
Adodc1.Refresh
dbgrdProducts.Refresh
Else
sql="select*fromProductswhere供应商='"
sql=sql&cboSupplier.Text&"'orderby进货时间"
Adodc1.RecordSource=sql
Adodc1.Refresh
dbgrdProducts.Refresh
EndIf
EndIf
'查询全部记录
IfchkAllThen
Adodc1.RecordSource="select*fromProducts"
Adodc1.Refresh
dbgrdProducts.Refresh
EndIf
EndSub
7.实现数据修改功能
表3-9中,数据控件Adodc1的属性CommandType为2-adCmdTable,属性RecordSource为Products;属性ConnectionString为:
“Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurity
Info=False;InitialCatalog=Goods”
这样可以使显示字段的文本框与表中字段绑定。
下面是窗体frmQuery的功能实现代码。
(1)第一次打开frmUpdate窗体时,设置窗体的显示位置,并使商品编码文本框为不可编辑状态,以禁止用户修改商品的编码。
其代码如下:
PrivateSubForm_Load()
ChangeFormPosfrmMain,frmUpdate
'初始化商品编码文本框状态
txtProductInfo(0).Locked=True
EndSub
(2)单击“向前”或“向后”按钮时,将使数据表Products向前或向后移动一条商品记录,以下为代码:
'向前移动一条记录
PrivateSubcmdForward_Click()
IfAdodc1.Recordset.BOF=TrueThen
Adodc1.Recordset.MoveFirst
ExitSub
Else
Adodc1.Recordset.MovePrevious
EndIf
IfAdodc1.Recordset.BOF=TrueThen
MsgBox"已经到了最前一条记录!
",vbExclamation
Adodc1.Recordset.MoveFirst
EndIf
EndSub
'向后移动一条记录
PrivateSubcmdBackward_Click()
IfAdodc1.Recordset.EOF=TrueThen
Adodc1.Recordset.MoveLast
ExitSub
Else
Adodc1.Recordset.MoveNext
EndIf
IfAdodc1.Recordset.EOFThen
MsgBox"已经到了最后一条记录!
",vbExclamation
Adodc1.Recordset.MoveLast
EndIf
EndSub
(3)单击“添加”按钮时,程序将执行以下代码:
PrivateSubcmdAdd_Click()
DimiAsInteger
DimsqlAsString
'如果单