Помогите чайнику!!!
В ACCESS можно сделать запрос для поиска по нескольким полям по заданному критериям (он статичен, чтобы изменить критерий надо лезть в структуру запроса). А как можно сделать подобные запросы, так сказать, динамическими? Имеется ввиду создаем форму, в которой пользователь сам мог бы выбирать по каким полям и по каким критериям будет осуществляться поиск. Там представляем все возможные поля, существующие в базе. И поля для ввода интересующих критериев.
Да, и еще, можно ли для полученной в ходе поиска группы сделать рассылку?
Как сделать "динамический" поиск по базе ACCESS?
-=ReGNaZ=-
Люди, горю! Очень срочно нужна помощь
Ну дайте хоть какой-нибудь совет, подскажите! Ведь это наверняка очень просто... Но не для меня, не могу я найти, как это сделать. Впервые с Access работаю! А делать все равно нужно... На вас последняя надежда!

-=ReGNaZ=-
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
У нас сейчас пара проектиков на Oracle (это круче, чем Access). Там надо в некоторых местах делать поиск по изменяющимся критериям.
Приходится пользоваться кучей if..else и выбирать нужный статический запрос.
Приходится пользоваться кучей if..else и выбирать нужный статический запрос.
2B OR NOT(2B) = FF
Так в ACCESSe как это сделать, пусть с кучей чего угодно, главное расскажи как!
-=ReGNaZ=-
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
В Акцессе не силен =(
В Джава + Оракл это выгладит так
Более красивого решения боюсь тут нема =(
class RecipientDAO {
...
public Collection getRecipipents(RecipintFilter filter) {
if(filter.имеет_вид_1()) {
Делаем запрос 1 и возвращаем его результат
} else if(filter.имеет_вид_2()) {
Делаем запрос 2 и возвращаем его результат
} else if(filter.имеет_вид_3()) {
Делаем запрос 3 и возвращаем его результат
} else if(filter.имеет_вид_4()) {
Делаем запрос 4 и возвращаем его результат
} else if(filter.имеет_вид_5()) {
Делаем запрос 5 и возвращаем его результат
} else if(filter.имеет_вид_6()) {
Делаем запрос 6 и возвращаем его результат
} else if(filter.имеет_вид_7()) {
Делаем запрос 7 и возвращаем его результат
} else if(filter.имеет_вид_8()) {
Делаем запрос 8 и возвращаем его результат
}
}
}
В Джава + Оракл это выгладит так
Более красивого решения боюсь тут нема =(
class RecipientDAO {
...
public Collection getRecipipents(RecipintFilter filter) {
if(filter.имеет_вид_1()) {
Делаем запрос 1 и возвращаем его результат
} else if(filter.имеет_вид_2()) {
Делаем запрос 2 и возвращаем его результат
} else if(filter.имеет_вид_3()) {
Делаем запрос 3 и возвращаем его результат
} else if(filter.имеет_вид_4()) {
Делаем запрос 4 и возвращаем его результат
} else if(filter.имеет_вид_5()) {
Делаем запрос 5 и возвращаем его результат
} else if(filter.имеет_вид_6()) {
Делаем запрос 6 и возвращаем его результат
} else if(filter.имеет_вид_7()) {
Делаем запрос 7 и возвращаем его результат
} else if(filter.имеет_вид_8()) {
Делаем запрос 8 и возвращаем его результат
}
}
}
2B OR NOT(2B) = FF
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Это VBA.В ACCESS можно сделать запрос для поиска по нескольким полям по заданному критериям (он статичен, чтобы изменить критерий надо лезть в структуру запроса). А как можно сделать подобные запросы, так сказать, динамическими? Имеется ввиду создаем форму, в которой пользователь сам мог бы выбирать по каким полям и по каким критериям будет осуществляться поиск.
Добавляем в проект компонент UserForm. Рисуем поля. Обеспечиваем вызов формы в нужные момент (например по кнопке на другой форме, в которой ведется поиск). Последнее делается VBA-макросом с единственной строчкой Userform1.Show
На этой самой UserForm кроме полей кладем 2 кнопки "Найти" и "Найти далее". Эти кнопки опять-таки обрабатываются VBA макросами в одну строку каждый.
DoCmd.Find .....
и
DoCmd.FindNext ....
Параметры методов Find/FindNext аналогичны и описаны в спраке, а также вываливаются при наборе текста...
Условия надо составлять из значений полей так, чтобы получилось выражение, какое обычно пишутт в предложении WHERE.
Например: ....."[FIO] Like " & TextBox1.Value & " AND [WEIGHT] " & Combobox1.Text & TextBox2.Value......
PS
А вообще есть стандартная возможность фильтрации, там можно сформулировать любые мыслимые критерии поиска, объединяя условия по "И" и "ИЛИ". См. кнопки на панели инструментов.
PPS
2 AiK:
Если ответ на этот вопрос еще актуален, и потребуются детали, то тему можно перенести в Office+VB(A)
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Обрабатывать записи по Find/Findnext можно, но только это неэффективно и не красиво (все будет мигать).Да, и еще, можно ли для полученной в ходе поиска группы сделать рассылку?
В любом случае надо это делать средствами VBA.
После того как условия поиска сформулированы, как сказано выше ничто не мешает слева добавить к ним "select * from XXX " и сделать CurrentDB.OpenRecordset, а затем пробежаться по этому рекордсету в цикле. В справке масса примеров.
Попробуй использовать параметры. Вот для примера:
PARAMETERS [Введите дату] DateTime;
SELECT IIf([Nbs] Like "1*","Активы",IIf([Nbs] Like "2*","Обязательства",IIf([Nbs] Like "3*","Капитал",IIf([Nbs] Like "4*","доходы",IIf([Nbs] Like "5*","Расходы"))))) AS Класс, Sum(год.Ost) AS Sum_Ost, год.Data
FROM год
GROUP BY IIf([Nbs] Like "1*","Активы",IIf([Nbs] Like "2*","Обязательства",IIf([Nbs] Like "3*","Капитал",IIf([Nbs] Like "4*","доходы",IIf([Nbs] Like "5*","Расходы"))))), год.Data
HAVING (((год.Data)=[Введите дату]));
PARAMETERS [Введите дату] DateTime;
SELECT IIf([Nbs] Like "1*","Активы",IIf([Nbs] Like "2*","Обязательства",IIf([Nbs] Like "3*","Капитал",IIf([Nbs] Like "4*","доходы",IIf([Nbs] Like "5*","Расходы"))))) AS Класс, Sum(год.Ost) AS Sum_Ost, год.Data
FROM год
GROUP BY IIf([Nbs] Like "1*","Активы",IIf([Nbs] Like "2*","Обязательства",IIf([Nbs] Like "3*","Капитал",IIf([Nbs] Like "4*","доходы",IIf([Nbs] Like "5*","Расходы"))))), год.Data
HAVING (((год.Data)=[Введите дату]));