• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Остатки На Произвольную Дату

  • Автор темы Allexei
  • Дата начала
A

Allexei

Здравствуйте.Вопрос такой. У меня есть документ заказа клиента. В ТЧ документа для каждого товара ставятся даты отгрузки. Вариант контроля остатков по складу - просто остатки, без резервов и графиков движений. Так вот вопрос как одним запросом(запрос в цикле не предлагать) получить срез остатков по товарам в ТЧ и датам их отгрузки?
 
P

puh14

Ну из разряда извращений - пожалуйста. Загоняем наш фильтр по товарам (или партиям) и датам отгрузки в временную таблицу (назовем её первая) - она будет нужна для кейсов в запросах. Берем виртуальную таблицу остатков и вычисляем начальные остатки на минимальную дату отгрузки по всем позициям из первой таблицы, помещяем результат в времянку под названием вторая. Берем виртуальную таблицу оборотов и вычисляем обороты по позициям из первой таблицы. Параметры начала / конца периода - минимальная/максимальная дата отгрузки соответственно, тут же можно добавить условие на дату в джойне, типа Первая.Номенклатура = Обороты.Номенклатура и Первая.Датаотгрузки >= Обороты.Период.
также тут можно уже выдать приход как например Сумма(Сумма(Количествоприход) - Сумма(КоличествоРасход)) Как Полныйприход.

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

апдейт - туплю, первую таблицу проще получить запросом из документа, чем с менеджером мучаться.
 
A

Allexei

Извиняюсь за тупизм, но все же...

-Берем виртуальную таблицу остатков и вычисляем начальные остатки на минимальную дату отгрузки по всем позициям из первой таблицы
Минимальную дату передаем в запрос как параметр?

Параметры начала / конца периода - минимальная/максимальная дата отгрузки
максимальная дата отгрузки это есть максимальная дата по все таблице документа?

А так идея понятна. Огромный плюс, и респект!
 
A

Allexei

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

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

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

СГРУППИРОВАТЬ ПО
ТоварыПоЗаказу.Склад,
ТоварыПоЗаказу.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиНаНачалоПериода.Склад,
ОстаткиНаНачалоПериода.Номенклатура,
ЕСТЬNULL(ОстаткиНаНачалоПериода.СвободныйОстаток, 0) + ЕСТЬNULL(Оборот.ОборотТоваров, 0) КАК СвободныйОстаток
ИЗ
ОстаткиНаНачалоПериода КАК ОстаткиНаНачалоПериода
ПОЛНОЕ СОЕДИНЕНИЕ Оборот КАК Оборот
ПО ОстаткиНаНачалоПериода.Склад = Оборот.Склад
И ОстаткиНаНачалоПериода.Номенклатура = Оборот.Номенклатура
 
D

Darlock

Комрады, а не проще ли собрать текст запроса динамически, обходя циклом всю ТЧ? Т.е. пускаем цикл по ТЧ, в конструкторе собираем шапку запроса, а в теле цикла добавляем необходимы е нам поля ручками, попутно указывая параметр и значение параметра. Посе цикла весь полученый текст пихаем в текст запроса и выполняем.
 
A

Allexei

Не, не не. "Шурик, это не наш метод". Задачка как раз и состоит в том что бы сделать это одним запросом ибо на СКД. А формировать в ручную для СКД текст запроса это долго и не интересно.
 
D

Darlock

Не, не не. "Шурик, это не наш метод". Задачка как раз и состоит в том что бы сделать это одним запросом ибо на СКД. А формировать в ручную для СКД текст запроса это долго и не интересно.
Классная формулировка...надо взять на вооружение :eek:fftop: а если серьезно.... тогда только вложенные запросы могут помочь, и соединять их с регистром остатков
 
A

Allexei

Задачка решена.Запрос выложен выше.Все работает.Все счастливы.Спасибо всем :eek:fftop:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!