Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) ОстаткиИОбороты в разрезе дней (число прочтений - 6733 )
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
ОстаткиИОбороты в разрезе дней
05. Мая 2010 :: 08:18
Печать  
Помогите составить запрос для получения таблицы остатков на каждый день периода:
Товар            |           01.05.10             |        02.05.10      |  ....
-------------------------------------------------------------------------------
Хлеб               НачОст+Приход-Расход              ........          ....
-------------------------------------------------------------------------------
.....                            ......                                 .......           ....
  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #1 - 05. Мая 2010 :: 09:10
Печать  
Ну как вариант текст запроса вроде case when ... then .... else Улыбка. Ну там проверка на дату и установка в соответствующую колонку.
Или перекручивать ИТЗ на клиенте Улыбка.
Есть еще кубики, может там что копнуть.

У меня бредовых идей не много  Смех, вот и кончились.
  

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #2 - 05. Мая 2010 :: 09:22
Печать  
Я подумываю с ИТЗ, с перекручиванием на клиенте.
Подскажите, как объединить таблицу ОстатковИОбаротов и таблицу дней, чтоб на каждый день иметь остаток
  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #3 - 05. Мая 2010 :: 09:25
Печать  
Заполни список значений датами и уложи в базу данных, после этого сделай соединение этой таблицы и ОстаткиОбороты (левое).
Вроде должно помочь.
  

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #4 - 05. Мая 2010 :: 09:32
Печать  
vandalsvq писал(а) 05. Мая 2010 :: 09:25:
Заполни список значений датами и уложи в базу данных, после этого сделай соединение этой таблицы и ОстаткиОбороты (левое).
Вроде должно помочь.

Если я правильно уловил логику, то из
 
Код
Выбрать все
  Хлеб | 02.05.10| 4|
  -----------------------
   Хлеб | 03.05.10| 2|
  -----------------------
   Хлеб | 05.05.10| 2| 


и
Код
Выбрать все
01.05.10
		02.05.10
		03.05.10
		04.05.10
		05.05.10 


получу
Код
Выбрать все
Хлеб | 01.05.10|  |
-----------------------
Хлеб | 02.05.10| 4|
-----------------------
Хлеб | 03.05.10| 2|
-----------------------
Хлеб | 04.05.10|  |
-----------------------
Хлеб | 05.05.10| 2| 


А мне надо:

Код
Выбрать все
Хлеб | 01.05.10| 0|
-----------------------
Хлеб | 02.05.10| 4|
-----------------------
Хлеб | 03.05.10| 2|
-----------------------
Хлеб | 04.05.10| 2|
-----------------------
Хлеб | 05.05.10| 2| 


  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #5 - 05. Мая 2010 :: 09:39
Печать  
Ах да... я же забыл про пересчет. Самый простой вариант - пересчет на клиенте. Вариант посложнее - это запрос аналогичный тому что в ВТ БИОстаткиОбороты у тов. berezdetsky или у меня в КОП "ПрямойЗапрос" (РегистрОстаткиОбороты или БИОстаткиОбороты). Кратко суть в том что на временную таблицу вешаешь уникальный кластеризованный индекс заполяешь ее своими данными (соединение двух таблиц). Потом делаешь update с пересчетом.
Вариант достаточно сложный. Поэтому проще на клиенте.
  

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #6 - 05. Мая 2010 :: 10:08
Печать  
vandalsvq писал(а) 05. Мая 2010 :: 09:39:
...Вариант достаточно сложный. Поэтому проще на клиенте.

Это очень удручающее обстоятельство, но задачка такова, что на клиенте может выполняться очень долго.
А в вашем объекте "ПрямойЗапрос" запрос по "ОстаткиИОбороты" в разрезе дней делается также, как и в запросе для ODBC или как мне нужно?
  

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #7 - 05. Мая 2010 :: 10:09
Печать  
Речь идет о регистре
  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #8 - 05. Мая 2010 :: 10:18
Печать  
Аналогично как и в ODBC.
Единственное можешь подсмотреть реализацию ВТ РегистрОстаткиОбороты (SQL формат БД) и написать аналогичную процедуру у себя в обработке. Причем заранее заполнив пересчитываемую таблицу именно необходимыми тебе датами.
Помнится такой пример я уже делал, но где он счас и выкладывал ли я его не помню.
  

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #9 - 05. Мая 2010 :: 10:51
Печать  
vandalsvq писал(а) 05. Мая 2010 :: 10:18:
Аналогично как и в ODBC.
Единственное можешь подсмотреть реализацию ВТ РегистрОстаткиОбороты (SQL формат БД) и написать аналогичную процедуру у себя в обработке. Причем заранее заполнив пересчитываемую таблицу именно необходимыми тебе датами.
Помнится такой пример я уже делал, но где он счас и выкладывал ли я его не помню.

Должно быть что-то типа:
http://www.1cpp.ru/forum/YaBB.pl?num=1210966437 ?
  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #10 - 05. Мая 2010 :: 17:49
Печать  
В указанную тему не вдавался (в подробности), просто хочу сказать если интересует вариант реализации посмотри в классы думаю все понятно будет.
  

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #11 - 17. Мая 2010 :: 12:16
Печать  
vandalsvq писал(а) 05. Мая 2010 :: 17:49:
В указанную тему не вдавался (в подробности), просто хочу сказать если интересует вариант реализации посмотри в классы думаю все понятно будет.

Нашел вашу обработку, про которую вы говорили, но там остатки и обороты в разрезе дней, по которым есть движения. Как получить таблицу остатков и оборотов на каждый день не могу придумать. Пожалуйста, помогите решить мне эту задачу.
Выкладываю ваш пример, адаптированный  под мою задачу.
  

______________________________.ert ( 43 KB | Загрузки )

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


1C++ rocks!

Сообщений: 4
Зарегистрирован: 04. Июня 2010
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #12 - 09. Июля 2010 :: 09:02
Печать  
Пытался сделать развертку по всем товарам/складам/дням. В моем случае 1С зависала когда в ТЗ было около 1000000 строк (3 дня по всем товарам по всем складам). Поэтому пошел другим путем. Основной (внешний) отчет с группировкой "день", и при выводе в печатную форму получаю остатки функцией на 1 день и заполняю ими нужные места во внешнем запросе.

Вот запрос для получения начального и конечного остатков на день.

Функция НайтиОстатки_ПрямойЗапрос(наДату)
     ТекстЗапроса1="
           |select
           |  Матрица1.Товар [Товар $Справочник.Товары]
           |, Матрица1.Склад [Склад $Справочник.Склады]
           |, sum(Матрица1.ОстатокТовараНач) as ОстатокТовараНач
           |, sum(Матрица1.ОстатокТовараКон) as ОстатокТовараКон
           |from
           |(
           |SELECT РегОстНачальные.Товар
           |      , РегОстНачальные.Склад
           |      , РегОстНачальные.ОстатокТовараОстаток as ОстатокТовараНач
           |      , 0 as ОстатокТовараКон
           |FROM $РегистрОстатки.ОстаткиТоваров(:наДату,,";
           Если спТовары.РазмерСписка() <> 0 Тогда
                 ТекстЗапроса1=ТекстЗапроса1+"
                 |(Товар IN (SELECT val FROM #выбТовары))
                 |";
           КонецЕсли;
           Если ((спТовары.РазмерСписка() <> 0) и (спСклады.РазмерСписка() <> 0)) Тогда
                 ТекстЗапроса1=ТекстЗапроса1+"
                 | AND "
                 ;
           КонецЕсли;
           Если спСклады.РазмерСписка() <> 0 Тогда
                 ТекстЗапроса1=ТекстЗапроса1+"
                 |(Склад IN (SELECT val FROM #выбСклады))
                 |";
           КонецЕсли;
           ТекстЗапроса1=ТекстЗапроса1+"
           |,,
           |            ОстатокТовара) AS РегОстНачальные
           |            
           |union all
           |
           |SELECT РегОстКон.Товар
           |      , РегОстКон.Склад
           |      , 0 as ОстатокТовараНач
           |      , РегОстКон.ОстатокТовараОстаток as ОстатокТовараКон
           |FROM $РегистрОстатки.ОстаткиТоваров(:наДату~,,";
           Если спТовары.РазмерСписка()<> 0 Тогда
                 ТекстЗапроса1=ТекстЗапроса1+"
                 |(Товар IN (SELECT val FROM #выбТовары))
                 |";
           КонецЕсли;
           Если ((спТовары.РазмерСписка()<> 0) и (спСклады.РазмерСписка() <> 0)) Тогда
                 ТекстЗапроса1=ТекстЗапроса1+"
                 | AND "
                 ;
           КонецЕсли;
           Если спСклады.РазмерСписка() <> 0 Тогда
                 ТекстЗапроса1=ТекстЗапроса1+"
                 |(Склад IN (SELECT val FROM #выбСклады))
                 |";
           КонецЕсли;
           ТекстЗапроса1=ТекстЗапроса1+"
           |,,
           |            ОстатокТовара) AS РегОстКон
           |) as Матрица1
           |
           |group by Матрица1.Товар, Матрица1.Склад
           |order by Матрица1.Товар, Матрица1.Склад
           |";
           
           итЗапроса = СоздатьОбъект("ИндексированнаяТаблица");
           рс.УстановитьТекстовыйПараметр("наДату", наДату);
           рс.УложитьСписокОбъектов(спТовары,"#выбТовары","Товары");
           рс.УложитьСписокОбъектов(спСклады,"#выбСклады","Склады");
           Ответ=рс.ВыполнитьИнструкцию(ТекстЗапроса1,итЗапроса);
           
           ПостроитьИндекс(итЗапроса,тИндекс);
           Возврат итЗапроса;
КонецФункции

Функция НайтиВЗапросПоОстаткам(итЗапроса,тИндекс,сзЧтоИщем)
     Ответ=итЗапроса.НайтиСтроку(тИндекс,сзЧтоИщем,0,1);
     //Сообщить("Ответ "+Ответ+" "+итЗапроса.НомерСтроки()+"нач: "+итЗапроса.ОстатокТовараНач+", кон: "+итЗапроса.ОстатокТовараКон);
     
     Если Ответ <> 0 Тогда
           НачОст=итЗапроса.ОстатокТовараНач;
           КонОст=итЗапроса.ОстатокТовараКон;
     Иначе
           НачОст=0;
           КонОст=0;
     КонецЕсли;
     
     
     сзОтвет.УдалитьВсе();
     сзОтвет.ДобавитьЗначение(НачОст);
     сзОтвет.ДобавитьЗначение(КонОст);
     Возврат сзОтвет;
КонецФункции

во внешнем отчет соответственно:


тИндекс="*Товар,*Склад";

// ищем остатки
                       сзОтвет.УдалитьВсе();
                       сзОтвет.ДобавитьЗначение(текТовар.ТекущийЭлемент());
                       сзОтвет.ДобавитьЗначение(текСклад.ТекущийЭлемент());
                       
                       сзОтветОст=НайтиВЗапросПоОстаткам(ЗапросПоОстаткам,тИндекс,сзОтвет);
                       
                       НачОстКол=сзОтветОст.ПолучитьЗначение(1);
                       КонОстКол=сзОтветОст.ПолучитьЗначение(2);

Остатки по всем товарам/складам на 1 день - от 2х до 8 секунд
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #13 - 09. Июля 2010 :: 09:15
Печать  
А я воспользовался советом vandalsvq и результат произведения предварительно созданной таблицы дней(Dat) и таблицы остатков и оборотов:
Код
Выбрать все
ТекстЗапроса = "-- qryMaker:Ост по дням.2010.05.18.17.29.05
		|SELECT Ном.ID [Элемент $Справочник.Номенклатура]
		|	, Dat1.Dat День
		|   , IsNull(Sum(Выборка.КонОст),0) Остаток
		|   , 1 МинОстаток
		|   , case  when Sum(Выборка.КонОст) is null
		|	    then 1
		|	    else 0 end Провалы
		|   , 0 ПериодыПровалов
		|   , 0 КоличествоПровалов
		|   , 0 КоличествоПериодов
		|   , 1 Всего
		|FROM $Справочник.Номенклатура AS Ном With (NOLOCK)
		|   Full Outer Join Dat_  As Dat1
		|				 On  1=1
		|	Left OUTER JOIN
		|	(SELECT ОстаткиТМЦОстаткиОбороты.Номенклатура Номенк
		|	 , ОстаткиТМЦОстаткиОбороты.Период Период
		|	 , SUM(ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток) КонОст
		|	 FROM $РегистрОстаткиОбороты.ОстаткиТМЦ(:НачДата,
		|	 :КонДата~,
		|	 День,
		|	 ДвиженияИГраницыПериода,,
		|	 --(Номенклатура = :ВыбНоменклатура)
		|	 (Номенклатура in (Select val from #СписокНоменклатуры))
		|	    And (Склад = :ВыбСклад),
		|	  Номенклатура,) AS ОстаткиТМЦОстаткиОбороты
		|	 GROUP BY ОстаткиТМЦОстаткиОбороты.Номенклатура
		|	 , ОстаткиТМЦОстаткиОбороты.Период) As Выборка
		|			   On (Выборка.Номенк = Ном.Id) And (Dat1.Dat=Выборка.Период)
		|   Left outer join $Справочник.СлужебныйОбщий As СпрСлОбщ On СпрСлОбщ.ParentExt = Ном.Id
		|							   And $СпрСлОбщ.Склад = :ВыбСклад
		|WHERE (Ном.Id in (Select val from #СписокНоменклатуры))
		|	-- (Ном.ID = :ВыбНоменклатура)
		|GROUP BY Ном.ID, Ном.Descr, Dat1.Dat, $Ном.МинОстаток, $СпрСлОбщ.НормаПодтоварки
		|Order By Ном.Descr, Dat1.Dat
		|"; 


Обработал на клиенте. Спасибо, vandalsvq! Спасибо всем за участие!
  

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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: ОстаткиИОбороты в разрезе дней
Ответ #14 - 14. Марта 2011 :: 05:43
Печать  
Рано радовался! При отсутствии оборотов за период по данному запросу начальный остаток 0 и конечный остаток 0.
Период быль очень большой, поэтому заметил поздно. Улыбка
Предлагаю, у кого есть готовое работоспособное решение, вынести его в FAQ.
  

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