Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема СрезПоследних для 7.7 (число прочтений - 6949 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
СрезПоследних для 7.7
13. Ноября 2006 :: 08:49
Печать  
Что-то не нравится мне способ получения периодических реквизитов пусть даже через прямые запросы. Если нужно получить, например, список клиентов и значение определенного периодического реквизита по каждому на определенную дату, то, как я понял получается, что, фактически, на каждого клиента выполнится отдельный подзапрос, чтобы получить максимальную дату из таблицы истории.

Соответственно, задумался, что можно сделать. Хочется получить список клиентов со значением периодического реквизита одним запросом. Для получения САМОГО ПОСЛЕДНЕГО значения периодического реквизита можно сделать, например, так:
для хранения периодических реквизитов создаем справочник, подчиненный клиентам. В справочник добавляем реквизит с отбором под названием "ПоследнееЗначение". Тогда список клиентов с последним значением получается выборкой по таблице клиентов с простым джойном нового справочника.

А как быть с получением значений на любую дату? Не хранить же значения на все возможные даты... Что-то не придумывается ничего...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: СрезПоследних для 7.7
Ответ #1 - 13. Ноября 2006 :: 08:51
Печать  
У подчиненного справочника структура такая:
ДатаЗначения,
ЗначениеНаДату,
ПоследнееЗначение - флаг 1/0.

Это чтоб понятнее было Улыбка
  
Наверх
 
IP записан
 
mash
1c++ donor
Отсутствует


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: СрезПоследних для 7.7
Ответ #2 - 13. Ноября 2006 :: 14:17
Печать  
А чем не нравится _1sconst? Там все сделано примерно как ты указал Улыбка только нет флага - последнее значение. Я думаю что пойдет такой запрос (с) SQL.RU
Код
Выбрать все
select *
	from _1sconst t1 inner join
	(select OBJID, ID,
		max([DATE]) as [DATE]
		from _1SCONST
		where date < :выбДата
		group by OBJID, ID) t2 on t1.OBJID = t2.OBJID and t1.[DATE] = t2.[DATE] and t1.ID = t2.ID


 



А содержать отдельный справочник будет банально дорого (нужно ставить тригер на _1sconst который отнимет больше времени при записи чем съэкономишь времени при чтении).
  

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: СрезПоследних для 7.7
Ответ #3 - 13. Ноября 2006 :: 14:27
Печать  
mash писал(а) 13. Ноября 2006 :: 14:17:
А чем не нравится _1sconst?


Не нравится, что для каждого контрагента должен выполняться подзапрос типа SELECT MAX(date) WHERE date <= :НужнаяДата. Некрасиво как-то. Хотелось бы свести выборку по всем контрагенту к одному запросу: выборка контрагентов + соединение со СрезомПоследних Улыбка
  
Наверх
 
IP записан
 
mash
1c++ donor
Отсутствует


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: СрезПоследних для 7.7
Ответ #4 - 13. Ноября 2006 :: 14:31
Печать  
Я думаю, или таблица будет невообразимая, или точность определения последнего значения будет желать лучшего. А подзапрос c агреггированием , в моем примере, будет выполнятся не для каждого элемента а один раз.
  

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
mash
1c++ donor
Отсутствует


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: СрезПоследних для 7.7
Ответ #5 - 13. Ноября 2006 :: 14:34
Печать  
СрезПоследних здесь и есть

Код
Выбрать все
select OBJID,
	    ID,
	    max([DATE]) as [DATE]
from _1SCONST
where date < :выбДата
group by OBJID, ID
 

  

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: СрезПоследних для 7.7
Ответ #6 - 13. Ноября 2006 :: 14:52
Печать  
mash писал(а) 13. Ноября 2006 :: 14:34:
СрезПоследних здесь и есть


Спасибо за пример. Я просто на таком коде из статьи по прямым запросам базировался:
Код
Выбрать все
|SELECT
|	СпрН.Descr AS Наименование,
|	Цены.Цена as [Цена $Число]
|FROM
|	$Справочник.Номенклатура СпрН
|LEFT JOIN
|	$Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND
|				   $СпрЦ.ТипЦен = :ТипЦен";
|LEFT JOIN (
|	SELECT
|		Период.objid as objid,
|		Период.value as Цена
|	FROM 1sconst as Период
|	WHERE
|		Период.date IN
|		(SELECT
|			MAX(Константа.date)
|		FROM 1sconst as Константа
|		WHERE
|			(Константа.date <= :ВыбДата ~~)
|			AND (Константа.id = $ИсторияРеквизита.Цены.Цена)
|			AND (Константа.objid = Период.objid)
|		)
|		AND Период.id = $ИсторияРеквизита.Цены.Цена
|	) as Цены ON Цены.objid = СпрЦ.id
 

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


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 20. Мая 2006
Re: СрезПоследних для 7.7
Ответ #7 - 14. Ноября 2006 :: 21:32
Печать  
Я использую для целей получения периодики оборотный регистр без измерений и ресурсов (в варианте sql приходится создавать фиктивный ресурс). Результат - почти регистр сведений из 8.0.  Написал соответствующий класс. "Реквизиты с галкой "отбор движений" проходят как "псевдоизмерения", без галки "отбор движений" - как "псевдоресурсы". Получается подходящая структура данных. Минус - двигается только документами (но это и к лучшему). Плюс - фильтрация/результат сразу нескольких реквизитов.
Да, СрезПоследних получается выборкой 1-го  движения в обратном порядке.
  
Наверх
 
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: СрезПоследних для 7.7
Ответ #8 - 15. Ноября 2006 :: 08:11
Печать  
А поделится классом можешь?
есть пример для ToySQL, но хотелось бы без этой компоненты
http://1csql.ru/materials/articles/develop.html~ca77e427-9323-e996-9291-0a0592fe...
  
Наверх
ICQ  
IP записан
 
Shurik71
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 20. Мая 2006
Re: СрезПоследних для 7.7
Ответ #9 - 15. Ноября 2006 :: 08:28
Печать  
Могу, но...

В текущем виде он не работает на версии, более поздней, чем 2.0.2.2.

См. обсуждение на
http://www.1cpp.ru/forum/YaBB.pl?num=1163497427/0

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