gifts2017

Остатки на каждый день периода одним запросом - универсальный

Опубликовал Головаченко Дима (Smaylukk) в раздел Программирование - Практика программирования

Запрос для получения остатков (начальный, конечный, приход, расход) из регистров накопления. Одним запросом. Без вспомагательных регистров и пост-обрабтки запроса. В удобном и читаемом виде.

Запрос будет строится с помощью временных таблиц - очень удбный инструмент, так как не нужно постоянно тянуть данные из таблиц БД. В примере я хочу получить начальный остаток номенклатуры на каждый день из регистра накопления ТоварынаСкладах. Из чего будет состоять запрос:

  1. Во временную таблицу получу набор нужной мне номенклатуры (или весь справочник), по которому мне надо посмотреть остатки;
  2. С помощью Декартова произведения таблиц получим диапазон дат из указанного периода. В указанном примере можно получить только 36 дней, но почитав статью вы сможете ее увеличить под свои требования;
  3. Следующим этапом я решил соединить первые 2 таблицы. Здесь может быть много критики, но я это могу аргументировать тем, что виртуальные таблицы ОстаткиИОбороты могут некорректно отображать нулевые остатки. Это страховка того, что выбранная номенклатура будет учавствовать в выборке запроса.
  4. Теперь очередь за остатками. Как всем озвестно выше упомянутая виртуальная таблица таблица возвращает данные только за тот день, когда остаток был изменен. Поэтому было решено построить на основании данных остатков таблицу следующего вида:
     
    Начало периода Конец периода Номенклатура Количество
           
    Далее при соединенни с таблицей дат, посмотрев в какой интервал остатков входит дата, получаем нужный остаток Главное правильно построить такую таблицу;
  5. Не посредственно само соединение таблицы с датами с таблице с остатками и группировка результата.

Отрабатывает результат шустренько, но на периодах больше месяца не смотрел - поэтому сказать не могу. При выводе результат лучше сразу делать Итоги по номенклатуре (или каком-то другом измерении) - вывод будет заметно быстрее. Во вложении внешний отчет (8.1), в котором на СКД с помощью этого запроса сделан вывод нужного результата - тем, кто сразу хочет посмотреть на результат. Знаю, что баян - но это по крайней мере не перенумератор :)

 

Текст запроса:



ВЫБРАТЬ

   
СпрНоменклатура.Ссылка КАК Номенклатура

ПОМЕСТИТЬ ТЗНоменклатур

ИЗ

   
Справочник.Номенклатура КАК СпрНоменклатура

ГДЕ

    (
НЕ СпрНоменклатура.ПометкаУдаления)

   
И (НЕ СпрНоменклатура.ЭтоГруппа)
;
//////////////////////// - получение таблицы дат и соединение таблиц номенклатуры и дат
ВЫБРАТЬ

   
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) КАК Дата,

   
ТЗНоменклатур.Номенклатура

ПОМЕСТИТЬ ТаблицаДата

ИЗ
    (ВЫБРАТЬ
       
6 * (t1.a - 1) + t2.b - 1 КАК n
    ИЗ
        (ВЫБРАТЬ

           
1 КАК ОБЪЕДИНИТЬ  ВЫБРАТЬ ОБЪЕДИНИТЬ ВЫБРАТЬ 3  ОБЪЕДИНИТЬ  ВЫБРАТЬ ОБЪЕДИНИТЬ  ВЫБРАТЬ ОБЪЕДИНИТЬ  ВЫБРАТЬ 6) КАК t1

            ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ

               
1 КАК ОБЪЕДИНИТЬ ВЫБРАТЬ ОБЪЕДИНИТЬ ВЫБРАТЬ ОБЪЕДИНИТЬ  ВЫБРАТЬ  4  ОБЪЕДИНИТЬ ВЫБРАТЬ  ОБЪЕДИНИТЬ ВЫБРАТЬ 6) КАК t2

            ПО (ИСТИНА)) КАК t,

   
ТЗНоменклатур КАК ТЗНоменклатур

ГДЕ

   
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) ;
//////////////////////// - получение остатков
ВЫБРАТЬ

   
ВложенныйЗапрос.Номенклатура,

   
ВложенныйЗапрос.НачалоПериода КАК НачалоПериода,

   
МАКСИМУМ(ВложенныйЗапрос.Количество) КАК Количество

ПОМЕСТИТЬ Остатки

ИЗ

    (ВЫБРАТЬ

       
&НачалоПериода КАК НачалоПериода,

       
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,

       
ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество

   
ИЗ

       
РегистрНакопления.ТоварыНаСкладах.Остатки(&НачалоПериода, ) КАК ТоварыНаСкладахОстатки

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ

       
НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ),

       
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,

       
ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток

    ИЗ

       
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты)КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО

   
ВложенныйЗапрос.НачалоПериода,

   
ВложенныйЗапрос.Номенклатура
;
////////////////////////- формирование таблицы остатков нужного вида
ВЫБРАТЬ

   
Остатки.НачалоПериода,

   
МИНИМУМ(ДОБАВИТЬКДАТЕ(ЕСТЬNULL(ОстаткиКонец.НачалоПериода, ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1)), СЕКУНДА, -1)) КАК КонецПериода,

   
Остатки.Номенклатура,

   
Остатки.Количество

ПОМЕСТИТЬ ОстаткиПериодами

ИЗ

   
Остатки КАК Остатки

        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК ОстаткиКонец

        ПО Остатки.Номенклатура = ОстаткиКонец.Номенклатура

            И Остатки.НачалоПериода < ОстаткиКонец.НачалоПериода

СГРУППИРОВАТЬ ПО

   
Остатки.НачалоПериода,

   
Остатки.Номенклатура,

   
Остатки.Количество
;
/////////////////////// - финальное соединение
ВЫБРАТЬ

   
ТаблицаДата.Дата КАК Дата,

   
ТаблицаДата.Номенклатура КАК Номенклатура,

   
ЕСТЬNULL(ОстаткиПериодами.Количество, 0) КАК Количество

ИЗ

   
ТаблицаДата КАК ТаблицаДата

        ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиПериодами КАК ОстаткиПериодами

        ПО (ТаблицаДата.Дата МЕЖДУ ОстаткиПериодами.НачалоПериода И ОстаткиПериодами.КонецПериода)

           
И ТаблицаДата.Номенклатура = ОстаткиПериодами.Номенклатура

УПОРЯДОЧИТЬ ПО
   
Дата

ИТОГИ ПО
   
Номенклатура


Разукрашка по-своему решила разукрасить :)


Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Остатки товара на каждый день
.erf 16,18Kb
02.07.12
218
.erf 16,18Kb 218 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. evgeniti (evgeniti) 11.12.11 14:04
декартово произведение вроде бы вполне обходится без конструкций ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПО ИСТИНА
select
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, 3*(a-1)+b-1 ) as megafunction
, c as nomenkrlatura
from
(select 1 as a union select 2 union select 3) as t1,
(select 1 as b union select 2 union select 3) as t2,
(select 'крокодил' as c union select 'красный') as t3
-------
да и если уж на то пошло почему бы не пихать вместо двух одинаковыйх строчек вида (select 1 as a union select 2 union select 3) - таблицу значений с цифрами, сформированную в коде, в качестве параметра
2. Головаченко Дима (Smaylukk) 11.12.11 14:33
Потому что изначально поставил себе цель сделать все одним запросом. Если делать табличку с цыферками - то ее перед запросом нужно сформировать, а при реализации на СКД - вообще такого сделать нельзя, только соединив два набора данных - объект (куда собственно таблица попадет) и запрос, но этот вариант уже реализован.
Что же к Декартовому произведению таблиц - я указал первоисточник, откуда его взял. Можете почитать, почему автор сделал так - просто он делает как раз то, что мне нужно, а далее я не копал
3. Доржи Балбаров (Angeros) 12.12.11 04:19
А почему было использовано 2 запроса к остаткам, а потом к движениям? Неужели нельзя было обойтись параметром виртуальной таблицы - метод дополнения.
4. Доржи Балбаров (Angeros) 12.12.11 04:22
(1)Формировать в табличку в коде не самый быстрый и гибкий метод. Практика показывает делать это в запросе намного лучше и вообще если есть возможность избавится от параметра лучше это сделать, оно и отлаживать удобней.
5. Головаченко Дима (Smaylukk) 12.12.11 10:57
(3), вполне возможно. Я просто делал этот запрос по аналогии с регистрами сведений, когда из них нужно было получить такую же табличку(курсы валют, цены номенклатуры, ...). Просто запрос работает да еще и не очень долго, а я этого и добивался. Если сделаете с методом дополнения с использованием 1 таблички - респект вам :)
6. Al (al_zzz) 12.02.12 22:15
А запрос точно рабочий? Запускаю в демке по позиции "Петр I Легкие" за период май 2007. При этом получаю в результате, что был на остатки только в последний день периода, хотя по ведомости есть приход от 5 мая 2007.
7. Головаченко Дима (Smaylukk) 13.02.12 10:37
Запрос точно рабочий. Текст запроса, при вставке в пост потерял несколько символов. Ну и плюс, таблица дата, которую я выложил имеет ограниченность в 36 символов. Попробуйте скачать сам отчет или поменять разрядность таблицы дат.
8. Al (al_zzz) 13.02.12 21:12
(7) Smaylukk, Проверил на самом отчете, количество выдает только на последний день периода, если был всего один приход за период.
9. Головаченко Дима (Smaylukk) 13.02.12 21:41
(8) al_zzz, извините, не верно понял предыдущий комент. В тексте зпроса я выбираю НачальныйОстаток и соответственно, если был только один приход - в день прихода начальный остаток не изменится. Поменяйте его в тексте запроса на КонечныйОстаток(временная таблица Остатки) и все должно заработать верно.
Спасибо за выявленную неточность
10. Александр Кораблев (akor77) 13.05.12 21:08
Запрос прекрасно работает. Нужно только добавить одно условие для соединения двух таблиц. Иначе даты с остатками будут "обрезаны" по всем товарам. Пошевелите мозгами сами. Я и так хорошо подсказал.
Автору огромный респект!!!
11. Головаченко Дима (Smaylukk) 14.05.12 11:47
(10), спасибо, очень приятно :)
12. uri1978 uri1978 (uri1978) 15.06.12 01:04
Отчет точно рабочий?
Привожу пример. Меняем дату начала и цифры в отчете разные:


и



По-моему опечатка в коде.
Нужно заменить КоличествоНачальныйОстаток на КоличествоКонечныйОстаток. И тогда отчет заработает, остатки совпадут с "Ведомость по товарам организаций". Т.е. нужно:
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ),
		ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
		ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
...Показать Скрыть
13. Головаченко Дима (Smaylukk) 15.06.12 11:40
(12), как я уже говорил вот здесь (9), да - я там выбирал начальный остаток. Уже не помню зачем. Спасибо за внимательный анализ:)
Хотя вот такая заковыка помогает получше узнать структура и принцип запроса
14. uri1978 uri1978 (uri1978) 15.06.12 11:48
Да, действительно не прочитал комментарии. Спасибо за обработку, натолкнула на правильное решение.
15. Головаченко Дима (Smaylukk) 15.06.12 11:51
(14), очень рад, что вам пригодилось
16. Головаченко Дима (Smaylukk) 03.07.12 00:44
Во второй временной таблице "ТаблицаДата" условие должно быть следующим:

ГДЕ

ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) <= &КонецПериода ;

Последнее убирается при вставке в публикацию.
Извините
17. al petrov (petrov_al) 03.07.12 13:11
Обратите внимание!!! Запрос корректно отрабатывает не всех ситуациях, например попробуйте например сформировать за период 01.12.2011 по 06.01.2012
Вообщем нужно либо дорабатывать либо на помойку.
18. al petrov (petrov_al) 03.07.12 13:23
Анализируйте что выдает конкретно этот подзапрос

ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) КАК Дата
ИЗ
(ВЫБРАТЬ
6 * (t1.a - 1) + t2.b - 1 КАК n
ИЗ
(ВЫБРАТЬ

1 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6) КАК t1

ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ

1 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6) КАК t2

ПО (ИСТИНА)) КАК t
ГДЕ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) <= &КонецПериода

УПОРЯДОЧИТЬ ПО
Дата
19. Головаченко Дима (Smaylukk) 04.07.12 09:08
(18) , если вы внимательно читали публикацию - то могли заметить, что в пунтке 2, где я описывал Декартово произведение таблиц - указано, что даный запрос возвращает 36 дней. Запрос вполне рабочий при определенных условиях. Выложен как вариант реализации данной задачи. Все расписано и указаны ссылки первоисточников, так что под свои нужды его очень быстро можно подстроить. Если же вы не в силах это сделать - обращайтесь к специалистам.
20. aspirator 23 (aspirator23) 09.07.12 07:27
Или я не понял, или эта задача решается с использованием СКД.
Получение остатков на каждую дату решается установкой периода День.
21. Головаченко Дима (Smaylukk) 09.07.12 09:45
(20) , возможно и решается. Но основной идеей этой публикации была реализация задачи БЕЗ использования каких-то инструментов кроме запроса.
Если вам при проведении какого-то документа понадобится данная табличка - вы же не будете СКД туда цеплять :)
22. aspirator 23 (aspirator23) 09.07.12 13:12
(21) Согласен, если действительно не нужен отчет.
23. EfiopReal (Созинов) 10.07.12 15:22
(20) aspirator23,
не решается, у вас будут остатки не на каждый день. Для этого и выдумывают виртуальную таблицу дат.

(21) Smaylukk,
В отчетах тоже полезно, сталкивался с ситуацией, когда не мог реализвать остатки по периодам с помощью наборов данных, но это редкие случаи.


Еще дополнение - запрос не считает дни, когда товар пришел днем и в этот же день был продан. Я тупо подставил регистр продаж в подзапрос по остаткам 3 объединением. Может кто подскажет как по нормальному сделать подсчет таких дней (утром и вечером нет остатка по товару, остаток только днем)?
24. Головаченко Дима (Smaylukk) 10.07.12 16:49
(23) , попробуйте брать НачальныйОстаток + Приход - по идее должно сработать.
25. Гость 04.10.12 14:48
Я выбираю остатки по контрагентам(задолженность), и у меня почему-то в таблице ОстаткиПериодами получаются нулевые периоды, за 1 апреля есть остаток, а за 2 нет....
26. Anton - (AntonH851) 04.10.12 14:52
Потому что у меня считаются не сами остатки а разность дт и кр, причем только но документам дата которых удовлетворяет определенному условию, и в результате некоторые строки в таблице остатки получаются с нулевым остатком
27. WildWildUser Wild (wildwilduser) 24.12.12 09:29
подскажите пожалуйста, может чего недопонимаю
но вот эта строчка
МИНИМУМ(ДОБАВИТЬКДАТЕ(ЕСТЬNULL(ОстаткиКонец.НачалоПериода, ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1)), СЕКУНДА, -1)) КАК КонецПериода

получает конец дня перед ОстаткиКонец.НачалоПериода. это верно?
я полагаю что должен быть конец дня ОстаткиКонец.НачалоПериода.
ещё раз возможно что то недопонимаю.
28. Головаченко Дима (Smaylukk) 24.12.12 10:41
(27), попробую объяснить:
  • В таблице ОстаткиКонец поле НачалоПериода всегда больше, чем в таблице Остатки.
  • Строка, что вы написали берет минимальную дату, которая больше НачалоПериода в таблице Остатки.
  • Далее, чтобы не было такого, что КонецПериода текущей строки и НачалоПериода следующей не были одинаковы (могут потом быть дублирования) нужно отнять 1 секунду.
  • Ну и последний штрих - для последней записи таблицы уже нет соответствия в таблице ОстаткиКонец, поэтому берем значение параметра &КонецПериода
Как-то так
29. WildWildUser Wild (wildwilduser) 24.12.12 11:16
т.е. в таблице ОстаткиПериодами получаем строки двежений, а ДатаНачала и ДатаКонца это даты между движениями по этим позициям?
30. Головаченко Дима (Smaylukk) 24.12.12 11:27
(29), Да. И если остаток не менялся за этот период, то мы можем на каждый день в этот промежуток поставить определенное значение.
31. straus (straus) 27.12.12 17:39
Касательно объединения в таблице остатков, это необходимо, только на мой взгляд параметр должен быть немного другим:
РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ), ) КАК ТоварыНаСкладахОстатки
32. Головаченко Дима (Smaylukk) 27.12.12 18:03
(31), А разве послудеющее объединение
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
не подтянет эти изменения?
И вполне возможно, что для учета конечных остатков по дням ваш вариант лучше.
Но в примере я решил (на свою голову) выбрать начальные остатки по дням, поэтому ваш пример мне не покажет правильной картины, если было движение в в день
&НачалоПериода
.
Спасибо за отзыв
33. straus (straus) 27.12.12 18:22
простите за кучу правок, не ожидал, что так быстро ответят. Я пытался получить остатки на начало дня и активно испытывал Ваш запрос.
тогда нужно совсем удалить объединение с таблицей остатков иначе первой строкой будет остаток именно на начало дня
34. straus (straus) 27.12.12 18:32
(32) Smaylukk,
Я получил начальные остатки просто сместив дату в таблице остатков на день вверх, по другому у меня не получилось
35. Головаченко Дима (Smaylukk) 27.12.12 18:48
(33) , так ведь начальный остаток и нужен на начало дня :).
Но если у вас все получилось согласно вашим ожиданиям - тогда все ОК.
36. straus (straus) 27.12.12 19:00
так конечный остаток предыдущего дня и есть начальный остаток текущего или я что то не понимаю?
плюс ко всему, максимум непредсказуемо выберет либо начальный остаток, либо конечный
37. Sergei (kauksi) 17.02.13 09:22
полезная штука. но поправьте уже обработку согласно замечаниям тут
38. Сергей (ildarovich) 17.02.13 16:43
Не рекомендую эту статью к использованию. Ну не должна такая простая задача выливаться в запрос из более сотни строк! Более правильное в методологическом смысле решение (опирающееся на понимание устройства виртуального регистра остатков) можно найти в публикации Запрос по остаткам регистра накопления на каждый день, а еще более короткое - в моем комментарии к этой же статье.
rozhkovdmitriy; ErrorEd88; zqzq; +3 Ответить
39. Головаченко Дима (Smaylukk) 19.02.13 00:01
Ну сколько нужно повторять? Запрос написан без использования вспомогательных регистров для получения таблицы дат. Наилучшее решение (даже лучше вашего "короткого") - использовать производственный календарь, там точно есть все даты.
А относительно количества строк - я расширенно показал, как сделать поставленную задачу. И заданием этой статьи было поделиться знаниями. И думаю это понятнее, чем "вот такой запрос, только даты берите там, где у вас каждый день регистр изменяется (не в обиду автора упомянутой публикации)".
И на своей базе я не могу посмотреть тем запросом остатки на каждый день. Нет у меня такого регистра.
После этого вы будете утверждать что мой вариант плохой?
40. Головаченко Дима (Smaylukk) 19.02.13 00:02
(37) ,что именно нужно поправить?
41. Анатолий (ABudnikov) 10.09.13 16:51
Применил этот метод к данным по своим остаткам.
Ошибку, с которой пока так и не поборолся нашёл в том, что не корректно считает остатки в первый день изменения.
Пример:
Есть входящий остаток 50 шт. Период построения запроса с 01.09 по 10.09.
Остаток менялся 05.09 на 45 шт и 08.09 на 30 шт.
В результате таблица остатков выглядит следующим образом:

01.09 - 00:00 | 04.09 - 23:59 | 50 шт - верно
05.09 - 00:00 | 07.09 - 23:59 | 50 шт - не верно ведь остаток на 06.09 должен быть 45 шт
08.09 - 00:00 | 08.09 - 23:59 | 45 шт - верно
09.09 - 00:00 | 09.09 - 23:59 | 30 шт - верно
42. Головаченко Дима (Smaylukk) 10.09.13 16:59
(41) ABudnikov, в запросе вы берете НачальныйОстаток или КонечныйОстаток? Если брали запрос из публикации - то там Начальный остаток, о чем указано в статье и что соответствует вашим данным.
43. Анатолий (ABudnikov) 10.09.13 17:12
(42) Smaylukk, беру НачальныйОстаток - так же как и в статье.
да и данные я понимаю как получились технически. Но получатся что логически остаток не верный для первой записи из соединения с таблицей остатков по дням - о чем я и написал

Конечный остаток на 05.09 и соответственно начальный на 06.09 у меня 45 шт.
А в результате работы запроса показывает что на 06.09 50 шт а не 45 шт.
44. Головаченко Дима (Smaylukk) 10.09.13 20:25
(43) ABudnikov, не согласен. Запрос в статье все верно показывает. Смотрим на ваш пример, но я немного расширю таблицу:
Начало периода |Конец периода |Нач. ост.| Оборот|КонОст | Что берет запрос
01.09 - 00:00 | 04.09 - 23:59 | 50 шт | 0 | 50 шт | 50 шт
05.09 - 00:00 | 07.09 - 23:59 | 50 шт | -5 | 45 шт | 50 шт
08.09 - 00:00 | 08.09 - 23:59 | 45 шт | -15 | 30 шт | 45 шт
09.09 - 00:00 | 09.09 - 23:59 | 30 шт | 0 | 30 шт | 30 шт
45. Анатолий (ABudnikov) 10.09.13 20:36
(44) Smaylukk, Хорошо а теперь если эту таблицу соединить с таблицей дат, то получается что на начало 06.09 остаток 50 шт, что не является правильным ответом, т.к. 05.09 произошло списание 5 шт
У Вас в статье написано: "Далее при соединении с таблицей дат, посмотрев в какой интервал остатков входит дата, получаем нужный остаток Главное правильно построить такую таблицу"
Так вот получается что таблица периодов не отражает всю действительность.
46. Головаченко Дима (Smaylukk) 10.09.13 22:40
(45) ABudnikov, ну так выбирайте конечный остаток и будет вам счастье. Почему оно должно показать вам все правильно, если вы выбираете начальный остаток? Виртуальная таблица оборотов дает 4 даты - начало, конец и даты расходов. В день, когда был расход, начальный остаток не изменялся. Это касается 5 и 8 числа. Т.е. в вашей первоначальной таблице и 8 числа должно быть неправильно.
47. Анатолий (ABudnikov) 11.09.13 10:44
(46) Smaylukk, :) так задача состоит в том, чтоб получить начальные остатки. Да и 8-го тоже не правильный начальный остаток.
Т.к. у Вас в описано получение начальных остатков, я просто хотел указать что приведенный запрос не корректно решает описанную задачу.
48. Алексей Шабанов (BTRVODKA) 15.09.13 04:28
Спасибо, за вашу публикацию!
49. Михаил Григорьев (Mails79) 11.02.14 12:09
Спасибо.
Весь фокус в формирование таблицы остатков по периодам.
Сам бы долго соображал что нужно:)
50. bulpi bulpi (bulpi) 07.03.14 17:25
Имхо, ошибка в том, что Вы берете начальный остаток, а не конечный. Пример :
Товар1,
нач.остаток 01.01.14 - 5 шт, кон.остаток 3 шт.
нач.остаток 10.01.14 - 3 шт

У Вас получится, что с 02.01 по 09.01 нач.остаток 5. А на самом деле он 3!

51. Головаченко Дима (Smaylukk) 24.03.14 19:25
(50), да, вы правы. С начальными остатками я перемудрил. Не работает. И если честно, то завис - не пойму как сделать :)
52. Головаченко Дима (Smaylukk) 24.03.14 19:26
(47), да, вы были правы. Только сейчас до этого допер. Спасибо.
53. Алексей Голосеев (Aleksey81) 14.08.14 23:00
Автор молодец. Очень полезный код выложил. Важно лишь отметить что в том виде, что он изложен можно использовать период не более 36 дней. Ограничение прямо выходит из способа формирования таблицы дат путем "комбинирования" двух массивов по 6 чисел.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа