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

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

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

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

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

Вложенный Запрос

  • Автор темы Дайнеко
  • Дата начала
Д

Дайнеко

Запрос должен выбрать сведения из Документа и его проводок. На одну строку документа может быть несколько проводок. Поэтому во внутреннем запросе проводки группируются и затем объединяются по реквизиту проводки "НомерСтрокиДок".
Пример:
Пример.JPG
Код:
ВЫБРАТЬ
РасходСырьяТовары.НомерСтроки КАК НомерСтроки,
РасходСырьяТовары.Счет Как СчетДок,
Проводки.НомерСтрокиДок КАК НомерСтрокиДок
Проводки.СуммаСто,
ИЗ
Документ.РасходСырья.Товары КАК РасходСырьяТовары
ЛЕВОЕ СОЕДИНЕНИЕ 
(ВЫБРАТЬ
БухИтоги.НомерСтрокиДок КАК НомерСтрокиДок,
СУММА(БухИтоги.СуммаР) КАК СуммаР,
СУММА(ВЫБОР
КОГДА БухИтоги.СчетКт = &Счет
ТОГДА БухИтоги.СуммаР
ИНАЧЕ 0
КОНЕЦ) КАК СуммаСто
ИЗ
РегистрБухгалтерии.БухИтоги КАК БухИтоги

СГРУППИРОВАТЬ ПО
БухИтоги.Регистратор,
БухИтоги.НомерСтрокиДок
) КАК Проводки
ПО 
РасходСырьяТовары.Ссылка = Проводки.Регистратор И
РасходСырьяТовары.НомерСтроки = Проводки.НомерСтрокиДок

Моя проблема в том, что надо во внутреннем запросе построить выражение ВЫБОР и в нем оперировать реквизитом из документа "РасходСырьяТовары.Счет Как СчетДок", т.е из головного запроса. Я в отладочных целях упростил само выражение и использовал параметр &Счет. Вот его и надо заменить. Это возможно?
 
U

unknown181538

Ну какой параметр во вложенный запрос?
Надо делать внутреннее соединение по РасходСырьяТовары.Счет = БухИтоги.СчетКт, а потом уже группировать.
 
Д

Дайнеко

Т.е. Группировку сделать не вложенном запросе, а в основном? Т.е. вообще без вложенного.
Да я бы так и сделал. Но у меня более сложная задача с обработкой счетов в проводках.
Надо анализировать, если нужный Счет = СчетКт, то результирующая СуммаСто = БухИтоги.СуммаР, если Счет = СчетДт, то умножить -1.
Код:
			СУММА(ВЫБОР
КОГДА БухИтоги.СчетКт = &Счет
ТОГДА БухИтоги.СуммаР
КОГДА БухИтоги.СчетДт = &Счет
ТОГДА - БухИтоги.СуммаР
ИНАЧЕ 0
КОНЕЦ) КАК СуммаСто
Спасибо, буду думать. А что если вместо ВЫБОР соединить 2 набора, а результирующий уже объединить по "Счет".
 
U

unknown181538

Не вижу проблемы. В соединении можно написать, что совпадать может по д*цензура*у или по кредиту.
 
Д

Дайнеко

Не вижу проблемы. В соединении можно написать, что совпадать может по д*цензура*у или по кредиту.

Спасибо. Получилось таким методом:
* Подчиненный сделал из объединения 2-х наборов: 1-только счет кредита и сумма, 2-только счет д*цензура* и сумма с минусом.
* Соединил с документом
* Группировал по реквизитам документа. Вот этого хотел избежать. Т.к. делаю универсальный механизм, выдающий любые реквизиты док-та. Поэтому для простоты хотелось иметь вложенный запрос уже запрос свернутым и отсеянным.
Код:
ВЫБРАТЬ
РасходСырьяТовары.НомерСтроки КАК НомерСтроки,
РасходСырьяТовары.Счет КАК Счет,
РасходСырьяТовары.Товар,
РасходСырьяТовары.Количество,
СУММА(Проводки.СуммаР) КАК СуммаСто
ИЗ
Документ.РасходСырья.Товары КАК РасходСырьяТовары
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
БухИтоги.Регистратор КАК Документ,
БухИтоги.НомерСтрокиДок КАК НомерСтроки,
БухИтоги.СчетКт КАК Счет,
БухИтоги.СуммаР КАК СуммаР
ИЗ
РегистрБухгалтерии.БухИтоги КАК БухИтоги
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
БухИтоги.Регистратор,
БухИтоги.НомерСтрокиДок,
БухИтоги.СчетДт,
-БухИтоги.СуммаР
ИЗ
РегистрБухгалтерии.БухИтоги КАК БухИтоги


ПО РасходСырьяТовары.Ссылка = Проводки.Документ
И РасходСырьяТовары.НомерСтроки = Проводки.НомерСтроки
И РасходСырьяТовары.Счет = Проводки.Счет
ГДЕ
РасходСырьяТовары.Ссылка = &Документ

СГРУППИРОВАТЬ ПО
РасходСырьяТовары.НомерСтроки,
РасходСырьяТовары.Счет,
РасходСырьяТовары.Товар,
РасходСырьяТовары.Количество

УПОРЯДОЧИТЬ ПО
НомерСтроки



По ходу работы возник вопрос оптимизации.
Основной запрос содержит условие: ГДЕ РасходСырьяТовары.Ссылка = &Документ
И он объединяется (левое) с вложенным запросом по этому же полю Ссылка. Вложенный выбирает движения документа (регистр накопления или бухгалтерии).

Вопрос: надо ли во вложенном также ставить условие отбора по документу. Ведь даже если не ставить, то объединение отсечет только нужные записи и результат в обоих случаях получается правильный.
Но сточки зрения загрузки сервера, делает ли он большую работу, когда во вложенном запросе выбирая регистр всех документов, а только потом отсекает ненужные. Нет большого набора данных чтобы проверить.
 
U

unknown181538

Имел в виду, что быстрее не будет, но доказать не могу. В подобном запросе, если бы правая часть выбиралась полностью, были бы серьезные тормоза. Никогда этого не наблюдалось.
 
Мы в соцсетях:

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