Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Динамическая фильтрация-III(Запрос на основе формы.) / 20 сообщений из 20, страница 1 из 1
27.05.2003, 14:25
    #32169609
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая фильтрация-III(Запрос на основе формы.)
После общения с уважаемыми участниками форума, решил сделать не динамическую фильтрацию, а запрос на основании полей со списком. Всего полей 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
27.05.2003, 14:38
    #32169626
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая фильтрация-III(Запрос на основе формы.)
Код: 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
27.05.2003, 14:39
    #32169627
V. Motchulsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая фильтрация-III(Запрос на основе формы.)
Замечания:
1) Dim sql As String
2) Масив зачем. Достаточно одной переменной.
3) Переменная sql1 не используется.
Что бы в цикле используй Me.Controls(...)
...
Рейтинг: 0 / 0
27.05.2003, 14:47
    #32169643
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая фильтрация-III(Запрос на основе формы.)
Или:

Код: 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
27.05.2003, 14:49
    #32169650
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая фильтрация-III(Запрос на основе формы.)
> If Not IsNull(Diag1) Then
> ... "Diag='" & Me.PoleDiag & "'"

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

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

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

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

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

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

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

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

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

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
27.05.2003, 15:12
    #32169704
dencat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая фильтрация-III(Запрос на основе формы.)
Спасибо Владимир Саныч, не без гордости сообщаю что до этогj я уже сам додумался, немного не так но мысль та же:)

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

:^P

2 V. Motchulsky:

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

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

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

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

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


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