Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite. Неправльный результат запроса при группировке (число прочтений - 7651 )
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
1sqlite. Неправльный результат запроса при группировке
12. Марта 2012 :: 12:21
Печать  
Приветствую всех ! кто подскажет в чем проблема ?
есть 2 запроса, привожу фрагменты кода :
Текст первого запроса:
Select
ОстаткиТМЦ.Номенклатура , ОстаткиТМЦ.Склад,
SUM(ОстаткиТМЦ.Количество)
FROM РегистрИтоги_ОстаткиТМЦ AS ОстаткиТМЦ
where      ОстаткиТМЦ.PERIOD = :КонДата and
ОстаткиТМЦ.Склад = :выбСклад AND
ОстаткиТМЦ.Номенклатура = :выбТМЦ
GROUP BY
Номенклатура ,
Склад          

Текст второго запроса:
Select
ОстаткиТМЦ.Номенклатура , ОстаткиТМЦ.Склад,
SUM(ОстаткиТМЦ.Количество)
FROM РегистрИтоги_ОстаткиТМЦ AS ОстаткиТМЦ
where      ОстаткиТМЦ.PERIOD =:КонДата and
ОстаткиТМЦ.Склад in (select val from СпсСкладов) and
ОстаткиТМЦ.Номенклатура = :выбТМЦ
GROUP BY
Номенклатура ,
Склад
Во втором случае таблица СпсСкладов получена через      база.УложитьОбъекты(выбСклад,"СпсСкладов" , ,"Склады") ;
Все параметры одинаковые для обоих запросов, т.е. номенклатура одна и та же (не группа), склад тот же (не группа).

Предположим, что в регистре остатках 2 записи (коды номенклатуры и склада- это внутренние ID)
Номенклатура      Склад      Количество
  UH3ЦИБ          19ЦИБ                  -5
  UH3ЦИБ          19ЦИБ                   5

Результат первого запроса правильный- при группировке по полям Номенклатура и Склад-  Количество = 0

Результат второго запроса вообще непонятно как расчитывается- при группировке по полям Номенклатура и Склад-  Количество = -5
Т.е. запросы отличаются лишь способом фильтрации по складу.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #1 - 12. Марта 2012 :: 13:01
Печать  
ВыбТМЦ в первом случае, это что ?
1sqlite какое версии еще ?

И.. почему не типизируешь результат ?
И..почему не используешь автоподключение таблиц ?
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #2 - 12. Марта 2012 :: 13:35
Печать  
ВыбТМЦ - это элемент справочника Номенклатура.
выбСклад- это элемент справочника Склады.
КонДата- ТА.
1sqlite - версия 1026 (скачал только что обновление, попробовал). изначально было на 1023
Автоподключение таблиц еще с релиза 1023 не обязательна же  (Начиная с версии 1.0.1.4)??
Типизация полей сейчас не столь важна- будет адекватный результат- буду и типизицировать.
Использую выборку из регистра ОтстаткиТМЦ нетиповой ТиС- но структура регистра не изменялась.

Но непонятно почему разнится результат при фильтрации-  в первом случае по параметрам товара и склада(т.е. в выборку попадают остатки конкретного товара на конкретном складе), а во втором- отбор по конкретному товару и по списку складов, где в списке всего лишь один элемент справочника Склады ?

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #3 - 12. Марта 2012 :: 13:50
Печать  
При автоподключении упрощается синтаксис в разы.
+ не видно твои тексты запросов и ка ты фильтры устанавливаешь

Вот так, что кажет ??

Код
Выбрать все
Попытка
     база = СоздатьОбъект("SQLiteBase");
Исключение
    ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
    база = СоздатьОбъект("SQLiteBase");
КонецПопытки;
база.Открыть(":memory:");
запрос = база.НовыйЗапрос();
запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
ТекстЗапроса = "
    |Select
	|   ОстаткиТМЦ.Номенклатура [Номенклатура :Справочник.Номенклатура]
	|   ,ОстаткиТМЦ.Склад [Склад :Справочник.Склады]
	|   ,sum(ОстаткиТМЦ.Количество) Количество
	|from [РегистрИтоги.ОстаткиТМЦ] ОстаткиТМЦ
	|where
	|  ОстаткиТМЦ.period =:КонДата
	|  and ОстаткиТМЦ.Склад in (select val from СпсСкладов)
	|  and ОстаткиТМЦ.Номенклатура = :выбТМЦ
	|group by
	|   ОстаткиТМЦ.Номенклатура
	|   ,ОстаткиТМЦ.Склад
	|";
Запрос.Подставлять("выбТМЦ",выбТМЦ);
база.УложитьОбъекты(ВыбСклад,"СпсСкладов",0,"Склады");
мд = СоздатьОбъект("MetaDataWork");
Запрос.Подставлять("КонДата",мд.ПолучитьНачПериода(ПолучитьДатуТА()));
запрос.ВыполнитьЗапрос(ТекстЗапроса).ВыбратьСтроку(); 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #4 - 12. Марта 2012 :: 13:57
Печать  
+ В твоем случае, не видно еще, что именно ты укладываешь в список - элемент справочника/группу справочника/ список значений.

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


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #5 - 12. Марта 2012 :: 19:19
Печать  
не, дружище. Те же Фаберже, только в профиль. один фиг- не сворачивает запрос строки по группируемым полям. т.е по логике- из первого примера- должна быть одна запись с нулевым количеством, а по результару- одна запись с кол. -5.
В список для подзапроса выкладываю элемент справочника Склады. пробовал и по другому-  этот элемент загнать в список значений, а список- уложить. И потом в обоих вариантах делал тестовый запрос к таблице СпсСкладов- дает одну запись с Val, равным ссылкой на ID склада.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #6 - 13. Марта 2012 :: 06:13
Печать  
Больше кода. Железобетонно, ты в свой список значений положил НЕ элемент справочника.

И.. Что кажет мой код ?
Есть скриншот ?
Я тебе не верю, про не "сворачивание"
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #7 - 13. Марта 2012 :: 06:45
Печать  
да собственно вот архив, там скрины  , пояснение и сама обработка
  

___________________.zip ( 292 KB | Загрузки )
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #8 - 13. Марта 2012 :: 06:57
Печать  
Скорее всего непонятки в регистре ОстаткиТМЦ. сейчас смоделировал ситуацию, завел приход товара от одной фирмы. сделал перемещение - от другой фирмы. беру эту обработку- работает идеально- строки сворачиваются, количество- нулевое. вообщем буду разбираться.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #9 - 13. Марта 2012 :: 07:03
Печать  
И ? у меня всё работает!

У тебя ВыбСклад на форме какого типа ? Не <Справочник> без вида случаем ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #10 - 13. Марта 2012 :: 07:04
Печать  
tsarevich писал(а) 13. Марта 2012 :: 06:57:
Скорее всего непонятки в регистре ОстаткиТМЦ. сейчас смоделировал ситуацию, завел приход товара от одной фирмы. сделал перемещение - от другой фирмы. беру эту обработку- работает идеально- строки сворачиваются, количество- нулевое. вообщем буду разбираться.


Реиндекс базы, для начала.
И.. отрицательные итоги - это не комильфо, если че - пересчитай их монопольно, подвигав ТА назад - вперёд
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #11 - 13. Марта 2012 :: 07:40
Печать  
ок. спасибо, удачи...
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #12 - 14. Марта 2012 :: 08:37
Печать  
Код
Выбрать все
ФирмыФильтрСЗ=СоздатьОбъект("СписокЗначений");
ФирмыФильтрСЗ.ДобавитьЗначение(БазФирма);	// "Справочник.Фирмы", заполнено, не группа!
ФирмыФильтрСЗ.ДобавитьЗначение(ДопФирма);	// "Справочник.Фирмы", заполнено, не группа!
КодыОперацийФильтрСЗ=СоздатьОбъект("СписокЗначений");
КодыОперацийФильтрСЗ.ДобавитьЗначение("З");
КодыОперацийФильтрСЗ.ДобавитьЗначение("Ь");
тТхт="
|SELECT Партии.Фирма [Фирма :Справочник.Фирмы], Партии.Поставка [Поставка :Документ]
|	, Партии.ПрихДокумент [ПрихДокумент :Документ], Партии.IDDOC [Документ:Документ]
|	, Sum(Партии.ОстатокТовара) Кво, Sum(Партии.Стоимость) Сум, Sum(Партии.НДС) Ндс
|FROM [Регистр.ПартииТоваров] Партии
|WHERE (Партии.Фирма IN (select val from ФирмыФильтр)
|	AND (Партии.Товар = :ВыбТмц)
|	AND (Партии.КодОперации IN (select val from КодыОперацийФильтр)
|GROUP BY Партии.Фирма, Партии.Поставка, Партии.ПрихДокумент, Партии.IDDOC
|ORDER BY Партии.Фирма, Партии.Поставка, Партии.ПрихДокумент, Партии.IDDOC";
_1склБаза.УложитьОбъекты(ФирмыФильтрСЗ,"ФирмыФильтр",0,"Фирмы");
_1склБаза.УложитьОбъекты(КодыОперацийФильтрСЗ,"КодыОперацийФильтр");
_1склЗапрос=_1склБаза.НовыйЗапрос(); _1склЗапрос.Отладка(1);
_1склЗапрос.Подставлять("ВыбТмц",ВыбТмц);	// "Справочник.ТМЦ", заполнено, не группа!
_1склЗапрос.ВыполнитьЗапрос(тТхт).ВыбратьСтроку(); 


результат:
Код
Выбрать все
SELECT Партии.Фирма [Фирма :Справочник.Фирмы], Партии.Поставка [Поставка :Документ]
	, Партии.ПрихДокумент [ПрихДокумент :Документ], Партии.IDDOC [Документ:Документ]
	, Sum(Партии.ОстатокТовара) Кво, Sum(Партии.Стоимость) Сум, Sum(Партии.НДС) Ндс
FROM [Регистр.ПартииТоваров] Партии
WHERE (Партии.Фирма IN (select val from ФирмыФильтр)
	AND (Партии.Товар = '    AY   ')
	AND (Партии.КодОперации IN (select val from КодыОперацийФильтр)
GROUP BY Партии.Фирма, Партии.Поставка, Партии.ПрихДокумент, Партии.IDDOC
ORDER BY Партии.Фирма, Партии.Поставка, Партии.ПрихДокумент, Партии.IDDOC
err:  _1склЗапрос.ВыполнитьЗапрос(тТхт).ВыбратьСтроку();
{ЧО-ТО-ТАМ.ERT(220)}: near "GROUP": syntax error 


Плачущий

ЗЫ: а как его упорядочить по убыванию позиций документов-измерений? и при этом выбрать только первые с конца группировки по условию заполненности?
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #13 - 14. Марта 2012 :: 08:59
Печать  
у тебя в конструкции WHERE количество открывающихся скобок не равно количеству закрывающих.
Вместо
|WHERE (Партии.Фирма IN (select val from ФирмыФильтр)
|      AND (Партии.Товар = :ВыбТмц)
|      AND (Партии.КодОперации IN (select val from КодыОперацийФильтр)
поставь
|WHERE Партии.Фирма IN (select val from ФирмыФильтр)
|      AND Партии.Товар = :ВыбТмц
|      AND Партии.КодОперации IN (select val from КодыОперацийФильтр)

Условия в WHERE между AND/OR/NOT не обязательно отделять "()"- хотя и можно- главное в количестве скобок не запутаться. В 1С это не прокатывает, в SQL- прокатывает
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #14 - 14. Марта 2012 :: 09:07
Печать  
tsarevich писал(а) 14. Марта 2012 :: 08:59:
у тебя в конструкции WHERE количество открывающихся скобок ...
Вместо ...  поставь ...

ялох, да, спасибо. но:
Код
Выбрать все
WHERE Партии.Фирма IN (select val from ФирмыФильтр)
	AND Партии.Товар = '    AY   '
	AND (Партии.КодОперации IN (select val from КодыОперацийФильтр)
GROUP BY Партии.Фирма, Партии.Поставка, Партии.ПрихДокумент, Партии.IDDOC
ORDER BY Партии.Фирма, Партии.Поставка, Партии.ПрихДокумент, Партии.IDDOC
err:  _1склЗапрос.ВыполнитьЗапрос(тТхт).ВыбратьСтроку();
{ЧО-ТО-ТАМ.ERT(220)}: near "GROUP": syntax error  

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать