Foxtable(狐表)用户栏目专家坐堂 → [讨论] 关于填充器 New Filler 里面的筛选条件 filter 中引用全局变量,如何写代码?


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

主题:[讨论] 关于填充器 New Filler 里面的筛选条件 filter 中引用全局变量,如何写代码?

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
[讨论] 关于填充器 New Filler 里面的筛选条件 filter 中引用全局变量,如何写代码?  发帖心情 Post By:2009/7/23 15:26:00 [只看该作者]

我写了这样一段代码:

 

dim dqpz As New Filler

dqpz.SourceTable = DataTables("会计凭证查询") '指定数据来源

dqpz.SourceCols = "sszt,pzrqn,pzrqy,pzrqr,pzlx,pzdm,flxh,pzzy,kmdm,jdfx,flje,cjyh,fdzs" '指定数据来源列

dqpz.DataTable = DataTables("会计凭证") '指定数据接收表

dqpz.DataCols = "账套编号,年,月,日,pzlx,凭证编号,flxh,凭证摘要,科目代码,jdfx,flje,制证人,附件张数" '指定数据接收列

dqpz.ExcludeExistValue = true

dqpz.ExcludeNullValue = true

dqpz.Distinct = true

dqpz.filter ="pzrqn = "& vars("kn") & "and pzrqy <= "& vars("ky") & "and pzrqy >= " & vars("jy") & "pzrqr <= "& vars("kr") & "and pzrqr >= " & vars("jr")

dqpz.Fill() '填充数据


系统提示dqpz.filter 有误,我删除就好了。

我想可能是双引号和单引号的问题。

请教各位!

 回到顶部
美女呀,离线,留言给我吧!
shxiaoya
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:191 积分:1442 威望:0 精华:2 注册:2008/9/7 21:30:00
  发帖心情 Post By:2009/7/23 15:38:00 [只看该作者]

dim dqpz As New Filler

dqpz.SourceTable = DataTables("会计凭证查询") '指定数据来源

dqpz.SourceCols = "sszt,pzrqn,pzrqy,pzrqr,pzlx,pzdm,flxh,pzzy,kmdm,jdfx,flje,cjyh,fdzs" '指定数据来源列

dqpz.DataTable = DataTables("会计凭证") '指定数据接收表

dqpz.DataCols = "账套编号,年,月,日,pzlx,凭证编号,flxh,凭证摘要,科目代码,jdfx,flje,制证人,附件张数" '指定数据接收列

dqpz.ExcludeExistValue = true

dqpz.ExcludeNullValue = true

dqpz.Distinct = true

dqpz.filter ="pzrqn = '"& vars("kn") & "' and pzrqy <= #"& vars("ky") & "# and pzrqy >= #" & vars("jy") & "# pzrqr <= #"& vars("kr") & "# and pzrqr >= #" & vars("jr") & "#"

dqpz.Fill() '填充数据
[此贴子已经被作者于2009-7-23 15:39:45编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/7/23 15:46:00 [只看该作者]

#  ??

都是整数型的,不是日期型的!

 回到顶部
美女呀,离线,留言给我吧!
yangming
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/7/23 15:47:00 [只看该作者]

dqpz.filter ="[pzrqn] ="& vars("kn") and "[pzrqy] <= "& vars("ky")and "[pzrqy] >= "& vars("jy") and "[pzrqr] <= "& vars("kr") and "[pzrqr] >= "& vars("jr")

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/7/24 8:30:00 [只看该作者]

为什么要这样子写呢?

解释一下好吗?

我的多了&,并且and在“”的外面。

为什么?


 回到顶部
美女呀,离线,留言给我吧!
yangming
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/7/24 9:14:00 [只看该作者]

看黄色背景处

动态合成表达式

不少初次接触编程的用户,对于何时使用双引号,何时使用单引号,感到非常困惑。

其实很简单,代码中的字符串都是用双引号括起来的。

例如:

Dim s As String
s =
"abcd"

而单引号主要用于表达式,表达式可以用于计算、筛选。
表达式本身是一个字符串,所以必须用双引号括起来;表达式内部的字符串,用单引号括起来。

例如:

CurrentTable.Filter = "[产品] = 'PD01'"

上面的代码意思是在当前表中筛选出产品为PD01的行,筛选表达式本身是一个字符串,所以用双引号括起来,表达式中的PD01也是一个字符串,是表达式的一个内部字符串,所以用单引号括起来。
表达式中的日期继续用符号#括起来,数值则不需要任何符号括起来,这些和代码中的格式是一样的,唯一不同的是字符串用单引号括起来。

例如:

CurrentTable.Filter = "[产品] = 'PD01' And [日期] = #3/17/1999# And [折扣] = 0"

通过表达式列的Expression属性,可以动态设置其计算公式

例如:

DataTables("表A").DataCols("ID").Expression = "'CA' + [_Identify]"

实际编程的时候,经常要根据用户的输入,动态合成表达式。

例如:

例如要计算某个产品的销售数量,要计算的产品名称由用户输入,假定输入的结果保存在全局变量Vars("产品")中:

Dim Sum As Integer
Sum = 
DataTables("订单").Compute("Sum(数量)", "[产品] = '" & Vars("产品") & "'")

Compute的第二个参数为计算条件表达式,该表达式分为三部分:

"[产品] = '" & Vars("产品") & "'"

假定全局变量Vars("产品")的值为PD01,组合三部分的内容后,这个表达式就等效于:

"[产品] = 'PD01'"

假定表A和表B都有品名、型号两列,我们在表A中选择了一行,希望从表B中找出相同品名、规格的行:

Dim dr1 As DataRow = Tables("A").Current.DataRow
Dim
dr2 As DataRow
dr2 =
DataTables("表B").Find("[品名]  = '" & dr1("品名") & "'And [规格] = '" & dr1("规格") & "'")

上面代码的最后一行,初看非常难以理解。
为便于理解,我们首先来看看看正常的查找表达式:

"[品名] = '要找品名' And [规格] = '要找的规格'"

其中红色的部分要被dr1中的实际的品名和规格代替,所以最终的表达式成了:

"[品名]  = '" & dr1("品名") & "'And [规格] = '" & dr1("规格") & "'"

上面都是用字符型的值作为例子,表达式中字符型的值要用单引号括起来。
如果是日期型,要用符号#括起来。
例如我们要筛选出指定月份的订单,但是因为表达式没有求得日期月份的函数,我们只能这样设置代码:

Dim StartDate As Date '起始日期变量
Dim
EndDate As Date '结束日期变量
Dim
Month As Integer = 6 '指定月份
Dim
Year As Integer = 1999 '指定年份
StartDate = New
Date(Year,Month,1) '获得该月第一天
EndDate = New
Date(Year,Month,Date.DaysInMonth(Year,Month)) '获得该月最后一天
Tables(
"订单").Filter = "[日期] >= #" & StartDate & "# And [日期] <= #" & EndDate & "#"

如果是数值,则不需要括起来,直接使用即可。
例如假定编号列是整数型,要筛选的编号保存在全局变量Vars("编号")中:

Tables("表A").Filter = "[编号] = " & Vars("编号")

一定要记住表达式中的字符用单引号括起来,日期用符号#括起来,数值则不需要任何符号。
在编号为整数的情况下,有人写出了这样的代码:

Tables("表A").Filter = "[编号] = '" & dr("编号") & "'"

然后问我为什么不能执行?我想原因你应该已经知道了。

DataTable和Table都有很多属性和方法用到了表达式,我们必须掌握单引号和双引号的区别,并学会动态合成表达式,才能设计出强大而又灵活的管理系统。


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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/7/25 0:36:00 [只看该作者]

数值型的,好理解!但是字符型和日期型就有这样的情况:

我发现下面这两段代码中的 filter 都是有效的,至少没有报错,并且达到了我想要的重置、删除的效果:

DataTables("会计凭证").DataCols("附件张数").RaiseDataColChanged("[日期] <= #"&vars("结束日期")&"# And [日期] >= #"&vars("开始日期")&"#")

DataTables("会计凭证").DeleteFor("[校验] = 0 and [日期] >= '"&vars("开始日期")&"' and [日期] <= '"&vars("结束日期")&"'")


注:[日期]、vars("开始日期")、vars("结束日期")都是日期型的!

按规则应该是第一条正确,第二条不对!

但是,如果我用字符变量替换引用一下:
dim s as string = "[日期] <= #"&vars("结束日期")&"# And [日期] >= #"&vars("开始日期")&"#"
DataTables("会计凭证").DataCols("附件张数").RaiseDataColChanged(s)

则代码不能保存,报变量 S 的错!

请各位大侠指教!

[此贴子已经被作者于2009-7-25 0:36:58编辑过]

 回到顶部
美女呀,离线,留言给我吧!
yangming
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/7/25 9:52:00 [只看该作者]

我的理解,全局变量不论是什么类型都是这样:Vars("编号")
其它就按此:一定要记住表达式中的字符用单引号括起来,日期用符号#括起来,数值则不需要任何符号。

[此贴子已经被作者于2009-7-25 9:53:47编辑过]

 回到顶部