以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  自动编号代码改写  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=154223)

--  作者:zyxhx
--  发布时间:2020/9/8 15:20:00
--  自动编号代码改写
请老师帮忙改写一下以下代码:以下代码生成的格式为202009-0001,如果需要:组织机构代码(9位)+年份(4位)+流水码(4位),以下代码应该如何改写,请老师指点:

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 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,"yyyyMM") \'生成编号的前6位,4位年,2位月.
        If e.DataRow("编号").StartsWith(bh) = False \'如果编号的前6位不符
            Dim max As String
            Dim idx As Integer
            max = e.DataTable.Compute("Max(编号)","填表日期 >= #" & fd & "# And 填表日期 <= #" & 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("编号") = bh & "-" & Format(idx,"0000")
        End If
    End If
End If



--  作者:有点蓝
--  发布时间:2020/9/8 15:26:00
--  
组织机构代码是一个列?还是一个固定的值?
--  作者:zyxhx
--  发布时间:2020/9/8 15:31:00
--  
固定的
[此贴子已经被作者于2020/9/8 15:31:18编辑过]

--  作者:有点蓝
--  发布时间:2020/9/8 15:38:00
--  
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 fd As Date = New Date(y,1,1)
        Dim bh As String = "xx组织机构代码" & Format(d,"yyyy") \'生成编号的前6位,4位年,2位月.
        If e.DataRow("编号").StartsWith(bh) = False \'如果编号的前6位不符
            Dim max As String
            Dim idx As Integer
            max = e.DataTable.Compute("Max(编号)","填表日期 >= #" & fd & "# And 填表日期 < #" & fd.addyears(1) & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该月的最大编号
            If max > "" Then \'如果存在最大编号
                idx = CInt(max.Substring(max.length - 4)) + 1 \'获得最大编号的后四位顺序号,并加1
            Else
                idx = 1 \'否则顺序号等于1
            End If
            e.DataRow("编号") = bh & "-" & Format(idx,"0000")
        End If
    End If
End If

--  作者:zyxhx
--  发布时间:2020/9/8 15:46:00
--  
老师,如果组织机构代码是固定列呢?
--  作者:有点蓝
--  发布时间:2020/9/8 15:55:00
--  
参考:http://www.foxtable.com/webhelp/topics/2403.htm,看四、按日期和类别编号
--  作者:zyxhx
--  发布时间:2020/9/8 17:38:00
--  
谢谢老师:就是其中这段代码的意思不太理解:
max = e.DataTable.Compute("Max(编号)","填表日期 >= #" & fd & "# And 填表日期 < #" & fd.addyears(1) & "# And [_Identify] <> " & e.DataRow("_Identify"))

--  作者:有点蓝
--  发布时间:2020/9/8 20:17:00
--  
不是按年编号的吗,【"填表日期 >= #" & fd & "# And 填表日期 < #" & fd.addyears(1) & "#】就是指在这一年的范围之内,比如是今年,条件就是【"填表日期 >= #2020-1-1# And 填表日期 < #2021-1-1#
--  作者:zyxhx
--  发布时间:2020/9/8 21:12:00
--  
这一段怎么理解?为什么必须加上这一段:And [_Identify] <> " & e.DataRow("_Identify")
[此贴子已经被作者于2020/9/8 21:12:33编辑过]

--  作者:有点蓝
--  发布时间:2020/9/8 21:43:00
--  
取最大值的时候排除当前行的值