БД_РЕДАКТОР: обработчики В – выделения записи и Ж – множественного выделения записей

пользователь
Регистрация: 17.06.2015

Доброго времени суток!

Помогите, пожалуйста, разобраться с этими обработчиками. В хэлпе по БД_РЕДАКТОР очень краткое описание. Включаю их и никаких изменений кроме контекстного меню не вижу.

Обработчик выделения записи не срабатывает ни при каких телодвижениях. Только появляется и исчезает "птица" в контекстном меню.

Множественное выделение в моем понятии - это провести курсором по нескольким записям при нажатой левой кнопке мыши (лкм) или в любом порядке выделять Ctrl+лкм. А тут срабатывает только обработчик при выборе пунктов контекстного меню. А как выделить группу записей, например для последующей обработки?

Прошу объяснить с примером и/или "ткнуть" в работающий код в программе. Вроде бы полезная должна быть вещь, а как использовать? Работаю в интерпретаторе через список в ВЫРАЖЕНИИ.

модератор
Регистрация: 06.09.2007

Здравствуйте!

Множественное выделение в моем понятии - это провести курсором по нескольким записям при нажатой левой кнопке мыши (лкм) или в любом порядке выделять Ctrl+лкм.

В БД_РЕДАКТОР поддерживается только второй вариант - в любом порядке с инверсией выбора.
Существует специальный режим, который переключается и отображается в пункте контекстного меню "Режим выделения". Когда он включен, то левый клик или нажатие Enter приводят не к редактированию записи, а к переключению (toggle) состояния ее выбора. Также становятся доступными команды "Выделить все" и "Сброс выделения".

Несколько лет назад делал демо пример для наших прикладных разработчиков.
Краткая его суть такова.

Создается демо таблица фруктов: название + цена.
Делаем из нее SELECT в том виде, в каком хотим дать выбор пользователю.
Сохраняет результат SELECT во временную таблицу.
Добавляем во временную таблицу служебное поле - маркер выделения.
В примере я добавляю поле "selected", которое содержит "V" для выбранных записей и пустую строку для остальных.

Вызываем БД_РЕДАКТОР для временной таблицы, указывая поле "selected" первым (чтобы галочки были в начале строки).
После закрытия (не)активность режима выбора доступна через АТРИБУТ("посл_ред_при_выборе"), ее можно запомнить где-нибудь (в конфигур. файле, своем атрибуте и т.п.), у меня в демо - просто в общей переменной.

Получаем выбранные записи через SELECT к временной таблице WHERE selected="V".

Обработчик ПереключениеПоляВыбора отвечает за смену состояния выделенности одиночной записи (при клике или Enter).
Обработчик МножУстПоляВыбора отвечает за "Выделить все" и "Сброс выделения" (логический параметр "уст": ДА - все, НЕТ - сброс). Реализуется через тривиальный UPDATE временной таблицы.

Исходные файлы SRC и IBL прилагаю.

Вложения
пользователь
Регистрация: 17.06.2015

Спасибо за развернутый ответ и пример! А то мне представлялось, что это внутри БД_РЕДАКТОРа зашито :).

Еще один вопрос по обработчикам БД_РЕДАКТОРа: можно ли из обработчика, например Ф или С, закончить редактирование, как по кнопкам "ОК" и "Отмена"? "СТОПы" не работают.

модератор
Регистрация: 06.09.2007

Еще один вопрос по обработчикам БД_РЕДАКТОРа: можно ли из обработчика, например Ф или С, закончить редактирование, как по кнопкам "ОК" и "Отмена"?

Непонятно, зачем такое может понадобиться.
Это же обработчики фильтрации и сортировки отображаемого набора записей, т.е. изменение параметров отображения.

пользователь
Регистрация: 17.06.2015

Вообще-то это не связано с фильтрацией или сортировкой.

У меня есть пользовательские настройки видов справочников: ширина, видимость и позиция поля в таблице. Каждый раз при просмотре крайне неудобно сжимать/растягивать или прятать поля. Поэтому, настроив один раз вид справочника, всегда получаешь необходимую информацию. Настройку удобнее всего производить в браузере, когда сразу видишь результат. После настройки необходимо перезапустить БД_РЕДАКТОР, чтобы увидеть изменения.

Сейчас для этого использую кнопку "ОК", когда "ред_при_выборе=ДА", и специальный режим, задаваемый в определениях, чтобы его можно было выключить, когда настройка не нужна. Когда задан режим настройки, при нажатии на "ОК" запускается программа настройки видимости. По отмене браузер закрывается.

Оптимально для этого иметь кнопку "Настройка" или "Вид", которая появляется при наличии соотвествующего обработчика, как в фильтрации и сортировке.

Думал, может приспособить для этого кнопки фильтра и сортировки :)

P.S. Браузер у меня один для всех БД, а их описания полей, ссылки на обработчики, настройки видимости и заголовки поле находятся в специальных БД.

модератор
Регистрация: 06.09.2007

Можно будет добавить отдельную кнопку Настройка/Вид, чтобы перезапуск основного окна БД_РЕДАКТОР происходила автоматически.

пользователь
Регистрация: 17.06.2015

Просто перезапуск он и в фильтрации/сортировке есть. А как считать новые настройки? Лучше, если обработчик возвращает НЕТ - перезапуск, а если ДА - то выход, а там БД_РЕДАКТОР в цикле и через какой-нибудь атрибут решать перезапустить или закончить редактирование.

модератор
Регистрация: 06.09.2007

Не вижу сценария, когда после закрытия диалога настройки (по ОК) нужно закрытие основного окна БД_РЕДАКТОР по ОК. Т.е. с осуществлением выбора текущей записи, которой может и не быть (пустая таблица, курсор стоит на "+").

Предлагаю сделать так. Добавить новый обработчик "Й" (НастроЙка):
ФУНКЦИЯ ТИП_SQL ТИП_ЛОГИКА: <Имя>(ПЕРЕМ ТИП_СТРОКА: код)

Если обработчик возвращает НЕТ, то трактуем это как нажатие "Отмена" в диалоге настройки и ничего не делаем. Если обработчик возвращает ДА, то смотрим значение выходного параметра "код". Если "код" пустая строка, то закрытие окна БД_РЕДАКТОР не требуется, но требуется обновление таблицы (также как в обработчиках фильтра и сортировки).
Если код не пустая строка, то закрываем БД_РЕДАКТОР по "Отмена" (это всегда возможно) и устанавливаем значение "код" в атрибут "бд_ред_настройка".

Пользовательский "код" после выхода из БД_РЕДАКТОР может анализировать значение атрибута "бд_ред_настройка" и принимать решение о выходе из цикла, продолжении цикла и т.п.

Если давать возможность закрытия БД_РЕДАКТОР по ОК, то возникает логическое противоречие. Что должен обрабатывать пользовательский код? Выбор записи или код настройки?

пользователь
Регистрация: 17.06.2015

Закрытие, как по ОК, необходимо для получения текущего номера записи для последующей передачи в БД_РЕДАКТОР в параметр "номер" и возврата к ней при перезапуске БД_РЕДАКТОР.
Даже если курсор стоит на "+", получем номер следующей записи. Например, в БД 99 записей, получим 100, подставим в "номер" и окажемся в том же месте. 

Предлагаю сделать так. Добавить новый обработчик "Й" (НастроЙка):
ФУНКЦИЯ ТИП_SQL ТИП_ЛОГИКА: &lt;Имя&gt;(ПЕРЕМ ТИП_СТРОКА: код)

Прекрасная идея. Только непонятно назначение параметра "код".

Если "код" пустая строка, то закрытие окна БД_РЕДАКТОР не требуется, ?

Возможно я мыслю категориями языка «Инфо-Бухгалтер», т.к. чтобы изменить вид окна БД_РЕДАКТОРа, например: спрятать ненужные столбцы, добавить новые, изменить их размер и т.п., мне необходимо перезапустить БД_РЕДАКТОР с получением положения курсора.
Алгоритм простой: 
  1) перед запуском БД_РЕДАКТОРа создаю $атрибут с любым названием, например $бд_настройка;
  2) запускаю БД_РЕДАКТОР;
  3) нажимаю на кнопку "Настройка";
  4) в обработчике, если изменены параметры просмотра, устанавливаю значение $атрибута и значение функции ДА, если не требуется изменение вида - НЕТ;
  5) если обработчик вернул НЕТ, как вы и предлагаете, ничего не делаем;
  6) если обработчик вернул ДА, БД_РЕДАКТОР закрывается, как по ОК;
  7) считываем $атрибут и принимаем решение: перезапускать или выбирать.
При этом ничего не меняется в текущем поведении БД_РЕДАКТОРа, т.к. несуществующий атрибут будет возвращать "". Вопрос только в том будет ли виден $атрибут в обработчике БД_РЕДАКТОРа, запускаемого через ВЫРАЖЕНИЕ? Может его делать глобальным?