Foxtable(狐表)用户栏目专家坐堂 → 分享:优化窗口打开效率的多表查询实例


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

主题:分享:优化窗口打开效率的多表查询实例

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


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
分享:优化窗口打开效率的多表查询实例  发帖心情 Post By:2013/11/16 14:50:00 [只看该作者]

经过几天的捉摸,参照各位老师的指导,终于初步做出了我自己想要的效果,特意分享出来,感谢群里的热心的老师,同时也是与类似于我这样的新同学一起分享,相互增加点鼓励,和对狐表的无限期望.

界面截图:


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

项目文件:

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:高级过滤示例.rar


设计思路:
1、SQL多表查询语句以WHERE条件限制数据加载。

2、借用唐兄的企业版自定义高级过滤实例,进行设置过滤条件,形成SQL过滤条件语句。

3、通过 Tables("窗口1_Table1").Fill("Select * From{表} Where [_Identify] Is Null","数据源","true) 加载过滤条件数据表格。

 

这样一来,找开窗体的速度就是秒级,然后依条件加载数据就看数据的多少来计,这样一来,用户就能接受了。

以上项目例子,自己也发现了需要改善的几个问题,顺便提出来,希望各位老师予以指导和完善。
1、过滤字段,因为是加载多表查询中的字段,这里会有问题,比如,例子中的ID,生成的查询条件文本是 ID = 161,这样是查不出来的,因为SQL语句中正确的应该是:A.ID =161 ,这个地方怎么转换过来,当选ID时,生成的文本应该是A.ID.我看了条件符的设置,比如"大于",生成的文本是">",使用的添加了一个代码字典,而我是直接调用表的字段,不知怎么去设置?
2、查询出来后,表格中的字段宽度不能由用户自己调整后保存,下次打开后就是用户自己的宽度。如果做不了,或者用代码固定字段的宽度也行。

以上两个问题,完善了,我想后续所有的多表查询报表,操作起来就简单了。包括单表查询也可以这样不需要加载数据,打开窗口的效率就完美了,当然这是我的方法,我想应该还有更好的方法。

谢谢关注“求助:打开窗体效率慢有什么更好的优化方法? ”这个贴子的老师和所有的论坛同仁。

[此贴子已经被作者于2013-11-16 14:52:24编辑过]

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2013/11/16 14:54:00 [只看该作者]

顶.图片点击可在新窗口打开查看

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2013/11/16 14:56:00 [只看该作者]

窗口打开速度挺快的呀.

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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/16 16:44:00 [只看该作者]

1、这个没有办法自动,只能写死代码,根据用户选择的列加上对应的表名。

2、参考:

http://www.foxtable.com/help/topics/1921.htm

 


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


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
  发帖心情 Post By:2013/11/16 17:06:00 [只看该作者]

以下是引用狐狸爸爸在2013-11-16 16:44:00的发言:

1、这个没有办法自动,只能写死代码,根据用户选择的列加上对应的表名。

2、参考:

http://www.foxtable.com/help/topics/1921.htm

 

 

第一个用代码怎么写死?是不是写在以下代码中?

Dim sql As Table
sql = Tables("高级查询_Table2")

Dim frm As winform.Form = e.Form
Dim Tbl As Table = frm.Controls("Table1").Table
Dim FltStr As String
Dim i As Integer
Dim drs As List(of DataRow) = Tbl.DataTable.Select("")
Dim dr As DataRow
Dim dc As DataCol

Dim glType As String
Dim glMath As String
Dim glValue As String
Dim glstr As String
For i = 0 To drs.Count - 1
    dr = drs(i)
    If dr.IsNull("glCol") Then
        MessageBox.Show("第" & i+1 & "行过滤字段未填写!")
        Tbl.Select(i,1)
        Return
    Else
        dc = sql.DataTable.DataCols(dr("glCol"))
        glType = iif(dr("glType") = "1"," And "," Or ")
        Select Case dr("glMath")
            Case "1"
                glMath = " = "
            Case "2"
                glMath = " > "
            Case "3"
                glMath = " < "
            Case "4"
                glMath = " >= "
            Case "5"
                glMath = " <= "
            Case "6"
                glMath = " <> "
            Case "7"
                glMath = " like "
                glstr = "%"
        End Select
        If dc.IsNumeric Then
            Dim Dbl As Double
            If Double.TryParse(dr("glValue"), Dbl) Then
                FltStr = FltStr & glType & dr("glCol") & glMath & dr("glValue")
            Else
                MessageBox.Show("非法数值!")
                Tbl.Select(i,3)
                Tbl.StartEditing
                Return
            End If
        ElseIf dc.Isdate Then
            Dim dvar As Date
            If Date.TryParse(dr("glValue"), dvar) Then
                FltStr = FltStr & glType & dr("glCol") & glMath & "#" & dr("glValue") & "#"
            Else
                MessageBox.Show("非法日期值!")
                Tbl.Select(i,3)
                Tbl.StartEditing
                Return
            End If
        ElseIf dc.IsBoolean Then
            Dim boo As Boolean
            If Boolean.TryParse(dr("glValue"), boo) Then
                FltStr = FltStr & glType & dr("glCol") & glMath & boo
            Else
                MessageBox.Show("非法逻辑值!")
                Tbl.Select(i,3)
                Tbl.StartEditing
                Return
            End If
        Else
            FltStr = FltStr & glType & dr("glCol") & glMath & "'" & glstr & dr("glValue") & glstr & "'"
        End If
    End If
Next
If FltStr > "" Then
    If FltStr.StartsWith(" And ") Then
        FltStr = FltStr.SubString(5)
    ElseIf FltStr.StartsWith(" Or ") Then
        FltStr = FltStr.SubString(4)
    End If
End If

Dim slt As String = "SELECT  生产单号,A.数量 as 订单数量,物料编码,"
slt = slt & "B.数量 as 领料数量,A.MODID,A.ID FROM {表1} A "
slt = slt & "INNER JOIN {表3} B ON A.MODID=B.MODID where " & FltStr & " "
Tables("高级查询_Table2").fill(slt,"A",True)

Dim wb As WinForm.TextBox = e.Form.Controls("文本")
wb.Value = FltStr


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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/16 17:08:00 [只看该作者]

是的,就是在代码中判断:

 

Dim nm as string = "列名"

select case nm

   case "金额","数量"

        nm= "订单." & nm

   case "规格","型号"

        nm= "产品." & nm

end if


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2013/11/16 17:12:00 [只看该作者]

精神可嘉,顶帖鼓励。
[此贴子已经被作者于2013-11-16 17:12:01编辑过]

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


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
  发帖心情 Post By:2013/11/16 17:28:00 [只看该作者]

1、过滤字段,因为是加载多表查询中的字段,这里会有问题,比如,例子中的ID,生成的查询条件文本是 ID = 161,这样是查不出来的,因为SQL语句中正确的应该是:A.ID =161 ,这个地方怎么转换过来,当选ID时,生成的文本应该是A.ID.我看了条件符的设置,比如"大于",生成的文本是">",使用的添加了一个代码字典,而我是直接调用表的字段,不知怎么去设置?
这个还是不会做?
我在上面的代码上面加了以下语句,没有效果,过滤的语句还是 ID =161 不是A.ID=161


Dim nm As String = dr("glCol")
Select Case nm
   Case "ID"
        nm= "A.ID"
   Case "MODID"
        nm= "A.MODID"
End Select


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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/16 17:34:00 [只看该作者]

呵呵,这怎么可能啊,字符改了就改了,没改就没改,程序不会自做主张的,逐步调试分析一下你的代码吧:

http://www.foxtable.com/help/topics/1485.htm

 

 

 


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


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
  发帖心情 Post By:2013/11/17 12:37:00 [只看该作者]

我知道问题在哪儿了,谢谢狐爸。


 回到顶部