Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) часть 6 быстрый поиск товара На складе по движениям ra (число прочтений - 3655 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
часть 6 быстрый поиск товара На складе по движениям ra
01. Декабря 2008 :: 16:31
Печать  
продолжение предыдущей ветки
http://www.1cpp.ru/forum/YaBB.pl?num=1227685716
попытка решить задачу
найти товар на складе максимально быстро за период от начала тек месяца до конкретной даты ( т.е по таблице ra )
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #1 - 01. Декабря 2008 :: 16:31
Печать  
Пусть есть регистр
Товар, Склад, Фирма , Колво

какой порядок измерений стоит и как надо его определять опускаем

Задача для любого порядка измерений в вышеобозначеном регистре
быстро находить оборот конкрет Товара на конкретном Складе
с начала  последнего(текущего) месяца до
конкретной даты или до конкретного документа.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #2 - 01. Декабря 2008 :: 16:33
Печать  
Заводим  регистр оборотов( периодичность месяц ) : ИндексТоварСклад
Изменений нет
Ресурсы   Колво
Реквизиты Id_Товар_Id_Склад  строка длина 18 галка отбор движений стоит
на самом регистре галка быстрая установка движений тоже установлена
  

reg.bmp ( 576 KB | Загрузки )
reg.bmp
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #3 - 01. Декабря 2008 :: 16:34
Печать  
В модуле проведения где есть Приход Товара Пишем
Код
Выбрать все
Если НачМесяца(ДатаДок) >= НачМесяца(ТекущаяДата() ) Тогда
	ВыбратьСтроки();
	Пока ПолучитьСтроку() = 1 Цикл
		Стр_Х_Id_Товар_Id_Склад = Глоб_meta.ЗначениеВСтрокуБД(Товар) + Глоб_meta.ЗначениеВСтрокуБД(СтрокаСклад);
		Регистр.ИндексТоварСклад.Колво = Количество;
		Регистр.ИндексТоварСклад.Id_Товар_Id_Склад = Стр_Х_Id_Товар_Id_Склад;
		Регистр.ИндексТоварСклад.ДвижениеПриходВыполнить();
	КонецЦикла;
КонецЕсли;
 



В модуле проведения где есть Расход Товара Пишем
Код
Выбрать все
Если НачМесяца(ДатаДок) >= НачМесяца(ТекущаяДата() ) Тогда
	ВыбратьСтроки();
	Пока ПолучитьСтроку() = 1 Цикл
		Стр_Х_Id_Товар_Id_Склад = Глоб_meta.ЗначениеВСтрокуБД(Товар) + Глоб_meta.ЗначениеВСтрокуБД(СтрокаСклад);
		Регистр.ИндексТоварСклад.Колво = -Количество;
		Регистр.ИндексТоварСклад.Id_Товар_Id_Склад = Стр_Х_Id_Товар_Id_Склад;
		Регистр.ИндексТоварСклад.ДвижениеПриходВыполнить();
	КонецЦикла;
КонецЕсли;
 



Отличия для расхода -Количество а само движение именно ПРИХОД
ну и по некоторым документам у Вас может и не быть многострочной части.
« Последняя редакция: 02. Декабря 2008 :: 07:12 - Z1 »  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #4 - 01. Декабря 2008 :: 16:35
Печать  
Переодически по окончанию месяца данные этого Регистра предыдущих периодов удаляются штатными
или нештатными средствами.

PS : 1.Можно рассширить этот регистр храня Хвост регистра не месяц а скажем два, три месяца в прошлое.
      2.Учитывая общюю селективность Id товара поставлен раньше Id склада,
      потому что сравнение строк sql сервер делает слева направо.



Что нам дает этот регистр
1. Прямое попадание в некласторный индекс по полю Id_Товар_Id_Склад.
2. Преимущество перед некласторным индексом РегистраРодителя в том что количесво данных
гораздо меньше и поэтому данные будут находиться быстрее при прочих равных условиях.
также для стандартного ra будет case по полю debkred,
а у нас этого нет это хоть незначительный но тоже выигрыш во времени.
3. такой регистр будет работать и в УРБД и не требует от нас чего либо
для его поддержания в УРБД.
4. Если нам нужен остаток по Товар,Склад,Фирма то заводим еще один
реквизит регистра  Id_Товар_Id_Склад_Id_Фирма строка длина 27. галка отбор дв. включена

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #5 - 01. Декабря 2008 :: 16:35
Печать  
После этого остаток на 15 число получим как


select sum(sp7312) from ra7311 where
(date_time_iddoc between  '200812' and '20081215z')
and sp7313 = '   32DSK2    1XОФИ'



есстественно этот select надо привести в читаемый вид если вызываться будет из 1с++
либо ( что на мой взгляд предпочтительней ) создать sp ( хранимую процедуру )
и вызывать именно ее

CREATE PROCEDURE dbo.my_ost_tovar_sklad( @id_tov char(9), @id_sklad char(9) , @mindate char(9), @maksdate char(9) )
char AS
select sum(sp7312) from ra7311 where
(date_time_iddoc between  @mindate and @maksdate)
and sp7313 = @id_tov + @id_sklad


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #6 - 01. Декабря 2008 :: 16:36
Печать  
План выполнения запроса
  

qa_1c.bmp ( 2304 KB | Загрузки )
qa_1c.bmp
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #7 - 01. Декабря 2008 :: 16:36
Печать  
заранее приношу свои извенения если кто-то это считает все написанное выше бредом.
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #8 - 02. Декабря 2008 :: 06:24
Печать  
Вспоминаются учетные системы ДОСовского периода на Foxe. Так как тогда машинки были слабые в принципе так и делали - заводили табличку с оборотами за месяц, которую потом очищали или заводили новую. Так что подход вполне разумный, если критична производительность. А как старые движения можно очистить штатными средствами?
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #9 - 02. Декабря 2008 :: 07:08
Печать  
Alex_Bob писал(а) 02. Декабря 2008 :: 06:24:
Вспоминаются учетные системы ДОСовского периода на Foxe. Так как тогда машинки были слабые в принципе так и делали - заводили табличку с оборотами за месяц, которую потом очищали или заводили новую. Так что подход вполне разумный, если критична производительность. А как старые движения можно очистить штатными средствами?

Перепровести документы прошлых месяцев
условие не выполниться
Если НачМесяца(ДатаДок) >= НачМесяца(ТекущаяДата) Тогда
и движения очистятся

все это конечно можно сделать и на отдельной таблице sql
но потребует больше усилий для написания.
да кстати ошибся ТекущаяДата написал без скобок
надо конечно писать ТекущаяДата()
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #10 - 02. Декабря 2008 :: 15:16
Печать  
Цитата:
все это конечно можно сделать и на отдельной таблице sql
но потребует больше усилий для написания.

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 6 быстрый поиск товара На складе по движениям ra
Ответ #11 - 10. Декабря 2008 :: 05:12
Печать  
В sql2005 и выше появилась возможность добавлять в листья некластерного индекса свои колонки
ссылка http://msdn.microsoft.com/ru-ru/library/ms188783(SQL.90).aspx
Цитата:
INCLUDE ( column [ ,... n ] )
Указывает неключевые столбцы, добавляемые на конечный уровень некластеризованного индекса. Некластеризованный индекс может быть уникальным или неуникальным.

Максимальное количество включенных неключевых столбцов — 1023, минимальное — 1.

В списке INCLUDE имена столбцов не могут повторяться и не могут использоваться одновременно как ключевые и неключевые. Дополнительные сведения см. в разделе Индекс с включенными столбцамиhttp://msdn.microsoft.com/ru-ru/library/ms190806(SQL.90).aspx
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать