Foxtable(狐表)用户栏目专家坐堂 → 什么时候用Datatables 什么时候用tables


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

主题:什么时候用Datatables 什么时候用tables

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


加好友 发短信
等级:幼狐 帖子:72 积分:614 威望:0 精华:0 注册:2009/5/23 10:22:00
什么时候用Datatables 什么时候用tables  发帖心情 Post By:2009/6/3 14:53:00 [只看该作者]

Dim dr1 As DataRow = Tables("A").Current.DataRow


这一句中 Tables("表A")  是指表A

如果换成 DataTables("表A")呢?   

请问什么时候用DataTables("表名")  什么时候用tables("表名")呢?

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


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


图片点击可在新窗口打开查看此主题相关图片如下:asd.gif
图片点击可在新窗口打开查看

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


加好友 发短信
等级:幼狐 帖子:72 积分:614 威望:0 精华:0 注册:2009/5/23 10:22:00
  发帖心情 Post By:2009/6/3 14:59:00 [只看该作者]

狐狸老爸,这个我看过了,您看这句 

dr2 = DataTables("表B").Find("[品名]  = '" & dr1("品名") & "'And [规格] = '" & dr1("规格") & "'")

这个地方的表名为什么不用Tables呢?

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


加好友 发短信
等级:幼狐 帖子:72 积分:614 威望:0 精华:0 注册:2009/5/23 10:22:00
  发帖心情 Post By:2009/6/3 15:00:00 [只看该作者]

而且不是说DataRow 代表数据表的行啊吗? DataRow相对应的应该是DataTabel才对啊
[此贴子已经被作者于2009-6-3 15:02:38编辑过]

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


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

在DataTable中找,就是在仓库找,只要有,都能找到。
在Table中找,就是在展厅找,如果Table进行了筛选,且你要找的记录不符合筛选条件,你就找不出来了。



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


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

示例三

上面的例子提到,TableRowCol都有对应的属性,用于返回其所属的DataTableDataRowDataCol
但是却不可能反过来操作,因为一个DataTable,可能对应有多个Table
不过通过TableFindRow方法,我们可以获得某一个DataRowTable中的位置。
例如我们希望在订单表中,将光标定位到最近一次订购PD01的行上:

Dim dr As DataRow
Dim
po As Integer
dr = DataTables("
订单").Find("产品 = 'PD01'","日期 Desc") '找出最后一次订购PD01产品的DataRow
po = Tables("
订单").FindRow(dr)'找出该DataRowTable中的位置
If
po >= 0 Then '如果找到
    Tables(
"订单").Position = po '选定
End If

因为Table可能会进行筛选,所以一个DataRow可能不会出现在Table中,此时FidnRow方法会返回-1,表示没有找到指定的DataRow

再例如正在订单表操作,希望在订单表中选定一行时,客户表的光标能够自动定位到该客户,这样我一旦从订单表回到客户表,即可看到刚刚所选订单的客户资料。
为此我们在CurrentChanged事件中设置如下代码: 

Dim wz As Integer
Dim
dr As DataRow
dr = DataTables("
客户").Find("[客户ID] = '" & e.Table.Current("客户ID") & "'")
If
dr IsNot Nothing Then
    wz = Tables("
客户").FindRow(dr)
    If wz >= 0 Then
        Tables
("
客户").Position = wz
    End If
EndIf

这种在不同表之间联动的技巧应该掌握,也许你觉得通过关联,不就可以在订单表中以关联表的形式显示客户信息吗?
但是:
1
、有的时候我们并不希望建立太多的关联。
2
、即使建立了关联,我们也可能关闭了Foxtable的双向关联特性,这样就无法以关联表的形式查看父表数据了。

 


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


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

示例四

其实Table也有Find方法,不过TableFind方法是根据内容查找,而不是根据表达式来查询,返回的是行的位置。

例如:

With CurrentTable
    Dim
r As Integer
   
r = .Find("PD01", 0, "
产品", False, False, True)
    If
r > - 1 Then '如果找到符合条件的行

        .
Position = r
    End If
End With

TableFind方法功能较弱,但是使用简单,通常用于进行简单的查找和定位。
Table
还有一个FidRow方法,可以使用表达式进行查找,例如订单表的公司名称列中,查找包括“湛江”二字的单位:

With Tables("订单")
    Dim
r As Integer
    r = .FindRow("[
公司名称] Like '*湛江*'", .Position + 1, True ) '从当前行开始查找

    If
r >= 0 Then '如果找到的话
       
.Position = r'定位到找到的行。
   
End If
End With

显然TableFindFindRow方法的查找结果,会受筛选的影响,因为作为Table的方法,只是在可见的行中进行查找; 此外因为没有排序参数,这两个方法无法按照特定的顺序进行查找,只能从上往下地顺序查找。
相对来说,DataTableFind方法则要强大很多,不仅可以用表达式查询,有排序参数,还可以指定返回第几个符合条件的行,而且可以不受筛选的影响,只要有符合条件的行,始终都能找出来。
一些复杂的查找,用TableFindFindRow方法是无法实现的,我们可以先用DataTableFind方法,找出符合条件的DataRow,让后利用TableFindRow方法 ,找出该DataRowTable中的位置。
例如我们希望定位到客户CS01第二次订购PD01产品的行:

Dim dr As DataRow
Dim
Index As Integer
dr = DataTables("
订单").Find("客户 = 'CS01' And 产品 = 'PD01'","日期",1)
Index = Tables("
订单").FindRow(dr)
If
Index > 0 Then
    Tables(
"
订单").Position = Index
End If

 


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


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

示例五

除非需要定位 到符合条件的行,否则是不需要使用TableFindFindRow方法的。

例如希望在订单表输入产品编号,能够从产品表提取该产品的名称、型号、规格,自动输入到订单表的相关列中。
为实现此目的,可在订单表的DataColChanged事件中输入如下代码:

If e.DataCol.Name ="产品编号" Then '发生变化的是产品名称吗?
    '
在产品表找出该产品

   
Dim dr As DataRow = DataTables("产品").Find("编号 = " & "'" & e.DataRow("产品编号") & "'" )
    If dr IsNot Nothing'
如果找到,则设置各列内容

        e.DataRow("
品名")= dr("品名")
        e.DataRow("
型号")= dr("型号")
        e.DataRow("
规格")= dr("规格"
)
    End If
EndIf

在上面的代码中,我们是在DataTable中查找所输入编号的产品,这是显然的, 首先我们只是引用数据,并不需要定位,其次如果在Table中查找,一旦Table进行了筛选,而你输入的产品编号恰好不符合筛选条件,那么就无法实现自动输入。


 回到顶部
美女呀,离线,留言给我吧!
yangming
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/6/3 15:07:00 [只看该作者]

http://www.foxtable.com/dispbbs.asp?BoardID=2&ID=2913&replyID=&skin=1

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


加好友 发短信
等级:幼狐 帖子:72 积分:614 威望:0 精华:0 注册:2009/5/23 10:22:00
  发帖心情 Post By:2009/6/3 15:40:00 [只看该作者]

是不是可以这样理解  DataTable 包括一个表的所有行! 包括不隐藏的或其它不可见的行,
Table包括一个表中可见的行?
如果一个表没有不可见的行时  DataTables(“表名“)和 Tables("表名")所包含的内容是一样的?

 回到顶部
总数 11 1 2 下一页