以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  自动编号突然失效  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=130762)

--  作者:whoisvinci
--  发布时间:2019/1/31 12:45:00
--  自动编号突然失效
在datarowadded中的代码

Dim cmd As New SQLCommand
Dim dt As Date
cmd.C
cmd.CommandText = "Select GetDate()" \'从远程数据库获取日期信息
dt = cmd.ExecuteScalar()
e.DataRow("日期") = dt
Dim d As Date = e.DataRow("日期")
Dim y As Integer = d.Year
Dim m As Integer = d.Month
Dim Days As Integer = Date.DaysInMonth(y,m)
Dim fd As Date = New Date(y,m,1) \'获得该月的第一天
Dim ld As Date = New Date(y,m,Days) \'获得该月的最后一天
Dim bh As String ="HP"& Format(d,"yyMM") \'生成货品编号的前6位,2位字符,2位年,2位月.
e.DataRow.save \'***必须在sqlcompute前先保存,才能获得当前行的真实的_identify值***
If e.DataRow("货品编号").StartsWith(bh) = False \'如果货品编号的前6位不符
    Dim max As String
    Dim idx As Integer  
    max = e.DataTable.sqlCompute("Max(货品编号)","[日期] >= \'" & fd & "\' And [日期] <= \'" & ld & "\'And [_Identify] <> " & e.DataRow("_Identify")) \'取得该月的最大货品编号
    If max > "" Then \'如果存在最大货品编号
        idx = CInt(max.Substring(6,4)) + 1 \'获得最大货品编号的后四位顺序号,并加1
    Else
        idx = 1 \'否则顺序号等于1
    End If
    e.DataRow("货品编号") = bh & Format(idx,"0000")
    e.DataRow.save   
End If

发布的程序,至昨天之前使用还是正常的,能够自动增加编号,但今天就始终无法自动增加。同样的功能另外的表自动编码又是正常的。不知道是不是SQL SERVER那边的问题。

--  作者:有点甜
--  发布时间:2019/1/31 12:46:00
--  

重新发布,然后测试,看是否正常。


--  作者:whoisvinci
--  发布时间:2019/1/31 12:50:00
--  
我在源程序上直接运行也不行,而且我用了很多之前备份的版本,都是这个问题
--  作者:whoisvinci
--  发布时间:2019/1/31 13:03:00
--  
感觉的现象就像是我新增加的行好像没有保存到后台数据库中,但我从菜单“外部数据表”预览,是能看到新增加项的,而且关闭程序后打开,重新加载,刚刚增加的重复项也是正常加载进来的,所以很奇怪
--  作者:cyrollin
--  发布时间:2019/1/31 13:05:00
--  
我也是今天出现了很多状况,没改代码,但是有些功能运行不正常,昨天还好好的。。。
--  作者:whoisvinci
--  发布时间:2019/1/31 13:11:00
--  
难道是因为今天是1月31号的缘故?
--  作者:whoisvinci
--  发布时间:2019/1/31 13:25:00
--  


图片点击可在新窗口打开查看此主题相关图片如下:qq拼音截图未命名20190131.jpg
图片点击可在新窗口打开查看

还真是因为日期的原因,我把服务器时间改成2月1日,自动编号又正常了,百思不得其解图片点击可在新窗口打开查看


--  作者:有点甜
--  发布时间:2019/1/31 14:44:00
--  

改一改代码

 

max = e.DataTable.sqlCompute("Max(货品编号)","[日期] >= \'" & fd & "\' And [日期] < \'" & ld.addDays(1) & "\' And [_Identify] <> " & e.DataRow("_Identify")) \'取得该月的最大货品编号


--  作者:whoisvinci
--  发布时间:2019/2/1 18:07:00
--  
谢谢,甜版,代码确实解决了这个问题,但我还是没明白其中的原因,而且原来同样的代码在另一个表上是可以正常工作的,仅这一个表会出现这个情况。不知甜版能否帮我分析下大概的原因?
--  作者:有点蓝
--  发布时间:2019/2/1 22:35:00
--  
以下是引用whoisvinci在2019/2/1 18:07:00的发言:
谢谢,甜版,代码确实解决了这个问题,但我还是没明白其中的原因,而且原来同样的代码在另一个表上是可以正常工作的,仅这一个表会出现这个情况。不知甜版能否帮我分析下大概的原因?


同一份代码,在不同环境,不同表格,不同事件,甚至不同的数据下效果都未必是一样的。

这个问题应该是数据库里的日期值有时分秒导致的,比如日期值:2019-1-2 23:01:01

那么 【日期 <= 2019-1-2】只能查到:2019-1-2 0:0:0及之前的记录
只有【日期 < 2019-1-3】可以查到2019-1-3 0:0:0之前的记录,就是2019-1-2 23:59:59之前的记录
[此贴子已经被作者于2019/2/2 10:32:14编辑过]