Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема 1sqlite вопрос по запросу (число прочтений - 2157 )
kentavr27
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 40
Зарегистрирован: 04. Июня 2008
1sqlite вопрос по запросу
20. Ноября 2010 :: 15:34
Печать  
Сильно не пинайте. Задача элементарная, но с SQL запросами не работал... а потребовалось.
База ДБФ.
Задача следующая:
Выбрать из справочника все элементы и группы, которые отсутствуют в неком списке значений (фильтре). В списке значений могут быть как группы, так и отдельные элементы. Из выборки должны быть исключены ВСЕ элементы (группы), которые лежат ниже выбранных в списке значений.
Условие аналогично НЕ(СписокФильтр.Принадлежит(Элемент.ТекущийЭлемент()))

Примерный код получается такой:

[code]      базаДанных = СоздатьОбъект("SQLiteBase");
     базаДанных.Открыть(":memory:");
     запрос = базаДанных.НовыйЗапрос();
     вид="Клиенты";
     запрос.ВыполнитьЗапрос("create virtual table "+Вид+" using dbeng(Справочник."+Вид+")");
     базаДанных.УложитьОбъекты(СписокЗапрещенных,"_"+Вид,0,);
     
     текст="SELECT
     |code Код,
     |id ["+Вид+" :Справочник."+Вид+"]
     |FROM "+Вид+"
     |WHERE ismark <> '*'
     |And (PARENTID not IN (SELECT Val FROM "+("_"+Вид)+"))";
     
     тз=запрос.ВыполнитьЗапрос(текст);
     Сообщить("элементов "+тз.КоличествоСтрок());
     тз.ВыбратьСтроку();[/code]
но такая конструкция исключает только один нижележащий уровень, а все что на 2 и дальше уровнях -- попадает в выборку...

Поскажите плиз, как правильно нужно написать запрос...
Стандартными средствами не предлагать, т.к. стандартно отрабатывает 3-4 секунды, а в моем случае время исполнения должно быть не более 0.3-0.5 сек.
И еще... подскажите чего можно почитать, что бы как-то вдуплиться в синтаксис и основы 1sqlite, дабы не обращаться к многочисленной аудитории с элементарными вопросами?...  :-[

« Последняя редакция: 20. Ноября 2010 :: 22:48 - kentavr27 »  
Наверх
 
IP записан
 
sava
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Февраля 2010
Пол: Мужской
Re: 1sqlite вопрос по запросу
Ответ #1 - 21. Ноября 2010 :: 14:37
Печать  
смотри в УложитьОбъекты(Объект, ИмяТаблицы, [КакПостоянную], [Иерархия])
  
Наверх
 
IP записан
 
kentavr27
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 40
Зарегистрирован: 04. Июня 2008
Re: 1sqlite вопрос по запросу
Ответ #2 - 21. Ноября 2010 :: 17:09
Печать  
Смотрел. Не подходит...
Иерархия - тип: Строка. Название справочника или плана счетов для разворота групп справочника или групп счетов. Необязательный параметр. По умолчанию - пустая строка.

Во-первых у меня список значений а не одна группа справочника, во-вторых в списке значений у могут быть выбраны несколько элементов/групп разных справочников
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite вопрос по запросу
Ответ #3 - 21. Ноября 2010 :: 22:14
Печать  
kentavr27 писал(а) 21. Ноября 2010 :: 17:09:
Смотрел. Не подходит...
Иерархия - тип: Строка. Название справочника или плана счетов для разворота групп справочника или групп счетов. Необязательный параметр. По умолчанию - пустая строка.

Во-первых у меня список значений а не одна группа справочника, во-вторых в списке значений у могут быть выбраны несколько элементов/групп разных справочников

Во-первых, посмотри еще описание параметра Объект, а не только параметра Иерархия.
Во-вторых, если у тебя в списке значения разных видов справочника, то и твой вариант запроса неверен, тк идшники нужно тогда сравнивать вместе с видом. Либо для каждого вида справочника в таблицу выгружать только значения справочника этого же вида.
  
Наверх
 
IP записан
 
kentavr27
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 40
Зарегистрирован: 04. Июня 2008
Re: 1sqlite вопрос по запросу
Ответ #4 - 21. Ноября 2010 :: 23:29
Печать  
orefkov писал(а) 21. Ноября 2010 :: 22:14:
Во-первых, посмотри еще описание параметра Объект, а не только параметра Иерархия.
Во-вторых, если у тебя в списке значения разных видов справочника, то и твой вариант запроса неверен, тк идшники нужно тогда сравнивать вместе с видом. Либо для каждого вида справочника в таблицу выгружать только значения справочника этого же вида.

C параметром Объект не совсем понятно...
Объект - тип: СписокЗначений, Справочник, Счет. Выгружаемые объекты
У меня список значений. Что здесь не так?
Друге дело, если бы можно было в цикле разобрать список и УложитьОбъекты() не список, а группы/элементы, но если я правильно понимаю, этот метод для одной таблицы может быть выполнен только один раз. т.е. элементами справочника в одну таблицу все что есть в списке не запихнешь...

Или эту задачу можно реализовать только через серию запросов? (на каждый элемент списка в отдельности). Но как-то геморойно это.

Неуж-то в SQL запросах нет чего-то подобного стндартным функциям 1С (типа "В" (в запросе) или .Принадлежит (в списке значений)?

Если "во-вторых" -- это проблематично сделать "одним махом", то могу в список выгружать справочник одного вида, не вопрос. (просто делал по аналогии со стандартными запросами -- там хавает без проблем)
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite вопрос по запросу
Ответ #5 - 22. Ноября 2010 :: 05:45
Печать  
kentavr27 писал(а) 21. Ноября 2010 :: 23:29:
(просто делал по аналогии со стандартными запросами -- там хавает без проблем)

Ну и сам видишь, до чего тебя довела эта безпроблемность Улыбка
Ну а так - раз тебе надо выбирать элементы/группы из одного справочника, то зачем сравнивать со значениями других справочников?

Если бы тебе было нужно получить только элементы, то решалось бы просто:
подготовь СписокЗначений, в котором оставь только группы/элементы нужного вида.
Затем уложи этот СЗ в таблицу, методом УложитьОбъекты с разворотом по иерархии:
Код
Выбрать все
база.УложитьОбъекты(сзЗапрещенных, "выбЭлементы",, "НужныйВид"); 


(при этом все группы, входящие в список, будут заменены на входящие в них элементы)

далее запрос
Код
Выбрать все
select
    id
from [Справочник.НужныйВид] where isfolder=2 and id not in (select val from выбЭлементы)
 



Однако тебе надо с группами. Тут сложнее. Подумаю еще. Может допилю метод УложитьОбъекты, чтобы группы разворачивались до элементов, но из списка не удалялись.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать