Access交流中心

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

写入冲突/修改表已提示有相同项仍进行修改

麥稥  发表于:2012-02-21 16:29:19  
复制

第一次发帖 用了360  打了几遍 都白打了 差点扔键盘

 

言归正传,这里是对一个以产品系列为主键的内饰详细尺寸表进行修改,其中 规格料单说 字段 为附件,用了ADO方法 两个记录集判断

先对 除了 主键 附件 两字段的 所有字段进行判断 如果有 提示已存在 否则进入第二个判断 产品系列存在的话 进行修改 相应字段

否则退出

其中sql语句 我是一行的 这里换行了 应该没问题   组合框更新后 事件 查询 各个字段 如图1

问题1: 修改时 判断了 有相同项 但结果仍进行修改 导致两个相同项  为什么 难道我的判断 逻辑错误?

问题2: 修改后 选择组合框查询 提示 写入冲突 就是第二个图 为何 应该是哪里的问题?

请各位帮忙看看 多谢    第一次发帖 有什么不对 不妥的地方 见谅

If IsNull(Combo114) Then
        MsgBox "请选择产品系列!", vbOKOnly, "温馨提示"
        Me.Combo114.SetFocus
    Else
        Dim sql As String
        Dim rs As ADODB.Recordset
        Set rs = New ADODB.Recordset
        sql = "select * From 内饰详细尺寸表 Where 枕头尺寸='" & Me.Text65 & "' and 枕头重量='" & Me.Text67 & "' and 床垫尺寸='" & Me.Text73 & "' and 床垫重量='" & Me.Text71 & "' and 前盖顶='" & Me.Text51 & "' and 后盖顶='" & Me.Text53 & "' and 前盖围='" & Me.Text55 & "' and 后盖围='" & Me.Text57 & "' and 前盖='" & Me.Text61 & "' and 后尾='" & Me.Text63 & "' and 盖被='" & Me.Text69 & "' and 小围布='" & Me.Text75 & "'"
        rs.Open sql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        If rs.RecordCount = 1 Then
            MsgBox "此产品系列信息已存在,请重新输入!", vbOKOnly, "温馨提示"
            rs.Close
            Set rs = Nothing
            Me.Combo114.SetFocus
        Else
            Dim sql1 As String
            Dim rs1 As ADODB.Recordset
            Set rs1 = New ADODB.Recordset
            sql1 = "select * From 内饰详细尺寸表 Where 产品系列='" & Me.Combo114 & "'"
            rs1.Open sql1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
            If rs1.RecordCount = 1 Then
                rs1("枕头尺寸") = Me.Text65
                rs1("枕头重量") = Me.Text67
                rs1("床垫尺寸") = Me.Text73
                rs1("床垫重量") = Me.Text71
                rs1("前盖顶") = Me.Text51
                rs1("后盖顶") = Me.Text53
                rs1("前盖围") = Me.Text55
                rs1("后盖围") = Me.Text57
                rs1("前盖") = Me.Text61
                rs1("后尾") = Me.Text63
                rs1("盖被") = Me.Text69
                rs1("小围布") = Me.Text75
                rs1.Update
                rs1.Close
                Set rs1 = Nothing
                MsgBox "修改成功!", vbOKOnly, "温馨提示"
            Else
                MsgBox "产品系列不存在,请重新选择!", vbOKOnly, "温馨提示"
                Me.Combo114.SetFocus
            End If
        End If
    End If

 

Top
纵云梯 发表于:2012-02-21 22:49:42

就这个例子,大哥你的编程逻辑是有问题的。

 

第一个错误:

    当你第一次用ADODB打开表【内饰详细尺寸表】时你用rs.RecordCount = 1 来判断你的条件是否成立,成立你就来个【MsgBox】然后用【rs.Close】来结束这个ADODB,但你有没有想过当它不成立时走到你的【Else】里你有没有同样用【rs.Close】来结束这个ADODB?答案是:无论你用那一种方法(ADO、DAO、等等)打开一个数据集,你必须要关闭它不管你有多小条件或这些条件成立与否。你第一次打开【内饰详细尺寸表】只开不关的做法自然为了第二次打开【内饰详细尺寸表】埋下写入冲突的伏笔  (即是说你第一次用ADODB打开的【内饰详细尺寸表】还未关闭你又要用第二个ADODB去打开【内饰详细尺寸表】),如图:

 

第二个错误:

    第二个错误更第一个类似对ADODB数据集只开不关。



纵云梯 发表于:2012-02-21 22:54:30

解决方案应该如下(只是应该,因为不知道还有没有其它问题;最好发个例子,准保可以改回回传):

If IsNull(Combo114) Then
        MsgBox "请选择产品系列!", vbOKOnly, "温馨提示"
        Me.Combo114.SetFocus
    Else
        Dim sql As String
        Dim rs As ADODB.Recordset
        Set rs = New ADODB.Recordset
        sql = "select * From 内饰详细尺寸表 Where 枕头尺寸='" & Me.Text65 & "' and 枕头重量='" & Me.Text67 & "' and 床垫尺寸='" & Me.Text73 & "' and 床垫重量='" & Me.Text71 & "' and 前盖顶='" & Me.Text51 & "' and 后盖顶='" & Me.Text53 & "' and 前盖围='" & Me.Text55 & "' and 后盖围='" & Me.Text57 & "' and 前盖='" & Me.Text61 & "' and 后尾='" & Me.Text63 & "' and 盖被='" & Me.Text69 & "' and 小围布='" & Me.Text75 & "'"
        rs.Open sql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        If rs.RecordCount = 1 Then
            MsgBox "此产品系列信息已存在,请重新输入!", vbOKOnly, "温馨提示"
            rs.Close
            Set rs = Nothing
            Me.Combo114.SetFocus
        Else

            rs.Close
            Set rs = Nothing  '你必须在打开下面的
【内饰详细尺寸表】表前关闭上面已经打开的【内饰详细尺寸表】表
            Dim sql1 As String
            Dim rs1 As ADODB.Recordset
            Set rs1 = New ADODB.Recordset
            sql1 = "select * From 内饰详细尺寸表 Where 产品系列='" & Me.Combo114 & "'"
            rs1.Open sql1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
            If rs1.RecordCount = 1 Then
                rs1("枕头尺寸") = Me.Text65
                rs1("枕头重量") = Me.Text67
                rs1("床垫尺寸") = Me.Text73
                rs1("床垫重量") = Me.Text71
                rs1("前盖顶") = Me.Text51
                rs1("后盖顶") = Me.Text53
                rs1("前盖围") = Me.Text55
                rs1("后盖围") = Me.Text57
                rs1("前盖") = Me.Text61
                rs1("后尾") = Me.Text63
                rs1("盖被") = Me.Text69
                rs1("小围布") = Me.Text75
                rs1.Update
                rs1.Close
                Set rs1 = Nothing
                MsgBox "修改成功!", vbOKOnly, "温馨提示"
            Else
                MsgBox "产品系列不存在,请重新选择!", vbOKOnly, "温馨提示"
                Me.Combo114.SetFocus
            End If

                rs1.Close
                Set rs1 = Nothing
        End If

 



纵云梯 发表于:2012-02-21 23:00:49

解决方案应该如下(只是应该,因为不知道还有没有其它问题;最好发个例子,准保可以改回回传):

If IsNull(Combo114) Then
        MsgBox "请选择产品系列!", vbOKOnly, "温馨提示"
        Me.Combo114.SetFocus
    Else
        Dim sql As String
        Dim rs As ADODB.Recordset
        Set rs = New ADODB.Recordset
        sql = "select * From 内饰详细尺寸表 Where 枕头尺寸='" & Me.Text65 & "' and 枕头重量='" & Me.Text67 & "' and 床垫尺寸='" & Me.Text73 & "' and 床垫重量='" & Me.Text71 & "' and 前盖顶='" & Me.Text51 & "' and 后盖顶='" & Me.Text53 & "' and 前盖围='" & Me.Text55 & "' and 后盖围='" & Me.Text57 & "' and 前盖='" & Me.Text61 & "' and 后尾='" & Me.Text63 & "' and 盖被='" & Me.Text69 & "' and 小围布='" & Me.Text75 & "'"
        rs.Open sql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        If rs.RecordCount = 1 Then
            MsgBox "此产品系列信息已存在,请重新输入!", vbOKOnly, "温馨提示"
            rs.Close
            Set rs = Nothing
            Me.Combo114.SetFocus
        Else

            rs.Close
            Set rs = Nothing  '你必须在打开下面的
【内饰详细尺寸表】表前关闭上面已经打开的【内饰详细尺寸表】表
            Dim sql1 As String
            Dim rs1 As ADODB.Recordset
            Set rs1 = New ADODB.Recordset
            sql1 = "select * From 内饰详细尺寸表 Where 产品系列='" & Me.Combo114 & "'"
            rs1.Open sql1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
            If rs1.RecordCount = 1 Then
                rs1("枕头尺寸") = Me.Text65
                rs1("枕头重量") = Me.Text67
                rs1("床垫尺寸") = Me.Text73
                rs1("床垫重量") = Me.Text71
                rs1("前盖顶") = Me.Text51
                rs1("后盖顶") = Me.Text53
                rs1("前盖围") = Me.Text55
                rs1("后盖围") = Me.Text57
                rs1("前盖") = Me.Text61
                rs1("后尾") = Me.Text63
                rs1("盖被") = Me.Text69
                rs1("小围布") = Me.Text75
                rs1.Update
                rs1.Close
                Set rs1 = Nothing
                MsgBox "修改成功!", vbOKOnly, "温馨提示"
            Else
                MsgBox "产品系列不存在,请重新选择!", vbOKOnly, "温馨提示"
                Me.Combo114.SetFocus

                rs1.Close
                Set rs1 = Nothing

            End If

        End If



方鸿亮 发表于:2012-02-22 09:12:53

我了个悲剧 又用360回复了 写了那么多 都没了。。

谢谢你的回复

我就简单的说下

我照着你的例子改了 不行  照样出现我那两个问题  写入冲突  有相同项 仍然进行修改

 

因为我对ado用法也了解,按照你的 说法  可以用多个记录集对表进行读取 但写入 更新的时候 必须只有一个记录集

 

1.我按照你的 都进行了关闭 但仍有 写入冲突 出现 ,不知为何?

2.提示有相同项 仍进行修改 有两种情况   首先这个表  产品型号为主键 规格料单说明 为 附件类型  其他都为文本  我只对其他的字段进行判断

  2.1  产品系列1 其他字段均为1  产品系列2 其中有个为2  我故意把2修改成1  提示有相同项  但仍进行修改入表 不知为何

  2.2  产品系列1 有个字段为空  其他均为1 产品系列2 相同字段为空 其他为1 有个为2  我故意把2修改成1 不提示有相同项 也进行修改 不知为何 

 

 



纵云梯 发表于:2012-02-22 10:54:01
发个例子上来,准能帮你改好。

方鸿亮 发表于:2012-02-22 11:22:19
纵云梯 发表于:2012-02-22 11:41:36

兄弟我只有Access2003,发个2003格式的上来,否则我打不开!



方鸿亮 发表于:2012-02-22 12:24:35

保存不了低级版本。

你就自己自己建个表 图

表 一个附件字段 两个文本字段 一个产品系列主键

 修改代码 就用我那种形式

我自己试过了 还是那个问题

 

没时间的话 就算了

还是谢谢你



纵云梯 发表于:2012-02-22 13:05:39

不行,我不知道你的数据库结构。



方鸿亮 发表于:2012-02-22 15:09:37

窗口中的文本框的控制来源 都是用到 窗体源为内饰详细尺寸表的 字段 ,用ADO修改表的方法 是不是有问题?

选择组合框来控制窗体过滤器的 所以是不是有这可能?  以表为源的窗体 打开的记录 跟 修改时用到的记录集 冲突? 



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