Найти ближайшую задолженность по регистру оборотов нарастающим итогом

1. insurgut 207 17.06.19 20:29 Сейчас в теме
Есть регистр оборотов, в который заносится долг и оплаты. Необходимо рассчитать срок задолженности (при наличии).

Нарастающим итогом задолженность считаем так:
ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.Период КАК Период,
	ПлатежныйКалендарьОбороты.СчетНаОплату КАК СчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОборот КАК СуммаОборот,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплатыОборот
ПОМЕСТИТЬ Дано
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &ДатаОтчета, День, ) КАК ПлатежныйКалендарьОбороты
ГДЕ
	ПлатежныйКалендарьОбороты.СчетНаОплату = &СчетНаОплату
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Дано.СчетНаОплату КАК СчетНаОплату,
	Дано.Период КАК Период,
	СУММА(ДоДано.СуммаОборот - ДоДано.СуммаОплатыОборот) КАК СуммаОстаток
ИЗ
	Дано КАК Дано
		ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК ДоДано
		ПО Дано.СчетНаОплату = ДоДано.СчетНаОплату
			И Дано.Период >= ДоДано.Период

СГРУППИРОВАТЬ ПО
	Дано.СчетНаОплату,
	Дано.Период
Показать


Отлично, таблица нарастающим итогом считается.

Пример 1

Сделка 135 от 26.08.2018 ||| 03.09.2018 ||| 20 000
Сделка 135 от 26.08.2018 ||| 04.09.2018 ||| <0>
Сделка 135 от 26.08.2018 ||| 14.09.2018 ||| 93 000
Сделка 135 от 26.08.2018 ||| 13.11.2018 ||| 39 974
Сделка 135 от 26.08.2018 ||| 29.11.2018 ||| 93 000


Пример 2 (минус - это переплата)

Сделка 195 от 27.01.2018 ||| 30.01.2018 ||| 20 000
Сделка 195 от 27.01.2018 ||| 07.02.2018 ||| <0>
Сделка 195 от 27.01.2018 ||| 17.04.2018 ||| -20 000
Сделка 195 от 27.01.2018 ||| 22.05.2018 ||| -40 000
Сделка 195 от 27.01.2018 ||| 02.07.2018 ||| -60 000
Сделка 195 от 27.01.2018 ||| 19.07.2018 ||| -1 353 334
Сделка 195 от 27.01.2018 ||| 05.09.2018 ||| <0>
Сделка 195 от 27.01.2018 ||| 25.09.2018 ||| 2 506 666
Сделка 195 от 27.01.2018 ||| 01.10.2018 ||| <0>


Пример 3

Сделка 554 от 12.01.2019 ||| 13.01.2019 ||| 20 000
Сделка 554 от 12.01.2019 ||| 13.02.2019 ||| 40 000
Сделка 554 от 12.01.2019 ||| 13.03.2019 ||| 60 000
Сделка 554 от 12.01.2019 ||| 13.04.2019 ||| 80 000
Сделка 554 от 12.01.2019 ||| 13.05.2019 ||| 100 000


Помогите продолжить запрос, чтобы для каждого документа получить минимальную (после 0 или минусовой задолженности) дату начала положительной суммы, либо при отсутствии таковой = пустую дату. Т.е.
для примера 1 = 14.09.2018
для примера 2 = 01.01.0001
для примера 3 = 13.01.2019
Вознаграждение за ответ
Показать полностью
Найденные решения
3. coollerinc 186 17.06.19 23:14 Сейчас в теме +1 $m
Получаете последний день без задолжности( ДоДано.СуммаОборот - ДоДано.СуммаОплатыОборот > 0, и группируете по максимум дате), помещаете во временную таблицу, потом соединяетесь еще раз с оборотами, но группируете по Минимум дате. Это и будет дата начала последней задолжности
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. tusv 211 18.06.19 08:01 Сейчас в теме +1 $m
(1) Задолженность получили. Пихаем во временную таблицую
И самое простое разбить на две части и обеъединям
В первой части Где Сумма задолженности =0 Тогда ДатаВремя(1,1,1)
Во второй Части Где Сумма задолженности >0
Можно Выбором сразу
2. coollerinc 186 17.06.19 21:51 Сейчас в теме
В чем разница сумма и сумма оплаты? Все движения со знаком минус это вроде должны быть оплаты? Это остаточный или только оборотный регистр?
3. coollerinc 186 17.06.19 23:14 Сейчас в теме +1 $m
Получаете последний день без задолжности( ДоДано.СуммаОборот - ДоДано.СуммаОплатыОборот > 0, и группируете по максимум дате), помещаете во временную таблицу, потом соединяетесь еще раз с оборотами, но группируете по Минимум дате. Это и будет дата начала последней задолжности
5. insurgut 207 18.06.19 09:36 Сейчас в теме +1 $m
Спасибо! В итоге запрос принял вид:

ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.Период КАК Период,
	ПлатежныйКалендарьОбороты.СчетНаОплату КАК СчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОборот КАК СуммаОборот,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплатыОборот
ПОМЕСТИТЬ Дано
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &ДатаОтчета, День, ) КАК ПлатежныйКалендарьОбороты
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Дано.СчетНаОплату КАК СчетНаОплату,
	Дано.Период КАК Период,
	СУММА(ДоДано.СуммаОборот - ДоДано.СуммаОплатыОборот) КАК СуммаОстаток
ПОМЕСТИТЬ НарастающиеИтоги
ИЗ
	Дано КАК Дано
		ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК ДоДано
		ПО Дано.СчетНаОплату = ДоДано.СчетНаОплату
			И Дано.Период >= ДоДано.Период

СГРУППИРОВАТЬ ПО
	Дано.СчетНаОплату,
	Дано.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПоследнийДеньБезЗадолженности.СчетНаОплату КАК СчетНаОплату,
	МАКСИМУМ(ПоследнийДеньБезЗадолженности.Период) КАК Период
ПОМЕСТИТЬ ПоследнийДеньБезЗадолженности
ИЗ
	НарастающиеИтоги КАК ПоследнийДеньБезЗадолженности
ГДЕ
	ПоследнийДеньБезЗадолженности.СуммаОстаток <= 0

СГРУППИРОВАТЬ ПО
	ПоследнийДеньБезЗадолженности.СчетНаОплату
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПервыйДеньЗадолженности.СчетНаОплату КАК СчетНаОплату,
	МИНИМУМ(ПервыйДеньЗадолженности.Период) КАК Период
ИЗ
	НарастающиеИтоги КАК ПервыйДеньЗадолженности
		ЛЕВОЕ СОЕДИНЕНИЕ ПоследнийДеньБезЗадолженности КАК ПоследнийДеньБезЗадолженности
		ПО ПервыйДеньЗадолженности.СчетНаОплату = ПоследнийДеньБезЗадолженности.СчетНаОплату
ГДЕ
	ПервыйДеньЗадолженности.Период >= ЕСТЬNULL(ПоследнийДеньБезЗадолженности.Период, ДАТАВРЕМЯ(1,1,1,0,0,0))
	И ПервыйДеньЗадолженности.СуммаОстаток > 0

СГРУППИРОВАТЬ ПО
	ПервыйДеньЗадолженности.СчетНаОплату
Показать
coollerinc; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот