Зависимые выпадающие списки в форме

Автор AlexWorkStream, 20 июля 2022, 13:49

0 Пользователи и 1 гость просматривают эту тему.

AlexWorkStream

День добрый. Застрял на моменте создания зависимого выпадающего списка в форме.
Как я понял, необходимо указать Критерий в конструкторе запросов, но вот как правильно это сделать - непонятно.
Для ясности, можно представить таблицы с областями и городами. Надо, чтобы в форме после введенного поля "Область", в следующей строке оставался только выбор городов из заданной области.

kompilainenn

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

AlexWorkStream

Цитата: kompilainenn от 20 июля 2022, 14:20
Гляньте, оно?
Увы нет. Я пересмотрел уже все эти уроки, но там все не то. Нашел похожее для Access https://www.youtube.com/watch?v=BVDiiWc53o8 , но как это реализовать здесь - хз.

economist

wiki.harlamenkov.ru про Base и поиск в Форме.

В Base логику работы Формы можно строить на связанных полях/ID, а можно реализовать макросами, привязанными к событиям контролов.

А вот Конструктор тут не помощник вообще, его логика невнятна. Ещё сайт для решения связи контролов - это myooo.ru
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

AlexWorkStream

Цитата: economist от 20 июля 2022, 19:40
wiki.harlamenkov.ru про Base и поиск в Форме. Ещё сайт для решения связи контролов - это myooo.ru
Спасибо, но там ничего подобного я не нашел. Есть что угодно, но только не это... Проблема остается, а решения нигде найти не могу(((

economist

#5
С макросом, имхо, можно реализовать даже самую идиотскую бизнес-логику, поэтому это "наш метод":

1) Имеем Список 1 ОБЛАСТИ и Список 2 ГОРОДА, оба заполняются из ТАБЛИЦА - таблицы БД вида "ОБЛАСТЬ-ГОРОД-ПРОДАЖИ" запросами. Конструктор форм позволяет создать связь, но делает это контр-интуитивно, поэтому сделаем связь ручками

Список 1 ОБЛАСТИ - первичный, главный. Заполним его: Поле со списком - ПКМ в Режиме разработки - Данные - Содержимое списка - SELECT DISTINCT Область FROM ТАБЛИЦА ORDER BY Область

2) Хотим чтобы Список 2 ГОРОДА показывал города из выбранной в Список 1 области. Для этого нужен макрос, который при каждой смене области - подменяет запрос Списка 2 на запрос с условием WHERE на фильтр по области. Макрос должен
- найти контрол Список 1 и считать текущую ОБЛАСТЬ
- найти контрол Список 2, обратиться к его SQL-свойству, а именно ListSource и заменить его.

Приведу пример для, имхо, самой правильной среды рисования Форм работы с данными из баз данных и "деловых приложений" из пакета OpenOffice|LibreOffice. А именно для Calc. В Base и Writer придется поправить пару слов.

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

В коде это выглядит так:

Sub Link_Oblast_Gorod  
oblast = ThisComponent.CurrentController.ActiveSheet.DrawPage.Forms(0).getByName("ОБЛАСТИ").Text
sql = "SELECT DISTINCT Город FROM ТАБЛИЦА WHERE Область = '" & oblast & "' ORDER BY 1"
ThisComponent.CurrentController.ActiveSheet.DrawPage.Forms(0).getByName("ГОРОДА").ListSource = sql
End sub


4) Макрос назначаем на события Списка 1, которые происходят со списком. Обычно их два:
- Текст изменен (возникает при вводе первых букв, что реализует "быстрый поиск по первым введенным символам с автодополнением"
- Состояние изменено (это при выборе готового элемента мышью/клавой)

Поле со списком - ПКМ в Режим разработки - Свойства элемента - События Данные - <событие> - [...] - выбрать наш макрос.

Теперь выбор Области меняет список доступных Городов. Аналогично каскадно можно привязать следующий контрол (Район города итд). Если Таблицы Области и Города две - ничего особо не меняется, т.к. мы по прежнему можем "соединить" их в представлении/view или в запросе/под-запросе. Надеюсь, объяснил понятно.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

AlexWorkStream

Цитата: economist от 21 июля 2022, 08:44
С макросом, имхо, можно реализовать даже самую идиотскую бизнес-логику, поэтому это "наш метод":
Надеюсь, объяснил понятно.
Спасибо большое, буду пробовать)