Foxtable(狐表)用户栏目专家坐堂 → 生成查询条件的通用代码


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

主题:生成查询条件的通用代码

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
生成查询条件的通用代码  发帖心情 Post By:2009/8/24 16:40:00 [显示全部帖子]

该代码可根据当前打开的table列,自动生成查询条件。比如,table表有2列,就可以输入2列的查询关键字;有5列就可以输入5列的查询关键字。这样的通用代码,将使查询更加灵活。
以下图为例,如要查询叠次等于“B”、且叠名包含“休”字的记录,只要输入“B,休”即可。关键字之间用半角逗号分开;
如要查询叠名包含“休”字的全部记录,只要输入“,休”即可。这表明第一列没有输入关键字。

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

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/8/24 16:41:00 [显示全部帖子]

通用条件生成函数Filter的代码如下:

'生成可见的列名称
Dim Cols,Vals as New List(of String)
Dim txt As String = "A"             '加个A是为了便于替换
For Each c as Col in Args(0).Cols
    If c.Visible = True
        txt = txt & "," & c.name
    End If
Next
txt = txt.Replace("A,","")         '生成可见列名
'生成查询条件
Cols.AddRange(txt.Split(","))      '字段列表
Vals.AddRange(Args(1).Replace("'","''").Replace("*","[*]").Split(","))  '查询值列表并保证其有效
Dim flt As String = "A"            '加个A是为了便于替换
Dim i as Integer = 0
For Each Val as String in Vals
    If i < Cols.Count
        flt = flt & " and " & Cols(i) & " like '*" & Val & "*'"
    End If
    i = i + 1
Next
flt = flt.Replace("A and ","")
Return flt


调用方法,如:

'生成查询条件
Dim txt as String = Functions.Execute("Filter",Tables("窗口1_Table1"),e.Form.Controls("TextBox1").Text)
'执行查询
Tables("窗口1_Table1").Filter = txt


这是例子:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.table

[此贴子已经被作者于2009-8-24 16:42:41编辑过]

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
reachtone
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/8/24 17:19:00 [显示全部帖子]

以下是引用chenwuwenyu在2009-8-24 17:03:00的发言:
你太牛了,正琢磨实现这个功能呢,
看来我又可以偷懒了
谢谢

但要注意,二楼的代码只能对字符型的列进行查询。如果你的列中有其它数据类型,需要在 If i < Cols.Count 里进行判断。如:
If  Args(0).Cols(i).DataCol.IsNumeric   '如果是数值型
If  Ars(0).Cols(i).DataCol.IsDate         '如果是日期型,等等。否则会出错的。

[此贴子已经被作者于2009-8-24 17:22:26编辑过]

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/8/26 14:43:00 [显示全部帖子]

如果是数值型的列,可以这样:
把原来代码中的:flt = flt & " and " & Cols(i) & " like '*" & Val & "*'"  替换成:

        If Args(0).Cols(i).DataCol.IsNumeric and Trim(Val).length > 0 and Char.IsNumber(Val) Then
            flt = flt & " and " & Cols(i) & " = " & Val
        ElseIf Args(0).Cols(i).DataCol.IsString Then
            flt = flt & " and " & Cols(i) & " like '*" & Val & "*'"
        End If

第一行表示的意思是:
如果列类型为数值型:Args(0).Cols(i).DataCol.IsNumeric,而且
      输入的关键字不为空:Trim(Val).length > 0,而且
     输入的关键字也是数值型:Char.IsNumber(Val)

[此贴子已经被作者于2009-8-26 14:44:10编辑过]

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/8/26 15:14:00 [显示全部帖子]

日期也很简单啊,无非再加上date的判断而已。
这个代码就是根据用户输入的查询关键字自动生成查询条件的,返回值就是一串字符。在filter里可以直接使用。


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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/8/26 16:18:00 [显示全部帖子]

以下是引用blackzhu在2009-8-26 15:25:00的发言:

   你这个代码我刚才试出来了,谢谢!但效果做不到的是如我在"textbox1"输入一个数据如"123",可以列出一个表中凡是和这个数据相匹配的行出来,不管在什么列.数据越完整,如这个表只有一个列的数据是"123",那么最后显示的就是这个数据的行.这个能改吗?

这个查询代码是按列顺序来的,如表中有A、B、C三列,输入的关键字是1,2,3,则自动查询A=1 and B=2 and C=3的记录。如果只输入了1,则只查A=1;如果输入了,1,则只查B=1。。。明白了吗?输入的关键字是和相应的列对应的。
你这个要求也很容易做到,无非是把每个列和关键字进行比较查询而已。


 回到顶部