Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Среднюю цену из расх. накладных. Помогите (число прочтений - 2595 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Среднюю цену из расх. накладных. Помогите
21. Декабря 2007 :: 07:55
Печать  
Привет Алл!
В принципе тривиальная задача заставляет задуматься о своей профпригодности.

Требуется из одного определенного вида документов для отчета получить среднюю цену определенного товара за определенный период.

Так, как ниже конечно работает
Код
Выбрать все
select
	avg($rns.ЦенаБезНДС)
from
	$ДокументСтроки.РасходнаяНакладная rns(nolock)
inner join
	_1sjourn j(nolock) on j.iddoc = rns.iddoc
where
	$rns.ТМЦ = sentry.KTSC1
	and	j.closed & 1 = 1
	and j.date_time_iddoc between :НачДата and :КонДата~ 


, но только в том случае, если в табличной части документа нет повторяющихся строк с одним и тем же товаром и одинаковыми или разными ценами на него. Если есть дублирование, то этот запрос врет, а точнее в таком виде он уже не годится...
Понимаю, что дублирование строк товара - это плохо, но ничего не могу сделать, - данные качаются из корпоративной системы и должны ей соответствовать. Я правила тут менять не могу.

Помогите, плз!!!
« Последняя редакция: 21. Декабря 2007 :: 09:28 - Kapet »  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Среднюю цену из расх. накладных. Помогите
Ответ #1 - 21. Декабря 2007 :: 08:28
Печать  
несовсем понятна задача.
т.е. если товар встречается в одном документе в двух строках то этот  документ
должен быть исключен из вычисления сред цены ?
  
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Среднюю цену из расх. накладных. Помогите
Ответ #2 - 21. Декабря 2007 :: 08:42
Печать  
Z1 писал(а) 21. Декабря 2007 :: 08:28:
несовсем понятна задача.
т.е. если товар встречается в одном документе в двух строках то этот  документ
должен быть исключен из вычисления сред цены ?

Нет, в выборке должны быть учтены цены всех строк одного товара (ессно с учетом количества товара) во всех проведенных расх. накладных за период,

В общем в запросе требуется получить количество отпущенного товара, его себестоимость и среднюю цену. Часть всего запроса выглядит так:
Код
Выбрать все
|set nocount on
	|	-- фактический период, расход
	|select
	|	tmz.descr Партномер
	|,	sentry.KTSC1 [СубконтоКт2 $Субконто]  
	|,	sentry.VKTSC1 СубконтоКт2_вид  
	|,	sum(sentry.sum_) Себестоимость2
	|,	sum(sentry.amount) КоличествоПродано2
	|,	(select
	|		avg($rns.ЦенаБезНДС)
	|	from
	|		$ДокументСтроки.РасходнаяНакладная rns(nolock)
	|	inner join
	|		_1sjourn j(nolock) on j.iddoc = rns.iddoc
	|	where
	|		$rns.ТМЦ = sentry.KTSC1
	|	and	j.closed & 1 = 1
	|	and j.date_time_iddoc between :НачДата and :КонДата~) СредняяЦена2
	|,	0 Себестоимость1
	|,	0 КоличествоПродано1
	|,	0 СредняяЦена1
	|,	0 СебестоимостьВозврат2
	|,	0 КоличествоПроданоВозврат2
	|,	0 СредняяЦенаВозврат2
	|,	0 СебестоимостьВозврат1
	|,	0 КоличествоПроданоВозврат1
	|,	0 СредняяЦенаВозврат1
	|from
	|	_1sentry sentry(nolock)
	|inner join
	|	$Справочник.ТМЦ tmz(nolock) on tmz.id = sentry.KTSC1
	|inner join
	|	_1sjourn j(nolock) on j.iddoc = sentry.docid
	|where
	|	sentry.active <> '*'
	|	and sentry.date_time_docid between :НачДата and :КонДата~
	|	and	sentry.accktid = :ВыбСчетКт
	|	and	sentry.accdtid = :ВыбСчетДт
	|	and j.iddocdef = $ВидДокумента.РасходнаяНакладная
	|group by
	| 	tmz.descr
	|,	sentry.KTSC1
	|,	sentry.VKTSC1
	//|having
	//|	sum(sentry.amount) > 0
	|
	|union all -- сравниваемый период, расход
	|
	|select ... 


Далее еще идет объединение с аналогичным запросом за другой период, и объединение аналогичных запросов по возвратам товаров.
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Среднюю цену из расх. накладных. Помогите
Ответ #3 - 21. Декабря 2007 :: 09:09
Печать  
Народ, очень прошу, помогите !
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Среднюю цену из расх. накладных. Помогите
Ответ #4 - 21. Декабря 2007 :: 10:08
Печать  
Очень прошу, помогите !!!!!
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Среднюю цену из расх. накладных. Помогите
Ответ #5 - 21. Декабря 2007 :: 10:09
Печать  
Код
Выбрать все
select
  tmz.descr						  Партномер,
  tmz.id						    [ТМЦ  $Справочник.ТМЦ],
  vt_Проводки.Себестоимость2,
  vt_Проводки.КоличествоПродано2,
  vt_РасхНакл.СуммаБезНДС/vt_РасхНакл.Количество СредняяЦена2,
from
  (
  select
    sentry.KTSC1	  СубконтоКт2,
    sum(sentry.sum_)    Себестоимость2,
    sum(sentry.amount)  КоличествоПродано2
  from
    _1sentry sentry(nolock)
  inner join
    _1sjourn j (nolock) on j.iddoc = sentry.docid
  where
    sentry.active <> '*'
    and sentry.date_time_docid between :НачДата and :КонДата~
    and	sentry.accktid = :ВыбСчетКт
    and	sentry.accdtid = :ВыбСчетДт
    and j.iddocdef = $ВидДокумента.РасходнаяНакладная
  group by
    sentry.KTSC1
  ) vt_Проводки
inner join
  (
   select
     $rns.ТМЦ		   ТМЦ,
     sum($rns.Количество)   Количество,
     sum($rns.СуммаБезНДС)  СуммаБезНДС
   from
     $ДокументСтроки.РасходнаяНакладная rns(nolock)
   inner join
     _1sjourn j(nolock) on j.iddoc = rns.iddoc
   where
     j.closed & 1 = 1
     and j.date_time_iddoc between :НачДата and :КонДата~
   group by
     $rns.ТМЦ
  ) vt_РасхНакл on vt_РасхНакл.ТМЦ = vt_Проводки.СубконтоКт2
inner join
  $Справочник.ТМЦ tmz(nolock) on tmz.id = left(sentry.KTSC1,9)
 



ПС: не проверял, но вроде правильно%)
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Среднюю цену из расх. накладных. Помогите
Ответ #6 - 24. Декабря 2007 :: 06:44
Печать  
Сдаётся мне, что надо так
Код
Выбрать все
select
	sum($rns.ЦенаБезНДС * $rns.Количество) / sum($rns.Количество)  СредняяЦена
from
	$ДокументСтроки.РасходнаяНакладная rns(nolock)
inner join
	_1sjourn j(nolock) on j.iddoc = rns.iddoc
where
	$rns.ТМЦ = sentry.KTSC1
	and	j.closed & 1 = 1
	and j.date_time_iddoc between :НачДата and :КонДата~
group by
	$rns.ТМЦ
 


В самом первом запросе средняя получалась как
Код
Выбрать все
sum($rns.ЦенаБезНДС) / count(*)  СредняяЦена 


что не совсем правильно в данном случае
  
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Среднюю цену из расх. накладных. Помогите
Ответ #7 - 25. Декабря 2007 :: 10:30
Печать  
Ну просто огромное человеческое спасибо, друзья! Очень выручили, а то в конце года как обычно завал, в голове каша...

В итоге запрос (вернее часть его) получился такой:
Код
Выбрать все
|set nocount on
	|	-- фактический период, расход
	|select
	|	tmz.descr						Партномер
	|,	tmz.id						    [ТМЦ  $Справочник.ТМЦ]
	|,	left(rtrim(tmz.descr),"+Макс(ДлинаПрефикса,1)+")	ПечТМЦ
	|,	rtrim(tmz.descr)+' '+rtrim($tmz.НаименованиеАнгл)	НаименованиеПолн
	|,	vt_Проводки.Себестоимость2		Себестоимость2
//	|,	vt_Проводки.КоличествоПродано2	КоличествоПродано2
	|,	vt_РасхНакл.Количество			КоличествоПродано2
	|,	vt_РасхНакл.СуммаБезНДС/vt_РасхНакл.Количество СредняяЦена2
	|,	0 Себестоимость1
	|,	0 КоличествоПродано1
	|,	0 СредняяЦена1
	|,	0 СебестоимостьВозврат2
	|,	0 КоличествоПроданоВозврат2
	|,	0 СредняяЦенаВозврат2
	|,	0 СебестоимостьВозврат1
	|,	0 КоличествоПроданоВозврат1
	|,	0 СредняяЦенаВозврат1
	|from
	|	(
	|	select
	|		$rns.ТМЦ				ТМЦ,
	|		sum($rns.Кво)			Количество,
	|		sum($rns.СуммаБезНДС*$rn.Курс/(case when $rn.Валюта = :НацВалюта then 1 when $rn.Валюта = :Доллар then :КратностьДоллар2 when $rn.Валюта = :Евро then :КратностьЕвро2 else 1 end))	СуммаБезНДС
	|	from
	|		$ДокументСтроки.РасходнаяНакладная rns(nolock)
	|	right join
	|		_1sjourn j(nolock) on j.iddoc = rns.iddoc
	|	inner join
	|		$Документ.РасходнаяНакладная rn(nolock) on rn.iddoc = rns.iddoc
	|	where
	|		j.closed & 1 = 1
	|		and left(j.date_time_iddoc,8) between :НачДата and :КонДата~
	|	group by
	|		$rns.ТМЦ
	|	) vt_РасхНакл
	|inner join
	|	$Справочник.ТМЦ tmz(nolock) on tmz.id = vt_РасхНакл.ТМЦ
	|left join
	|	(
	|	select
	|		sentry.KTSC1		СубконтоКт2,
	|		sum(sentry.sum_)	Себестоимость2,
	|		sum(sentry.amount)	КоличествоПродано2
	|	from
	|		_1sentry sentry(nolock)
	|	right join
	|		_1sjourn j(nolock) on j.date_time_iddoc = sentry.date_time_docid
	|	where
	|		sentry.active <> '*'
	|		and	left(sentry.date_time_docid,8) between :НачДата and :КонДата~
	|		and	sentry.accktid = :ВыбСчетКт
	|		and	sentry.accdtid = :ВыбСчетДт
	|		and j.iddocdef = $ВидДокумента.РасходнаяНакладная
	|	group by
	|		sentry.KTSC1 having sum(sentry.sum_) >= 0
	|	) vt_Проводки on vt_Проводки.СубконтоКт2 = vt_РасхНакл.ТМЦ
	|
//	|********************************************************************
	|
	|union all -- сравниваемый период, расход 



Используется в обработке "Многофакторный анализ прибыльности реализации", для почти типовой бухгалтерии для Украины. Сделан по заданию моего главбуха в целях аналитического обоснования прибылей/убытков от торговых операций, для нетупого руководства и полуграмотной налоговой. Если кого заинтересует могу сюда выложить.

ЗЫ. Используется рекомендованный стабильный релиз с раздельной загрузкой FormEx: 2.5.0.5, FormEx версия: 2.0.5.82, и TableDoc - внешняя компонента для работы с табличным документом.

Причем !!!!!!!!!!!!!!!!!!!!!! с каждым запросом очень сжирается и не очищается память сервера. Кажется зависают виртуальные таблицы в скуле, точнее не предположу, не силен. Однако, имхо, здесь кроется какой-то глюк в или TableDoc или 1ср++

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