以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 还是自动编号的问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=47180) |
-- 作者:xvkewen -- 发布时间:2014/3/5 20:17:00 -- 还是自动编号的问题 我在BeforesaveDatarow事件中全部代码如下,我想让所有行在保存前都自动给它一个编号,但是用以下代码会出现重复编号,为什么?怎么改呢? 具体情况是这样的:在打开项目的时候,根据不同用户组加载不同的数据,这些数据都在同一个表里;现在问题是同一个用户组生产的编号是不重复的,而不同用户组之前的编号则是会重复的,假如我有5个用户组,数据的初始编号是001,那么就有5个001的编号,请问这样的问题该怎么办呢? Dim yh As DataRow = DataTables("User_info").Find("User_Name = \'" & _username & "\'" ) \'获取当前用户信息 \'If yh IsNot Nothing Then \'退出前删除空办单; e.DataTable.DeleteFor("[Customer] Is Null and [Style_No] is null and [size] is null and [color] is null and [Follow_QA] = \'" & yh("FullName") & "\'") \'删除空行 Dim dr1 As DataRow = DataTables("scheduling").Find("([排单顺序] Is Null or [Sewing_Team] Is Null or [sample_state] Is Null ) And [Follow_QA] = \'" & yh("FullName") & "\'") \' 找出当前用户出办日期为空,车缝组别,样办状态的办单; Dim i As Integer = Tables("scheduling").Findrow("([排单顺序] Is Null or [Sewing_Team] Is Null or [sample_state] Is Null ) and [Follow_QA] = \'" & yh("FullName") & "\'") \'找出当前用户出办日期为空的办单行的位置; If e.DataRow.RowState <> DataRowState.Added And e.DataRow.RowState <> DataRowState.Modified Then Return End If If dr1 Is Nothing Then \'如果没有找到当前用户出办日期为空的办单,则保存当前排期,并给出新的内部办单号 \'**************************设定办单号为自动编号******************************* If e.DataRow.IsNull("Inside_SRS") Then Dim d As Date = e.DataRow("input_date") 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 = Format(d,"yyMM") \'生成编号的前6位,4位年,2位月. If e.DataRow("Inside_SRS").StartsWith(bh) = False \'如果编号的前6位不符 Dim max As String Dim idx As Integer max = e.DataTable.Compute("Max(Inside_SRS)","Input_date >= #" & fd & "# And Input_date <= #" & ld & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该月的最大编号 If max > "" Then \'如果存在最大编号 idx = CInt(max.Substring(7,4)) + 1 \'获得最大编号的后四位顺序号,并加1 Else idx = 1 \'否则顺序号等于1 End If e.DataRow("Inside_SRS") ="BR" & bh & "-" & Format(idx,"0000") End If End If Else \'否则需要补充【出办日期】与【车缝组别】才能保存,如果【样办状态】为空将会出现无法加载的情况 msgbox("办单号:" & dr1("SRS_No") & ",款号: " & dr1("Style_No") & "的【出办日期】,【样办状态】及【车缝组别】不能为空,请补充完毕后重新保存;") e.Cancel = True Tables("scheduling").Position = i End If \' \'End If |
-- 作者:有点甜 -- 发布时间:2014/3/5 21:08:00 -- 如果你是用2014版的话,保存之前,先去获取后台数据库里最大的编号
max = e.DataTable.Compute("Max(Inside_SRS)","Input_date >= #" & fd & "# And Input_date <= #" & ld & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该月的最大编号
改成
max = e.DataTable.SqlCompute("Max(Inside_SRS)","Input_date >= #" & fd & "# And Input_date <= #" & ld & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该月的最大编号
http://www.foxtable.com/help/topics/2897.htm |
-- 作者:xvkewen -- 发布时间:2014/3/5 21:22:00 -- 丰常感谢,明天再去测试一下;但是我担心会不会随着数据量的增加,导致保存的速度越来越慢? |
-- 作者:有点甜 -- 发布时间:2014/3/5 21:26:00 -- 以下是引用xvkewen在2014-3-5 21:22:00的发言:
丰常感谢,明天再去测试一下;但是我担心会不会随着数据量的增加,导致保存的速度越来越慢?
但是没有办法的,因为你的情况是多用户使用,必须这样才能获取到最新的编号的。 |
-- 作者:有点甜 -- 发布时间:2014/3/5 21:29:00 -- 或者你用列 前缀 + _Identify 列做编号,这样就不需要获取最大值了。
http://www.foxtable.com/help/topics/1443.htm |
-- 作者:xvkewen -- 发布时间:2014/3/5 22:24:00 -- 我们用的版本是2013的,还没有SQLcommad属性,除了这个和 _Identify列,还没有没有别办法? |
-- 作者:xvkewen -- 发布时间:2014/3/7 20:35:00 -- 还有别的什么办法吗? |
-- 作者:有点甜 -- 发布时间:2014/3/7 21:29:00 -- 以下是引用xvkewen在2014-3-7 20:35:00的发言:
还有别的什么办法吗?
有办法,你用sql语句代替sqlcompute的功能就行了 http://www.foxtable.com/help/topics/0696.htm
参考例子 http://www.foxtable.com/help/topics/1994.htm
|