Office中国论坛/Access中国论坛

标题: 请教如何使用 IN 运算符做参数查询并输入多个值 [打印本页]

作者: zbjit    时间: 2006-7-19 19:10
标题: 请教如何使用 IN 运算符做参数查询并输入多个值


教各位高手:我在使用IN 做参数查询时,碰到一个问题如下:
1、参数查询SQL语句如下:
SELECT ItemID_Input,Region_Input FROM InputDailyDetails WHERE Region_Input In ([输入内外销?])
当我运行查询并输入 内销 或 外销 时,是可以正常查询的,但当我输入 内销,外销 时,却没有记录返回,
请问该怎么输入才行。也就是如何在此查询的参数提示框内输入多个值
2、如下SQL语句是正常的:
SELECT ItemID, Region FROM InputDetails WHERE Region In ("内销")
SELECT ItemID_Input, Region_Input FROM InputDailyDetails WHERE Region_Input In ("内销","外销")
3、我知道在使用SELECT子查询可以解决此问题,如:
      SELECT ItemID_Input, Region_Input FROM InputDailyDetails WHERE Region_Input In (SELECT Region FROM tblRegion)
      但我在此想知道如何在参数提示框内用输入多个值来代替 SELECT子查询
   请大家帮忙,多谢!

作者: andymark    时间: 2006-7-19 19:17
我也发过类似的贴子,看看对你有没有帮助

http://www.office-cn.net/forum.php?mod=viewthread&tid=41219&replyID=&skin=1
作者: zbjit    时间: 2006-7-19 19:19
实际上我也是想让这个参数引用到表单上的下拉框,但当下拉框的值是单个值时,如 "内销",查询能返回记录,但当下拉框的值是
多个值时,如 "内销,外销" 时,就不能返回记录了。
  所以我也也在查询中测试输入多个值,都没成功,摸索了半天,没有希望,盼求老师帮忙解决下了。
作者: zbjit    时间: 2006-7-19 19:33
谢谢版主回复,在VBA中我可以解决此问题,但我的查询类似如下:
SELECT ItemID_Input,Region_Input FROM InputDailyDetails WHERE Region_Input In (FORMS!frmMain!cboRegion)
此时,在下拉框的After Update事件里,我用了子表单资料的 Requery 方法,所以当下拉框 cboRegion的值是 "内销,外销" 时,却没有返回记录,为何?该如何给多个值。
作者: hi-wzj    时间: 2006-7-19 19:49
FORMS!frmMain!cboRegion 里保存的值并不是:"内销,外销" 的形式,因此需要用vba来转化。
作者: zbjit    时间: 2006-7-19 21:48
我使用的是让查询引用到表单上的 txtRegion 文本框,通过改变文本框的值来动态改变子表单的当前记录,当 cboRegion的值是 "内销"或“外销”时,txtRegion的值是 内销 和 外销,(注意文本框的内容没有引号),但当 我选择下拉框,并设置 txtRegion的值为
内销,外销 (没有双引号)时,子表单没有任何记录,曾经尝试使用单引号和双引号,但都不正确。
因此,我想请教老师,在此如何给 txtRegion 赋值?其实也就是如何在直接运行此查询并提示你输入参数时,如何正确输入多个列表值?

作者: zbjit    时间: 2006-7-19 23:37
沒有朋友幫助嗎?
作者: andymark    时间: 2006-7-20 00:25
把例子传上来
作者: zbjit    时间: 2006-7-20 00:31
版主,不好意思,我没发现在哪儿可以上传我的例子,我可以发到你的邮箱里吗
作者: andymark    时间: 2006-7-20 00:39
你点最上面的 回复贴子 ,就可以上传,然后把文件以RAR的方式压缩传上来
作者: zbjit    时间: 2006-7-20 00:52
[attach]19123[/attach]


例子已上传,谢谢版主!
作者: andymark    时间: 2006-7-20 04:47
[attach]19128[/attach]

作者: zbjit    时间: 2006-7-20 17:05
感谢版主的帮助,看过你修改过的文件了,用的是 Filter,这个方法其实我用过。实际上我是想知道如何给那个 IN操作符赋多个列表值,是不是不能连续输入用逗号分开的参数值,而只能在基层查询中修改 IN 的参数为 IN ([Value1],[Value],[Value],..),请帮忙!
作者: andymark    时间: 2006-7-20 18:12
输入,号后,用SPLIT分隔出来

Private Sub cboRegion_AfterUpdate()
  
Dim strWhere As String
Dim vArr As Variant
Dim i As Integer
Dim Str As String
strWhere = ""

If Not IsNull(Me.cboRegion) Then
     
      If Me.cboRegion = "All" Then
      
             Me.txtRegion = "Export,Local"
            
             vArr = Split(Me.txtRegion, ",")
           
                 For i = LBound(vArr) To UBound(vArr)
         
                     If vArr(i) <> "" Then
                     
                        Str = Str & "'" & vArr(i) & "',"

                     End If
        
                Next i
            
            strWhere = strWhere & "[Region] in (" & Str & ") AND "
   
        Else
        
            strWhere = strWhere & "([Region] like '*" & Me.cboRegion & "*') AND "
         
        End If
   
End If
      
    If Len(strWhere) > 0 Then
    strWhere = Left(strWhere, Len(strWhere) - 5)

End If
   
   
    Me.Form.Filter = strWhere
    Me.Form.FilterOn = True
   
   
End Sub

[此贴子已经被作者于2006-7-20 10:13:33编辑过]


作者: zbjit    时间: 2006-7-20 18:51
版主没有把代码写全,该如何传递分割後的阵列值传递给查询呢?
作者: andymark    时间: 2006-7-20 19:40
直接在查询里应该不行,可以根据条件生成查询

Dim AQueryDef As QueryDef

Dim strWhere As String
Dim vArr As Variant
Dim i As Integer
Dim Str As String
strWhere = ""

If Not IsNull(Me.cboRegion) Then
     
      If Me.cboRegion = "All" Then
      
             Me.txtRegion = "Export,Local"
            
             vArr = Split(Me.txtRegion, ",")
           
                 For i = LBound(vArr) To UBound(vArr)
         
                     If vArr(i) <> "" Then
                     
                        Str = Str & "'" & vArr(i) & "',"

                     End If
        
                Next i
            
            strWhere = strWhere & "[Region] in (" & Str & ") AND "
   
        Else
        
            strWhere = strWhere & "([Region] like '*" & Me.cboRegion & "*') AND "
         
        End If
   
End If
      
    If Len(strWhere) > 0 Then
    strWhere = Left(strWhere, Len(strWhere) - 5)

End If
   
Set AQueryDef = CurrentDb.QueryDefs("qryItem")

AQueryDef.Sql = "SELECT * FROM tblItem where " & strWhere & ""

If (Err) Then
   Exit Sub
End If
   
AQueryDef.Close

CurrentDb.QueryDefs.Refresh
DoCmd.OpenQuery "qryItem"




作者: zbjit    时间: 2006-7-20 22:23
多謝版主,看來我只有運用篩選和多個參數查詢了
作者: Threaten    时间: 2007-5-2 07:21
怎么代码看不见






欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3