gifts2017

Запрос+Пример отчета: Количество дней с остатком товара. Доработанный запрос

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

После долгих поисков необходимых запросов, наткнулся на статью местного ресурса http://infostart.ru/public/17023/. Только вот была беда небольшая: по условию моей задачи, днем с остатками должен был считаться даже тот день, когда товар пришел и ушел за один день. Т.е. использование значения КонечныйОстаток не представляется возможным, потому что значение будет 0. За основу взят запрос из вышеуказанной статьи, только малость доработан. Проверял на КА, ред. 1.1
ВЫБРАТЬ
	ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
	ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
	СУММА(ВЫБОР
			КОГДА ТоварыНаСкладахОстаткиИОбороты.Период = НАЧАЛОПЕРИОДА(&КонПериода, ДЕНЬ)
				ТОГДА ВЫБОР
						КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстатокПредыдущий > 0
							ТОГДА ВЫБОР
									КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0
										ТОГДА РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.ПредыдущийПериод, ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
									ИНАЧЕ РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.ПредыдущийПериод, &КонПериода, ДЕНЬ)
								КОНЕЦ
						ИНАЧЕ ВЫБОР
								КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0
									ТОГДА РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.Период, &КонПериода, ДЕНЬ)
								ИНАЧЕ ВЫБОР
										КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход = ТоварыНаСкладахОстаткиИОбороты.КоличествоРасходПредыдущий
											ТОГДА 1
										ИНАЧЕ 0
									КОНЕЦ
							КОНЕЦ
					КОНЕЦ
			ИНАЧЕ ВЫБОР
					КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстатокПредыдущий > 0
						ТОГДА ВЫБОР
								КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0
									ТОГДА РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.ПредыдущийПериод, ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
								ИНАЧЕ РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.ПредыдущийПериод, ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
							КОНЕЦ
					ИНАЧЕ ВЫБОР
							КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0
								ТОГДА 1
							ИНАЧЕ ВЫБОР
									КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход = ТоварыНаСкладахОстаткиИОбороты.КоличествоРасходПредыдущий
										ТОГДА 1
									ИНАЧЕ 0
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ) КАК КоличествоДнейСОстатком
ИЗ
	(ВЫБРАТЬ
		ТаблицаПредыдущиеПериоды.Номенклатура КАК Номенклатура,
		ТаблицаПредыдущиеПериоды.Склад КАК Склад,
		ТаблицаПредыдущиеПериоды.Период КАК Период,
		ТаблицаПредыдущиеПериоды.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
		ТаблицаПредыдущиеПериоды.КоличествоРасход КАК КоличествоРасход,
		ТаблицаПредыдущиеПериоды.ПредыдущийПериод КАК ПредыдущийПериод,
		ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстатокПредыдущий,
		ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасходПредыдущий
	ИЗ
		(ВЫБРАТЬ
			ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
			ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
			ТоварыНаСкладахОстаткиИОбороты.Период КАК Период,
			ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
			ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
			МАКСИМУМ(ТоварыНаСкладахОстаткиИОбороты1.Период) КАК ПредыдущийПериод
		ИЗ
			РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
					&НачПериода,
					&КонПериода,
					День,
					,
					Номенклатура = &Номенклатура
						И Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты
				ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
						&НачПериода,
						&КонПериода,
						День,
						,
						Номенклатура = &Номенклатура
							И Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты1
				ПО (ИСТИНА)
					И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ТоварыНаСкладахОстаткиИОбороты1.Номенклатура
					И ТоварыНаСкладахОстаткиИОбороты.Склад = ТоварыНаСкладахОстаткиИОбороты1.Склад
					И ТоварыНаСкладахОстаткиИОбороты.Период > ТоварыНаСкладахОстаткиИОбороты1.Период
		
		СГРУППИРОВАТЬ ПО
			ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
			ТоварыНаСкладахОстаткиИОбороты.Склад,
			ТоварыНаСкладахОстаткиИОбороты.Период,
			ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
			ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК ТаблицаПредыдущиеПериоды
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
					&НачПериода,
					&КонПериода,
					День,
					,
					Номенклатура = &Номенклатура
						И Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты
			ПО (ИСТИНА)
				И ТаблицаПредыдущиеПериоды.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
				И ТаблицаПредыдущиеПериоды.Склад = ТоварыНаСкладахОстаткиИОбороты.Склад
				И ТаблицаПредыдущиеПериоды.ПредыдущийПериод = ТоварыНаСкладахОстаткиИОбороты.Период) КАК ТоварыНаСкладахОстаткиИОбороты

СГРУППИРОВАТЬ ПО
	ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
	ТоварыНаСкладахОстаткиИОбороты.Склад
АВТОУПОРЯДОЧИВАНИЕ

Возможно, запрос где-то не оптимизирован, но я постараюсь его еще доработать. Запрос ограничен выборкой по Номенклатуре и Складу, что можно легко отключить и наложить другие условия. Это было сделано просто для проверки самого запроса.

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

Наименование Файл Версия Размер
Пример отчета "Количество дней с остатками" 2
.epf 9,70Kb
18.12.14
2
.epf 9,70Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Константин Юрин (kostyaomsk) 18.12.14 08:09
Такие задачки часто бывают. Нужно запомнить.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа