Отчёт по отфильтрованному. Запрос из формы.
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Отчёт по отфильтрованному. Запрос из формы. Expand / Collapse
Автор
Сообщение
25.03.2007 12:59
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.09.2007 0:14
Сообщ.: 8, Visits: 38
Есть таблица, в которой будет много-много записей и около 30-ти столбцов.
Задача состоит в том, чтобы выбрать из неё какое-то количество записей по одному или нескольким параметрам и распечатать их в виде отчёта. Поиск должен осуществляться из формы. Для этого там сделал 10 полей для поиска.

1-й способ. Фильтрация.
Проблем две:
1. Access не может обработать больше четырёх условий [Студенты]![Фамилия] Like [Формы]![Студенты]![Поле145] AND [Студенты..... AND .... And .....
2. Не знаю как сделать отчёт по отфильтрованному.
Ну или как вариант - делать по той записе, которую сейчас просматриваю в форме.

2-й способ. Запрос.
Проблема в том, что если делаю запрос с условием AND, то необходимо заполнять все поисковые поля в форме, иначе Access ищет записи, в которых эти поля тоже не заполнены.
Предполагаю, что надо либо присвоить полям в форме произвольное значение по умолчанию, либо сделать проверку пустоты.

VBA не знаю, но надеюсь разобраться по аналогии с делфи и Visual Basic

Помогите пожалуйста, завтра надо бы уже сдавать работу!
Сообщ. #911845
25.03.2007 16:34
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 07.03.2008 19:04
Сообщ.: 328, Visits: 1 857
1. Утверждение о том, что Access не может обрабатывать более 4-х And неверное.
2. Для того, чтобы фильтровать в отчете, используйте 4-ый параметр метода OpenReport.
3. При формировании параметра не учитывайте пустые поля формы.
4. Like применяйте к текстовым полям. Для числовых и полей даты он обычно не применяется.
Сообщ. #911849
25.03.2007 18:47
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.09.2007 0:14
Сообщ.: 8, Visits: 38
1. Утверждение о том, что Access не может обрабатывать более 4-х And неверное.
-Посмотрел... Действительно, там дело в длине строки... А это уже не поправишь...

3. При формировании параметра не учитывайте пустые поля формы.
-Вот это как раз больше всего и интересует! КАК не учитывать эти поля?
Сообщ. #911852
25.03.2007 19:54
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 07.03.2008 19:04
Сообщ.: 328, Visits: 1 857
Например, так

Dim s As String
If Not IsNull(Forms![Студенты]![Поле1]) Then s = s & "[Студенты]![Фамилия] Like '" & Forms![Студенты]![Поле1] & "' And "
If Not IsNull(Forms![Студенты]![Поле2]) Then s = s & "[Студенты]![Какое-то_поле2] Like '" & Forms![Студенты]![Поле2] & "' And "
.....................................................
If Not IsNull(Forms![Студенты]![Поле10]) Then s = s & "[Студенты]![Какое-то_поле10] Like '" & Forms![Студенты]![Поле10] & "' And "
If Len(s) > 0 Then s = Left$(s, Len(s) - 5)
DoCmd.OpenReport "Имя_отчета", acPreview, , s

Подстановочные знаки для Like можно вводить в полях формы или, если они необходимы только в начале или/и в конце, то соответственно, между одинарной и двойной кавычками или/и между двойной и одинарной кавычками.
Если на форме нет никаких полей, кроме указанных 10-и, и эти 10 одноименны с соответствующими полями источника данных отчета, то можно формировать s в цикле

Dim s As String, cntrl As Control
s = ""
For Each cntrl In Me.Form
If TypeOf cntrl Is TextBox Then
If Not IsNull(cntrl) Then s = s & cntrl.Name & " Like '" & cntrl & "' And "
End If
Next
If Len(s) > 0 Then s = Left$(s, Len(s) - 5)
DoCmd.OpenReport "Имя_отчета", acPreview, , s
Сообщ. #911853
25.03.2007 19:59
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.09.2007 0:14
Сообщ.: 8, Visits: 38
СПАСИБО ОГРОМНОЕ!
Примерно что-то такое предполагал, но реализовать не мог. Работает! =))))
Студенты Запрос


  Post Attachments 
Центр Занятости Студентов.rar (10 views, 124,37 KB)
Сообщ. #911854
25.03.2007 20:29
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 07.03.2008 19:04
Сообщ.: 328, Visits: 1 857
Посмотрел Вашу базу.
Вам осталось для завершения ввести Like в заполненные поля условий отбора запроса "Студенты Запрос" и все должно работать (по крайней мере у меня работает)

Извините, поторопился с этим утверждением. Запутался в кнопках, отчетах и их источниках данных. Поэтому предыдуший абзац считать недействительным.
Сообщ. #911856
25.03.2007 20:48
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.09.2007 0:14
Сообщ.: 8, Visits: 38
эээ.... куда ввести like? Впрочем не важно. Запрос прямо из кнопки работает отлично!

И теперь второй вопрос. Отчёт по одной просматриваемой в форме записи. Как это сделать?

PS Ктати, есть какие-нибудь существенные замечания относительно базы данных? За исключением дизайна отчёта, который будет ещё переделываться.
Сообщ. #911858
25.03.2007 21:50
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 07.03.2008 19:04
Сообщ.: 328, Visits: 1 857
Отчет по текущей записи. Так как у вас поле "№ Студенческого" - уникальное, то

DoCmd.OpenReport stDocName, acPreview, , "[№ Студенческого]=" & Me![№ Студенческого]

Недостатки, которые сразу бросилось в глаза (детально не ковырял).
1. Со справочниками Вы остановились на полпути. Создали в них ключевые поля счетчики и нигде их не используете (кроме сортировки, о которой см. ниже). Хотя нужно бы было в таблице "Студенты" вместо текстовых полей, которые соответствуют справочным, создать поля типа Long (внешние ключи), в которые помещать коды первичного ключа из справочников. С помощью схемы данных создайте связи по ключевым полям.
2. Сортировку в ComboBox-ах лучше сделать не по коду, а по текстовому полю.

P.S. Если Вы решитесь на шаг 1, а это нужно сделать с целью приближения базы к нормализованной, то не забудьте, что для оговоренных полей в фильтре необходимо задавать не Like, а сравнение по =, так как в это случае используются коды (числа).

Сообщ. #911859