列表框输出的组合框过滤未按预期工作

时间:2018-05-17 01:16:41

标签: sql ms-access access-vba

我有一些控件(Combobox,我称之为DDL' s),我用它作为动态查询的过滤器,如下所示。

我有一个区域,分区过滤器 - 以及BCI / BCV / ABC /等下拉列表。

当我选择区域和分区时,输出列表框会正确过滤掉除此区域/分区以外的所有内容。好。

当我使用其他DDL,ABD / BCI /等时出现问题...那些没有正确过滤掉,我认为它与我的和/或下面的条款有关。

任何人都可以看到任何明显的东西或指向正确的方向来获取这个,以便每个控件和ddl元素过滤掉它的目标数据 - 同时保持它的格式,其中SQL本身是字符串的一部分,就像我的例子一样?

Private Sub goBtn_Click()
          strSQL = "SELECT [account_number], [BCI_Amt], [BCV_Amt],[ABC_Amt], [other_Amt], " & _
        "[BCI_Amt]+[BCV_Amt]+[ABC_Amt]+[other_MRC_Amt], Division_Name, Region_Name, " & _
        "Tier, Unit_ID, Name, Description_2 " & _
        "FROM dbo_ndw_bc_subs " & _
        "WHERE DivisionDDL = [Division_Name] and RegionDDL = [Region_Name] " & _
        " and ( [BCI_Ind] = CheckBCI.value or [BCV_Ind] = CheckBCV.value or [ABC_Ind] = CheckABC.value " & _
        " or BCIServiceDDL = [Tier]" & _
        " or BCVServiceDDL = [Description_2]" & _
        " or ABCServiceDDL = [Unit_ID]  )" & _
        "ORDER BY 6 asc"
    Me.output1.RowSource = strSQL
    End Sub

其中一个组合框DDL控制代码。复选框使组合框可见或不可见。

Private Sub CheckBCV_Click()
  If Me.CheckBCV = vbTrue Then 
     Me.BCVServiceDDL.Visible = True
     Me.BCVServiceDDL = "Select:"
     strSQL = "SELECT  Distinct subs.[Description_2] FROM dbo_ndw_bc_subs "
     Me.BCVServiceDDL.RowSource = strSQL
     Me.BCVServiceDDL.Requery
  Else
     Me.BCVServiceDDL.Visible = False
     Me.BCVServiceDDL = ""
  End If
End Sub

编辑:为上下文的第一个代码块添加了其他代码,并更新了一些注释。

重申我的问题 - 由于某些DDL的工作符合预期,而其他人则没有。是在我有问题的AND / OR部分 - 或者我被迫在select中执行IF / IIF语句。 (如果我这样做,那么解决方案 - 如何将它与我现在拥有的方式结合到字符串中,我在研究分辨率时没有看到这样的例子)。

1 个答案:

答案 0 :(得分:1)

我认为您的顶级代码示例应该更像这样:

Private Sub goBtn_Click()
    Dim strSQL As String
    Dim strWhere As String 
    Dim strOp As String 

    strSQL = "SELECT [account_number], [BCI_Amt], [BCV_Amt],[ABC_Amt], [other_Amt], " & _
        "[BCI_Amt]+[BCV_Amt]+[ABC_Amt]+[other_MRC_Amt], Division_Name, Region_Name, " & _
        "Tier, Unit_ID, Name, Description_2 " & _
        "FROM dbo_ndw_bc_subs "

    strWhere = ""
    strOp = ""
    If Not IsNull(Me.DivisionDDL.Value) Then 
        strWhere = strWhere & strOp & "(Division_Name = """ & Me.DivisionDDL.Value & """)"
        strOp = " And "
    End If
    If Not IsNull(Me.RegionDDL.Value) Then 
        strWhere = strWhere & strOp & "(Region_Name = """ & Me.RegionDDL.Value & """)"
        strOp = " And "
    End If
    If Me.CheckBCI.Value Then 
        strWhere = strWhere & strOp & "(Tier = """ & Me.BCIServiceDDL.Value & """)"
        strOp = " And "
    End If
    If Me.CheckBCV.Value Then 
        strWhere = strWhere & strOp & "(Description_2 = """ & Me.BCVServiceDDL.Value & """)"
        strOp = " And "
    End If
    If Me.CheckABC.Value Then 
        strWhere = strWhere & strOp & "(Unit_ID = """ & Me.ABCServiceDDL.Value & """)"
        strOp = " And "
    End If

    If Len(strWhere) > 0 then 
        strSQL = strSQL & " WHERE " & strWhere
    End If
    strSQL = strSQL & " ORDER BY 6 asc"

    Me.output1.RowSource = strSQL

End Sub

这是更多的,但更接近正确。附:我猜想所有的值都是字符串。如果不删除非字符串值周围的引号。