Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite - движения документа (число прочтений - 8190 )
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
1sqlite - движения документа
09. Декабря 2010 :: 04:49
Печать  
Как присоединить в запросе 1sqlite движения дока по конкретному регистру?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite - движения документа
Ответ #1 - 09. Декабря 2010 :: 06:08
Печать  
left join [Регистр.НужныйТебе] Рег on Рег.iddoc=Док.iddoc
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - движения документа
Ответ #2 - 09. Декабря 2010 :: 06:37
Печать  
Спасибо!
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Регистр движений
Ответ #3 - 15. Декабря 2010 :: 05:24
Печать  
Необходимо получить итоги + движения регистра по конкретному измерению.
Соорудил в консольке пробный запрос:
Код
Выбрать все
SELECT
мат.id [Материал :Справочник.Материалы]
, SUM(COALESCE(Партии.Количество, ПартииД.Количество * (1 - ПартииД.debkred * 2), 0))
, SUM(COALESCE(Партии.Сумма, ПартииД.Сумма * (1 - ПартииД.debkred * 2), 0))
FROM [Справочник.Материалы] мат
LEFT JOIN [РегистрИтоги.Партии] Партии ON SUBSTR(Партии.МПЗ,5,9) = мат.id AND Партии.period = '20101201'
LEFT JOIN [Регистр.Партии] ПартииД ON SUBSTR(ПартииД.МПЗ,5,9) = мат.id
LEFT JOIN [Журнал] ж ON ж.iddoc = ПартииД.iddoc AND ж.date >= '20101201'
WHERE мат.МатериалБезЛица IN ('   3UA   ')
GROUP BY 1
LIMIT 20 

Запрос выполняется 50 сек ... что я делаю не так?
(В справочнике есть индекс по полю МатериалБезЛица, сделано через IN потому что в реальных условиях там будет не один материал)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - движения документа
Ответ #4 - 15. Декабря 2010 :: 05:53
Печать  
1.Перебираешь весь справочник материалов
2.Перебираешь всю табличку регистра
3.Не используешь индекс при подключении 1sjournl

ЗЫ: Оно точно надо, весь справочник иметь в выборке ?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - движения документа
Ответ #5 - 15. Декабря 2010 :: 06:18
Печать  
Eprst писал(а) 15. Декабря 2010 :: 05:53:
1.Перебираешь весь справочник материалов
2.Перебираешь всю табличку регистра
3.Не используешь индекс при подключении 1sjournl

ЗЫ: Оно точно надо, весь справочник иметь в выборке ?

1. Почему весь? Только при условии совпадения по реквизиту. Просто условие для выборки только одно...
2. Аналогично пункту 1.
3. Поясни. Не понял.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - движения документа
Ответ #6 - 15. Декабря 2010 :: 06:44
Печать  
Вообще весьма забавный код..
Складывать итоги на определенную дату со всеми движениями, при условии, что если остатка нет на '20101201', то и сумма в движениях тоже 0 будет всегда.
Зачем присоединять табличку движений - неясно.
Если нужно иметь остаток на определенную дату, то нужно юнион делать.
Если нужны итоги на ТА - то табличка движений не нужна вообще.
И еще, в регистре, мпз - справочник неопределенного вида ?


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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - движения документа
Ответ #7 - 15. Декабря 2010 :: 06:45
Печать  
Dmitry The Wing писал(а) 15. Декабря 2010 :: 06:18:
Eprst писал(а) 15. Декабря 2010 :: 05:53:
1.Перебираешь весь справочник материалов
2.Перебираешь всю табличку регистра
3.Не используешь индекс при подключении 1sjournl

ЗЫ: Оно точно надо, весь справочник иметь в выборке ?

1. Почему весь? Только при условии совпадения по реквизиту. Просто условие для выборки только одно...
2. Аналогично пункту 1.
3. Поясни. Не понял.


1.потому, что отсканить весь справочник и отсеет те строки, которые не подходят по условию мат.МатериалБезЛица IN
2. аналогично..
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - движения документа
Ответ #8 - 15. Декабря 2010 :: 06:51
Печать  
Eprst писал(а) 15. Декабря 2010 :: 06:44:
Вообще весьма забавный код..
Складывать итоги на определенную дату со всеми движениями, при условии, что если остатка нет на '20101201', то и сумма в движениях тоже 0 будет всегда.
Зачем присоединять табличку движений - неясно.
Если нужно иметь остаток на определенную дату, то нужно юнион делать.
Если нужны итоги на ТА - то табличка движений не нужна вообще.
И еще, в регистре, мпз - справочник неопределенного вида ?

Итоги я видел только на первые числа ... в теории период может быть и неактуальным.
Можно и юнион, но в регистре движений нет дат...
Реквизит мпз - неопределенный справочник.

Eprst писал(а) 15. Декабря 2010 :: 06:45:
1.потому, что отсканить весь справочник и отсеет те строки, которые не подходят по условию мат.МатериалБезЛица IN
2. аналогично..

Т.е. индекс по реквизиту не используется?  Ужас
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - движения документа
Ответ #9 - 15. Декабря 2010 :: 06:56
Печать  
Тебе в результате что нужно то ?
То что ты написал, годится только для получения итогов на ТА, и то, если выкинешь обращение к таблице движений.

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - движения документа
Ответ #10 - 15. Декабря 2010 :: 06:58
Печать  
Eprst писал(а) 15. Декабря 2010 :: 06:56:
Тебе в результате что нужно то ?

Мне нужны остатки на определенную дату. Понимаю, что вместо "ж.date >= '20101201'" должен быть BETWEEN.

С юнионом - так?
Код
Выбрать все
SELECT
мат.id [Материал :Справочник.Материалы]
, SUM(Партии.Количество) Количество
, SUM(Партии.Сумма) Сумма
FROM [Справочник.Материалы] мат
LEFT JOIN [РегистрИтоги.Партии] Партии ON SUBSTR(Партии.МПЗ,5,9) = мат.id AND Партии.period = '20101201'
WHERE мат.МатериалБезЛица IN ('   3UA   ')
GROUP BY 1
UNION
SELECT
мат.id [Материал :Справочник.Материалы]
, SUM(ПартииД.Количество * (1 - ПартииД.debkred * 2))
, SUM(ПартииД.Сумма * (1 - ПартииД.debkred * 2))
FROM [Справочник.Материалы] мат
LEFT JOIN [Регистр.Партии] ПартииД ON SUBSTR(ПартииД.МПЗ,5,9) = мат.id
LEFT JOIN [Журнал] ж ON ж.iddoc = ПартииД.iddoc AND ж.date >= '20101201'
WHERE мат.МатериалБезЛица IN ('   3UA   ') AND ж.iddoc IS NOT NULL
GROUP BY 1 



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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - движения документа
Ответ #11 - 15. Декабря 2010 :: 07:18
Печать  
Код
Выбрать все
   Т="
	  |Select
		|   Рег.МПЗ [Материал :Справочник]
		|   ,SUM(Рег.НачОст) [НачОст $Число]
		|   ,SUM(Рег.Приход) [Приход $Число]
		|   ,SUM(Рег.Расход) [Расход $Число]
		|   ,SUM(Рег.НачОст+Рег.Приход-Рег.Расход) [КонОст $Число]
		|From
		|	(
		|	SELECT
		|	  Итоги.МПЗ МПЗ
		|		,Итоги.Количество НачОст
		|		,0 Приход
		|		,0 Расход
		|	FROM
		|		[РегистрИтоги.Партии] as Итоги
		|
		|	WHERE
		|		Итоги.period = :ПредПериод
		|   UNION ALL
		|	SELECT
		|		 Движения.МПЗ
		|		,Движения.Количество * (1 - Движения.debkred * 2)
		|		,0
		|		,0
		|	FROM
		|		[Регистр.Партии] AS Движения
		|   INNER Join [Журнал] Жур ON Жур.iddoc = Движения.iddoc and Жур.date BETWEEN :НачПериод And :КонПериод
		|	--WHERE это если есть галка быстрая обработка движений
		|		-- Движения.date BETWEEN :НачПериод And :КонПериод
		|	UNION ALL
		|	SELECT
		|		 Движения.МПЗ
		|		,0
		|		,Движения2.Количество*(1-Движения2.Debkred)
		|		,Движения2.Количество*Движения2.Debkred
		|	FROM
		|		[Регистр.Партии] Движения2
		|   INNER Join [Журнал] Жур2 ON Жур2.iddoc = Движения.iddoc and Жур2.date BETWEEN :Дата1 And :Дата2
		|
		|	--WHERE это если есть галка быстрая обработка движений
		|		--Движения2.date BETWEEN :Дата1 And :Дата2
		|) Рег
		|Inner join [Справочник.Материалы] мат on SUBSTR(Рег.МПЗ,5,9) = мат.id and мат.МатериалБезЛица IN ('   3UA   ')
	  |Group by Рег.МПЗ
		|";

		мд = СоздатьОбъект("MetaDataWork");
		НачПериод = мд.ПолучитьНачПериода(НачДата);//начало периода
		ПредПериод = мд.ПолучитьНачПериода(НачПериод-1);//предыдущее начало периода останков
		Запрос.Подставлять("ПредПериод",ПредПериод);
		Запрос.Подставлять("НачПериод",НачПериод);
		Запрос.Подставлять("КонПериод",НачДата-1);//для вычисления НачОст
		Запрос.Подставлять("Дата1",НачДата);
		Запрос.Подставлять("Дата2",КонДата);
 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - движения документа
Ответ #12 - 15. Декабря 2010 :: 07:20
Печать  
Eprst писал(а) 15. Декабря 2010 :: 06:44:
Если нужны итоги на ТА - то табличка движений не нужна вообще.

Проверил это заявление и не нашел подтверждения. Итоги всегда лежат на первом числе, хотя ТА находится не там...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - движения документа
Ответ #13 - 15. Декабря 2010 :: 07:22
Печать  
Это начОст,КонОст,Приход,Расход за период с НачДата по КонДата..
Если нужны только КонОст - то выкидываешь последний юнион и переписываешь запрос, чтоб сразу КонОст получался, а не как НачОст+Приход-Расход.., т.е нужно взять ближайший итог от даты и сложить приход-расход от даты начала периодичности хранения останков до нужной даты получения остатков.
Если нужны актуальные останки (на ТА), то достаточно сложить итоги на начало периодичности хранения останков и всё.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - движения документа
Ответ #14 - 15. Декабря 2010 :: 07:24
Печать  
Dmitry The Wing писал(а) 15. Декабря 2010 :: 07:20:
Eprst писал(а) 15. Декабря 2010 :: 06:44:
Если нужны итоги на ТА - то табличка движений не нужна вообще.

Проверил это заявление и не нашел подтверждения. Итоги всегда лежат на первом числе, хотя ТА находится не там...


Итоги лежат не на первое число (исключение - периодичность - месяц), а на начало периодичности хранения останков.
Для месяца - начало месяца, для 5-дневки - начало пятидневки и т.д..

И при получении итогов на ТА, смотреть табличку движений не надо.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать