Foxtable(狐表)用户栏目专家坐堂 → 跨表引用慢


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

主题:跨表引用慢

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


加好友 发短信
等级:狐精 帖子:3210 积分:21336 威望:0 精华:0 注册:2016/3/28 16:57:00
跨表引用慢  发帖心情 Post By:2020/1/17 16:19:00 [只看该作者]

老师,跨表引用慢,怎么解决呢?

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "S  ELECT DISTINCT 合同编码,所属机构,项目名称,合同金额 From {合同签订}"
dt = cmd.ExecuteReader()
If  e.DataCol.Name = "项目名称" Then
     Dim nms()As String = {"合同编码","所属机构","合同金额"}
     If  e.NewValue Is Nothing Then 
         For Each nm As String In nms
             e.DataRow(nm)= Nothing 
         Next 
     Else 
         Dim dr As DataRow
         dr = dt.Find("[项目名称]= '" & e.NewValue & "'") 
         If  dr IsNot Nothing
             For Each nm As String In nms
                 e.DataRow(nm)= dr(nm)
             Next
         End If
     End If
End If


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


加好友 发短信
等级:超级版主 帖子:110784 积分:563852 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/1/17 16:46:00 [只看该作者]

这种代码本身就是灾难。任何一个单元格编辑都会加载一下合同签订数据,有句话叫啥来着:吃饱了.....

1、加载{合同签订}表也没有看到什么条件,还不如一开始就加载这张表所有数据进来使用。要学会从逻辑上思考一下怎么处理业务合适,而不仅仅是在写代码上。就好比我要修车,就要用到a/b/c/d各种工具,那么是用到每样工具的时候再临时去仓库找呢,还是一次性把需要使用的工具拿过来放到身边合适!不要把写代码看做是多么高深的玩意,代码的逻辑就是业务逻辑的实现,先思考一下怎么样的逻辑是合理的,再考虑写代码。我们说动态加载,有时候是为了提高程序启动的速度,一开始用不到的数据就慢一点加载。但不是一刀切,转到另外一个极端:任何时候都必须临时加载使用。一些常用的数据,或者某个功能密集需要使用到的数据,就应该先加载出来使用。如果是在主表里用,可以在afteropenproject加载,如果是窗口表要使用,可以在窗口afterload加载。就算不作为主表加载,也可以做为临时表加载,不需要了再卸载掉。

2、就算您喜欢一定要每次都动态加载,也不要把代码放在这个事件开头呀,写了这么久代码,应该也知道这个datacolchanged事件是除了表达式列之外所有单元格数据更改都会触发的吧!不要说到现在还搞不懂?

3、再说了既然最终也就使用到其中一行数据,那么为什么不一开始就只加载这一行数据呢,加载其它数据有啥用!
If  e.DataCol.Name = "项目名称" Then
     Dim nms()As String = {"合同编码","所属机构","合同金额"}
     If  e.NewValue Is Nothing Then  
         For Each nm As String In nms 
             e.DataRow(nm)= Nothing  
         Next  
     Else  
Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "SELECT DISTINCT 合同编码,所属机构,项目名称,合同金额 From {合同签订} where [项目名称]= '" & e.NewValue & "'"
dt = cmd.ExecuteReader()
         If dt.datarows.count > 0
Dim dr As DataRow = dt.datarows(0)
             For Each nm As String In nms
                 e.DataRow(nm)= dr(nm)
             Next
         End If
     End If
End If

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


加好友 发短信
等级:狐精 帖子:3210 积分:21336 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By:2020/1/17 17:00:00 [只看该作者]

谢谢老师耐心指点,逻辑确实是个难点,没系统学过,只能照搬帮助的,没做到举一反山。

又算是学到一个方法。


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


加好友 发短信
等级:超级版主 帖子:110784 积分:563852 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/1/17 17:19:00 [只看该作者]

逻辑不需要什么系统的学!就是自己生活,工作的时候对怎么做好一件事的思考而已。

 回到顶部