Итак, частенько стоит задача организации многоуровневого меню - ну там что-нибудь выбрать по последовательной иерархии... Как пример (по-быстрому притянут за уши) - воспользуемся такой задачей: юзеру необходимо сделать выбор конкретной номенклатуры конкретного производителя номенклатуры по конкретной группе номенклатуры. Чебурашек будем тренировать на лекарственных препаратах.
Источником данных может быть что угодно, главное (в данном рассматриваемом решении) - перед использованием "миногоуровневого меню" источником данных для меню должна быть плоская ТЗ, например, получим список реализованной номенклатуры:
Источник данных
"Плоская ТЗ" - это значит, что в ней нет никаких итогов-группировок и прочего.. В нашем примере источником данных для меню является ТЗ со строками такой структуры: группа лек.средств-производитель-номенклатура, например:
Формат плоской ТЗ
Важное замечание: иерархия меню определяется порядком столбцов в ТЗ-источнике!!! Смотрим, как это выглядит...
1. Запускаем выбор меню:
Запуск меню
В данном нашем примере - по нажатию кнопки производится выборка данных (см.вышеприведенный код), и вываливается для выбора первый уровень меню (Группа, см.формат плоской ТЗ):
Первый уровень меню
Выбираем нужный пункт меню (в данном случае это - ПСИХОЛЕПТИКИ) и попадаем на следующий уровень меню (Производитель, см.формат плоской ТЗ):
Второй уровень меню
Выбираем нужный пункт меню (в данном случае это - LUNDBECK) и попадаем на следующий уровень меню (Номенклатура, см.формат плоской ТЗ):
Третий уровень меню
После выбора ПОСЛЕДНЕГО уровня (меню-то иерархическое) - пользователь в том или ином виде получает свой выбор (для философского созерцания - можно открыть карточку номенклатуры, или для производительного труда - выбор далее обрабатывается программно, исходя из логики алгоритма/задачи). В нашем примере, выбор пользователя чисто иллюстративно показывается в табло сообщений:
Результат выбора меню
Вызов меню
Признаком того, что меню не выбрано - пустое значение, которое возвращает функция глБВК_ВернутьМеню(...). В качестве признака выбора/невыбора меню также можно использовать признак "непустой/пусто" списока значений СЗИтогВыбора.
Итог выбора меню - находится в списке значений СЗИтогВыбора. Порядок значений в списке соответствует иерархии выбора всех уровней меню:
Итог выбора меню
В списке значений представление - это название очередного уровня иерархии меню, а значение - пункт, выбранный на данном уровне иерархии. В нашем примере это можно посмотреть на рисунке (см.выше) "Результат выбора меню":
выбор: Группа = ПСИХОЛЕПТИКИ,Производитель = Lundbeck,Номенклатура = Клопиксол табл.п.о 25мг №50
..
Данный результат формируется просто: последовательно проходимся по списку значений и формируем итоговую строку:
Пример формирования вывода результата
Если нас интересует только "конечный" выбор, то его можно получить так:
СЗИтогВыбора.Получить(СЗИтогВыбора.РазмерСписка()).
..вот и весь алгоритм. В компактном виде большую часть этого алгоритма занимает подготовка данных для меню и вывод результата выбора из меню на экран... весь код:
Весь код примера
Непосредственно всю "черновую" работу выполняют две функции (которые можно разместить в своем глобальном модуле):
- глБВК_ВернутьМеню(...) - рекурсивная функция, обеспечивающая навигацию по иерархическому меню;
- глОтобратьПоКолонке(...) - широко известная функция, которая возвращает подмножество ТЗ по указанной колонке и значению этой колонки.
Конкретное рассмотрение функционала этих функций не входит в предмет данной статьи.
Пример обработки, с рассмотренными выше возможностями (немного изменен источник данных) приведен здесь //infostart.ru/projects/985/?ref=174
Если статья оказалась для вас полезной - скажи спасибо автору - приплюсуй рейтинг.