Столкнувшись с трудностями в построении SQL из нескольких множественных списков выбора - PullRequest
1 голос
/ 31 января 2012

У меня есть форма, в которой есть около 6 множественных списков выбора.списки заполнены из разных таблиц.У меня нет проблем в сохранении выборок из listBoxes в переменных, а затем с помощью переменных в запросе SQL.переменная хранит выбранный элемент из listBox следующим образом:

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-запрос выглядит следующим образом с большим количеством переменных, которые называются crit_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 & ")..... ;"

Как мне поступить в ситуации, когдапользователь не делает выбор.В настоящее время переменная attribute_xx становится пустой, а предложение IN содержит ('') и выдает ошибку.

Пожалуйста, дайте несколько советов, как это преодолеть?Если бы это были только два или три списка, я бы написал разные запросы, но это шесть списков с несколькими выборками, и я не имею понятия.

Заранее спасибо.

1 Ответ

2 голосов
/ 31 января 2012

Вот один из подходов:

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. (N.B. Второй и третий аргументы всегда оцениваются, хотя один из них впоследствии игнорируется.)

Поскольку что-то вроде where and или and and не может быть допустимым SQL, я включаю каждый and в iif -контролируемый код предыдущего предложения. Затем, поскольку окончательный and не будет действительным SQL, я добавил окончательное предложение 1 = 1, которое не имеет действительного эффекта.

(Кстати, извините, если моя схема отступов уродлива; с тех пор, как я в последний раз писал VB6, прошло более десятка лет, поэтому я действительно не помню, как обычно форматируется код VB6.)

...