2012-01-31 48 views
1

我有一个大约有6个多选列表框的表单。列表框从不同的表中填充。将listBoxes中的选择存储在变量中,然后在SQL查询中使用变量,我没有任何问题。变量存储从列表框中选择的项目如下:从多个多选列表框中构建SQL时遇到困难

If clientList.SelCount > 0 Then 

    For i = 0 To clientList.ListCount - 1 

     If clientList.Selected(i) Then 
      If Len(criteria_cl) = 0 Then 
       criteria_cl = Chr(39) & clientList.List(i) & Chr(39) 
     Else 
     criteria_cl = criteria_cl & "," & Chr(39) & clientList.List(i) & Chr(39) 
     End If 

End If 
Next 

Else 
End If 

SQL查询是与更多的变量,被称为criteria_xx

strsql = "select * from pmt_hist_dmart_step2 where dbr_portfolio in (" & criteria_pf & ") and DBR_CLIENT in (" & criteria_cl & _ 
") and DBR_ACCT_TYPE in (" & criteria_ac & ")..... ;" 

如何处理的情况时,用户没有进行如下选择。当前,criteria_xx变量变为空白,IN子句包含('')并引发错误。

请提供一些关于如何解决这个问题的建议?如果只有两个或三个列表框,我会写不同的查询,但这是六个多选列表框,我不知道。

在此先感谢。

+0

可能重复[如何显示选定的记录](http://stackoverflow.com/questions/7951372/how-to-display-the-selected-records) – Deanna 2012-01-31 11:40:21

+0

只需简单地省略那部分SQL,如果它是空白的,它会要求你稍微多一些条件。 – Deanna 2012-01-31 11:41:56

回答

2

这里有一个办法:

strsql = " select *       " &      _ 
     " from pmt_hist_dmart_step2  " &      _ 
     " where " & iif(len(criteria_pf) = 0,       _ 
          "",           _ 
          "dbr_portfolio in (" & criteria_pf & ") and " _ 
         ) &           _ 
         iif(len(criteria_cl) = 0,       _ 
          "",           _ 
          "DBR_CLIENT in (" & criteria_cl & ") and " _ 
         ) &           _ 
         iif(len(criteria_ac) = 0,       _ 
          "",           _ 
          "DBR_ACCT_TYPE in (" & criteria_ac & ") and " _ 
         ) &           _ 
         ... &            _ 
        " 1 = 1;" 

这里的想法是,形式dbr_portfolio in (...)的每个子句中只应包括如果...是非空白。 iif是一个内置函数,它有三个参数;如果它的第一个参数是true,那么它返回它的第二个参数,如果它的第一个参数是false,那么它返回它的第三个参数。例如,iif(1 = 1, 5, 10)返回5,并且iif(1 = 2, 5, 10)返回10。 (注:第二个和第三个参数都始终评估,尽管他们中的一个被忽略之后)

由于像where andand and不会是有效的SQL,我包括每个and的的iif -controlled代码中前面的条款。然后,由于最后的and不是有效的SQL,所以我找到了一个没有实际影响的最终1 = 1子句。

(顺便说一句,对不起,如果我的压痕方案是丑陋的,它已经是十几年了,因为我上次写VB6,所以我真的不记得如何VB6代码通常格式化。)的