Foxtable(狐表)用户栏目专家坐堂 → [求助]请教关于项目编号的设计


  共有3479人关注过本帖树形打印复制链接

主题:[求助]请教关于项目编号的设计

帅哥哟,离线,有人找我吗?
likaibin1983
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:53 积分:415 威望:0 精华:0 注册:2014/3/29 23:05:00
[求助]请教关于项目编号的设计  发帖心情 Post By: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

已经可以做到根据“年份+顺序号+类型”(这个规则是必须的),但是无法根据不同的项目时间年份分别加入顺序号,有什么方式可以做到呢?不同时间的项目最好都存在同一张项目表里。

谢谢版主!


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2015/3/10 21:08:00 [只看该作者]

 看这里的帮助文档

 

http://www.foxtable.com/help/topics/2403.htm

 


 回到顶部
帅哥哟,离线,有人找我吗?
likaibin1983
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:53 积分:415 威望:0 精华:0 注册:2014/3/29 23:05:00
  发帖心情 Post By:2015/3/10 21:14:00 [只看该作者]

我已经看过了,上面的代码就是根据这个写的,但是有没有什么方式可以区分不同的年份分别编写顺序号,例如:

1)遍历读遍所有的项目日期及编号
2)选取该年份最大的顺序号
3)然后顺序号在2)上+1

逻辑我能想到,但代码不会写,请帮忙,或者请告诉我应该查看帮助文档哪个地方

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2015/3/10 21:16:00 [只看该作者]

 请上传具体例子。代码照抄即可的。

 回到顶部
帅哥哟,离线,有人找我吗?
likaibin1983
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:53 积分:415 威望:0 精华:0 注册:2014/3/29 23:05:00
  发帖心情 Post By:2015/3/10 21:22:00 [只看该作者]

我不会做,就是一张数据表,怎么实现:

1)遍历读遍所有的项目日期及编号
2)选取该年份最大的顺序号
3)然后顺序号在2)上+1

关键命令是什么?或者我去哪里查?

工况就如帖子里描述的。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2015/3/10 21:23:00 [只看该作者]

 答案在2楼啊,已经很明显了啊。

 回到顶部
帅哥哟,离线,有人找我吗?
likaibin1983
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:53 积分:415 威望:0 精华:0 注册:2014/3/29 23:05:00
  发帖心情 Post By:2015/3/10 21:31:00 [只看该作者]

欧!看到了!刚开错链接了!非常感谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:53 积分:415 威望:0 精华:0 注册:2014/3/29 23:05:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:53 积分:415 威望:0 精华:0 注册:2014/3/29 23:05:00
  发帖心情 Post By: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

 回到顶部