Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Не видится реквизит Период в ВТ остатки и обороты (число прочтений - 6922 )
Андрюха
Junior Member
**
Отсутствует



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Не видится реквизит Период в ВТ остатки и обороты
25. Августа 2010 :: 06:33
Печать  
Пытаюсь получить остатки из виртуальной таблица остатки и обороты, но почему-то выскакивает ошибка Invalid column name 'Период', хотя при детализации День этот реквизит должен быть.

Запрос должен выдавать значения регистра на каждый день периода.

Код
Выбрать все
рс = СоздатьОбъект("ODBCRecordset");

// Сначала формируем таблицу дат
ТекстЗапроса = "
  |IF OBJECT_ID(N'tempdb.dbo.#Дни') IS NOT NULL
  |	DROP TABLE #Дни
  |";

рс.Выполнить(ТекстЗапроса);
ТекстЗапроса = "
  |CREATE TABLE #Дни (День DateTime)
  |";

рс.Выполнить(ТекстЗапроса);
Для ТекДата = ТекущаяДата() - 14 По ТекущаяДата() Цикл
  ТекстЗапроса = "
    |INSERT INTO #Дни VALUES (:ТекДата)
    |";

  рс.УстановитьТекстовыйПараметр("ТекДата", ТекДата);
  рс.Выполнить(ТекстЗапроса);
КонецЦикла;

// Основной запрос
ТекстЗапроса = "
  |SELECT DISTINCT ТаблицаДней.День ДатаПериода
  |	, NullIf(ПартииНаличиеОстаткиОбороты.Период, '17530101') Период
  |	, ПартииНаличиеОстаткиОбороты.Номенклатура [Номенклатура $Справочник.Номенклатура]
  |	, ПартииНаличиеОстаткиОбороты.КоличествоНачальныйОстаток
  |	, ПартииНаличиеОстаткиОбороты.КоличествоПриход
  |	, ПартииНаличиеОстаткиОбороты.КоличествоРасход
  |	, ПартииНаличиеОстаткиОбороты.КоличествоКонечныйОстаток
  |FROM #Дни AS ТаблицаДней
  |	LEFT JOIN $РегистрОстаткиОбороты.ПартииНаличие(:НачДата,
  |		:КонДата ~,
  |		День,
  |		Движения,
  |
  |
  //  *****      Вот тут не находится Период *****
  |
  |		INNER JOIN #Дни AS ТаблицаДней ON ТаблицаДней.День = Период,,
  |
  |
  |
  |		Номенклатура,
  |		Количество) AS ПартииНаличиеОстаткиОбороты ON ТаблицаДней.День = ПартииНаличиеОстаткиОбороты.Период
  |";
 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #1 - 25. Августа 2010 :: 07:18
Печать  
Ну и убери этот join - результат не изменится. И distinct туда же.

Конструктор исправлю. Когда-нибудь..  Улыбка
  

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



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #2 - 25. Августа 2010 :: 09:39
Печать  
Спасибо большое, помогло!

Но теперь другая проблема - всё-таки из запроса выпадают даты без движения по регистру, а хотелось бы чтобы были движения за каждый день, с нулевым приходом/расходом и одинаковым остатком на начало/конец дня.
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #3 - 26. Августа 2010 :: 11:12
Печать  
Недавно как раз экспериментировал. Сразу оговорюсь - не моё.
Если поискать, можно найти еще несколько разных вариантов.

Код
Выбрать все
	ЗапросСКЛ.УложитьСписокОбъектов(сз,ВремТаб,"Товары");
		КолДней = (КонДата-НачДата);
	ТекстЗапроса = "
	|Set NoCount On
	|
	|Declare @НачДата DATETIME, @КонДата DATETIME
	|Set @НачДата = '"+Формат(НачДата,"ДДДММГГ")+"'
	|Set @КонДата = '"+Формат(КонДата,"ДДДММГГ")+"'
	|
	|Select
	|	Период,
	|	Товар,
	|	ОстатокТовараНачальныйОстаток 	as НачОст,
	|	ОстатокТовараПриход				as Приход,
	|	ОстатокТовараРасход				as Расход,
	|	ОстатокТовараКонечныйОстаток	as КонОст
	|Into "+ВремТабОстОб+"
	|From $РегистрОстаткиОбороты.ТоварыОстатки(:НачДата,:КонДата~,День,,,(Товар IN (SELECT val FROM "+ВремТаб+")),(Товар),(ОстатокТовара))
	|
	|--в остаткахОборотах, даже Если использовать метод дополнения ""ДвиженияИГраницыПериода"", может не быть остатка на начало периода.
	|Insert Into "+ВремТабОстОб+"
	|Select
	|	@НачДата as Период,
	|	ост.Товар,
	|	ост.ОстатокТовараОстаток	as НачОст,
	|	0							as Приход,
	|	0							as Расход,
	|	ост.ОстатокТовараОстаток	as КонОст
	|From $РегистрОстатки.ТоварыОстатки(:НачДата,,(Товар IN (SELECT val FROM "+ВремТаб+")),(Товар),(ОстатокТовара)) as ост
	|Where Not Exists(Select * From "+ВремТабОстОб+" as об Where ост.Товар = об.Товар and об.Период = @НачДата)
	|
	|
	|Select
	|	кросс.день,
	|	кросс.Товар,
	|	Ост.КонОст
	|Into "+ВремТабИтог+"
	|From (
	|	Select дни.день,val as Товар
	|	From (
	|		Select DATEADD(day,(aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d),@НачДата) as день
	|		From	   (Select 0 AS a UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS aa
	|		CROSS JOIN (Select 0 AS b UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS bb
	|		CROSS JOIN (Select 0 AS c UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS cc
	|		CROSS JOIN (Select 0 AS d UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS dd
	|		Where aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= "+КолДней+"
	|		) as дни
	|	CROSS JOIN "+ВремТаб+"
	|	) as кросс
	|
	|	LEFT JOIN (
	|				Select
	|					об1.Период as ДатаС,
	|					MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,@КонДата) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо,
	|					об1.КонОст,
	|					об1.Товар
	|				From "+ВремТабОстОб+" об1
	|				LEFT JOIN "+ВремТабОстОб+" об2 on об1.Товар = об2.Товар and об1.Период < об2.Период
	|				Group By об1.Период,об1.Товар,об1.КонОст
	|			) as Ост on кросс.Товар = Ост.Товар and кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо
	|Where Ост.КонОст <> 0 --Если нужны дни без остатков, то это строку закомментарить
	|ORDER BY кросс.Товар,кросс.день
	|";
	ЗапросСКЛ.УстановитьТекстовыйПараметр("НачДата",НачДата);
	ЗапросСКЛ.УстановитьТекстовыйПараметр("КонДата",КонДата);
	ЗапросСКЛ.Выполнить(ТекстЗапроса);

 



Кстати, заодно может просветит кто, почему в РегистрОстаткиОбороты даже если использовать метод дополнения "ДвиженияИГраницыПериода", может не быть остатка на начало периода (остаток стопудово не нулевой)? 1сpp 3.2.1.14

Еще как вариант (здесь считается количество дней с ненулевым остатоком):
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|   ВлЗапрос.Фирма [Фирма $Справочник.Фирмы]
	|   ,ВлЗапрос.Номенклатура [ПодзапросНоменклатура $Справочник.Номенклатура]
	|   ,SUM(
	|   CASE WHEN ВлЗапрос.НачОст>0 THEN  
	|	CASE WHEN ВлЗапрос.Период=convert(datetime,:НачДата,112) THEN
	|					     CASE WHEN ВлЗапрос.КонОст<=0 THEN  
	|		1
	|	   ELSE
	|		DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112)) + 1
	|	   END
	|	ELSE
	|			   CASE WHEN ВлЗапрос.КонОст<=0 THEN
	|		-DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112))
	|	   END
	|	END		    
	|   ELSE
	|	CASE WHEN ВлЗапрос.КонОст>0 THEN
	|	   DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112)) + 1
	|	END
	|   END) as ДнейНаСкладе
	|FROM(
	|   SELECT ОстаткиТМЦОстаткиОбороты.Фирма
	|	, ОстаткиТМЦОстаткиОбороты.Номенклатура
	|	, ОстаткиТМЦОстаткиОбороты.Период as Период
	|	, ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток КонОст
	|	, ОстаткиТМЦОстаткиОбороты.КоличествоНачальныйОстаток НачОст
	|   FROM риода,
	|		   ,
	|		   Номенклатура in (select val from #СписокТоваров)
	|		   ,(Номенклатура, Фирма),) AS ОстаткиТМЦОстаткиОбороты
	|   ) AS ВлЗапрос	    
	|   GROUP BY ВлЗапрос.Фирма
	|	, ВлЗапрос.Номенклатура
	|   ORDER BY ВлЗапрос.Номенклатура
	|";
 

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #4 - 05. Апреля 2011 :: 09:30
Печать  
Последний запрос по количеству дней в наличии не работает, если по товару за период не было движений.
  

_____________________________novichek.ert ( 50 KB | Загрузки )

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #5 - 05. Апреля 2011 :: 10:12
Печать  
Вот так, кажется, правильно будет:
Код
Выбрать все
ТекстЗапроса = "
	|Select
	|    Выборка.Номенклатура [Номенклатура $Справочник.Номенклатура]
	| ,  (Case When (IsNull(Выборка.ДнейНаСкладе,0) = 0) And (IsNull(Sum(ОстаткиТМЦОстатки.КоличествоОстаток),0) <> 0) Then
	|     DATEDIFF(day, :НачДата, :КонДата) + 1
	|    Else
	|	IsNull(Выборка.ДнейНаСкладе,0)
	|    End) As КолДней
	|,   Sum(ОстаткиТМЦОстатки.КоличествоОстаток) Остаток
	|From
	|   (SELECT
	|   ВлЗапрос.Номенклатура Номенклатура
	|   , SUM(
	|   CASE WHEN ВлЗапрос.КоличествоНачОст>0 THEN
	|	CASE WHEN ВлЗапрос.Период=convert(datetime,:НачДата,112) THEN
	|					     CASE WHEN ВлЗапрос.КоличествоКонОст<=0 THEN
	|		1
	|	   ELSE
	|		DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112)) + 1
	|	   END
	|	ELSE
	|			   CASE WHEN ВлЗапрос.КоличествоКонОст<=0 THEN
	|		-DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112))
	|	   END
	|	END
	|   ELSE
	|	CASE WHEN ВлЗапрос.КоличествоКонОст>0 THEN
	|	   DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112)) + 1
	|	END
	|   END) as ДнейНаСкладе
	|FROM(
	|   SELECT ОстаткиТМЦОстаткиОбороты.Номенклатура
	|	, ОстаткиТМЦОстаткиОбороты.Период as Период
	|	, ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток КоличествоКонОст
	|	, ОстаткиТМЦОстаткиОбороты.КоличествоНачальныйОстаток КоличествоНачОст
	|   FROM  а,
	|		   ,
	|		 (Номенклатура = :ВыбНоменклатура)
	|		   -- (Номенклатура in (select val from #СписокНоменклатуры))
	|		  And (Склад = :ВыбСклад)
	|		   ,(Номенклатура),) AS ОстаткиТМЦОстаткиОбороты
	|   ) AS ВлЗапрос
	|   GROUP BY ВлЗапрос.Номенклатура
	|-- ORDER BY ВлЗапрос.Номенклатура
	|   ) As Выборка
	|  Inner Join $РегистрОстатки.ОстаткиТМЦ(:КонДата~,,
	|		(Номенклатура = :ВыбНоменклатура) And (Склад = :ВыбСклад),
	|		(Номенклатура),) AS ОстаткиТМЦОстатки On ОстаткиТМЦОстатки.Номенклатура = Выборка.Номенклатура
	|Group By Выборка.Номенклатура, Выборка.ДнейНаСкладе
	|"; 


Выдает остаток на конец и дней в наличии за период с :НачДата по :КонДата.
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #6 - 05. Апреля 2011 :: 18:09
Печать  
berezdetsky писал(а) 25. Августа 2010 :: 07:18:
Конструктор исправлю. Когда-нибудь..  Улыбка

Исправлено в v3.28.  Нерешительный
  

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


1C++ rocks!

Сообщений: 1
Зарегистрирован: 27. Мая 2013
Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #7 - 27. Мая 2013 :: 11:54
Печать  
Последний запрос не работает, если на конец периода товар отстутствует. Подскажите, плиз, как поправить.
  
Наверх
 
IP записан
 
Smog78
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 26. Июня 2013
Re: Не видится реквизит Период в ВТ остатки и обороты
Ответ #8 - 26. Июня 2013 :: 13:32
Печать  
cls писал(а) 27. Мая 2013 :: 11:54:
Последний запрос не работает, если на конец периода товар отстутствует. Подскажите, плиз, как поправить.

Используйте LEFT JOIN вместо последнего INNER JOIN, он отбрасывает последнее пустое. Если кому-то еще нужно, конечно )
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать