Foxtable(狐表)用户栏目专家坐堂 → 如何设置datatable的load条件. (不是重新加载!!!)


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

主题:如何设置datatable的load条件. (不是重新加载!!!)

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
如何设置datatable的load条件. (不是重新加载!!!)  发帖心情 Post By:2017/9/14 11:03:00 [显示全部帖子]

首先我快被load快搞死了. 先说下两种方式的差异.

1) 在项目外部数据源中,直接设置加载条件,加载数据后的结果有2000行左右.
datatable在项目启动加载的时候,非常非常快,可能不到1秒.启动进去后,datatable完全正常.

2) 在窗口代码中,如果重新load(用如下代码),非常非常慢,要1分钟以上,同样的加载条件.
DataTables("xxxxx").LoadFilter = "xxx =yyy"
DataTables("xxxxx").Load()

看Foxtable里面的帮助,关于动态加载的,都是建议用第二种代码的方式,我不知道其他人有没有遇到同样问题.

现在我改成默认先不加载,后面再加载的方式.
a) 在BeforeLoadOuterTable事件代码,(下面是复制帮助中的例子)
if e.DataTableName = "订单" Then
   e.Cancel = True 
    e.SelectString = "Selec t * F rom {订单} Wh ere [_Identify] Is Null" 

End
 If

b) 在窗口按钮中的代码中需要加载,用下面代码:
DataTables.Load("订单")

那么问题来了,我如何在Load时设置不同加载条件.因为我要根据不同用户组设置不同加载条件,不能在BeforeLoadOuterTable事件写明条件.

寻遍帮助文件找不到相关内容.

请注意DataTables.Load("订单")和DataTables("订单").Load()的差异,我问的是前一种.
[此贴子已经被作者于2017/9/14 11:09:15编辑过]

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/14 11:21:00 [显示全部帖子]

谢谢大神回复,麻烦看下我蓝色回复字体.

1)
systemready = False
DataTables("xxxxx").LoadFilter = "xxx =yyy"
DataTables("xxxxx").Load()
systemready = True

我试一下有没有用. 我目前把表间关联全部删除,表的事件代码全部注释了,都没有任何改善.

2) BeforeLoadOuterTable动态条件,你可以用全局代码,如 

e.SelectString = "Select * From {订单} Where " & public变量


BeforeLoadOuterTable会在AfterOpenProject事件之前就执行了. 我加载的代码在AfterOpenProject之后,改变会有效吗? 我试试看先.

[此贴子已经被作者于2017/9/14 11:23:46编辑过]

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/14 16:47:00 [显示全部帖子]

谢谢. 第一种方式目前还没有试. 第二种,改用public变量的方式datatable能加载了,但是出错.


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20170914163624.png
图片点击可在新窗口打开查看

相关代码如下:

BeforeLoadOuterTable事件代码
Select Case e.DataTableName
    Case "业务销售"
        e.Cancel = True '打开项目的时候不加载此表
        e.SelectString = "Select * Fro m {业务销售} Where " & SalesrecordFilterString '设置加载条件
    Case "出货记录"
        e.Cancel = True '打开项目的时候不加载此表
        e.SelectString = "Select * Fro m {出货记录} Where " & ShiprecordFilterString  '设置加载条件
End Select

用户登录窗口,登录按钮相关事件代码
 If _UserGroup = "管理员" Then
        SalesrecordFilterString = "[归档] = 0"
        ShiprecordFilterString = "[归档] = 0"
        
    Else
        SalesrecordFilterString = "[归档] = 0 AND [录入者] = '" & _UserName & "'"
        ShiprecordFilterString = "[归档] = 0 AND [录入者] = '" & _UserName & "'"      
    End If

DataTables.Load("出货记录|业务销售")

恢复了数据库,检查了出货记录表,Identify列都是正常的. 而且把这部份代码注释掉,让项目正常自行加载这两个表后,不会出错.

请帮忙看看,谢谢!

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/14 17:06:00 [显示全部帖子]

现在那个确定按钮点了之后一直再出来,进入死循环,没办法看到后面的那个运行错误的详细信息.. 只有结束foxtable进程才能退出来.

检查了所有代码,没有哪里是引用_Identify列.

看起来,只能我重新做个项目,只有这些代码试一下.

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/14 18:00:00 [显示全部帖子]

不知道是怎么搞的.重新做个项目, 用DataTables("").Load的方式完全无问题. Load多次都不会等很久.

先不加载,后面再用上面说的那些代码DataTables.Load(""),加载表,也不会出现_Identify列不存在的错误.

看起来需要把项目全部重写一遍?  这个项目之前是试用版写的,后来买了开发版之后,转换成的开发版..难道转换后会出现问题吗?



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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/14 18:04:00 [显示全部帖子]

初步判断不是数据库的问题,因为重新建个新项目,两种方式加载没有任何问题.

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/14 19:45:00 [显示全部帖子]

以下是引用有点甜在2017/9/14 18:50:00的发言:

 

程序代码的问题。

 

1、这种方式有没有用?

 

systemready = False
DataTables("xxxxx").LoadFilter = "xxx =yyy"
DataTables("xxxxx").Load()
systemready = True

 

2、把所有关联都删除,把表达式列的公式都去掉,把表事件代码去掉,测试有没有问题?


1. 没用.

2. 把所有关联删除,所有表达式列删除,没有问题了. 看起来,要采用排除法,一个个试了.




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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/15 8:55:00 [显示全部帖子]

写了一个全局过程如下,来代替datatable的load方法.正在测试中. 


Public Sub ReloadData(ByVal dt As DataTable,ByVal se As Boolean) '全局过程,用于加载表前清空表达式列的公式,并于加载表后还原相应公式.

'创建临时表用于保存表达式列名称及对应公式
Dim dtb As New DataTableBuilder("表达式列暂存")
Dim tempdt As DataTable
dtb.AddDef("列名", Gettype(String), 30)
dtb.AddDef("表达式", Gettype(String), 200)
tempdt = dtb.Build(True)

'下面将表达式列公式保存到临时表
Dim tempdr As DataRow
Dim pi As System.Reflection.PropertyInfo
For Each dc As DataCol In dt.DataCols
    
    pi = dc.Gettype.getproperty("IsTemporary",Reflection.BindingFlags.nonpublic Or Reflection.BindingFlags.Instance)
    
    If pi.getvalue(dc,Nothing) Then
        tempdr = tempdt.AddNew()
        tempdr("列名") = dc.Name
        tempdr("表达式") = dc.Expression
        dc.Expression =""
    End If
Next

dt.Load(se)

'下面将表达式列公式还原
For Each dr As DataRow In tempdt.DataRows
    dt.DataCols(dr("列名")).Expression = dr("表达式")
Next

End Sub

[此贴子已经被作者于2017/9/15 8:55:55编辑过]

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/15 9:04:00 [显示全部帖子]

测试结果,比以前好多了.但是在还原公式的过程中,似乎又在重新计算了,延迟大概2-3秒左右.

以前直接load差不多60秒.

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


加好友 发短信
等级:幼狐 帖子:94 积分:800 威望:0 精华:0 注册:2013/2/11 18:26:00
  发帖心情 Post By:2017/9/15 13:29:00 [显示全部帖子]

谢谢. 重新改了一下代码,简洁多了.

Public Sub ReloadData(ByVal dt As DataTable,ByVal se As Boolean) '全局过程,用于加载DataTable前清空表达式列的公式,并于加载表后还原相应公式.

'将表达式列公式保存到数据字典中,并清空.
Dim zd As New Dictionary(Of String, String)
For Each dc As DataCol In dt.DataCols
    If dc.Expression <>"" Then
        zd.Add(dc.Name,dc.Expression)
        dc.Expression =""
    End If
Next

'加载DataTable
dt.Load(se)

'下面将表达式列公式还原
If zd.Count > 0 Then
    For Each K As String In zd.Keys
        dt.DataCols(K).Expression = zd(K)
    Next
End If

End Sub
[此贴子已经被作者于2017/9/15 13:36:17编辑过]

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