以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  运行一段时间后代码运行错误  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=193045)

--  作者:段虎成
--  发布时间:2024/8/12 14:23:00
--  运行一段时间后代码运行错误
老师好,下面代码,一致没有问题,这几天只要增加行,输入日期,就提示“合同编号重复!”,我重新建一个项目,使用下面代码也都是正常的。为什么会这样那?
而且,下面代码也没有 “合同编号重复”的输出窗口提示。



Select Case e.DataCol.Name
    Case "签约时间"
        If e.DataCol.Name = "签约时间" Then
            If e.DataRow.IsNull("签约时间") Then
                e.DataRow("合同编号") = Nothing
            Else
                Dim d As Date = e.DataRow("签约时间")
                Dim y As Integer = d.Year
                Dim bh As String = Format(d, "yyyy") \'生成编号的前4位,4位年
                If e.DataRow("合同编号").StartsWith(bh) = False Then\'如果编号的前4位不符
                    Dim max As String
                    Dim idx As Integer
                    max = e.DataTable.SQLCompute("Max(合同编号)", "[_Identify] <> " & e.DataRow("_Identify")) 
                    If max > "" Then \'如果存在最大编号
                        idx = CInt(max.Substring(4, 6)) + 1 \'获得最大编号的后三位顺序号,并加1
                    Else
                        idx = 1 \'否则顺序号等于1
                    End If
                    e.DataRow("合同编号") = bh & Format(idx, "000000")
                    Tables("销售合同").Current.Save()
                End If
            End If
        End If
End Select 


--  作者:有点蓝
--  发布时间:2024/8/12 14:27:00
--  
Tables("销售合同").Current.Save()
改为
e.DataRow.Save()

--  作者:段虎成
--  发布时间:2024/8/12 14:39:00
--  
还是不行,一样的提示,还是提示“合同编号重复”
--  作者:有点蓝
--  发布时间:2024/8/12 14:51:00
--  
这段代码没有这个提示,检查其它事件代码
--  作者:段虎成
--  发布时间:2024/8/12 15:04:00
--  
哎,找不到其他代码,而且这段代码我只要禁用了,就不再提示了。
我再找找看。


--  作者:段虎成
--  发布时间:2024/8/12 18:02:00
--  

老师,提示信息找到了,在datacolchanging代码中, 这个代码应该是没问题。

这个代码我取消之后,发现datacolchanged在运行的时候,生成的合同编号一直不变,都是最后一个合同编号,所以导致提示“合同编号重复”,但是自动编码的代码没有动过,不知道为什么使用一段时间后出现这个问题。还未解决。

If e.DataCol.Name = "合同编号" Then
    Dim dr As DataRow
    dr = e.DataTable.SQLFind("合同编号 = \'" & e.NewValue & "\'")
    If dr IsNot Nothing Then
        MessageBox.Show("合同编号重复!")
        e.Cancel = True
    End If
End If


--  作者:有点蓝
--  发布时间:2024/8/12 20:12:00
--  
应该是合同编号出现了脏数据,比如本来应该全部是10位的编号,可能错录入了9位、11位的编号

另外如果是按年生成的编号,查询的时候也应该去判断一下年份
                Dim d As Date = e.DataRow("签约时间")
                Dim y As Integer = d.Year
Dim fd As Date = New Date(y,1,1\'获得该的第一天
Dim ld As Date = New Date(y,12,31) 
\'
获得该的最后一天
max = e.DataTable.SQLCompute("Max(合同编号)", "日期 >= \'" & fd & "\' And 日期 <= \'" & ld & "\' And [_Identify] <> " & e.DataRow("_Identify")) 
msgbox(max) ‘学会调试!看看查询出来的最大值是什么


--  作者:段虎成
--  发布时间:2024/8/12 21:47:00
--  
收到老师,谢谢
--  作者:段虎成
--  发布时间:2024/8/12 21:48:00
--  

老师,如果出现类似的脏数据,以后我应该如何处理那?(我已经按照新的编码规则处理解决了,但是担心以后还是会出现脏数据)
--  作者:有点蓝
--  发布时间:2024/8/12 21:59:00
--  
datacolchanging加代码判断一下,如果编号不是10位就提示并e.cancel掉