Foxtable(狐表)用户栏目专家坐堂 → [求助]求一个简单的自动填表实例


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

主题:[求助]求一个简单的自动填表实例

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


加好友 发短信
等级:婴狐 帖子:5 积分:101 威望:0 精华:0 注册:2010/5/23 8:50:00
[求助]求一个简单的自动填表实例  发帖心情 Post By:2010/5/23 9:18:00 [只看该作者]

由于本人基础太差,对狐表始终不得要领,现求一个实例,见附件

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


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/5/23 10:07:00 [只看该作者]

试试这个(放在datacolchanged事件中):

dim bm as string = currenttable.current("部门编码")
Dim ls() as String
ls = bm.split("-")
If bm <> "" Then
    Select Case ls.Length
        Case 1
            currenttable.current("部门全称") = currenttable.current("部门名称")
        Case 2
            Dim dr As DataRow
            dr = DataTables("部门表").Find("部门编码 = '" & ls(0) & "'")
            currenttable.current("部门全称") = dr("部门名称") & "-" & currenttable.current("部门名称")
        Case 3
            Dim dr As DataRow
            dr = DataTables("部门表").Find("部门编码 = '" & ls(0) & "-" & ls(1) & "'")

            currenttable.current("部门全称") = dr("部门全称") & "-" & currenttable.current("部门名称")
    End Select
End If

[此贴子已经被作者于2010-5-23 10:07:24编辑过]

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


加好友 发短信
等级:婴狐 帖子:5 积分:101 威望:0 精华:0 注册:2010/5/23 8:50:00
  发帖心情 Post By:2010/5/23 10:33:00 [只看该作者]

谢谢,但第二项要求“填列部门编码时,编码必需依级次增加,不能填无上级的编码”还不能满足,虽然有提示(提示好像是代码错误提示),但还是能填不符合要求的编码。如:在没有编码3的时候还是能填编码3-1或者3-2-1 。mr725兄再帮助完善一下

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/5/23 10:41:00 [只看该作者]

这样不报错:

 

Select Case e.DataCol.Name
    case "部门编码","部门名称"
        Dim dr As DataRow
        dim bm as string = currenttable.current("部门编码")
        Dim ls() as String
        ls = bm.split("-")
        If bm <> "" Then
            If ls.Length<=1 Then
                currenttable.current("部门全称") = currenttable.current("部门名称")
            Elseif ls.Length<=2 Then
                dr = DataTables("部门表").Find("部门编码 = '" & ls(0) & "'")
                if dr IsNot Nothing Then
                    currenttable.current("部门全称") = dr("部门名称") & "-" & currenttable.current("部门名称")
                End If
            ElseIf ls.Length<=3 Then
                dr = DataTables("部门表").Find("部门编码 = '" & ls(0) & "-" & ls(1) & "'")
                if dr IsNot Nothing Then
                    currenttable.current("部门全称") = dr("部门全称") & "-" & currenttable.current("部门名称")
                End If
            End if
        End If
End Select

[此贴子已经被作者于2010-5-23 10:46:16编辑过]

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/5/23 11:20:00 [只看该作者]

以下是引用我会用狐表在2010-5-23 10:33:00的发言:
谢谢,但第二项要求“填列部门编码时,编码必需依级次增加,不能填无上级的编码”还不能满足,虽然有提示(提示好像是代码错误提示),但还是能填不符合要求的编码。如:在没有编码3的时候还是能填编码3-1或者3-2-1 。mr725兄再帮助完善一下

以为你会用狐表呢···    在4楼基础上再加些判断:

If e.DataCol.Name = "部门编码" and e.DataRow.IsNull("部门编码") Then
    e.DataRow("部门名称") = nothing
    e.DataRow("部门全称") = nothing
ElseIf e.DataCol.Name = "部门名称" and e.DataRow.IsNull("部门名称") Then
    e.DataRow("部门全称") = nothing
Else
    dim bm as string = e.DataRow("部门编码")
    Dim ls() as String
    ls = bm.split("-")
    If bm <> "" Then
        Select Case ls.Length
            Case 1
                e.DataRow("部门全称") = e.DataRow("部门名称")
            Case 2
                Dim dr As DataRow
                dr = DataTables("部门表").Find("部门编码 = '" & ls(0) & "'")
                if dr IsNot Nothing Then
                    e.DataRow("部门全称") = dr("部门名称") & "-" & e.DataRow("部门名称")
                else
                    messagebox.show("没有上一级编码")
                    e.DataRow("部门编码") = nothing
                end if
            Case 3
                Dim dr As DataRow
                dr = DataTables("部门表").Find("部门编码 = '" & ls(0) & "-" & ls(1) & "'")
                if dr IsNot Nothing Then
                    e.DataRow("部门全称") = dr("部门全称") & "-" & e.DataRow("部门名称")
                else
                    messagebox.show("没有上一级编码")
                    e.DataRow("部门编码") = nothing                
                end if
        End Select
    End If
End If


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


加好友 发短信
等级:婴狐 帖子:5 积分:101 威望:0 精华:0 注册:2010/5/23 8:50:00
  发帖心情 Post By:2010/5/23 11:24:00 [只看该作者]

以上两种代码,还不能满足“填列部门编码时,编码必需依级次增加,不能填无上级的编码”。如:在没有编码3的时候,如在部门编码列填3-1或者3-2-1,希望能给出提示“编码错误”,并清除所填内容.谢谢

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


加好友 发短信
等级:婴狐 帖子:5 积分:101 威望:0 精华:0 注册:2010/5/23 8:50:00
  发帖心情 Post By:2010/5/23 11:34:00 [只看该作者]

对了,谢谢

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/5/24 8:32:00 [只看该作者]

楼主记得使用Datacolchanged事件的时候,一定要判断列名。

 

一定要判断列名!

不少人,特别是初学编程的人,没有在DataColChanged事件中判断列名的习惯,例如为了在订单表计算金额,往往只是在DataColChanged简单地写入代码:

Dim dr As DataRow = e.DataRow
dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))

这样可能会带来严重的后果,首先会导致重复的计算,因为数量、单价或折扣发生变化后,触发DataColChanged事件,计算得出新的金额,而金额列内容的变化,会再次触发DataColChanged事件,使得金额被重新计算一次;实际上其他不相关列,例如日期、客户、产品等列内容发生变化后,同样会触发DataColChanged事件,导致金额列被重新计算。

显然这样的代码,效率实在是太低,而且在机缘巧合的情况下,很可能会出现死循环,导致程序崩溃。

所以我们一定要养成良好的习惯,在编写DataColChanged事件代码时,判断发生变化列的名称,只有相关列发生变化时,才进行特定的重算工作。

例如:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
   
Case "数量","单价","折扣"
        dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
End
Select

这节的内容不仅仅针对DataColChanged,实际上对于任何表事件都有效,例如DataColChaning、PrepareEdit、ValidateEdit、AfterEdit等等。


 回到顶部