|   |   | 
| 
 | 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     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |