Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Не работает отбор в запросе 1sqlite (число прочтений - 8847 )
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Не работает отбор в запросе 1sqlite
25. Марта 2014 :: 07:57
Печать  
Уважаемые специалисты, подскажите пожалуйста, почему в запросе 1sqlite не отрабатывает отбор по списку значений?

Запрос к справочнику номенклатуры (ТиС) с отбором по полю производитель, запрос выводит всю номенклатуру, а должен только ту, которая в СЗ:

     ВыбПроизводитель = СоздатьОбъект( "Справочник.Производители" );
     ВыбПроизводитель.НайтиПоКоду( "0021" );
     ВыбПроизводитель = ВыбПроизводитель.ТекущийЭлемент();
     
     Спс = СоздатьОбъект( "СписокЗначений" );
     спс.ДобавитьЗначение( ВыбПроизводитель );
     
     ТекстЗапроса="
     |Select
     | Ном.code,
     | Ном.Descr,
     | Ном.Производитель [Производитель $Справочник.Производители]
     |From
     | Справочник_Номенклатура Ном;
     |
     |WHERE (Ном.Производитель IN (SELECT val FROM Спс));";
     
     База = СоздатьОбъект( "SQLiteBase" );
     
     база.Открыть(":memory:"); // Откроем пустую базу данных в памяти
     запрос = база.НовыйЗапрос();
     запрос.Подготовить(текстЗапроса);
     запрос.ВыполнитьЗапрос( "PRAGMA journal_mode = WAL" );
     
     база.УложитьОбъекты( спс, "Спс", 0);            
     
     ТЗ = СоздатьОбъект( "ТаблицаЗначений" );
     ТЗ = Запрос.ВыполнитьЗапрос( ТекстЗапроса );
     
     ТЗ.ВыбратьСтроку();

1С 7.7 27, DBF, 1С++ 3.2.4.1, 1sqlite 1.0.2.3, Win2003stdR2 64bit
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #1 - 25. Марта 2014 :: 08:19
Печать  
Код
Выбрать все
 //  Спс = СоздатьОбъект( "СписокЗначений" );
//     спс.ДобавитьЗначение( ВыбПроизводитель );

.....
  |From
     |-- Справочник_Номенклатура Ном;
     |[Справочник.Номенклатура] Ном


....
// запрос.Подготовить(текстЗапроса);
база.УложитьОбъекты(ВыбПроизводитель,"Спс",0,"Производители");
// ТЗ = СоздатьОбъект( "ТаблицаЗначений" );
 ТЗ = Запрос.ВыполнитьЗапрос( ТекстЗапроса ); 

  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #2 - 25. Марта 2014 :: 08:21
Печать  
Уважаемый Erpst, меня интересует отбор именно по списку. В моем примере в списке был один элемент, а иногда надо фильтровать по нескольким одновременно.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #3 - 25. Марта 2014 :: 08:22
Печать  
Ну втыкай список.
В твоём примере, для отбора по группе/элементы список не нужен был бы.
ЗЫ: у тебя в УложитьОбъекты небыло типизации + зачем то ; в тексте запроса.. он вообще должен был ошибку выдавать в синтаксисе..
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #4 - 25. Марта 2014 :: 08:24
Печать  
Дак я и воткнул список, но отбор по списку не работает - в ТЗ попадают все товары (вместо того, чтобы вывести только те, у которых производитель в списке).
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #5 - 25. Марта 2014 :: 08:26
Печать  
база.УложитьОбъекты(Спс,"Спс",0,"Производители");
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #6 - 25. Марта 2014 :: 08:28
Печать  
Спасибо за помощь, но отбор по прежнему не работает...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #7 - 25. Марта 2014 :: 08:34
Печать  
Текст запроса покажи.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #8 - 25. Марта 2014 :: 08:35
Печать  
+ Производитель  в справочнике какого типа хоть ?
Неопределенного вида/типа ?
Или конкретного вида справочника ?
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #9 - 25. Марта 2014 :: 08:36
Печать  
Весь код обработки был в (0), могу еще полнее:

Процедура Сформировать()

     ВыбПроизводитель = СоздатьОбъект( "Справочник.Производители" );
     ВыбПроизводитель.НайтиПоКоду( "0021" );
     ВыбПроизводитель = ВыбПроизводитель.ТекущийЭлемент();
     
     Спс = СоздатьОбъект( "СписокЗначений" );
     спс.ДобавитьЗначение( ВыбПроизводитель );
     
     ТекстЗапроса="
     |Select
     | Ном.code,
     //| Ном.Descr,
     | id [Объект :Справочник.Номенклатура],
     | Ном.Производитель [Производитель $Справочник.Производители]
     |From
     | Справочник_Номенклатура Ном;
     |
     |WHERE (Ном.Производитель IN (SELECT val FROM Спс));";
     
     База = СоздатьОбъект( "SQLiteBase" );
     
     база.Открыть(":memory:"); // Откроем пустую базу данных в памяти
     запрос = база.НовыйЗапрос();
     запрос.Подготовить(текстЗапроса);
     запрос.ВыполнитьЗапрос( "PRAGMA journal_mode = WAL" );
     
     база.УложитьОбъекты( Спс, "Спс", 0, "Производители" );
     
     ТЗ = СоздатьОбъект( "ТаблицаЗначений" );
     ТЗ = Запрос.ВыполнитьЗапрос( ТекстЗапроса );
     
     ТЗ.ВыбратьСтроку();
     
КонецПроцедуры
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #10 - 25. Марта 2014 :: 08:42
Печать  
Eprst писал(а) 25. Марта 2014 :: 08:35:
+ Производитель  в справочнике какого типа хоть ?
Неопределенного вида/типа ?
Или конкретного вида справочника ?


Конкретного вида справочника
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #11 - 25. Марта 2014 :: 08:47
Печать  
Код
Выбрать все
Процедура Сформировать()
	ВыбПроизводитель = СоздатьОбъект("Справочник.Производители");
	Если ВыбПроизводитель.НайтиПоКоду("0021") =1 Тогда
		Спс = СоздатьОбъект("СписокЗначений");
		Спс.ДобавитьЗначение(ВыбПроизводитель.ТекущийЭлемент());
	Иначе
		Предупреждение("Пнх, Альфредо!");
		Возврат;
	КонецЕсли;
	ТекстЗапроса="
	|Select
	| Ном.code,
	| Ном.Descr,
	| id [Объект :Справочник.Номенклатура],
	| Ном.Производитель [Производитель :Справочник.Производители]
	|From
	| [Справочник.Номенклатура] Ном
	|WHERE (Ном.Производитель IN (SELECT val FROM Спс))";

	База = СоздатьОбъект( "SQLiteBase" );
	база.Открыть(":memory:"); // Откроем пустую базу данных в памяти
	запрос = база.НовыйЗапрос();
	запрос.ВыполнитьЗапрос("PRAGMA journal_mode = WAL");
	база.УложитьОбъекты(Спс,"Спс",0,"Производители");
	ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
	ТЗ.ВыбратьСтроку();
КонецПроцедуры 

  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #12 - 25. Марта 2014 :: 08:49
Печать  
Ваш код не выдает ошибку и не посылает Альфредо (т.е. СЗ заполнился), но тем не менее выдает все товары без отбора. Почему такое может быть?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #13 - 25. Марта 2014 :: 08:54
Печать  
Так че пишет ?
Запрос.Отладка(1) ?
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #14 - 25. Марта 2014 :: 09:06
Печать  
Дико извиняюсь, смогу ответить только завтра - пришлось уехать с работы
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #15 - 26. Марта 2014 :: 05:15
Печать  
Вот что выдает отладка:

Select
Ном.code,
id [Объект :Справочник.Номенклатура],
Ном.Производитель [Производитель $Справочник.Производители]
From
Справочник_Номенклатура Ном;

WHERE (Ном.Производитель IN (SELECT val FROM Спс));
Подбор индекса для таблицы SC84:
     Ограничения:
     Найдено в кэше
     Индекс не выбран.
     Стоимость: 9986

Увидев текст "Индекс не выбран" - я вспомнил, что у поля "Производитель" - не включена галка "Отбор по реквизиту" и включил его, но это не помогло - и содержание ТЗ не изменилось и текст отладки тоже.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #16 - 26. Марта 2014 :: 05:41
Печать  
Да пилять... Ты копи-пасте умеешь пользоваться ????
В моём тексте запроса нет точек с запятыми...
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #17 - 26. Марта 2014 :: 05:53
Печать  
Прошу прощения, был кругом не прав. Ваш пример работает, а я дурак.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #18 - 26. Марта 2014 :: 06:04
Печать  
Просто, я тебе об ентом еще выше писал, ";" используется для разделения запросов в пакете.. Тут sqlite много прощает ошибок в синтаксисе, по сравнению с обычным t-sql... вот и тупо игнорит твой второй запрос, который не с селекта начинается опосля твоей ";"
Как-то так Подмигивание
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Не работает отбор в запросе 1sqlite
Ответ #19 - 26. Марта 2014 :: 07:11
Печать  
И в заключение хотелось бы спросить - какую версию 1sqlite лучше всего использовать? Сейчас стоит 1.0.2.3, читал что 1.0.2.6 - нестабильный.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не работает отбор в запросе 1sqlite
Ответ #20 - 26. Марта 2014 :: 07:40
Печать  
Всё , что выше  1.0.2.4 не рабочее...
Проверить просто, простейшим селектом.
ЗЫ: хотя,  1.0.2.6 и шустрее работает, я остался на  1.0.2.4
  
Наверх
 
IP записан
 
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Не работает отбор в запросе 1sqlite
Ответ #21 - 14. Августа 2016 :: 06:44
Печать  
Eprst писал(а) 25. Марта 2014 :: 08:47:
Код
Выбрать все
Процедура Сформировать()
	ВыбПроизводитель = СоздатьОбъект("Справочник.Производители");
	Если ВыбПроизводитель.НайтиПоКоду("0021") =1 Тогда
		Спс = СоздатьОбъект("СписокЗначений");
		Спс.ДобавитьЗначение(ВыбПроизводитель.ТекущийЭлемент());
	Иначе
		Предупреждение("Пнх, Альфредо!");
		Возврат;
	КонецЕсли;
	ТекстЗапроса="
	|Select
	| Ном.code,
	| Ном.Descr,
	| id [Объект :Справочник.Номенклатура],
	| Ном.Производитель [Производитель :Справочник.Производители]
	|From
	| [Справочник.Номенклатура] Ном
	|WHERE (Ном.Производитель IN (SELECT val FROM Спс))";

	База = СоздатьОбъект( "SQLiteBase" );
	база.Открыть(":memory:"); // Откроем пустую базу данных в памяти
	запрос = база.НовыйЗапрос();
	запрос.ВыполнитьЗапрос("PRAGMA journal_mode = WAL");
	база.УложитьОбъекты(Спс,"Спс",0,"Производители");
	ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
	ТЗ.ВыбратьСтроку();
КонецПроцедуры 




Подниму эту тему ещё раз..
Столкнулся с проблемой что УложитьОбъекты не отрабатывает: "SELECT val FROM Спс" возвращает пустую таблицу, запрос без этой части отрабатывает. Что я делаю не так??? Для теста полностью скопировал этот запрос, только реквизиты поменял на свои. Вот текст запроса:
Код
Выбрать все
	ТекстЗапроса="
	|Select
	| code,
	| Descr,
	| id [Объект :Справочник.Товары]
	//| Ном.Производитель [Производитель :Справочник.Производители]
	|From Товары
	//|LIMIT 100";
	|WHERE (ID IN (SELECT val FROM Спс))";

	База = СоздатьОбъект( "SQLiteBase" );
	база.Открыть(":memory:"); // Откроем пустую базу данных в памяти
	запрос = база.НовыйЗапрос();
	запрос.ВыполнитьЗапрос("PRAGMA journal_mode = WAL");
	запрос.ВыполнитьЗапрос("create virtual table Товары using dbeng(Справочник.Товары)");

	база.УложитьОбъекты(ВыбТовары,"Спс",0,"Товары");
	ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса); //"SELECT val FROM Спс"); //ТекстЗапроса);
	ТЗ.ВыбратьСтроку();
 


1SQLite - 1.0.2.6, База ДБФ 7.7 ВыбТовары - элемент диалога на форме, выбираю группу, ожидалось что в отбор попадут элементы группы.
« Последняя редакция: 14. Августа 2016 :: 08:09 - PVL »  
Наверх
 
IP записан
 
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Не работает отбор в запросе 1sqlite
Ответ #22 - 15. Августа 2016 :: 10:21
Печать  
Может из-за этого: http://www.forum.mista.ru/topic.php?id=550161

orefkov
14 - 18.05.11 - 14:14
(13)
Усе понятно.
Для разворота справочника по группам 1sqlite использует 2ой по порядку индекс, полагая, что он
PARENTID,ISFOLDER,...
А тут в начале индекса добавляется еще поле PARENTEXT.

Попробовал взять другой справочник - работает..
Справочник.Товары используется через владельца (константа).
Что-то автор разработки в теме из предыдущего поста не указал в какой версии это пофиксил, и сделал ли..
Придётся ручками делать..  Нерешительный  Плачущий
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать