Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Подмогните, нету сил (число прочтений - 3138 )
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Подмогните, нету сил
17. Апреля 2008 :: 18:22
Печать  
Цель - в приходном документе получить список товаров из прошлых приходов (строго прошлых, для каждого товара свой) в которых цены были ниже

Т.е.

Приход № 1
Товар1 100
Товар2 150

Приход № 2
Товар1 90
Товар3 200

Приход №  3
Товар1 100
Товар2 160
Товар3 200

Должно выдать таблицу для документа № 3
Товар1 было 90 + документ (2), стало 100
Товар2 было 150 + документ (1), стало 160
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #1 - 17. Апреля 2008 :: 18:23
Печать  
Пока вот так, работает медленно
Попробовал по-разному... так хотя бы правильно Улыбка

Код
Выбрать все
	ТекстЗапроса = "
	|Declare @DT Char(23)
	|Set @DT = (SELECT DATE_TIME_IDDOC FROM _1SJOURN With (NOLOCK) WHERE IDDOC = :ВыбДок)
	|
	|SELECT ДокСтроки.LINENO_	НомСтроки
	|, $ДокСтроки.Товар		[Товар $Справочник.Номенклатура]
	|, $ДокСтроки.Цена		Цена
	|, $ДокСтроки1.Цена		ПослЦена
	|, ДокСтроки1.IDDOC		[Документ $Документ.ПриходКредит]
	|FROM $ДокументСтроки.ПриходКредит AS ДокСтроки With (NOLOCK)
	|LEFT JOIN $ДокументСтроки.ПриходКредит AS ДокСтроки1 With (NOLOCK) ON $ДокСтроки1.Товар = $ДокСтроки.Товар AND $ДокСтроки1.Цена < $ДокСтроки.Цена
	|WHERE (ДокСтроки.IDDOC = :ВыбДок)
	|AND ДокСтроки1.IDDOC =
	|	(SELECT TOP 1 Док.IDDOC
	|	FROM $ДокументСтроки.ПриходКредит AS Док With (NOLOCK)
	|	INNER JOIN _1SJOURN AS Жур With (NOLOCK) ON Док.IDDOC = Жур.IDDOC
	|	WHERE $Док.Товар = $ДокСтроки.Товар AND Жур.DATE_TIME_IDDOC < @DT
	|	ORDER BY Жур.DATE_TIME_IDDOC DESC
	|	)
	|";
 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #2 - 17. Апреля 2008 :: 20:12
Печать  
Уточню еще строго ли прошлый приход или просто максимальная цена по которой товар поступал (тогда проще и быстрее)
Но интересен именно сабж
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #3 - 17. Апреля 2008 :: 22:30
Печать  
Цитата:
Пока вот так, работает медленно
Попробовал по-разному... так хотя бы правильно Улыбка

Правильно, но можно заменить получение @DT четвёртым модификатором :ВыбДок, заменить (в соответствии с #0) left на inner, перенести условие с TOP 1 в секцию from, ну и попасть в какой нибудь индекс _1sjourn, включающий date_time_iddoc.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #4 - 18. Апреля 2008 :: 08:23
Печать  
Спасибки
Про четвертый модификатор - отдельное Улыбка
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #5 - 18. Апреля 2008 :: 08:23
Печать  
Код
Выбрать все
select
    ПредПриходы.lineno_ as НомерСтроки,
    $ПриходКредитСтроки.Товар as [Товар $Справочник.Номенклатура],
    $ПриходКредитСтрокиПред.Цена as ЦенаБыла,
    right(ПредПриходы.ПредыдущийПриход, 9) as [ПредыдущийПриход $Документ.ПриходКредит],
    $ПриходКредитСтроки.Цена as ЦенаСтала
from (
  select
	ПриходКредитСтроки.lineno_,
	max(ЖурналПред.date_time_iddoc) as ПредыдущийПриход
  from $ДокументСтроки.ПриходКредит как ПриходКредитСтроки (nolock)
  left join _1sjourn as ЖурналВыб (nolock) on ЖурналВыб.iddoc = ПриходКредитСтроки.iddoc
  left join _1sjourn as ЖурналПред (nolock)
	left join $ДокументСтроки.ПриходКредит как ПриходКредитСтрокиПред (nolock) on ЖурналПред.iddoc = ПриходКредитСтрокиПред.iddoc
	on ЖурналПред.iddocdef = ЖурналВыб.iddocdef and ЖурналПред.date_time_iddoc < ЖурналВыб.date_time_iddoc
	and $ПриходКредитСтрокиПред.Товар = $ПриходКредитСтроки.Товар
  where ПриходКредитСтроки.iddoc = :ВыбДок
  group by ПриходКредитСтроки.lineno_
) as ПредПриходы
left join $ДокументСтроки.ПриходКредит как ПриходКредитСтроки (nolock) on ПриходКредитСтроки.iddoc = :ВыбДок
    and ПриходКредитСтроки.lineno_ = ПредПриходы.lineno_
left join $ДокументСтроки.ПриходКредит как ПриходКредитСтрокиПред (nolock)
    on ПриходКредитСтрокиПред.iddoc = right(ПредПриходы.ПредыдущийПриход, 9) and $ПриходКредитСтрокиПред.Товар = $ПриходКредитСтроки.Товар
where $ПриходКредитСтрокиПред.Цена < $ПриходКредитСтроки.Цена
 


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


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #6 - 18. Апреля 2008 :: 08:30
Печать  
Омистинеть... спасибки, попробую чуть позже!

Я думал насчет регистра, однако существует опасность непоследовательного проведения, тогда программу можно обмануть (тут типа контроля за поставщиками, возможно была даже какая-то скидка про которую потом забыли)
После согласования документ проводится
Может надо исключать только помеченные на удаление...
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #7 - 18. Апреля 2008 :: 09:29
Печать  
Респект!
И показывает одинаковые результаты с моей
Насчет скорости сказать пока трудно, по моим подсчетам быстрее только на процентов 5-10
Я подумаю еще над советами г-на  berezdetsky (делал в принципе в спешке)
Ты не проверял даже (судя по опискам в тесте)?  Подмигивание
Мегачеловек!

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #8 - 18. Апреля 2008 :: 09:52
Печать  
Конечно не проверял, мне лениво базу подбирать или строить, быстрее так напишу, пока мегавосьмера конфигурации сравнивает.
Выложи поправленый запрос для порядку.
Чтобы было быстрее надо для поиска предыдущего прихода юзать или регистр какой нить (в его таблице движений есть и документы и индекс по товару) или графу отбора городить.
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #9 - 18. Апреля 2008 :: 11:30
Печать  
Код
Выбрать все
	ТекстЗапроса = "
	|select
    |ПредПриходы.lineno_ as НомСтроки,
    |$ПриходКредитСтроки.Товар as [Товар $Справочник.Номенклатура],
    |$ПриходКредитСтрокиПред.Цена as ПослЦена,
    |right(ПредПриходы.ПредыдущийПриход, 9) as [Документ $Документ.ПриходКредит],
    |$ПриходКредитСтроки.Цена as Цена
	|from (
	  |select
	|ПриходКредитСтроки.lineno_,
	|max(ЖурналПред.date_time_iddoc) as ПредыдущийПриход
	  |from $ДокументСтроки.ПриходКредит as ПриходКредитСтроки (nolock)
	  |left join _1sjourn as ЖурналВыб (nolock) on ЖурналВыб.iddoc = ПриходКредитСтроки.iddoc
	  |left join _1sjourn as ЖурналПред (nolock)
	|left join $ДокументСтроки.ПриходКредит as ПриходКредитСтрокиПред (nolock) on ЖурналПред.iddoc = ПриходКредитСтрокиПред.iddoc
	|on ЖурналПред.iddocdef = ЖурналВыб.iddocdef and ЖурналПред.date_time_iddoc < ЖурналВыб.date_time_iddoc
	|and $ПриходКредитСтрокиПред.Товар = $ПриходКредитСтроки.Товар
	  |where ПриходКредитСтроки.iddoc = :ВыбДок
	  |group by ПриходКредитСтроки.lineno_
	|) as ПредПриходы
	|left join $ДокументСтроки.ПриходКредит as ПриходКредитСтроки (nolock) on ПриходКредитСтроки.iddoc = :ВыбДок
    |and ПриходКредитСтроки.lineno_ = ПредПриходы.lineno_
	|left join $ДокументСтроки.ПриходКредит as ПриходКредитСтрокиПред (nolock)
    |on ПриходКредитСтрокиПред.iddoc = right(ПредПриходы.ПредыдущийПриход, 9) and $ПриходКредитСтрокиПред.Товар = $ПриходКредитСтроки.Товар
	|where $ПриходКредитСтрокиПред.Цена < $ПриходКредитСтроки.Цена
	|";

 



Про графу тож думал, но пока это имхо единственная такая задачка (под нее не хочется городить)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Подмогните, нету сил
Ответ #10 - 18. Апреля 2008 :: 11:37
Печать  
а можно:
1. сохранять цены при проведении приходника (периодический реквизит), но тогда будет сильно пухнуть _1sconst.
2. создать справочник, куда при проведении приходников писать ИДДок, товар и цену. Для первых 2 установить отбор. В модуль проведения приходника надо добавить процедуру ПриУдаленииПроведения(), в которой удалять из справочника записи. Первоначально придется написать обработку, чтобы заполнить этот справочник уже имеющимися приходниками.

Зато, ИМХО, нужный тебе запрос должен летать и восхищаться.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подмогните, нету сил
Ответ #11 - 18. Апреля 2008 :: 11:47
Печать  
Спасибки, пока о подобном даже не думал... надо сто раз подумать прежде чем такое наваять Улыбка
На более или менее крупных накладных старый вариант на локальном компе выполняется примерно 5 сек
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать