Foxtable(狐表)用户栏目专家坐堂 → 关于datatable的疑惑!


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

主题:关于datatable的疑惑!

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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/15 14:05:00 [显示全部帖子]

以下是引用客家阿哥在2013-7-15 13:35:00的发言:

使用下面的语句来清除加载条件

datatables().loadfilter= ""

datatables().load

是不是把所有的数据先加载到foxtable?

还是,只是在数据库加载?然后再根据foxtable程序的需要加载部分数据?

如果数据量大的话?那情况会怎样?

不需要清空,load默认从数据库加载,你条件直接写

datatable。loadFilter = “条件”

下次直接替换,再用load加载就可以了

加载速度与电脑和数据库性能有关系

 

table有个datatable属性,返回对应datatable。所以无论是单机版还是网络版,加载方式是一样的,没有必要区分。


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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/15 21:09:00 [显示全部帖子]

你没有理解这table和datatable的两个的区别

datatable——从数据源加载到foxtable的数据,如果设置了加载条件,则可能不完全等于数据源中的内容

table——从datatable中获取数据,如果设置了加载条件,则可能不完全等于datatable

 

那么三者的关系就变成数据表包含datatable(即foxtable中的datatable实际上相当于是数据源的table),datatable包含table

foxtable的大部分属性和方法都是针对已经加载的数据,后台没加载的,如果需要查找,可以使用SQLCommand,否则就设置过滤条件进行加载

 

 


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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/16 9:17:00 [显示全部帖子]

以下是引用客家阿哥在2013-7-15 22:09:00的发言:
            DataTables("学生信息表").LoadFilter = ""
            DataTables("学生信息表").LoadFilter = "学生编号 Like '%" & txt & "%'"
            DataTables("学生信息表").Load()


            DataTables("学生信息表").LoadFilter = "学生编号 Like '%" & txt & "%'"
            DataTables("学生信息表").Load()

等效??????????????????

具体在数据里面是怎么执行的?????????

loadfilter 只是一个字符串,相当于Where语句,load才是执行,所以你怎么修改都不会有任何影响,只有当执行load后才有改变


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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/24 11:30:00 [显示全部帖子]

以下是引用客家阿哥在2013-7-16 12:15:00的发言:
谢谢楼上各位老师的解答。还有具体问题要问

我记得使用 DataTables("表").Find()的时候,
如果不使用
datatables().loadfilter= ""

datatables().load

就发生找到的值不是数据现在的值问题?!,例如甲修改了数据库的值,乙找到的值仍然是加载到乙软件中的值,而不是甲修改过的值。


采用模拟关联表的时候,也一样要先清除加载条件,其实相当于重新加载整张表,不然的话,别人修改了记录,你这里就不能实时体现!


If Forms("收费操作").Opened()

    DataTables("收费记录表").LoadFilter = ""

    DataTables("收费记录表").Load

    Dim t As Table =Tables("收费记录表")

    With Tables("学生信息表") 

        If .Current Is Nothing Then

            t.Filter="False"

        Else

            t.Filter="学生信息表编号= " & .current("学生信息表编号")

        End If

    End With

End If



===================================


    DataTables("收费记录表").LoadFilter = ""

    DataTables("收费记录表").Load


这两句应该就相当于重新加载所有“收费记录表”数据到foxtable了???,数据量大的话是不是影响软件效率?


为了得到数据库的某个值,而不是加载到foxtable的值,要怎么做呢?

[此贴子已经被作者于2013-7-16 12:18:06编辑过]

你为什么要重新加载?你一开始的时候加载的表就已经限制了加载条件了,如果加载的条件没有变化,那么你只要DataTables("收费记录表").Load就可以了,别人修改的记录就被加载了。

这主要取决于你初始加载的条件而已。还有不要太担心load的影响,除非你加载数万条乃至数十万条,否则影响几乎没有。

如果你需要加载这么多数据,你本身的思路可能就需要修改了,绝大部分都是无效数据,你加载没有意义。

如果你仅仅为了查找,那么我建议你,另外一张表进行加载或者直接加载。

不要太迷恋table.filter,这样导致你必须全部加载所有数据,得不偿失。load一样非常快

 


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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/24 13:20:00 [显示全部帖子]

以下是引用客家阿哥在2013-7-24 12:43:00的发言:
如果有 fromserver,直接查询后台服务器上的数据,是不是更简单????

那你有没有想过你需要哪些数据那?你想要返回什么数据?

一个值?一行?表?

事实上 loadfilter + load = fromserver

 

那么不就是封装一个返回datatable的函数而已吗?

 


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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/24 15:23:00 [显示全部帖子]

datatables().load

就发生找到的值不是数据现在的值问题?!,例如甲修改了数据库的值,乙找到的值仍然是加载到乙软件中的值,而不是甲修改过的值。

 

你用find方法才会出现这种情况。你查找的是你已经加载的,所以你必须重新加载一次,再使用find方法

为什么不讨论find?

在刚开始学习的时候,使用过find函数,为了定位行,但有多个行的时候,用起来非常不方便。现在用loadfilter直接代替

 那么很明显,find方法在多人工作环境下,变得缺乏意义。

举个简单的例子:

你浏览网页,如果你不刷新,你能看见网页更新的内容吗?这就是相当于执行了一次load

 

你觉得把数据一次加载到foxtable中然后进行查找,真的比你从后台加载少量数据快吗?如果你网络畅通的话,你完全感觉不到区别

 

 

乙找到的值还是原来的值。

如果已经重新加载了,这个是不可能的。只有一种情况会出现,乙修改了该行,然后进行load加载。foxtable默认情况下load是保存表的,那么就修改了数据库。

解决方法

datatables().load(False)

 

[此贴子已经被作者于2013-7-24 15:31:59编辑过]

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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/24 18:02:00 [显示全部帖子]

以下是引用客家阿哥在2013-7-24 17:29:00的发言:
那么“关联表”怎么解决?

父表,子表数据能不全部加载吗?

关联表更加适合用loadfilter,按条件加载。你上个例子吧,把要求说清楚。

你回复的帖子不知道为什么总是缺失一些信息,而且页面也乱掉了,不知道是不是我的问题

 

父表,子表执行之前来一段下面的代码:代码就看不到


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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/25 9:27:00 [显示全部帖子]

就是帮助中的代码这样处理的。

这种代码可以看做是一种常规代码,你封装后可以在任何地方使用,无需重复写。

传递3个参数,
参数1 父表 dt1

参数2 子表 dt2

参数3 关联列 ID

 

子表为什么要同步加载父表所有的关联数据哪?而不是选中后加载相关ID列那?

开发版版本太低打不开最新的

[此贴子已经被作者于2013-7-25 9:29:46编辑过]

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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2013/7/25 10:10:00 [显示全部帖子]

以下是引用客家阿哥在2013-7-25 9:39:00的发言:
我的本意就是不想加载所有的子表数据,子表数据根据父表数据加载,如果关联表有个这样的属性:关联子表的数据随父表数动态(实时)加载,那多好,就不用搞那么多代码了。
利用find的时候,有个属性:从数据库中查找,也是一样的意思。

我的本意不是问有没有解决方法,而是这么常用的功能,狐表应该有一个更好的解决方法!

加个属性能代替那么多代码,不好吗?

狐表目前的方法都是针对加载后的数据,对于没有加载的,几乎没有任何功能。

 

子表根据父表加载:默认只加载选中行的相关子表记录。这应该是最合理的。

 

提出的这个子表同步问题,其实应该是用查询表解决的,而不是关联表,你可能只要一张表把这些数据呈现出来就可以了。

 

Find方法 :即使从后台加载, 还是那个问题,当你存在多个数据的时候,你返回什么?一个值?行?还是表?

返回后如何处理?显然还是不能用很简单的代码得到,你还是要自己解决这个返回后的问题。这不是一个属性能解决的,也不是一个代码能解决的,即使可以也不一定你能用的上。

 

你应该封装一些适合自己常用的方法成为一个函数,需要的时候调用即可,慢慢积累成自己的东西。

 

还有你说,对于高手SQL都是小菜.

我只能说,我在foxtable之前,没接触过数据库,不会任何的sql语句,都是在这个之后慢慢学习。而且我也很负责任的告诉你:不会SQL语句,在以后的开发中肯定处处受制,是受制于Foxtable,他没有提供你就没办法解决。

数据库的核心是sql语言,是每个学习数据库的人都应该掌握的。等你掌握了后,你会发现原来的问题,真的不是问题。

 

 

 


 回到顶部