2015-12-29 4 views
2

Я создал несвязанную форму с несколькими Combo Boxes с целью передачи параметров, полученных в SQL-запрос. Мой SQL работает, когда все поля содержат значение, но когда он равен нулю, весь запрос завершается с ошибкой. Я установил предложение where для каждого поля к его соответствующему (tblIRS.[Field]=Forms!frmSUPIR![Field] OR Forms!frmSUPIR![Field] IS NULL OR tblIRS.[Field] IS NULL) AND (...Передача параметра из значений в запрос

Я также попытался передать значения из несвязанных из переменных, а затем построить SQL в VBA, а также безрезультатно. Каждое поле имеет свою линию, аналогичную приведенной ниже:

Dim strFilter As String 
Dim strSQL As String 
    If Nz(Me.EMP1, "") <> "" Then 
    strFilter = strFilter & "tblIRS.[EMP1] = '" & PQ(Me.txtEMP1) & "' And " ... 
    strSQL = "SELECT * FROM tblIRS " & _ 
      "WHERE" & strFilter 
End If 

Вышеупомянутая функция включает функцию замены PQ.

Я нашел множество ресурсов, обрабатывающих выше, но ни один из них не включает обработку нулевых значений таблиц и/или записей в форме.

Моя цель состоит в том, чтобы пользователь сузил свой поиск, используя как можно меньше комбинированных ящиков. Форма идеально примет значения null в поле со списком, которые будут обрабатываться как NULL, и не отображать все записи с нулевым значением таблицы для этого поля.

Например:

  • Формы frmSUPIR [EMP1] = [Smith, John]
  • Формы frmSUPIR [етр2] = [Джонс, Марк]
  • Формы frmSUPIR [!!!!! EMP3] = Null

Я желаю, чтобы запрос возвращал все случаи, когда EMP1 = Смит, Джон И етр2 = Джонс, Марк ИANY Значение для EMP3. Каков наилучший способ сделать это?

Надеется, что я достаточно ясно, и спасибо заранее,

JS

ответ

1

Один простой способ сделать это, чтобы сделать другую переменную для каждой части, где положение:

Dim strWhereEmp1 As String 
Dim strWhereEmp2 As String 
Dim strWhereEmp3 As String 
Dim strFilter As String 

If IsNull(Me.EMP1) Then /*Or use If Nz(Me.Emp1, "") = "" if you wish*/ 
    strWhereEmp1 = "TRUE" 
Else 
    strWhereEmp1 = "tblIRS.[EMP1] = '" & Me.Emp1 & "'" 
End If 
If IsNull(Me.EMP2) Then 
    strWhereEmp2 = "TRUE" 
Else 
    strWhereEmp2 = "tblIRS.[EMP2] = '" & Me.Emp2 & "'" 
End If 
If IsNull(Me.EMP3) Then 
    strWhereEmp3 = "TRUE" 
Else 
    strWhereEmp3 = "tblIRS.[EMP3] = '" & Me.Emp3 & "'" 
End If 
strFilter = strWhereEmp1 " AND " & strWhereEmp2 & _ 
         " AND " & strWhereEMp3 

strSQL = "SELECT * FROM tblIRS " & _ 
     "WHERE " & strFilter 

Вы можете сделать это для любого количества фильтров. Он будет просто ссылаться на «И ИСТИНА» на предложение where, если значение из формы равно null.

Я удалил ваше условие только для создания SQL, если Me.Emp1 не пуст, но его можно вернуть по желанию.

+0

Спасибо, OpiesDad, похоже, это привело меня на правильный путь. Когда я запускаю код, я получаю синтаксическую ошибку. В частности, время работы 3075. Я попытался установить тогда = TRUE, = "TRUE", = '""'. Есть рекомендации? Я использую: DoCmd.OpenReport «repSUPIR», acViewPreview,, strSQL, чтобы открыть отчет. Еще раз спасибо. – atomedic

+0

Пробел пропал после 'WHERE' ... – Gustav

+0

Я бы проверил последнюю строку SQL, а затем попытаюсь запустить ее за пределами VBA, чтобы узнать, есть ли какие-либо ошибки. Эта ошибка, как правило, является синтаксической ошибкой SQL. Вы определенно хотите = «TRUE» ..... как я сказал, это сделает предложение where «WHERE x AND y AND z ....«Если вы положите = TRUE, это может сработать (если VBA автоматически преобразует логическое значение в строку), но это не очень хорошо. Если вы положите =« », то предложение where будет выглядеть примерно так:« WHERE x AND И z ", и это определенно не сработает. – OpiesDad

0

Вот небольшой консольное приложение и способом создать свой ИНЕК. Вам не нужно беспокоиться о EMP3 в выражении where where, потому что любое значение приемлемо.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dict = new Dictionary<string, string>() 
     { 
      { "EMP1", "Smith, John" }, 
      { "EMP2", "Jones, Mark" }, 
      { "EMP3", "" }   //This could be null and it would still work 

     }; 

     Console.WriteLine(CreateWhereClause(dict)); 
     Console.ReadKey(); 
    } 

    public static string CreateWhereClause(Dictionary<string, string> keyValues) 
    { 
     var result = "WHERE "; 

     //Ignore blank values using lamda 
     foreach (var kvPair in keyValues.Where(kvp => !String.IsNullOrWhiteSpace(kvp.Value))) 
     { 
      //If we've already added a clause, add an AND 
      if (result.Length > 6) 
       result += " AND "; 

      result += String.Format(@"tblIRS.[{0}] = '{1}'", kvPair.Key, kvPair.Value); 
     } 
     return result; 
    } 
} 
+0

Это не VBA. – OpiesDad

Смежные вопросы