Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Пт Фев 20, 2015 11:45 am Заголовок сообщения: Можно создать запрос с изменяемым условием |
|
|
Есть таблица. Надо поставить к ней запрос, но условие запроса формируется от задач, которые поставил пользователь от 1 до 50. Т.е. в одном случае условие простое where a=b, а в другом where a=b and a>20 and ..... Сломал голову, но ничего так и не нашел. Последовательно делать кучу запросов, при объёмной базе приводит к "зависанию". |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Сб Фев 21, 2015 9:32 pm Заголовок сообщения: |
|
|
А все условия сконкатенировать в одном запросе никак? |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Пн Фев 23, 2015 12:00 pm Заголовок сообщения: |
|
|
Условий около 70. И применяются они по желанию пользователя. Т.е. пользователь может выбрать один или 10 или все. Считайте, сколько комбинаций select надо предусмотреть. Я уже посчитал 70 в двоичной системе, переводим в десятичную = 1.18Е+21 |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Пн Фев 23, 2015 9:18 pm Заголовок сообщения: |
|
|
Получается, что вам нужно построить некоторый конструктор запросов. Для начала стоит проверить, насколько условия независимы и все эти условия, записать в виде текста в массив, например
dtQr(1)= " a=b "
dtQr(2)= " a>20 "
…
Соответствующие переменные a, b, … д.б. в программе определены.
В зависимости от текущего выбора (например, через CheckBoxs) формируется запрос в виде строки:
myQuery= " Select * From " & tbName & " Where " & dtQr(2) & " And " & dtQr(5)
Run Command myQuery
Это только предложение в общем виде. Кроме того полагаю что те же 70 условий можно разбить на несколько непересекающихся групп так что в каждой группе будет не больше 20-30 условий. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Фев 24, 2015 9:16 am Заголовок сообщения: |
|
|
Каждое условие - это всего лишь дополнение "AND <условие>" в секцию WHERE. Не понимаю в чем проблема с 70 конструкциями AND в секции WHERE.
Или я что-то не понял, или вы не разъяснили. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Вт Фев 24, 2015 6:35 pm Заголовок сообщения: |
|
|
thegeo писал(а): |
Получается, что вам нужно построить некоторый конструктор запросов. Для начала стоит проверить, насколько условия независимы и все эти условия, записать в виде текста в массив, например
dtQr(1)= " a=b "
dtQr(2)= " a>20 "
…
Соответствующие переменные a, b, … д.б. в программе определены.
В зависимости от текущего выбора (например, через CheckBoxs) формируется запрос в виде строки:
myQuery= " Select * From " & tbName & " Where " & dtQr(2) & " And " & dtQr(5)
Run Command myQuery
Это только предложение в общем виде. Кроме того полагаю что те же 70 условий можно разбить на несколько непересекающихся групп так что в каждой группе будет не больше 20-30 условий. |
Run command не работает с переменными. Т.е. та часть, которая не в кавычках не может содержать переменные данные. Пробовал. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Вт Фев 24, 2015 6:41 pm Заголовок сообщения: |
|
|
Андрей Могильный писал(а): |
Каждое условие - это всего лишь дополнение "AND <условие>" в секцию WHERE. Не понимаю в чем проблема с 70 конструкциями AND в секции WHERE.
Или я что-то не понял, или вы не разъяснили. |
Имеется интерфейс. При помощи диалога пользователь выбирает условия запроса. Например год выпуска и название, или год выпуска, название и владелец... Проблема в том, что неизвестно сколько условий задаст пользователь. Возможно 1, а возможно 70. Отсюда каждый раз меняется строка select. Но в MB нельзя во время выполнения программы менять ее код. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Фев 24, 2015 8:36 pm Заголовок сообщения: |
|
|
Да почему нельзя-то? Run Command как вам и указали. Только конечно переменными пользоваться внутри Run Command не нужно, используйте подстановку самих значений переменных в момент конструирования списка условий. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Ср Фев 25, 2015 2:33 pm Заголовок сообщения: |
|
|
Андрей Могильный писал(а): |
Да почему нельзя-то? Run Command как вам и указали. Только конечно переменными пользоваться внутри Run Command не нужно, используйте подстановку самих значений переменных в момент конструирования списка условий. |
Уважаемый каких значений? Значения вводит пользователь в диалоге. Заодно, если Вас не затруднит,уточните, как в программе вместо переменной можно поставить её значение. |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Ср Фев 25, 2015 7:29 pm Заголовок сообщения: |
|
|
Пример:
sub setF_select
dim qq(5) as string
dim myQuery as string
'имя таблицы записано в переменной tbName
'имена полей: f1,f2,f3,f4,f5
qq(1)="f1>f2"
qq(2)="f1>20"
qq(3)="f3<100"
qq(4)="f3>f1"
qq(5)="f4=f2"
'выбраны условия 1 и 2
myQuery= " Select * From " & tbName & " Where " & qq(1) & " And " & qq(2) & " into Selection1"
Run Command myQuery
Browse * From Selection1
'выбраны условия 2, 3 и 5
myQuery= " Select * From " & tbName & " Where " & qq(2) & " And " & qq(3) & " And " & qq(5) & " into Selection2"
Run Command myQuery
Browse * From Selection2
'пусть в условии qq(2) фигурирует переменная
dim limit as integer
limit=25
qq(2)="f1>" & limit
myQuery= " Select * From " & tbName & " Where " & qq(1) & " And " & qq(2) & " into Selection3"
Run Command myQuery
Browse * From Selection3
End Sub |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Чт Фев 26, 2015 11:16 am Заголовок сообщения: |
|
|
thegeo писал(а): |
Пример:
sub setF_select
dim qq(5) as string
dim myQuery as string
'имя таблицы записано в переменной tbName
'имена полей: f1,f2,f3,f4,f5
qq(1)="f1>f2"
qq(2)="f1>20"
qq(3)="f3<100"
qq(4)="f3>f1"
qq(5)="f4=f2"
'выбраны условия 1 и 2
myQuery= " Select * From " & tbName & " Where " & qq(1) & " And " & qq(2) & " into Selection1"
Run Command myQuery
Browse * From Selection1
'выбраны условия 2, 3 и 5
myQuery= " Select * From " & tbName & " Where " & qq(2) & " And " & qq(3) & " And " & qq(5) & " into Selection2"
Run Command myQuery
Browse * From Selection2
'пусть в условии qq(2) фигурирует переменная
dim limit as integer
limit=25
qq(2)="f1>" & limit
myQuery= " Select * From " & tbName & " Where " & qq(1) & " And " & qq(2) & " into Selection3"
Run Command myQuery
Browse * From Selection3
End Sub |
Похоже работает. Сбило с толку вот это:
"К тому же, в строке command не могут быть использованы имена переменных; то есть, переменные
не могут появляться в кавычках. Например, следующая группа операторов не будет работать,
так как указание на переменные x и y попадает в строку, ограниченную кавычками"
еще не пробовал в полном объеме. Во всяком случае спасибо. |
|
Вернуться к началу |
|
|
|