Foxtable(狐表)用户栏目专家坐堂 → where条件的字段可否引用变量?


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

主题:where条件的字段可否引用变量?

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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 12:53:00 [只看该作者]

谢谢各位,还是不正确,我就想确定下这种写法是否正确,看来几位老师没有理解我的意思,实际上我是想将库存调拨单_主表上的品质状态的值作为查询时库存表中的字段名称来引用(一般查询中字段名称都是常量),这样就只要一个查询窗口和一条语句就可以实现动态调拨不同品质状态下的库存数量(库存表里每个仓库都有合格数量,不良数量,报废数量等字段名)。 我现在是设计了几个窗口对应不同品质状态的数量,想简化成只要一个窗口而已。

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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 14:06:00 [只看该作者]

再顶一下,除了分开写以外还有没有办法实现我的需求?

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/4/21 14:32:00 [只看该作者]

以下是引用scott518在2014-4-21 14:06:00的发言:
再顶一下,除了分开写以外还有没有办法实现我的需求?

 

呃,你说的不可以,是不是指你把 代码 写到了窗口设置那里?而不是写到afterload事件了?

 

你是可以动态的改变窗口表的内容的啊。

 

参考这里 http://www.foxtable.com/help/topics/1930.htm

 


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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 15:42:00 [只看该作者]

代码是从表中的几列合成在一个通用的函数中在打开窗口时调用的。其实就是想把下面的三条语句合成一条来用而已: 

select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where 合格数量 > 0

select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where 不良数量 > 0

select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where 报废数量 > 0


select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where " & tales("库存调拨单_主表").current("品质状态")  & " > 0

 

就想问能否这样用,因为我现在这样用就提示1楼所述的错误了。是不是where 后面紧跟的字段名称必须是常量,而不能是象 tales("库存调拨单_主表").Current("品质状态")  等类似的变量?


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


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

加入你当前行的值是 合格数量  你这也写相当于只是

select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where 合格数量 > 0


我有点摸不清楚你的情况

想要满足3个条件生成的SQl语句如下
select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where 合格数量 > 0 and 不良数量 > 0 and 报废数量 > 0


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


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2014/4/21 15:55:00 [只看该作者]

tables().loadfilter = “条件”
tables().load

你的语法
select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where " & tales("库存调拨单_主表").current("品质状态")  & " > 0

select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where " & tales("库存调拨单_主表").current("品质状态")  & " > 0 

引号用错地方了,而且你这个条件很奇怪,品质数量明明是字符,怎么和数值比较? 条件严重错误。

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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 15:56:00 [只看该作者]

那三种状态是分开用的,即每次只会选择一种,比如用户选择合格数量,则查询出库存表中合格数量>0的所有产品出来供调拨用。如果选择不良数量,则是查询库存表中不良数量大于0的产品出来。我现在是设计了三个窗口,每个不同的窗口对应上面说的三条select语句,这样太麻烦了一点,所以想精简一下。

 

如果

select 产品编码,品名,规格,计量单位,仓库,备注 from 库存表 where " & tales("库存调拨单_主表").current("品质状态")  & " > 0

 

这条语句可以通用的话,那我就只需要设计一个窗口和一条语句,用户在主表选择不同的品质状态时都能正确查询出需要的数据。


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/4/21 16:03:00 [只看该作者]

以下是引用scott518在2014-4-21 15:56:00的发言:

 

这条语句可以通用的话,那我就只需要设计一个窗口和一条语句,用户在主表选择不同的品质状态时都能正确查询出需要的数据。

 

可以通用,这个是最简单的表达式合成。

 

或许,贴出你写的代码,窗口的afterload事件的代码。


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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 19:17:00 [只看该作者]

谢谢各位,本来想做个简单的例子发上来,结果在做例子过程中发现了问题:这个语句并没有错,而是因为我的sql语句是从后台表的三列中拼接起来,即

cmd.CommandText = "Select distinct " & sql & " " & dr("Sqltbs") & " where " & dr("Whereflt")

在whereflt列中值是: 仓库 = '外协仓' and " & tables("库存调拨单_主表").Current("品质状态") & " > 0

上面的dr("Whereflt")结果实际上是一个常量,所以tables("库存调拨单_主表").Current("品质状态") 就不会动态改变了。

是不是这种写法,whereflt列中就一定不能再用变量?

 

我现在只好在打开窗口前将两个变量值保存到两个vars变量中,然后再用下面的方式替换成常量是可以了,但不知有否其他更好的方式?

Dim flt As String
If dr.IsNull("Whereflt") = False Then
    flt = dr("Whereflt")
    If flt.Contains("flt_01") Then '将全局变量1引入具体值
        flt = flt.replace("flt_01",Vars("flt_01"))
    End If
    If flt.Contains("flt_02") Then '将全局变量2引入具体值
        flt = flt.replace("flt_02",Vars("flt_02"))
    End If
End If
Dim cmd As New SQLCommand
cmd.ConnectionName = Mydata
If flt > "" Then
    cmd.CommandText = "Select distinct " & sql & " " & dr("Sqltbs") & " where " & flt
Else
    cmd.CommandText = "Select distinct " & sql & " " & dr("Sqltbs")
End If
Dim dt As DataTable = cmd.ExecuteReader()
.....

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/4/21 19:31:00 [只看该作者]

 回复19楼,字符串常量,是不能当作代码来使用的,如果要当成变量来用,你就得编译一下。

 

 参考 http://www.foxtable.com/help/topics/1487.htm

 

 

 你这个问题因为只有三种情况,就不建议用动态编译的方式了,直接判断一下值,再生成sql语句比较划算


 回到顶部
总数 23 上一页 1 2 3 下一页