Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизSQL запрос с многими значениями параметра. Найти похожие ветки
← →
galexis (2006-01-25 16:50) [0]Уважаемые мастера!
Не приходит в голову ничего хорошего. Нужно написать запрос примерно такой:
select * from OKVED WHERE KOD_OKVED="1.1" or KOD_OKVED="1.2" or KOD_OKVED="2.8" or ....
И так сколько пользователь выберет в элементе TTreeView.
Так и перечислять что ли все выбранные коды или есть более изящный синтаксис?
← →
Desdechado © (2006-01-25 16:59) [1]where kod in(1,2,3,4)
← →
galexis (2006-01-25 17:18) [2]Понял, спасибо.
Наверное все же почитаю что нибудь по SQL. Трудно методом тыка работать :(
← →
Deniz © (2006-01-26 06:40) [3]... where :param like "%~" || KOD_OKVED || "~%"
В программе составить параметр "~1.1~1.2~2.8~...~" не сложно
В качестве разделителя "~" можно использовать любой символ.
← →
galexis (2006-01-26 11:02) [4]
> Deniz ©
Да, действительно, придется видимо LIKE использовать, т.к. надо чтобы находились не только, например, 1.2, но и 1.2.1, 1.2.2 и т.д.
А вот еще вопрос (извиняюсь, программист я хреновый).
Натыкал пользователь в TTreeView ОКВЭДов. Как мне их в программе заполучить? Как от одного выбранного перейти к другому?
← →
SpellCaster (2006-01-26 12:51) [5]TreeView.Selected.Text - ты это имеешь в виду?
TreeView.Selections[х] - (х+1)й выбранный элемент, если в дереве можно выбирать несколько узлов.
Посмотри класс TreeView, там всё тривиально
← →
galexis (2006-01-26 13:03) [6]
> SpellCaster (26.01.06 12:51)
Да, спасибо, разобрался.
> Deniz ©
Where ( KOD_OKVED LIKE "%~" || "~36.12~36.11~" || "~%")
чего то не нахоит ничего с такой конструкцией
← →
SpellCaster (2006-01-26 13:54) [7]Конечно не находит. Проверка делается так:
Where ( ALL_NUMBERS LIKE "%~"|| KOD_OKVED ||"~%"),
где ALL_NUMBERS - это строка, содержащая список нужных номеров (например, "~36.11~36.12~")
Строку надо генерить каждый раз при изменении нужного набора номеров, это можно сделать путем сборки всего SQL запроса, а можно и через параметры.
← →
galexis (2006-01-26 14:06) [8]Where ( "~36.1~37~" LIKE "%~" || KOD_OKVED || "~%")
Работает!
Но...
36.1 находит, а 36.12 не находит.
Получается, что от IN не отличается
← →
SpellCaster (2006-01-26 14:12) [9]Так а это что за шняга:
"~36.1~37~"?
← →
galexis (2006-01-26 14:18) [10]Это ALL_NUMBERS
Пробовал и через параметр :KOD=~36.1~37~
То же самое
← →
SpellCaster (2006-01-26 14:34) [11]Нет, а откуда 37 взялось? ALL_NUMBERS должен состоять из нужных номеров, разделенных знаками "~". Тогда запрос для каждой записи будет проверять, содержится ли значение ее поля KOD_OKVED в этой строке, и если результат положителен, то эта запись войдет в результирующий набор данных. Ну, а если тебе надо проверить диапазон значений с 36.1 по 37.хх, то... либо перечислять _все_ возможные номера (36.1,36.2,...), либо действовать как-то по-другому.
Можно взять TTable, прицепить её к OKVED, потом присвоить TTable.filtered:=true и переопределить событие ONFilterRecord - тогда определять, соответствует ли запись требуемому условию, можно будет в программе, с применением всей мощи Дельфей.
Уточни, какая стоит задача - так будет легче ответить.
← →
galexis (2006-01-26 14:56) [12]Структура ОКВЭД - дерево. Хотелось бы выбрав верхнюю ветвь отобрать все записи соответствующие этой ветви. В том числе когда выбрано несколько ветвей. Т.е. выбрал я KOD_OKVED=01. СЕЛЬСКОЕ ХОЗЯЙСТВО, ОХОТА И ПРЕДОСТАВЛЕНИЕ УСЛУГ В ЭТИХ ОБЛАСТЯХ, хочется чтобы отобрались предприяьтия с KOD_OKVED=01.1 Растениеводство, с KOD_OKVED=01.11 Выращивание зерновых, технических и прочих с/х культур,не включ.в др.груп.
← →
Deniz © (2006-01-26 14:59) [13]>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.
← →
Sergey13 © (2006-01-26 15:10) [14]2[12] galexis (26.01.06 14:56)
KOD_OKVED LIKE "01.%" or KOD_OKVED LIKE "02.%"
← →
SpellCaster (2006-01-26 15:36) [15]В таком случае действительно надо действовать в том направлении, которое указал 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:44) [16]2[12] galexis (26.01.06 14:56)
>Структура ОКВЭД - дерево.
Если это дерево отражено в структуре таблицы, то надо писать процедуру (с рекурсией), которая будет выбирать это дерево по связанным полям. Опираться в этом деле на строковый код - это не есть хорошо. Кто нибудь тебе вместо нолика букву "О" заколотит - с ума сойдешь искать причину ошибки.
ИМХО.
← →
galexis (2006-01-27 10:29) [17]
> Sergey13 © (26.01.06 15:10) [14]
Будет этих ОКВЭДов выбрано штук 200. Это же какой длины запрос получится? И сколько он будет выполняться?
Придется видимо IN использовать, а пользователям сказать, что не реально сделать поиск по все ветви :(
← →
Sergey13 © (2006-01-27 10:37) [18]2[17] galexis (27.01.06 10:29)
Ты думаешь с IN на 200 только головных значений будет быстрее? IN вроде сервером все равно в OR переводится. Но при "1%" индекс работает хотя бы.
ИМХО у тебя задача поставлена несколько, как бы это сказать, не того. Или я ее просто не понял. Зачем тебе 200 веток кодов сразу? Сколько их всего? Почему просто все сразу не выбрать?
← →
Sergey13 © (2006-01-27 10:45) [19]2 galexis
И вообще - у таблицы структура "деревянная" или дерево строится только по кодам?
← →
galexis (2006-01-27 10:48) [20]ОКВЭД - это общероссийский классификатор видов экономической деятельности, не я его придумал. Вот хочется пользователям выбирать несколько веток с разных уровней.
← →
galexis (2006-01-27 10:48) [21]
> Sergey13 © (27.01.06 10:45) [19]
Дерево по кодам строится. Так удобнее пользователям
← →
Sergey13 © (2006-01-27 10:52) [22]2 [20] galexis (27.01.06 10:48)
Это я догадался. 8-) Что ты с ним делаешь?
2[21] galexis (27.01.06 10:48)
> Дерево по кодам строится. Так удобнее пользователям
Это плохо. И удобство юзеров тут совсем ни при чем.
← →
galexis (2006-01-27 11:02) [23]
> Sergey13 © (27.01.06 10:52) [22]
1. Предприятия ищу. Есть база предприятий с оквэдами. Сам запрос то вообщето большой, по многим полям разных таблиц поиск идет. В т.ч. и по оквэд. Т.е. если конкретная ветка выбрана, то все работает. А им теперь разные ветки подавай и хуже, разные подветки разных веток и т.д.
2. Плохо что дерево по кодам строится? А как еще то? Там и справочник ОКВЭД неполный даже. Только те оквэды которые есть у предприятий находящихся в базе.
← →
Sergey13 © (2006-01-27 11:14) [24]2[23] galexis (27.01.06 11:02)
Дерево строится классически. Ид_записи и ИД_родительской_записи ссылающееся на ИД_записи. Выбирается ветка или запросом (в ИБ и ФБ этого нет) или процедурой с рекурсией. Иначе тебе придется для каждой записи анализировать (раскладывать на составляющие) ее код. Тут индексы не работают, поэтому все это работает долго. Кроме того многое (ВСЕ!!!) держится на правильности написания этого кода. Ошибись юзер в одном знаке - и все дерево кирдыкнется.
По деревьям есть статьи на ibase.ru - почитай.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.014 c