以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]请教关于项目编号的设计 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=65182) |
-- 作者:likaibin1983 -- 发布时间:2015/3/10 21:05:00 -- [求助]请教关于项目编号的设计 请问版主,我在一张项目表里,要设计项目编号。项目表里有两列,分别是“项目时间”和“项目类型”。其中项目类型有A, B, C三类。 我设计的项目编号规则如下,根据“项目时间”+“顺序号”+“项目类型”+,例如 Case 1 项目时间:2015-03-01(项目表里第一个录入的2015年的项目) 项目类型:A 项目编号:15001A Case 2 项目时间:2015-06-01(项目表里第二个录入的2015年的项目) 项目类型:C 项目编号:15002C Case 3 项目时间:2016-06-01(虽然是项目表里第三个录入的项目,但是是第一个项目时间为2016年的项目) 项目类型:C 项目编号:16001C (注意不是16003C) 我目前只能在表事件的datacolchanged里加入以下代码: If e.DataRow.IsNull("项目日期") OrElse e.DataRow.IsNull("项目类型") Then e.DataRow("项目编号") = Nothing Else e.DataRow("项目编号") = Right(e.DataRow("项目日期").Year,2) + Format(e.DataRow("_Identify"),"000") + e.DataRow("项目类型") End If 已经可以做到根据“年份+顺序号+类型”(这个规则是必须的),但是无法根据不同的项目时间年份分别加入顺序号,有什么方式可以做到呢?不同时间的项目最好都存在同一张项目表里。 谢谢版主! |
-- 作者:有点甜 -- 发布时间:2015/3/10 21:08:00 -- 看这里的帮助文档
http://www.foxtable.com/help/topics/2403.htm
|
-- 作者:likaibin1983 -- 发布时间:2015/3/10 21:14:00 -- 我已经看过了,上面的代码就是根据这个写的,但是有没有什么方式可以区分不同的年份分别编写顺序号,例如: 1)遍历读遍所有的项目日期及编号 2)选取该年份最大的顺序号 3)然后顺序号在2)上+1 逻辑我能想到,但代码不会写,请帮忙,或者请告诉我应该查看帮助文档哪个地方
|
-- 作者:有点甜 -- 发布时间:2015/3/10 21:16:00 -- 请上传具体例子。代码照抄即可的。 |
-- 作者:likaibin1983 -- 发布时间:2015/3/10 21:22:00 -- 我不会做,就是一张数据表,怎么实现: 1)遍历读遍所有的项目日期及编号 2)选取该年份最大的顺序号 3)然后顺序号在2)上+1 关键命令是什么?或者我去哪里查? 工况就如帖子里描述的。
|
-- 作者:有点甜 -- 发布时间:2015/3/10 21:23:00 -- 答案在2楼啊,已经很明显了啊。 |
-- 作者:likaibin1983 -- 发布时间:2015/3/10 21:31:00 -- 欧!看到了!刚开错链接了!非常感谢! |
-- 作者:有点甜 -- 发布时间:2015/3/10 21:54:00 -- If e.DataCol.Name = "项目日期" OrElse e.DataCol.Name = "项目类型" Then If e.DataRow.IsNull("项目日期") OrElse e.DataRow.IsNull("项目类型") Then e.DataRow("项目编号") = Nothing Else Dim ydate As Date = new Date(e.DataRow("项目日期").year, 1, 1) Dim max As String = e.DataTable.Compute("max(项目编号)", "项目日期 >= #" & ydate & "# and 项目日期 < #" & ydate.AddYears(1) & "# and 项目类型 = \'" & e.DataRow("项目类型") & "\'") If max > "" Then e.DataRow("项目编号") = Right(e.DataRow("项目日期").Year,2) & Format(cint(max.SubString(2,3)) + 1,"000") & e.DataRow("项目类型") Else e.DataRow("项目编号") = Right(e.DataRow("项目日期").Year,2) & "001" & e.DataRow("项目类型") End If End If End If |
-- 作者:likaibin1983 -- 发布时间:2015/3/10 23:39:00 -- 谢谢版大,研究了半天完美解决! 对于这段代码,有一行没看的太懂,有点疑问请教(接二楼教程里的一行), max = e.DataTable.Compute("Max(编号)","日期 >= #" & fd & "# And 日期 <= #" & ld & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该月的最大编号 问题: [_Identify] <> " & e.DataRow("_Identify") 这两个主键列比较的意义是什么?没看懂。而且还是用and与两个日期日期比较 逻辑与 起来。能解释一下吗?
|
-- 作者:likaibin1983 -- 发布时间:2015/3/10 23:46:00 -- 哇,太感动了,居然帮我写出来。。。 ![]() 这个我自己琢磨出来写的,也能行: If e.DataCol.Name = "项目日期" Then If e.DataRow.IsNull("项目日期") OrElse 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 ld As Date = New Date(y,12,31) Dim bh As String = Format(d,"yy") If e.DataRow("项目编号").StartsWith(bh) = False 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(2,3)) + 1 \'获得最大编号的后三位顺序号,并加1 Else idx = 1 End If e.DataRow("项目编号") = bh & Format(idx,"000") & e.DataRow("项目类型") End If End If End If |