Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос с многими значениями параметра. [D7, IB6.x, FireBird 1.5]


Страницы:   1 2

galexis ©   (2006-01-25 16:50:00) 

Уважаемые мастера!
Не приходит в голову ничего хорошего. Нужно написать запрос примерно такой:
select * from OKVED WHERE KOD_OKVED='1.1' or KOD_OKVED='1.2' or KOD_OKVED='2.8' or ....
И так сколько пользователь выберет в элементе TTreeView.
Так и перечислять что ли все выбранные коды или есть более изящный синтаксис?


Sergey13   (2006-01-27 11:14:00) [1]

2[23] galexis   (27.01.06 11:02)
Дерево строится классически. Ид_записи и ИД_родительской_записи ссылающееся на ИД_записи. Выбирается ветка или запросом (в ИБ и ФБ этого нет) или процедурой с рекурсией. Иначе тебе придется для каждой записи анализировать (раскладывать на составляющие) ее код. Тут индексы не работают, поэтому все это работает долго. Кроме того многое (ВСЕ!!!) держится на правильности написания этого кода. Ошибись юзер в одном знаке - и все дерево кирдыкнется.
По деревьям есть статьи на ibase.ru - почитай.


galexis   (2006-01-27 11:02:00) [2]


> Sergey13 ©   (27.01.06 10:52) [22]

1. Предприятия ищу. Есть база предприятий с оквэдами. Сам запрос то вообщето большой, по многим полям разных таблиц поиск идет. В т.ч. и по оквэд. Т.е. если конкретная ветка выбрана, то все работает. А им теперь разные ветки подавай и хуже, разные подветки разных веток и т.д.

2. Плохо что дерево по кодам строится? А как еще то? Там и справочник ОКВЭД неполный даже. Только те оквэды которые есть у предприятий находящихся в базе.


Sergey13   (2006-01-27 10:52:00) [3]

2 [20] galexis   (27.01.06 10:48)
Это я догадался. 8-) Что ты с ним делаешь?

2[21] galexis   (27.01.06 10:48)
> Дерево по кодам строится. Так удобнее пользователям
Это плохо. И удобство юзеров тут совсем ни при чем.


galexis   (2006-01-27 10:48:00) [4]


> Sergey13 ©   (27.01.06 10:45) [19]

Дерево по кодам строится. Так удобнее пользователям


galexis   (2006-01-27 10:48:00) [5]

ОКВЭД - это общероссийский классификатор видов экономической деятельности, не я его придумал. Вот хочется пользователям выбирать несколько веток с разных уровней.


Sergey13   (2006-01-27 10:45:00) [6]

2 galexis  
И вообще - у таблицы структура "деревянная" или дерево строится только по кодам?


Sergey13   (2006-01-27 10:37:00) [7]

2[17] galexis   (27.01.06 10:29)
Ты думаешь с IN на 200 только головных значений будет быстрее? IN вроде сервером все равно в OR переводится. Но при '1%' индекс работает хотя бы.

ИМХО у тебя задача поставлена несколько, как бы это сказать, не того. Или я ее просто не понял. Зачем тебе 200 веток кодов сразу? Сколько их всего? Почему просто все сразу не выбрать?


galexis   (2006-01-27 10:29:00) [8]


> Sergey13 ©  (26.01.06 15:10) [14]

Будет этих ОКВЭДов выбрано штук 200. Это же какой длины запрос получится? И сколько он будет выполняться?

Придется видимо IN использовать, а пользователям сказать, что не реально сделать поиск по все ветви :(


Sergey13   (2006-01-26 15:44:00) [9]

2[12] galexis   (26.01.06 14:56)
>Структура ОКВЭД - дерево.
Если это дерево отражено в структуре таблицы, то надо писать процедуру (с рекурсией), которая будет выбирать это дерево по связанным полям. Опираться в этом деле на строковый код - это не есть хорошо. Кто нибудь тебе вместо нолика букву "О" заколотит - с ума сойдешь искать причину ошибки.
ИМХО.


SpellCaster   (2006-01-26 15:36:00) [10]

В таком случае действительно надо действовать в том направлении, которое указал Sergey13. А в программе просто сделать цикл по всем выбранным ветвям


filterstr:='';
for i:=0 to TV.selectcount-1 do
filterstr:=filterstr+'kod_okved like '''+
     copy(TV.selected[i].text,1,pos(TV.selected[i].text,'.'))+ // в общем извлекаем нужный номер
'%'' or ';
filterstr[length(filterstr)-4]:=#0; // сокращаем длину строки на 4 символа, т.к. там лишний OR остался

и потом

SQL.Text:='select * from OKVED where '+filterstr;

...


с конкретной реализацией возможно накосячил, но принцип такой


Sergey13   (2006-01-26 15:10:00) [11]

2[12] galexis   (26.01.06 14:56)
KOD_OKVED LIKE '01.%' or KOD_OKVED LIKE '02.%'


Deniz   (2006-01-26 14:59:00) [12]

>SpellCaster   (26.01.06 14:34) [11]
... Можно взять TTable ...

Не надо брать TTable.

>galexis   (26.01.06 14:06) [8]

Where  ( '~36.1~37~' LIKE '%~' || KOD_OKVED || '~%')
Работает!
Но...
36.1 находит, а 36.12 не находит.
Получается, что от IN не отличается

А где видно, что надо найти 36.12?
Ты передаешь запросу только 36.1 и 37.


galexis   (2006-01-26 14:56:00) [13]

Структура ОКВЭД - дерево. Хотелось бы выбрав верхнюю ветвь отобрать все записи соответствующие этой ветви. В том числе когда выбрано несколько ветвей. Т.е. выбрал я KOD_OKVED=01. СЕЛЬСКОЕ ХОЗЯЙСТВО, ОХОТА И ПРЕДОСТАВЛЕНИЕ УСЛУГ В ЭТИХ ОБЛАСТЯХ, хочется чтобы отобрались предприяьтия с KOD_OKVED=01.1 Растениеводство, с KOD_OKVED=01.11 Выращивание зерновых, технических и прочих с/х культур,не включ.в др.груп.


SpellCaster   (2006-01-26 14:34:00) [14]

Нет, а откуда 37 взялось? ALL_NUMBERS должен состоять из нужных номеров, разделенных знаками '~'. Тогда запрос для каждой записи будет проверять, содержится ли значение ее поля KOD_OKVED в этой строке, и если результат положителен, то эта запись войдет в результирующий набор данных. Ну, а если тебе надо проверить диапазон значений с 36.1 по 37.хх, то... либо перечислять _все_ возможные номера (36.1,36.2,...), либо действовать как-то по-другому.
Можно взять TTable, прицепить её к OKVED, потом присвоить TTable.filtered:=true и переопределить событие ONFilterRecord - тогда определять, соответствует ли запись требуемому условию, можно будет в программе, с применением всей мощи Дельфей.
Уточни, какая стоит задача - так будет легче ответить.


galexis   (2006-01-26 14:18:00) [15]

Это ALL_NUMBERS
Пробовал и через параметр :KOD=~36.1~37~
То же самое


SpellCaster   (2006-01-26 14:12:00) [16]

Так а это что за шняга:
'~36.1~37~'?


galexis   (2006-01-26 14:06:00) [17]

Where  ( '~36.1~37~' LIKE '%~' || KOD_OKVED || '~%')
Работает!
Но...
36.1 находит, а 36.12 не находит.
Получается, что от IN не отличается


SpellCaster   (2006-01-26 13:54:00) [18]

Конечно не находит. Проверка делается так:
Where  ( ALL_NUMBERS LIKE '%~'|| KOD_OKVED ||'~%'),
где  ALL_NUMBERS - это строка, содержащая список нужных номеров (например, '~36.11~36.12~')
Строку надо генерить каждый раз при изменении нужного набора номеров, это можно сделать путем сборки всего SQL запроса, а можно и через параметры.


galexis   (2006-01-26 13:03:00) [19]


> SpellCaster   (26.01.06 12:51)

Да, спасибо, разобрался.


> Deniz ©  


Where  ( KOD_OKVED LIKE '%~' || '~36.12~36.11~' || '~%')

чего то не нахоит ничего с такой конструкцией


SpellCaster   (2006-01-26 12:51:00) [20]

TreeView.Selected.Text - ты это имеешь в виду?
TreeView.Selections[х] - (х+1)й выбранный элемент, если в дереве можно выбирать несколько узлов.
Посмотри класс TreeView, там всё тривиально


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо