以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]向另一张表写记录时有时会失败  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=177990)

--  作者:huangfanzi
--  发布时间:2022/6/14 9:15:00
--  [求助]向另一张表写记录时有时会失败
销售出库表的DataColChanged事件有以下代码,作用是将1条销售记录按多个应付日期拆成多条记录分别写入到不对用户开放的另一张表,方便统计账龄,在实际使用中,有时会发生写入失败的情况,但不会报错,发现失败的原因是查账龄时结果不对,目前处理的办法就是将销售出库表的审核列取消审核,然后再审核一下,也就是重新执行下以下代码。
老师,帮我看看下面代码是否有不完善的地方,看看有没有办法解决到发生写入失败时能自动再重写一次。
谢谢老师!

\'自动把记录写入应付明细表
If e.DataCol.Name = "审核" Then
    If e.NewValue = True Then
        If e.DataRow("应付日期1") <> Nothing Then
            Dim dr As DataRow = _dt销售出库应付日期明细.AddNew
            dr("ID") = e.DataRow("_Identify")
            dr("应付描述") = e.DataRow("应付描述1")
            dr("应付日期") = e.DataRow("应付日期1")
            dr("应付金额") = e.DataRow("应付金额1")
            For Each dc As DataCol In _dt销售出库应付日期明细.DataCols
                If e.DataTable.DataCols.Contains(dc.Name) Then
                    If e.DataRow.IsNull(dc.Name) = False Then
                        dr(dc.Name) = e.DataRow(dc.Name)
                    End If
                End If
            Next
            dr.Save
        End If
        If e.DataRow("应付日期2") <> Nothing Then
            Dim dr As DataRow = _dt销售出库应付日期明细.AddNew
            dr("ID") = e.DataRow("_Identify")
            dr("应付描述") = e.DataRow("应付描述2")
            dr("应付日期") = e.DataRow("应付日期2")
            dr("应付金额") = e.DataRow("应付金额2")
            For Each dc As DataCol In _dt销售出库应付日期明细.DataCols
                If e.DataTable.DataCols.Contains(dc.Name) Then
                    If e.DataRow.IsNull(dc.Name) = False Then
                        dr(dc.Name) = e.DataRow(dc.Name)
                    End If
                End If
            Next
            dr.Save
        End If
        If e.DataRow("应付日期3") <> Nothing Then
            Dim dr As DataRow = _dt销售出库应付日期明细.AddNew
            dr("ID") = e.DataRow("_Identify")
            dr("应付描述") = e.DataRow("应付描述3")
            dr("应付日期") = e.DataRow("应付日期3")
            dr("应付金额") = e.DataRow("应付金额3")
            For Each dc As DataCol In _dt销售出库应付日期明细.DataCols
                If e.DataTable.DataCols.Contains(dc.Name) Then
                    If e.DataRow.IsNull(dc.Name) = False Then
                        dr(dc.Name) = e.DataRow(dc.Name)
                    End If
                End If
            Next
            dr.Save
        End If
    Else
        _dt销售出库应付日期明细.SQLDeleteFor("ID = " & e.DataRow("_Identify"))
    End If
End If

--  作者:有点蓝
--  发布时间:2022/6/14 9:29:00
--  
1、不建议使用自增主键_Identify值做业务关联。如果以后迁移数据库,或者还原数据库,有可能_Identify值是会变的,到时候数据就全部关联不上了
2、如果销售出库表要审核的行是新增的行,那么_Identify值有可能并不是真正的值,必须要保存过一次后才是真正的值。所以如果是新增的行,就会发现数据关联不上了,就以为是保存失败

可以在处理前先保存一下
If e.DataCol.Name = "审核" Then
e.DataRow.save
    If e.NewValue = True Then
        If e.DataRow("应付日期1") <> Nothing Then