以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]流水号自动生成问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=25070)

--  作者:云淡风轻
--  发布时间:2012/10/30 16:48:00
--  [求助]流水号自动生成问题

情况说明:

数据库中“全宗号”列的数值从1,2,3,4,5中取,分类号的值从0,1,2,3,4,5,6中取值,“年度”列的值是4位数,如2005,2006等,那么对于分类号是0,2,3的行,如何自动生成流水号列“存址号”列,其形式为“全宗号-年度-10001开始的递增数”,即形式为1-2005-10001,1-2005-10002,...,1-2005-10554,...,如果输入的年度以前没有输过的,比如新的年度2006,那么流水号又从10001开始,即1-2006-10001,1-2006-10002,...以此递增。

 

如何代码实现自动生成流水号?谢谢!

 

附数据:

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目8.foxdb

[此贴子已经被作者于2012-10-30 16:48:46编辑过]

--  作者:lin_hailun
--  发布时间:2012/10/30 22:21:00
--  
 打不开你的开发版项目。做了个小例子。

 
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.table



 

--  作者:lin_hailun
--  发布时间:2012/10/31 10:51:00
--  

 
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目8.foxdb



--  作者:云淡风轻
--  发布时间:2012/10/31 16:18:00
--  

谢谢指点!还想请教下,如果全宗号是X01,X02,X03,X04,X05时,流水号如X01-2005-10004形式的,怎么修改呢?因为此时e.DataTable.Compute("Max(存址号)", "全宗号 = " & e.DataRow("全宗号") & " And 年度 = " & e.DataRow("年度") & " And 分类号 in (0,2,3) And _Identify <> " & e.DataRow("_Identify"))代码,运行弹出调用的目标异常的错误,如何修改?谢谢!不同的全宗号,分类号是0,2,3,如果年度相同的话,流水号是重新编的,又从10001开始。所以在筛选里把全宗号 = " & e.DataRow("全宗号") 这个加上了

[此贴子已经被作者于2012-10-31 16:38:55编辑过]

--  作者:lin_hailun
--  发布时间:2012/10/31 16:30:00
--  
 嗯嗯,是的,要改成这句

Dim idx As String = e.DataTable.Compute("Max(存址号)", "全宗号 = \'" & e.DataRow("全宗号") & "\' And 年度 = " & e.DataRow("年度") & " And 分类号 in (0,2,3) And _Identify <> " & e.DataRow("_Identify"))

--  作者:云淡风轻
--  发布时间:2012/10/31 16:40:00
--  

嗯,我也这样想,可是增加行的时候报错了。怎么办?

Dim idx As String = e.DataTable.Compute("Max(存址号)", "全宗号 = \'" & e.DataRow("全宗号") & "\' And 年度 = " & e.DataRow("年度") & " And 分类号 in (0,2,3) And _Identify <> " & e.DataRow("_Identify"))

 

 

这个语句对于X01-2005-10001,X01-2005-10002,...,...

好像没有办法判断最大值,因为其中有X字母,不知是不是这样?

[此贴子已经被作者于2012-10-31 16:41:57编辑过]

--  作者:lin_hailun
--  发布时间:2012/10/31 16:51:00
--  
 比较大小是肯定能比较的。可能是在最后生成的时候出了差错。

这句
idx = idx.SubString(9) + 1

改成这句
idx = idx.SubString(e.DataRow("全宗号").length + e.DataRow("分类号").Length + e.DataRow("年度").length + 1) + 1

--  作者:云淡风轻
--  发布时间:2012/10/31 16:57:00
--  

还是不行。

 

我测试时改成

 

Select Case e.DataCol.Name
    Case "全宗号", "年度", "分类号"
        If e.DataRow.IsNull("全宗号") = False AndAlso e.DataRow.IsNull("分类号") = False AndAlso e.DataRow.IsNull("年度") = False  Then
            If e.DataRow("分类号") = 0 OrElse e.DataRow("分类号") = 2 OrElse e.DataRow("分类号") = 3 Then
                Dim idx As String = e.DataTable.Compute("Max(存址号)", "全宗号 = " & e.DataRow("全宗号") & " And 年度 = " & e.DataRow("年度") & " And 分类号 in (0,2,3) And _Identify <> " & e.DataRow("_Identify"))
                messagebox.show(idx)
            End If
        End If
End Select

弹出“调用的目标发生异常”错误。

说明idx值有问题

[此贴子已经被作者于2012-10-31 17:00:36编辑过]

--  作者:lin_hailun
--  发布时间:2012/10/31 17:02:00
--  
 如果列是字符类型,记得在左右加单引号 \'

 "全宗号 = \'" & e.DataRow("全宗号") & "\'"
 

--  作者:云淡风轻
--  发布时间:2012/10/31 17:05:00
--  
谢谢!!!一语中的,大侠!!