Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite. Неправльный результат запроса при группировке (число прочтений - 7856 )
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 записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #15 - 14. Марта 2012 :: 09:09
Печать  
Cthulhu писал(а) 14. Марта 2012 :: 09:07:
[quote author=tsarevich link=1331554885/0#13 date=1331715572]
Код
Выбрать все
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  



оп... в третьем условии AND (Партии.КодОперации IN... перед Партии скобку убрать...чей то я сам со скобками запутался Смущённый
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #16 - 14. Марта 2012 :: 09:14
Печать  
ааблинсвососкобками! дважды ялох! простите. щяс...
Added:
Блинство. В регистре Фирма и Товар - первые измерения. Пошёл в склайт для скорости. и на тебе:
Код
Выбрать все
Подбор индекса для таблицы RA1173:
	Ограничения: SP1159[Товар]=;
	Упорядочить: SP1158[Фирма], SP1163[Поставка], SP1164[ПрихДокумент], IDDOC,
	В кэше не найдено
	Индекс не выбран.
	Стоимость: 9978 


- и результат - ПУСТОЙ!.. хотя партии там есть точно!
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #17 - 14. Марта 2012 :: 09:29
Печать  
а убери фильтр по кодам операций. выборка пустая или непустая будет ?
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #18 - 14. Марта 2012 :: 09:36
Печать  
tsarevich писал(а) 14. Марта 2012 :: 09:29:
а убери фильтр по кодам операций. выборка пустая или непустая будет ?

Убрал. Выборка не пустая, НО: стоимость индекса всё та же дикая, и колонка "Документ" НЕ заполнена.

Прим: Убрал типизацию для IDDOC и добавил ", Count(Партии.IDDOC)" в SELECT.
В результате - заполненная rолонка IDDOC (краткими(!) ИД-ами), однако в колонке "Count(Партии.IDDOC)" почему-то встречаются не(!)единицы (двойки) - но почему? счетчик же по последней группировке..

ЗЫ: и - опа, мне только ПРИХоды нужны (это помимо фильтра по кодам операций)...  Злой
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #19 - 14. Марта 2012 :: 10:06
Печать  
а у тебя в фильтре по Фирме- если фильтруешь всегда по двум фирмам- по моему отбор лучще делать по параметрам, а не по подзапросу: Партии.Фирма  = :ВыбФирма1 AND Партии.Фирма  = :ВыбФирма2

Что по поводу колонки Документ:
В таблице движений регистра поле Документ(вернее IDDOC) храниться как  ссылка на КАКОЙ-ТО документ неопределенного вида.
Для типизации колонки  Документ как :Документ, т.е. документ неопределенного вида, нужно делать связь с журналом документов (таблица Журнал) по полям IDDOC с обоих сторон для получения дополнительной колонки для запроса  Документ_вид- это будет поле журнала документов Журнал.iddocdef , которое и определяет вид документа . И для измерения ПрихДокумент, если у него в 1С тип Документ, т.е. док неопредленного вида нужно примерно так же.
И почему не делаешь ограничения по периоду движений ?
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #20 - 14. Марта 2012 :: 10:20
Печать  
tsarevich писал(а) 14. Марта 2012 :: 10:06:
а у тебя в фильтре по Фирме- если фильтруешь всегда по двум фирмам- по моему отбор лучще делать по параметрам, а не по подзапросу: Партии.Фирма  = :ВыбФирма1 AND Партии.Фирма  = :ВыбФирма2

Вотжешблинство. А если я не знаю сколько фирм? и сколько товаров? но мне по этим двум первым измерениям надо отбор делать? что, способов найти дещёвый индекс нету?

Цитата:
Что по поводу колонки Документ:
В таблице движений регистра поле Документ(вернее IDDOC) храниться как  ссылка на КАКОЙ-ТО документ неопределенного вида.
Для типизации колонки  Документ как :Документ, т.е. документ неопределенного вида, нужно делать связь с журналом документов (таблица Журнал) по полям IDDOC с обоих сторон для получения дополнительной колонки для запроса  Документ_вид- это будет поле журнала документов Журнал.iddocdef , которое и определяет вид документа . И для измерения ПрихДокумент, если у него в 1С тип Документ, т.е. док неопредленного вида нужно примерно так же.

Как раз измерения типа "документ" (неопр) в результат прекрасно попадают с такой типизацией.
в RA-таблице есть поле IDDOCDEF. но епри попытке сунуть его в селект - говорит что такой колонки нету. странно, в одних есть, в других нету..
с журналом вязаться? ну тут я вообще увязну.  Плачущий
Цитата:
И почему не делаешь ограничения по периоду движений ?

мне нужны ВСЕ ПРИХоды - кстати, DEBCRED 0/1 это прих/расх? (аблин, надо сначала попробовать - может тоже как на iddocdef ругнется)
(ну или на крайняк - последний(в хронологии) приход по (последнему из) заполненному поставке или прихдоку (себестоимость последнего прихода короче).

ЗЫ: и всё-таки! как же фильтр на вид операции (реквизиту - однознаковой строке) по вхождению наложить??? Нерешительный
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #21 - 14. Марта 2012 :: 10:40
Печать  
Цитата:
А если я не знаю сколько фирм? и сколько товаров? но мне по этим двум первым измерениям надо отбор делать?

ну тогда - да. только через УложитьОбъекты

Цитата:
Как раз измерения типа "документ" (неопр) в результат прекрасно попадают с такой типизацией.
в RA-таблице есть поле IDDOCDEF. но епри попытке сунуть его в селект - говорит что такой колонки нету. что, неужто с журналом вязаться? ну тут я вообще увязну.

точно.. флаг "быстрая обработка движений" в регистре...

Цитата:
мне нужны ВСЕ ПРИХоды - кстати, DEBCRED 0/1 это прих/расх? (аблин, надо сначала попробовать - может тоже как на iddocdef ругнется)

DEBCRED  = 0, это приход

Цитата:
(ну или на крайняк - последний(в хронологии) приход по (последнему из) заполненному поставке или прихдоку (себестоимость последнего прихода короче).

а ты случаем не списание по партиям ваяешь ?
ЗЫ я тоже склайт не так давно использую... сначала в чистом виде брал, потом надыбал класс ПрямойЗапрос- щас отчеты через него ваяю, и некоторые доки тоже.
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #22 - 14. Марта 2012 :: 10:49
Печать  
tsarevich писал(а) 14. Марта 2012 :: 10:40:
ну тогда - да. только через УложитьОбъекты

- без возможности использовать дешёвые индексы если фильтры по первым измерениям?.. это очень, очень-очень грустно!

Цитата:
точно.. флаг "быстрая обработка движений" в регистре...

Там я исправил. в нужном регистре нету такого флага - и поля тоже.. буду гробиться связку с журналом строить для выдергивания вида документа и как-то (как, блин?) получить чтобы документ движения... или не буду - блин, невозможность существенного ускорения при множественном отборе на первые реквизитвы просто убивает.  Злой

Цитата:
DEBCRED  = 0, это приход

вот спасибочки.


Цитата:
а ты случаем не списание по партиям ваяешь ?

Оприходование излишков. Хитрое. Чтобы стоимость - по последней актуальной (а это не всякая поставка - тоже геморрой) поставке.

Цитата:
надыбал класс ПрямойЗапрос- щас отчеты через него ваяю, и некоторые доки тоже.

1с++ не юзаю, только 1sqlite. 1с++ мне периодически валит одинэсину - хрензнает при каких условиях, закономерность не удалось отловить, угробив кучу времени. и это - очень неприятно! хорошо что только начал на него переписывать кусочки - обратно отыгрывать пришлось...

ИТОГО:
всем спасибо, вопрос снят или отложен до появления свободного времени - прямой запрос не даст выигрыша ибо нужных индексов в партиях нету (отборы движений по фирме, товару и вообще - не стоят, а тут ещё как-то вязаться с журналом надо - вытаскивать вид докуменнта, как-то пристёгивать его к иду документа и как-то выдергивать документ).
Нерешительный  Смущённый
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #23 - 14. Марта 2012 :: 12:17
Печать  
IDDOC (9=символьный) - может дублироваться?
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #24 - 14. Марта 2012 :: 12:28
Печать  
не может. это поле присутствует в журнале. а там все IDDOC-и уникальные
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #25 - 14. Марта 2012 :: 12:43
Печать  
tsarevich писал(а) 14. Марта 2012 :: 12:28:
не может. это поле присутствует в журнале. а там все IDDOC-и уникальные

спасибочки.
(просьбы отменяются, доковырял сам)
Добавлено:
Блин. "no such column: Партии.DATE".
а так хотелось отсортировать по DATE + TIME... upd: отсортировал по DATE+TIME приджйненного журнала...
« Последняя редакция: 14. Марта 2012 :: 15:17 - Cthulhu »  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #27 - 15. Марта 2012 :: 05:07
Печать  
Поможет разве что галка быстрая обработка движений + явное указание индекса в тексте запроса.
Хотя, фокс всё равно обгонит этот запрос по скорости.
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #28 - 15. Марта 2012 :: 07:20
Печать  
Цитата:
На примере регистра Партий (см.выше). Запрос с джйном к журналу документов (желательно не блокируя его) - получить список документов, выполнивших приход, с кол-вом движений?


Будем исходить из следующих условий:
1.      У тебя 2 фирмы(можно и больше, т.к. все равно формируется список)
2.      Товар так же укладываем в список, т.к. возможна выборка группы или нескольких элементов . ну я так захотел : Подмигивание
3.      Ну и присутствует ограничение по датам документов- это можешь выкинуть...
4.      Далее.. не знаю, какую роль у тебя играют измерения Поставка и ПрихДокумент ??? так что буду отбирать записи с документами движения (IDDOC), где debkred = 0. Если, к примеру ПрихДокумент- это партиеобразующий документ, можно вместо IDDOC брать его- все равно перебираем движения…


     ТекстЗапроса = "
     |Select
     |   Партии.iddoc[ДокПрихода :Документ],
     |   Журнал.iddocdef ДокПрихода_вид,
     |   count(Партии.iddoc) КолДвидженийДоковПрихода
     |from Регистр_ПартииТоваров Партии
     |inner join Журнал on Партии.iddoc =  Журнал.iddoc
     |where
     |  Журнал.date between :НачДата and :КонДата and Журнал.ПартииТоваров ФР = 1 and Партии.debkred = 0
     |  and Партии.Фирма in (select val from СпсФирмы)  
     |  and Партии.Номенклатура in (select val from СпсТовары)
     |group by
     |  Партии.iddoc,Журнал.iddocdef
     |";        
     
база.УложитьОбъекты(ВыбТМЦ,"СпсТовары" , , "Номенклатура"); // ВыбТМЦ – возможно это будет один товар, группа товаров, список товаров и т.д.
// в СпсФирмы загружаем 2 фирмы.
СпсФирмы = СоздатьОбъект("СписокЗначений");
СпсФирмы.добавитьЗначение(ВыбФирма1);
СпсФирмы.добавитьЗначение(ВыбФирма2);
база.УложитьОбъекты(СпсФирмы,"СпсФирмы" , , "Фирмы");

Запрос.Подставлять("КонДата",КонДата);
Запрос.Подставлять("НачДата",НачДата);
Запрос.Подготовить(ТекстЗапроса);
запрос.отладка(1);
запрос.Выполнить().выбратьстроку();

Что касается стоимости индекстов:
В регистре движений партии индексы по измерениям регистров появятся только при установке в измерениях опции «Отбор движений». Возможно после этого скорость выборки возрастет. Но вследствие чего распухнет CDX файл таблицы движений. Пример: в моей базе таб. Движения партий = 90 Мб, cdx = 4 Мб. Установил в измерениях фирма и номенклатура отбор движений. Долго сохраняла конфу. После этого CDX стал 30 Мб. Ну и скорость записи в регистр упадет- насколько не знаю- не проверял. Не думаю, что намного…
Но несмотря на отсутствие индексов по измерениям в движениях, выборка у меня была примерно такая: с 01/01/11 по текущий день, по двум фирмам и по группа в которой у нас лежит очень дофига товаров – длилась ~ 5 секунд при первом запуске, 3 сек.- при последующих. Начало движения в партиях- с середины 07 года, всего записей в движенях - примерно 1400000. Штатным способом выборка была бы однозначно не такая.

Связь с журналом делаем тогда, когда например нужна типизация документов неопределенного вида,  когда нужно ограничивать выборку по датам движений. Исключение -  когда в регистре установлен флаг «Быстрая обработка движений».
Это добавляет в таб. движений поля IDDOCDEF, DATE, TIME.

Что касается блокировки таблиц- вроде по умолючанию блокировок нет. но можно их установить принудительно. для этого есть свойство запроса ВыполнятьВТранзакции
Вроде все...уф.. многабукаф...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #29 - 15. Марта 2012 :: 07:43
Печать  
Цитата:
Журнал.ПартииТоваров ФР = 1


Это что ?

Цитата:
Запрос.Подготовить(ТекстЗапроса);
Запрос.Выполнить().выбратьстроку();


Это зачем ? Цеже не параметезированный запрос
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #30 - 15. Марта 2012 :: 07:51
Печать  
Цитата:
Журнал.ПартииТоваровФР = 1
Это что ?

это дополнительный фильтр по журналу- отбираются те доки, которые делали движения по регистру ПартииТоваров. можешь пропробовать без него. ИмяРегистраФР- это поля журнала.
Цитата:
Запрос.Подготовить(ТекстЗапроса);
Запрос.Выполнить().выбратьстроку();
Это зачем ? Цеже не параметезированный запрос

у меня то есть параметры- даты.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #31 - 15. Марта 2012 :: 07:53
Печать  
Где эти параметры в этом тексте запроса ?
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #32 - 15. Марта 2012 :: 07:58
Печать  
параметры здесь
|where
|  Журнал.date between :НачДата and :КонДата

в принципе можно и не подготавливать, тогда нужно
|where
|  Журнал.date between @НачДата and @КонДата
после использовать метод УстановитьПарамер
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #33 - 15. Марта 2012 :: 08:00
Печать  
Улыбка)))))))))))))))))))))


Он у тебя и так НЕ подготовленный.
  
Наверх
 
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: 1sqlite. Неправльный результат запроса при группировке
Ответ #34 - 15. Марта 2012 :: 08:06
Печать  
ну если предварительно не подготавливать, тогда вместо Запрос.Выполнить().выбратьстроку() нужно Запрос.ВыполнитьЗапрос(ТекстЗапроса).выбратьстроку(). запрос же так или иначе перед выполнением подготавливается. либо непосредственно через Подготовить, либо через ВыполнитьЗапрос(ТекстЗапроса)
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать