Анализ сложных запросов с временными таблицами-2. Не такой мудреный.



Навеяно публикацией "Анализ сложных запросов с временными таблицами".

Долго пользовался предложенным методом //infostart.ru/public/90130/ . Как-то не догадывался опубликовать Smile. Потом увидел запросник, идея понравилась, но не совсем понравился способ просмотра временных таблиц. Да и используется там консоль запросов, а я пользуюсь консолью отчетов. Я понимаю, что способов просмотра временных таблиц реализовано великое множество, но все же осмелюсь предложить велосипед свою доработку стандартной консоли отчетов для просмотра временных таблиц.

Код для вывода временных таблиц приведен ниже:

 

// формирует список временных таблиц из текста запроса
//
// Параметры
//
// Возвращаемое значение:
//   <Массив>   - массив наименований временных таблиц
//
Функция ПолучитьМассивНаименованийВременныхТаблиц() Экспорт

МассивНаименований = Новый Массив;
ТекстЗапроса = ПостроительОтчетов.Текст;// преобразуем к стандартному тексту запроса с форматированием
Конструктор = Новый КонструкторЗапроса(ТекстЗапроса);
ТекстЗапроса = Конструктор.Текст;

Шаблон = "Поместитьs+[A-z0-9_А-я]+"; //Поместить + любое количество пробелов (TAB, CR,LF FF)+ следующее слово
RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы  с регулярными выражениями
RegExp.MultiLine = Истина;    // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина;     // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = Шаблон;
Если НЕ RegExp.Test(ТекстЗапроса) Тогда Возврат МассивНаименований КонецЕсли;
МассивСтрок = RegExp.Execute(ТекстЗапроса);
Для каждого Элемент  Из МассивСтрок Цикл
МассивНаименований.Добавить(СокрЛП(СтрЗаменить(Элемент.Value, "ПОМЕСТИТЬ", "")));
КонецЦикла;

Возврат МассивНаименований;

КонецФункции // ПолучитьСписокВременныхТаблиц()

// формирование структуры временных таблицы
//
// Параметры
//
// Возвращаемое значение:
//   <Структура>   - структура, содержащая временные таблицы
//
Функция ПолучитьВременныеТаблицы() Экспорт

СтруктураВременныхТаблиц = Новый Структура;
МассивНаименований = ПолучитьМассивНаименованийВременныхТаблиц();
Запрос = ПостроительОтчетов.ПолучитьЗапрос();
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.ВыполнитьПакет();
ВременныйЗапрос = Новый Запрос();
ВременныйЗапрос.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
Для каждого Элемент Из МассивНаименований Цикл
ВременныйЗапрос.Текст = "Выбрать * ИЗ " + Элемент;
ТаблицаЗапроса = ВременныйЗапрос.Выполнить().Выгрузить();
СтруктураВременныхТаблиц.Вставить(Элемент, ТаблицаЗапроса);
КонецЦикла;
Возврат СтруктураВременныхТаблиц;

КонецФункции // ПолучитьВременныеТаблицы()

// формирование элементов формы для вывода таблицы
//
// Параметры
//
Процедура СоздатьСтраницуДляВыводаВременнойТаблицы(ЭлементСтруктуры)

Наименование = ЭлементСтруктуры.Ключ;
ТаблицаЗапроса = ЭлементСтруктуры.Значение;
Страница = ЭлементыФормы.ПанельВременныхТаблиц.Страницы.Добавить();
Страница.Имя = Наименование;
Страница.Заголовок = Наименование;
ЭлементыФормы.ПанельВременныхТаблиц.ТекущаяСтраница = Страница;
ТабличноеПоле = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), Наименование, ,ЭлементыФормы.ПанельВременныхТаблиц);
ТабличноеПоле.Верх = 0;
ТабличноеПоле.Лево = 0;
ТабличноеПоле.Ширина = ЭлементыФормы.ПанельВременныхТаблиц.Ширина - 2;
ТабличноеПоле.Высота = ЭлементыФормы.ПанельВременныхТаблиц.Высота - 20;
ТабличноеПоле.ТолькоПросмотр = Истина;

ТабличноеПоле.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ЭлементыФормы.ПанельВременныхТаблиц, ГраницаЭлементаУправления.Низ);
ТабличноеПоле.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭлементыФормы.ПанельВременныхТаблиц, ГраницаЭлементаУправления.Право);

ТабличноеПоле.Значение = ТаблицаЗапроса;
ТабличноеПоле.СоздатьКолонки();

КонецПроцедуры // СоздатьСтраницуДляВыводаВременнойТаблицы()

// обработчик нажатия кнопки "Временные таблицы"
//
Процедура КоманднаяПанельФормыВременныеТаблицы(Кнопка)

ЭлементыФормы.ПанельВременныхТаблиц.Страницы.Очистить();
СтруктураВременныхТаблиц = ПолучитьВременныеТаблицы();
Для каждого Значение Из СтруктураВременныхТаблиц Цикл
СоздатьСтраницуДляВыводаВременнойТаблицы(Значение);
КонецЦикла;
ЭлементыФормы.ПанельРезультатов.ТекущаяСтраница = ЭлементыФормы.ПанельРезультатов.Страницы.ВременныеТаблицы;
ЭлементыФормы.ПанельВременныхТаблиц.Страницы.Удалить(0);// первая страница не нужна.

КонецПроцедуры

 

И не забыть добавить на форму страницу ПанельВременныхТаблиц, кнопку и повесить на нее обработчик.

Изменение от 25.09.2011
Добавлен файл с измененной обработкой «Консоль отчетов» для 8.1 с диска ИТС. В консоль добавлен функционал вывода временных таблиц для СКД.
Существующие ограничения: показ временных таблиц возможен только для первого набора данных типа «Запрос».

7 Comments

  1. ediks

    Навеяно публикацией «Анализ сложных запросов с временными таблицами».

    Перейти к публикации

    Reply ↓
  2. powerpc

    Вставил в стандартную Консоль Отчетов с диска ИТС. При записи в Конфигураторе ругается:

    {Форма.Форма.Форма(1395,17)}: Переменная не определена (ПостроительОтчетов)

    ТекстЗапроса = <<?>>ПостроительОтчетов.Текст; (Проверка: Толстый клиент (обычное приложение))

    {Форма.Форма.Форма(1427,11)}: Переменная не определена (ПостроительОтчетов)

    Запрос = <<?>>ПостроительОтчетов.ПолучитьЗапрос(); (Проверка: Толстый клиент (обычное приложение))

    Подскажите в чем дело ?

    Reply ↓
  3. ediks

    Сейчас посмотрел — действительно на ИТС сейчас другая обработка «Консоль отчетов». У меня скорее всего используется обработка, которая была еще в 8.0. Собственно, это показано на картинке.

    Reply ↓
  4. powerpc

    А можно как-то адаптировать под 8.2 ? Очень нужно, так как удобная вещь

    Reply ↓
  5. powerpc

    После обновления под 8.1 скачал. Сконвертировал под 8.2. Так классно работает, слов нет. Молодец. Классно сделал. Жаль нельзя еще плюсиков поставить. Спасибо тебе большое, ediks.

    Reply ↓
  6. DrAku1a

    Все это уже давно сделал и автор Запросника, и я в своей обработке «Выполнение и отладка запроса» (на вкладке «Результат» есть кнопка «Временные таблицы»).

    Способ использован именно такой как в Вашей публикации, за исключением того, что я не пользовался RegExp, т.к. не силен в регулярных выражениях (но чувствую необходимость исправить этот недочет).

    Reply ↓
  7. ediks

    (5) Больше консолей хороших и разных!!! :).

    Ну, а если по существу, то я вообще не собирался выкладывать никакие консоли. Эта публикация была задумывалась как статья к статье. Просто человек хороший попросил переделать родную консоль с ИТС. Собственно, это видно из комментариев.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *