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


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

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

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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
where条件的字段可否引用变量?  发帖心情 Post By:2014/4/21 11:27:00 [显示全部帖子]


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

如上图,品质状态列可以下拉选择三种数量:合格数量,不良数量,报废数量

在下面的明细表点击产品编码时弹出一个查询窗口,select语句如下: 

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

目的就是当主表中选择合格数量时,where条件就自动变为 where 合格数量 > 0

           当主表中选择不良数量时,where条件就自动变为 where 不良数量 > 0 ,以此类推。

 

但会提示“在应使用条件的上下文(在 '库存调拨单_主表' 附近)中指定了非布尔类型的表达式。”的错误;

 

上面的写法是不是不正确?还有没有其他写法(只用一条语句,分成三条语句来实现的我会)

 

谢谢!

 

 

 

 


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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 11:38:00 [显示全部帖子]

有检测,就是红色的变量部份不会变动如下:确定后就出现错误提示了。

 

 


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

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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 11:50:00 [显示全部帖子]

select a.产品编码,类别,a.品名,a.规格,a.计量单位,仓库,a.备注 From 库存表 a inner join 产品编码 b on a.产品编码 = b.产品编码 where 仓库 = '外协品仓' and " & tables("库存调拨单_主表").Current("品质状态") & " > 0

 

引号还有正反吗,都是小写的英文状态输入的,如果上面的红色部份直接换成 合格数量 显示就没问题。但就想动态变动它。


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


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/4/21 12:03:00 [显示全部帖子]

没有看出有什么不同啊,前后两个引号因为我的这个select 语句 是在command中调用的,这里不用


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


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

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

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


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

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

 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | 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("品质状态")  等类似的变量?


 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | 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()
.....

 回到顶部