![]() |
![]() |
![]() |
|
ADO : как кто реализует условие запроса ПринадлежитГруппе(Гр1)=1 ? Ø |
☑ | ||
---|---|---|---|---|
0
megatrend
02.10.01
✎
15:14
|
Есть ли красивое решение? Если иерархия групп разветвленная, то и решение д.б. нетривиальным, на мой взгляд.
|
|||
1
megatrend
02.10.01
✎
15:20
|
У меня DBF версия, кол-во уровней в справочнике - 5. Нужно написать SQL запрос к справочнику (select), так чтобы выбрались только элементы заданной группы.
|
|||
2
ert
02.10.01
✎
15:24
|
так там есть поле в таблице если неошибаюсь parentID...
select * from sc**** where parentID = groupID правда этот самый groupID надо как-то узнать... |
|||
3
N!ghtmare
02.10.01
✎
15:31
|
А что тебе мешает использовать код группы из 1с-ны ?
ты же запрос выполняешь из 1с-ны select sc ****** where parentID=Число(СпрГруппа.Код) |
|||
4
.
02.10.01
✎
15:33
|
имхо, нужен полный код и и что типа like
|
|||
5
Winter
02.10.01
✎
15:37
|
Начнём с того что запрос :
"//{{ЗАПРОС(Сформировать) |Товары = Справочник.Товары.ТекущийЭлемент; |Функция Счётчик = Счётчик(); |Группировка Товары без групп; |Условие(Товары.ПринадлежитГруппе(ВыбГруппа)=1); |"//}}ЗАПРОС ; Будет выполянться на порядок медленнее чем : "//{{ЗАПРОС(Сформировать) |Товары = Справочник.Товары.ТекущийЭлемент; |Функция Счётчик = Счётчик(); |Группировка Товары без групп; |Условие(Товары в ВыбГруппа); |"//}}ЗАПРОС ; Теперь по существу : вот текст процедуры вытащенный из профайлера, так как работает сама 1С, и работает надо сказать очень хорошо. ------------------------------------------------------------------------- CREATE PROCEDURE #RGTEMP0PROC(@current CHAR(9)) AS SET TEXTSIZE 0 DECLARE @VAL CHAR(9) IF EXISTS (SELECT * FROM SC33(NOLOCK) WHERE ID=@current AND ISFOLDER=1 ) BEGIN SET NOCOUNT ON INSERT INTO #RGTEMP0 SELECT ID,ISFOLDER FROM SC33(NOLOCK) WHERE PARENTID=@current AND ID NOT IN( SELECT VAL FROM #RGTEMP0 ) WHILE 1=1 BEGIN SELECT @VAL=MAX(VAL) FROM #RGTEMP0 WHERE ISFOLDER=1 IF @VAL IS NULL BREAK INSERT INTO #RGTEMP0 SELECT ID,ISFOLDER FROM SC33(NOLOCK) WHERE PARENTID=@VAL AND ID NOT IN( SELECT VAL FROM #RGTEMP0 ) DELETE FROM #RGTEMP0 WHERE VAL=@VAL AND ISFOLDER=1 END END ELSE IF NOT EXISTS( SELECT * FROM #RGTEMP0 WHERE VAL=@current ) INSERT #RGTEMP0 VALUES(@current, 2) return (0) |
|||
6
N!ghtmare
02.10.01
✎
15:40
|
Winter а запрос к ДБФ-у слабо через профайлер перехватить ;)
|
|||
7
Winter
02.10.01
✎
15:42
|
Ну, ну ... налью я тебе пива на следующей тусовке ... ;0)
|
|||
8
ex-Alex
02.10.01
✎
15:43
|
То 2. select * from sc**** where parentID = groupID выберет подчиненные элементы. Вложенные группы он не возьмет.
То 3. такая конструкция зависит от того, как идет нумерация - в пределах группы, или в пределах всего справочника. Для последнего варианта катит, для первого нет. Решение 5 - наиболее корректное. Суть его - формирование списка всех элементов, включая подчиненные и дальнейшая подстановка этого списка в условие запроса. |
|||
9
Winter
02.10.01
✎
15:48
|
Абсолютно согласен с (8).
|
|||
10
.
02.10.01
✎
15:52
|
2(8) А полный код из ID?
|
|||
11
N!ghtmare
02.10.01
✎
16:06
|
(7,8) Ну все запинали ;)
Хотя соглашусь с 8 полностью.Просто всегда использую нумерацию в пределах всего справочника и об этом не подумал. |
|||
12
megatrend
02.10.01
✎
16:16
|
(8) В DBF к сожалению не прокатывает длинный текст запроса. Если 35 условий прокатит, то 70 - нет. Поэтому подставить что-либо массивное в условие запроса не представляется возможным. Или я что-то недопонял про подстановку в условие запроса?
|
|||
13
N!ghtmare
02.10.01
✎
16:46
|
to 12
Внимательнее посмотри текст запроса приведенный Winter-om не смотря на его бесполезность для DBF /Winter не сильно пинай ;). SELECT с условием позволяет искать вхождение в перечислении. например Select ПродажаID,Месяц from Продажи where Месяц IN ('Январь','Март','Апрель') |
|||
14
megatrend
02.10.01
✎
16:57
|
Круто. Подумать только, я ведь SQL учил раньше чем 1С :) Только бы драйвер visual foxpro проглотил. Кстати, выяснилось, что для 7.5 (OEM кодировка)регистронезависимый поиск русских букв невозможен. По крайней мере, версии драйверов, которые валяются под руками, не дают такой возможности. Проверяли мы вдвоем с Alexander
|
|||
15
hurry
02.10.01
✎
17:15
|
Если знаешь уровень вложенности то например можешь употребить следующее
Условие ' 5SS ' - Ключ элемента группы WHERE( (SC33.PARENTID =' 5SS ')or(SC33.PARENTID IN (SELECT ID FROM SC33 (NOLOCK) WHERE (PARENTID =' 5SS ')or(PARENTID IN (SELECT ID FROM SC33(NOLOCK) WHERE PARENTID =' 5SS ')))) ) Решение 5 конечно универсалней но это короче и тривиальней. |
|||
16
Щ
02.10.01
✎
17:18
|
а теперь другой вопрос.
а у кого скл и кто пользуется описанным в 5 решением (временные таблицы + рекурсия ) ну акромя 1с , конечно. |
|||
17
Щ
02.10.01
✎
17:20
|
реккурсия ..отдельно.
|
|||
18
Higs
02.10.01
✎
17:26
|
Подскажите, а где можно почитать о том, как работать с АДО - доступом?
|
|||
19
megatrend
02.10.01
✎
17:34
|
(18) Примеры работы с ADO (by maxlab) есть на одном из фтп
(15) Что означает "SC33(NOLOCK)" после FROM? "(NOLOCK)" - ? |
|||
20
ex-Alex
02.10.01
✎
17:38
|
То 16. Ну у меня работает. А в чем вопрос то?
|
|||
21
hurry
02.10.01
✎
17:43
|
(19)
(NOLOCK) Это чтоб таблица не блокировалась во время выполнения запросов. Вообщето я на SQL общаюсь с MS SQL так что не знаю есть ли толк от NOLOCK в DBF. SC33 - собственно таблица |
|||
22
ex-Alex
02.10.01
✎
17:48
|
Не обязательно таблица (применительно к MSSQL). Это может быть и набор записей, участвующих в запросе. Это режим блокировки именно MSSQL, и естественно для других вариантов смысла не имеет.
|
|||
23
toypaul
02.10.01
✎
18:13
|
(0) Еще один из вариантов смотри в моей статье Бух запросы часть 1.2. Я считаю, что там ХП реализована даже лучше чем 1С-кая из (5). Последняя в цикле добавляет элементы, а в моей сначала собираются все группы, а потом можно по этим группам одним запросом выбрать все элементы - для универсальности можно создать еще одну ХП
|
|||
24
Xel
02.10.01
✎
20:11
|
2(19)Плиз, стукнись в аську(подмыльник) или мылом, как это можно увидеть. xel_1#aport.ru
|
|||
25
megatrend
03.10.01
✎
12:37
|
(24) Скорее всего, выложу это на своем сайте. Насколько срочно нужно?
|
|||
26
Y@go
03.10.01
✎
12:44
|
2(25) ссылку на сайт не забудь кинуть...
|
|||
27
megatrend
03.10.01
✎
14:13
|
||||
28
megatrend
03.10.01
✎
15:53
|
Выложено, см.
http://closed.narod.ru/rus/job_fran.htm |
|||
29
Xel
03.10.01
✎
16:06
|
(27) Это было не суперсрочно, но надо. Огромное спасибо!!!
|
|||
30
u
04.10.01
✎
11:54
|
p
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |