powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Динамическая фильтрация-III(Запрос на основе формы.)
20 сообщений из 20, страница 1 из 1
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169609
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После общения с уважаемыми участниками форума, решил сделать не динамическую фильтрацию, а запрос на основании полей со списком. Всего полей 4 штуки: Город,диагноз,врач,регион. Естественно пользователь может оставлять любое количество полей пустыми.
Получилась ниже приведенная структура, и она работает. Но наверняка все эти структуры можно упаковать в цикл (собственно по этому я и использовал массив), но как я пока не до думал.

Собственно вопрос,каким образом сделать построение sql запроса в цикле?
Или может не надо этого делать, и оставить как есть?

Спасибо


==============================================================
' Обработка нажатия кнопки фильтр, фильтрация по запросу.
Private Sub ButtonFltr_Click()

Dim sql As Variant
Dim sqlmas(4) As String
Dim sql1 As String

sql = "SELECT * FROM CompTbl"

If Not IsNull(PoleCity1) Then
sqlmas(0) = "City='" & Me.PoleCity1 & "'"
sql = "SELECT * FROM CompTbl WHERE " & sqlmas(0)
End If

If Not IsNull(Diag1) Then
sqlmas(1) = "Diag='" & Me.PoleDiag & "'"
If sql > "SELECT * FROM CompTbl" Then
sql = sql & " and " & sqlmas(1)
Else
sql = "SELECT * FROM CompTbl WHERE " & sqlmas(1)
End If
End If

If Not IsNull(PoleDoc) Then
sqlmas(2) = "Doc='" & Me.PoleDoc & "'"
If sql > "SELECT * FROM CompTbl" Then
sql = sql & " and " & sqlmas(2)
Else
sql = "SELECT * FROM CompTbl WHERE " & sqlmas(2)
End If
End If

If Not IsNull(PoleRegion) Then
sqlmas(3) = "Region='" & Me.PoleRegion & "'"
If sql > "SELECT * FROM CompTbl" Then
sql = sql & " and " & sqlmas(3)
Else
sql = "SELECT * FROM CompTbl WHERE " & sqlmas(3)
End If
End If

CompTbl.Form.RecordSource = sql

End Sub
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169626
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Private Sub ButtonFltr_Click()

dim sqlTail as string
dim i as integer, fld as variant, nam as string

sqlTail= ""

for i=1  to  4 
    select case i
        case  1 
            fld=Me!PoleCity1
            nam="City "
        case 2 
            fld=Me!PoleDiag
            nam="Diag "
        case 3 
            fld=Me!PoleDoc
            nam="Doc "
        case 4 
            fld=Me!PoleRegion
            nam="Region "
    end select
    If Not IsNull(fld) Then 
        if sqlTail>"  " then sqlTail=sqlTail & "  and  "
        sqlTail=sqlTail & nam & " ='" & fld & "' "
    End If
next

CompTbl.Form.RecordSource = " SELECT * FROM CompTbl WHERE " & sqlTail

End Sub
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169627
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Замечания:
1) Dim sql As String
2) Масив зачем. Достаточно одной переменной.
3) Переменная sql1 не используется.
Что бы в цикле используй Me.Controls(...)
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169643
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Или:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Sub ButtonFltr_Click()

dim sqlTail as string
dim fld as variant, nam as variant

sqlTail= ""

for each nam in array(" City "," Diag "," Doc "," Region ")
    if nam=" City " then
        fld=me!PoleCity1
    else
        fld=me(" Pole "&nam)
    end if
    If Not IsNull(fld) Then 
        if sqlTail>"  " then sqlTail=sqlTail & "  and  "
        sqlTail=sqlTail & nam & " ='" & fld & "' "
    End If
next

CompTbl.Form.RecordSource = " SELECT * FROM CompTbl WHERE " & sqlTail

End Sub
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169650
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> If Not IsNull(Diag1) Then
> ... "Diag='" & Me.PoleDiag & "'"

Если это не ачипятка (во всех остальных случаях названия обоих контролов совпадают), то мою программу (обе) надо подправить.
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169662
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз спасибо Владимир Саныч!
Все работает, этак с ходу я лет через 5 научусь.
Первая программа мне больше нравится, очевидно по тому что мне там сразу все понятно стало:)

Спасибо , не прощаюсь:)

P.S. Когда же я блин таким умным стану, ибо свою программу я вчера до часу ночи "создавал", хотя при условии стажа в 2 недели...
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169666
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Пропорция:

2 недели - до часу ночи
20 лет - несколько минут
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169683
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну будем стараться:)

А вот если глюпый пользователь нажмет кнопку без выбора вполях, когда они все пустые, тогда будет неправильный sql запрос, where нужно убирать както.

А у меня такие пользователи, просто чудо:)
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169686
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такое свойство элементов управления как TAG, в нем очень удобно хранить всякую всячину.
Например, признак того, что данный элемент участвует в составлении условия на запрос + тип этого поля (т.к. если поле дата, то его нужно "yyyymmdd").

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

Текст функции приводить не буду (жаба задавит :) ), даю только идею.
Кого заинтересовала, думаю сможет развить в конкретный код.

Пользоваться такой штукой очень удобно, особенно если добавляются новые поля поиска - добавил поле, поставил TAG и все...
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169690
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
:^) Таки баг. Тогда вместо

CompTbl.Form.RecordSource = "SELECT * FROM CompTbl WHERE " & sqlTail

надо так:

if sqlTail>"" then
CompTbl.Form.RecordSource = "SELECT * FROM CompTbl WHERE " & sqlTail
else
CompTbl.Form.RecordSource = "SELECT * FROM CompTbl"
end if
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169704
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Владимир Саныч, не без гордости сообщаю что до этогj я уже сам додумался, немного не так но мысль та же:)

Прогресс на лице:)
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169714
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2ВС
Или
if sqlTail>"" then sqlTail=sqlTail & " and " else sqlTail=" where " & sqlTail
..................
CompTbl.Form.RecordSource = "SELECT * FROM CompTbl" & sqlTail
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169717
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 dencat:

:^P

2 V. Motchulsky:

Да и еще раз да.
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169721
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2incold
А не у Гетца ли ты саму идею спер? :)
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169728
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
некоторые пишут:
"Select ... where True " & sqlTail
, который (sqlTail т.е.), ес-сно с "and " и стартует (без 'if sqlTail>"" then').
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169743
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Senin Viktor
Когда эта функция была написана, у меня Гетца еще не было.
Потом прочитал, кое-что улучшил.
Так что, идею не спер, а вот кое-что из реализации...таки-да, как сказал бы Владимир Саныч, надеюсь без обид :)
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169754
dencat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати о книгах, извините что прерываю :), что
посоветуете активно начинающему?
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169785
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 incold:

У меня "таки да" без минуса. Попрошу цитировать ближе к оригиналу. :^)))
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169796
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Санычу
>Пропорция:
>2 недели - до часу ночи
>20 лет - несколько минут

мой опыт показывает перевернутую парабалическую кривую

2 недели - несколько часов
2 года - несколько минут
5 лет - 1 час

Горе от ума, так сказать. Начинаешь пытаться предусмотреть слишком многое.
...
Рейтинг: 0 / 0
Динамическая фильтрация-III(Запрос на основе формы.)
    #32169804
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Саныч
В следующий раз обязательно :)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Динамическая фильтрация-III(Запрос на основе формы.)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]