北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |
代码:
Private Sub btnSave_Click()
On Error GoTo ErrorHandler
Dim strWhere As String
Dim strSQL As String
Dim rst As DAO.Recordset
Dim lngNum As Long
Dim objNode As MSComctlLib.Node
Dim strNewNum As String
If Not CheckRequired(Me) Then Exit Sub
If Not CheckTextLength(Me) Then Exit Sub
If Not IsNull(Me.txt分类编号) And Me.cbo上级分类编号 Like Me.txt分类编号 & "*" Then
MsgBoxEx "上级分类不能是当前分类或当前分类下的子分类。", vbInformation
Exit Sub
End If
strWhere = " 分类编号 Like '" & Me.cbo上级分类编号 & "####'" _
& " AND 分类编号<>'" & Me.txt分类编号 & "'" _
& " AND 分类名称=" & sqltext(Me.txt分类名称)
If DCount("*", "物料分类表", strWhere) > 0 Then
MsgBoxEx "该分类已存在,不能重复添加。", vbInformation
Exit Sub
End If
'添加新分类时,或者修改分类但上级分类被改变时,都需要重新进行编号
If IsNull(Me.txt分类编号) Or Nz(Me.cbo上级分类编号) <> Me.cbo上级分类编号.Tag Then
'如果是修改分类但上级分类发生变化时,需要先删除已有的节点
If Not IsNull(Me.txt分类编号) Then
DAORunSQL "DELETE FROM 物料分类表 WHERE 分类编号='" & Me.txt分类编号 & "'"
gobjTreeView.Nodes.Remove gobjTreeView.SelectedItem.Key
End If
'----------生成编号的代码开始----------
strSQL = " SELECT * FROM 物料分类表" _
& " WHERE 分类编号 Like '" & Me.cbo上级分类编号 & "####'" _
& " ORDER BY 分类编号"
Set rst = CurrentDb.OpenRecordset(strSQL)
lngNum = 1001 '初始编号从1001开始,而不是从1开始,可以保证编号位数固定,而不需要格式化补零
Do Until rst.EOF
If CLng(Right(rst!分类编号, 4)) > lngNum Then
Exit Do
End If
lngNum = lngNum + 1
rst.MoveNext
Loop
strNewNum = Me.cbo上级分类编号 & lngNum
'----------生成编号的代码结束----------
'保存新增或重新生成的分类到表中
rst.AddNew
rst!分类编号 = strNewNum
rst!分类名称 = Me.txt分类名称
rst.Update
rst.Close
'将新增或重新生成的分类添加到树列表中
Set objNode = gobjTreeView.Nodes.Add("K" & Me.cbo上级分类编号, tvwChild, _
"K" & strNewNum, Me.txt分类名称)
objNode.EnsureVisible '使新增的节点可见
Set gobjTreeView.SelectedItem = objNode '选中新增的节点
Set gobjTreeView.DropHighlight = objNode '高亮新增的节点
If Not objNode.Parent Is Nothing Then
Me.cbo上级分类编号 = Mid(objNode.Parent.Key, 2)
Else
Me.cbo上级分类编号 = Null
End If
If IsNull(Me.txt分类编号) Then
Me.txt分类名称 = Null
Me.txt分类名称.SetFocus
Me.cbo上级分类编号.Requery
Else
DoCmd.Close acForm, Me.Name
End If
Else
'仅修改分类名称时(上级分类不变),直接更新表中和树列表中的分类名称即可
strSQL = "UPDATE 物料分类表 SET 分类名称 = '@新分类名称' WHERE 分类编号 = '@分类编号'"
strSQL = Replace(strSQL, "@新分类名称", Me.txt分类名称)
strSQL = Replace(strSQL, "@分类编号", Me.txt分类编号)
DAORunSQL strSQL
gobjTreeView.SelectedItem.Text = Me.txt分类名称
DoCmd.Close acForm, Me.Name
End If
ExitHere:
Set rst = Nothing
Set objNode = Nothing
Exit Sub
ErrorHandler:
MsgBoxEx Err.Description, vbCritical
Resume ExitHere
End Sub
就是网站上的案例:《设施设备管理系统》开发心得及Access源码分享
http://www.accessoft.com/article-show.asp?id=16498
虽然没有老师帮忙解答,经过自己一番折腾终于搞明白了错误原因,归根结底还是基础知识不扎实,没有发现低级错误。
1、首先案例中的两个表 “物料分类表”和“物料信息表”存在关系。当“物料信息表”中存在记录时删除不了“物料分类表”中的关联记录,此例中“笔”分类下关联“圆珠笔”、“中性笔”两条记录,所以不能直接从“物料分类表”中删除“笔”分类(可以直接从data库表中删除试一下),所以需要修改相关代码:
注释掉此部分代码:
'如果是修改分类但上级分类发生变化时,需要先删除已有的节点
' If Not IsNull(Me.txt分类编号) Then
' DAORunSQL "DELETE FROM 物料分类表 WHERE 分类编号='" & Me.txt分类编号 & "'"
' gobjTreeView.Nodes.Remove gobjTreeView.SelectedItem.Key
' End If
关键是第2行,如果“物料信息表”中存在相关记录,在这里“物料分类表”中是删不掉相关记录的。第3行只是从树控件中删除了节点,当然看不到要修改的节点了,还以为修改成功,但分类表中的记录并没有删除,当然退出程序重新加载后树控件原来的地方又出现该节点了。
2、接下来,添加新分类时或者修改分类但上级分类被改变时,都需要重新进行编号。重新编号后,如果是新增的分类则直接添加新分类编号,如果是修改分类且上级分类被改变时,则把原来的分类编号更改为新生成的分类编号,如此就OK了。添加代码如下:
'如果是新增分类,则将新分类添加到物料分类表中
If IsNull(Me.txt分类编号) Then
rst.AddNew
rst!分类编号 = strNewNum
rst!分类名称 = Me.txt分类名称
rst.Update
rst.Close
Else '如果修改上级分类时,则将原分类编号更改为新分类编号
strSQL = "update 物料分类表 set 分类编号=" & sqltext(strNewNum) & " where 分类编号=" & sqltext(Me.txt分类编号)
DaoRunSQL strSQL
gobjTreeView.Nodes.Remove gobjTreeView.SelectedItem.Key
End If
3、注释掉此部分代码:
'保存新增或重新生成的分类到表中
' rst.AddNew
' rst!分类编号 = strNewNum
' rst!分类名称 = Me.txt分类名称
' rst.Update
' rst.Close
Access软件网 版权所有 CopyRight 2006-2030
上海盟威软件有限公司 提供支持
沪ICP备12024966号-4