Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

平台树控件的编辑分类不成功

孙召  发表于:2017-08-24 10:22:22  
复制

 

Top
麥田 发表于:2017-08-24 11:22:31
截图看看

孙召 发表于:2017-08-24 12:32:01


孙召 发表于:2017-08-24 12:33:28
前段时间在网站中看到了网友地主老财 发布的《设施设备管理系统》开发心得及Access源码分享,试了一下。发现在树控件分类中存在一点问题,查看源码也没找到问题,请各位大侠指点,具体问题如下:
“分类A”、“分类B”属于1级分类,“分类E”属于“分类A”下的2级分类,而且存在物料明细。现在通过编辑分类按钮把“分类E”移到“分类B”下,保存后,“分类A”下不见了“分类E”,“分类B下”出现了“分类E”,但无物料明细。退出后重新登录,此时“分类A”下又出现了“分类E”而且存在物料明细,“分类B”下也有“分类E”但无物料明细。给两个表做了关系:实施参照完整性、级联更新相关字段,问题依然。求解?如下图:



孙召 发表于:2017-08-24 12:33:55

代码:

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



Victor Duane 发表于:2017-09-04 22:11:35
上传文件,帮你看一下

孙召 发表于:2017-09-05 08:49:06

就是网站上的案例:《设施设备管理系统》开发心得及Access源码分享

http://www.accessoft.com/article-show.asp?id=16498



孙召 发表于:2017-09-07 13:01:02

虽然没有老师帮忙解答,经过自己一番折腾终于搞明白了错误原因,归根结底还是基础知识不扎实,没有发现低级错误。

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



总记录:7篇  页次:1/1 9 1 :