Пакетні запити для чайників
Коли мій запит став таким складним, що перевищив межі мого розуміння, я вирішив використовувати пакетні запити.
Як виявилося все дуже просто. Потрібно просто написати кілька запитів, між якими ставиться крапка з комою. Результат повернеться в останньому запиті.
Пакетні запити з'явилися тільки в версії 8.1.11.67.4.
Ось текст запиту:
ВИБРАТИ Т1.Зн помістити ВТБукви ІЗ (ВИБРАТИ "А" ЯК Зн ОБ'ЄДНАТИ ВСІ ВИБРАТИ "Б") ЯК Т1;
ВИБРАТИ Т1.Зн помістити ВТЦіфри ІЗ (ВИБРАТИ "1" ЯК Зн ОБ'ЄДНАТИ ВСІ ВИБРАТИ "2") ЯК Т1;
ВИБРАТИ ТБ.Зн, ТЦ.Зн, ТБ.Зн + ТЦ.Зн З ВТБукви ЯК ТБ, ВТЦіфри ЯК ТЦ
Пакетні запити підтримуються в будь-якої звичайної консолі запитів.
На малюнку представлений зразок виконання запиту:
А тепер трохи з досвіду. Навіщо потрібні пакетні запити.
Справа в тому, що в тимчасову таблицю можна вкласти якийсь проміжний результат, який потім може знадобитися в декількох повторних запитів.
Раніше, коли не було тимчасових таблиць, довелося б дублювати текст запиту.
Можна звичайно, обійтися без пакетного запиту, послідовно виконуючи кілька запитів і маніпулюючи вкладеними таблицями. Але з пакетними запитами зручніше. Просто пишеш запит, і не думаєш про розміщення тимчасових таблиць. Все відбувається саме.
Крім того, якщо використовується система компонування даних (СКД), вона грамотно відбирає потрібні поля і мінімізує весь пакет запитів.
Якщо у запитів був метод Запрос.Виполніть () то тепер з'явився метод Запрос.ВиполнітьПакет (). який повертає всі таблиці з пакета, у вигляді масиву.
Історія з життя
Поясню, що мене спонукало на пакетні запити.
Значить, уявіть є документ, у нього таблична частина. У колонці «Помилка» ознака, чи є помилка при заповненні документа. У колонці «ТекстОшібкі» може бути одне або декілька пропозицій з текстами помилок. Види помилок, що містяться в пропозиціях відомі заздалегідь.
Так ось, ми заносимо список всіх помилок в таблицю КодиОшібок - там міститься код помилки і подстрока пошуку.
Далі з'єднуємо табличну частину з кодами помилок.
Отримуємо для кожного рядка одну, дві або більше помилок. Оскільки в одному рядку може бути кілька помилок.
Але помилка може бути і не розпізнано, тобто прапор «Помилка» коштує, а текст помилки не видав нам код помилки.
Робимо ліве з'єднання, там де код помилки є NULL, даємо код помилки «Інші помилки».
Але проблема була в тому, що кодів помилок було близько 200, тому ліве з'єднання працювало дуже довго. Довелося замінити його на внутрішнє з'єднання, яке літало. Але при цьому губилися рядки, для яких помилка була не знайдено. Я так і не зміг зрозуміти, як витягти ці рядки в результат.
Запит писався для системи компоновки, тобто ніяких таблиць значень або тимчасових таблиць застосовувати не можна в принципі. Тут і стали в нагоді пакетні запити.
Я просто ще раз з'єднав всі рядки з помилками з усіма рядками, для яких були знайдені помилки, і додав все-таки вид помилки «Інші помилки».