Каталог решений - Как прибавить разное количество банковских/рабочих дней в запросе на каждую дату возникновения долга

Как прибавить разное количество банковских/рабочих дней в запросе на каждую дату возникновения долга

Как прибавить разное количество банковских/рабочих дней в запросе на каждую дату возникновения долга

В наличии

В компании возникла необходимость в получении даты возникновения просрочки по условиям договора либо в календарных, либо в рабочих днях. С календарными днями все просто. Здесь рассмотрим получение даты просрочки в рабочих днях.

Категория:

Описание

Постановка задачи:

Есть таблица, в которой указаны дата возникновения долга и допустимое количество дней просрочки в рабочих днях. Для простоты добавим сам документ в таблицу.

СсылкаДата возникновения долгаКол-во дней отсрочки
Док 104.03.201590
Док 204.03.2015 5
Док 304.03.201510
Док 405.03.2015 60

 В результате должны получить таблицу вида

СсылкаДата возникновения долгаКол-во дней отсрочкиДата возникновения просроченного долга
Док 104.03.201590 
Док 204.03.20155 
Док 304.03.201510 
Док 405.03.201560 

 

Первоначально был сделан отчет на СКД, куда помещался внешний набор данных. Но, посидев-покурив, решили сварганить запрос. И вот о нем и расскажу вам.

Реализация:

Первоначальные данные получаются следующим куском кода

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

Само собой получим Регламентированный производственный календарь.

ВЫБРАТЬ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ПОМЕСТИТЬ ВТ_РеглКалендарь
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ВидДня В(&ВидДня)

Здесь необходимо установить параметр «ВидДня» (значения перечисления Рабочий и Предпраздничный). Далее соединяем таблицу календаря саму с собой и получаем индекс даты (т.е. порядок следования записей) в нашей таблице

ВЫБРАТЬ
	ВТ_РеглКалендарь.ДатаКалендаря,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_РеглКалендарь1.ДатаКалендаря) КАК ИндексРегламентированногоКалендаря
ПОМЕСТИТЬ ВТ_РеглКалендарьСИндексами
ИЗ
	ВТ_РеглКалендарь КАК ВТ_РеглКалендарь
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РеглКалендарь КАК ВТ_РеглКалендарь1
		ПО ВТ_РеглКалендарь.ДатаКалендаря >= ВТ_РеглКалендарь1.ДатаКалендаря

СГРУППИРОВАТЬ ПО
	ВТ_РеглКалендарь.ДатаКалендаря
ИНДЕКСИРОВАТЬ ПО
        ИндексРегламентированногоКалендаря

Тут соединим таблицу ВТ и ВТ_РеглКалендарьСИндексами для того, что бы узнать какой индекс будет у нашей даты возникновения долга. Дополнительно добавим индексацию по расчетному полю для дальнейших соединений.

ВЫБРАТЬ
	ВТ.Ссылка,
	ВТ.Дата,
	ВТ.ДнейОтсрочкиДолга,
	ВТ_РеглКалендарьСИндексами.ИндексРегламентированногоКалендаря КАК ИндексДатыДолга
ПОМЕСТИТЬ ВТ_СИндексом
ИЗ
	ВТ КАК ВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РеглКалендарьСИндексами КАК ВТ_РеглКалендарьСИндексами
		ПО ВТ.Дата = ВТ_РеглКалендарьСИндексами.ДатаКалендаря

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

СсылкаДата возникновения долгаКол-во дней отсрочкиИндекс даты долга
Док 104.03.2015901 293
Док 204.03.201551 293
Док 304.03.2015101 293
Док 405.03.2015601 294

Здесь колонка «Индекс даты долга» показывает индекс поля «Дата возникновения долга» в таблице ВТ_РеглКалендарьСИндексами.

Далее мы можем получить результат «Дата возникновения просроченного долга» для каждой даты долга с учетом дней просрочки. Для этого соединим две таблицы.

ВЫБРАТЬ
	ВТ_СИндексом.Ссылка,
	ВТ_СИндексом.Дата КАК ДатаВозникновенияДолга,
	ВТ_СИндексом.ДнейОтсрочкиДолга,
	ВТ_РеглКалендарьСИндексами.ДатаКалендаря КАК ДатаВозникновенияПросроченногоДолга
ИЗ
	ВТ_СИндексом КАК ВТ_СИндексом
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РеглКалендарьСИндексами КАК ВТ_РеглКалендарьСИндексами
		ПО (ВТ_РеглКалендарьСИндексами.ИндексРегламентированногоКалендаря - ВТ_СИндексом.ИндексДатыДолга = ВТ_СИндексом.ДнейОтсрочкиДолга)

Здесь условие соединения означает, что мы хотим получить только ту дату из таблицы ВТ_РеглКалендарьСИндексами, у которой  разница Индекса регламентированного календаря и Индекса даты долга будет равно именно количеству дней отсрочки.

Результирующая таблица выглядит следующим образом:

СсылкаДата возникновения долгаКол-во дней отсрочкиДата возникновения просроченного долга
Док 104.03.20159014.07.2015
Док 204.03.2015512.03.2015
Док 304.03.20151019.03.2015
Док 405.03.201560

02.06.2015

 

Результирующий запрос

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ПОМЕСТИТЬ ВТ_РеглКалендарь
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ВидДня В(&ВидДня)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_РеглКалендарь.ДатаКалендаря,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_РеглКалендарь1.ДатаКалендаря) КАК ИндексРегламентированногоКалендаря
ПОМЕСТИТЬ ВТ_РеглКалендарьСИндексами
ИЗ
	ВТ_РеглКалендарь КАК ВТ_РеглКалендарь
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РеглКалендарь КАК ВТ_РеглКалендарь1
		ПО ВТ_РеглКалендарь.ДатаКалендаря >= ВТ_РеглКалендарь1.ДатаКалендаря

СГРУППИРОВАТЬ ПО
	ВТ_РеглКалендарь.ДатаКалендаря
ИНДЕКСИРОВАТЬ ПО
        ИндексРегламентированногоКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ.Ссылка,
	ВТ.Дата,
	ВТ.ДнейОтсрочкиДолга,
	ВТ_РеглКалендарьСИндексами.ИндексРегламентированногоКалендаря КАК ИндексДатыДолга
ПОМЕСТИТЬ ВТ_СИндексом
ИЗ
	ВТ КАК ВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РеглКалендарьСИндексами КАК ВТ_РеглКалендарьСИндексами
		ПО ВТ.Дата = ВТ_РеглКалендарьСИндексами.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_СИндексом.Ссылка,
	ВТ_СИндексом.Дата КАК ДатаВозникновенияДолга,
        ВТ_СИндексом.ДнейОтсрочкиДолга,
	ВТ_РеглКалендарьСИндексами.ДатаКалендаря КАК ДатаВозникновенияПросроченногоДолга
ИЗ
	ВТ_СИндексом КАК ВТ_СИндексом
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РеглКалендарьСИндексами КАК ВТ_РеглКалендарьСИндексами
		ПО (ВТ_РеглКалендарьСИндексами.ИндексРегламентированногоКалендаря - ВТ_СИндексом.ИндексДатыДолга = ВТ_СИндексом.ДнейОтсрочкиДолга)

Ссылки на другие публикации подобной темы:

//sale.itcity.ru/public/99507/ Банковские дни запросом 
//sale.itcity.ru/public/166349/ Добавить к дате рабочие дни в запросе 
//sale.itcity.ru/public/320887/ Расчет рабочих дней в запросе 
//sale.itcity.ru/public/338386/ Расчет банковских (рабочих) дней (Оригинальный способ) 
//sale.itcity.ru/public/358354/ Прибавление банковских дней к дате в запросе 

has been added to your cart:
Оформление заказа