Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Получить остатки на каждый день за период (число прочтений - 11564 )
Андрей_Минск
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Зарегистрирован: 05. Января 2011
Получить остатки на каждый день за период
28. Января 2011 :: 10:08
Печать  
Может кто сталкивался? Намекните плиз...
Смысл такой надо получить что то похожее в прямом запросе
     
Код
Выбрать все
"|Период с ВыбНачПериода по ВыбКонПериода;
	|ОстатокТовара = Регистр.ПартииТоваров.ОстатокТовара;
	|Товар = Регистр.ПартииТоваров.Товар;
	|Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
	|Группировка Товар;
	|Группировка День;
	|Условие(Товар в ВыбТовар);"
 


результат
товар разворачивается по ВСЕМ дням с ненулевым остатком
не могу придумать как сделать прямым запросом...
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Получить остатки на каждый день за период
Ответ #1 - 28. Января 2011 :: 10:22
Печать  
это есть в классе "ПрямойЗапрос" для $РегистрОстаткиОбороты,

Код
Выбрать все
•Периодичность – Тип: Строка. Значение периодичности. Возможные значения: Период|Документ|День|Неделя|Месяц|Квартал|Год [ДОПОЛНЕНИЕ]. Если после периодичности добавлена команда «Дополнение», итоговая таблица будет содержать все периоды входящие в таблицу, а не только те которые имели остатки и/или обороты. 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получить остатки на каждый день за период
Ответ #2 - 28. Января 2011 :: 10:49
Печать  
Присоединять к табличке с датами запрос к остаткам, это если всё "руками" писать.
  
Наверх
 
IP записан
 
Андрей_Минск
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Зарегистрирован: 05. Января 2011
Re: Получить остатки на каждый день за период
Ответ #3 - 28. Января 2011 :: 11:14
Печать  
спасибо, действительно работает через класс, только выдает все периоды включая нулевые остатки, как избавится от них?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получить остатки на каждый день за период
Ответ #4 - 28. Января 2011 :: 14:43
Печать  
Поставить условие на результат функции остатка..
  
Наверх
 
IP записан
 
temrmal
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 42
Зарегистрирован: 13. Января 2011
Re: Получить остатки на каждый день за период
Ответ #5 - 07. Февраля 2011 :: 08:35
Печать  
Anatol писал(а) 28. Января 2011 :: 10:22:
это есть в классе "ПрямойЗапрос" для $РегистрОстаткиОбороты,

Код
Выбрать все
•Периодичность – Тип: Строка. Значение периодичности. Возможные значения: Период|Документ|День|Неделя|Месяц|Квартал|Год [ДОПОЛНЕНИЕ]. Если после периодичности добавлена команда «Дополнение», итоговая таблица будет содержать все периоды входящие в таблицу, а не только те которые имели остатки и/или обороты. 





у меня последняя версия 1сpp с сайта - 2.5
"
|SELECT НачислениеПроцентовОстаткиОбороты.Договор [Договор $Справочник.Договоры]
|      , NullIf(НачислениеПроцентовОстаткиОбороты.ДатаПлатежа, '17530101') ДатаПлатежа
|      , NullIf(НачислениеПроцентовОстаткиОбороты.Период, '17530101') Период
|      , Sum(НачислениеПроцентовОстаткиОбороты.СуммаНачальныйОстаток) СуммаСуммаНачальныйОстаток
|      , Sum(НачислениеПроцентовОстаткиОбороты.СуммаПриход) СуммаСуммаПриход
|      , Sum(НачислениеПроцентовОстаткиОбороты.СуммаРасход) СуммаСуммаРасход
|, Sum НачислениеПроцентовОстаткиОбороты.СуммаКонечныйОстаток) СуммаСуммаКонечныйОстаток
|FROM $РегистрОстаткиОбороты.НачислениеПроцентов(:НачДата,
|            :КонДата,
|            День ДОПОЛНЕНИЕ,
|            ДвиженияИГраницыПериода,,
|            (Договор IN (:ВыбДоговор)),
|            (Договор, ДатаПлатежа),) AS НачислениеПроцентовОстаткиОбороты
|GROUP BY НачислениеПроцентовОстаткиОбороты.Договор
|      , НачислениеПроцентовОстаткиОбороты.Период
|      , НачислениеПроцентовОстаткиОбороты.ДатаПлатежа
|";

вылетает ошибка - Meta name parser error: недопустимое значение параметра "$РегистрОстаткиОбороты.НачислениеПроцентов" (3)

Скачал версию 3.2.3 - выдает ошибку связанную с "collation". У меня SQL 7.0

Как получить остатки на каждый день, даже если нет движений?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить остатки на каждый день за период
Ответ #6 - 07. Февраля 2011 :: 08:39
Печать  
Это в классе "ПрямойЗапрос", а не в родных ВТ 1С++
  
Наверх
 
IP записан
 
temrmal
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 42
Зарегистрирован: 13. Января 2011
Re: Получить остатки на каждый день за период
Ответ #7 - 07. Февраля 2011 :: 08:52
Печать  
ой, а можно подробнее, плиз. Тока что скачал класс "прямой запрос", там две обработки Построитель и прямой запрос. и файл defcls.prm. Что с ними делать? Очень надо получить остатки на каждый день!!!
С прямыми запросами недавно стал работать - скорость зацепила)))
  
Наверх
 
IP записан
 
nixstill
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 19. Января 2011
Re: Получить остатки на каждый день за период
Ответ #8 - 09. Марта 2011 :: 21:54
Печать  
Уважаемые спецы! Как же все же получить останки на каждый день?

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


Re: Получить остатки на каждый день за период
Ответ #9 - 10. Марта 2011 :: 07:05
Печать  
посмотри здесь, может подойдет http://www.1cpp.ru/forum/YaBB.pl?num=1282718022
  
Наверх
 
IP записан
 
nixstill
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 19. Января 2011
Re: Получить остатки на каждый день за период
Ответ #10 - 10. Марта 2011 :: 10:19
Печать  
Может и подойдет, но я не очень понимаю первый пример по данной ссылке.
Во-втором примере все ясно, получаем количество дней нахождения товара на складе включая выходные дни. В таком случае придется использовать для обработки две ТЗ. В одной весь запрос, а в другую добавлять уже дни по каждому товару (чтобы исключить выходные), что-то наподобие сделано в типовой конфигурации.
Хотелось бы только по рабочим сразу из запроса в ТЗ.
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Получить остатки на каждый день за период
Ответ #11 - 15. Марта 2011 :: 14:53
Печать  
Спрашивай, что конкретно не понятно. Как раз в первом запросе (ответ №3) можно легко исключить выходные дни. Если попробуешь в QA выполнить этот фрагмент:
Код
Выбрать все
|		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 <= "+КолДней+"
 


то увидишь что он возвращает табличку дат в интервале с @НачДата по @НачДата+КолДней. Достаточно наложить на нее условие по дням недели с помощью DATEPART ( dw , ... ) и получишь желаемое.
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Получить остатки на каждый день за период
Ответ #12 - 15. Марта 2011 :: 15:07
Печать  
И кратко словами весь процесс можно попробовать описать так:
1. Получаем таблицу остатков и оборотов по дням (в ней должны быть только дни в которых были движения+остаток на начало и на конец)

2.
а) получаем кросс таблицу всех дней со всеми товарами
б) получаем таблицу (назовем ее таблицей интервалов) в которой по каждому товару есть интервал дат с даты текущего движения до датаСледующегоДвижения-1 (либо, если следующего нет, то КонДата). В этом интервале остаток гарантированно не менялся и был равен конечному остатку на дату текущего движения.
в) соединяем таблицы а) и б), учитывая, что на любую дату остаток получается проверкой вхождения в интервал.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получить остатки на каждый день за период
Ответ #13 - 15. Марта 2011 :: 15:11
Печать  
табличку дат можно слепить так:

Код
Выбрать все
(пример с книжки):

--для начала создаем табличку с числами
set nocount on;
if object_id('Nums','U') is not null drop table Nums
create table Nums (n int not null primary key);
declare i as int;
set i=1;
begin tran
 while i<=365 --или сюда подставить разность дат, или просто большое число
 begin
   insert into Nums values(i);
   set i=i+1;
 end
commit tran
set nocount off;

--потом просто прибавляем к начальной дате числа..
select dateadd(day,n-1,:НачДата~~) as date
from Nums
where n<=datediff(day,:НачДата~~,:КонДата~~)+1
order by date 



или так:

Код
Выбрать все
--  ©Дык ё

select Dat
from (

   select dateadd(day,(a.number+b.number*256),:НачДата) as Dat
   from master..spt_values a, master..spt_values b

    where a.type='P' and b.type='P'
	  and b.number<=datediff(day,:НачДата,:КонДата)/256
	  and a.number<=(datediff(day,:НачДата,:КонДата)-b.number*256)
    ) x

where x.Dat between :НачДата and :КонДата 


     
или даже так:

Код
Выбрать все
--  ©Дык ё
select dateadd(day,(a.number+b.number*256),:НачДата) as Dat
from master..spt_values a, master..spt_values b
where a.type='P' and b.type='P'

    and b.number<=datediff(day,:НачДата,:КонДата)/256
    and a.number<=(datediff(day,:НачДата,:КонДата)-b.number*256) 

  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Получить остатки на каждый день за период
Ответ #14 - 15. Марта 2011 :: 15:18
Печать  
Eprst писал(а) 15. Марта 2011 :: 15:11:
табличку дат можно слепить так:
...
или даже так:

Код
Выбрать все
--  ©Дык ё
select dateadd(day,(a.number+b.number*256),:НачДата) as Dat
from master..spt_values a, master..spt_values b
where a.type='P' and b.type='P'

    and b.number<=datediff(day,:НачДата,:КонДата)/256
    and a.number<=(datediff(day,:НачДата,:КонДата)-b.number*256) 



Спасибо. Гораздо более читабельно чем у меня Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать