Вывод нужного поля в списке

Автор kikimer, 10 февраля 2015, 21:10

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

kikimer

Здравствуйте. Ломаю голову, не могу понять. После создания формы сделал выпадающий список. Изначально в связях указал Ключ(один) ко многим. Не могу понять, как сделать, чтобы в выпадающем списке не ключ предлагался, а то, на что он указывает. В данном примере - ключ указывает на название книги. На скриншотах более подробно изложен вопрос.

rami


kikimer

Вот, пожалуйста. Она у меня как тестовая. Мне бы понять, как эту связь сделать, для дальнейшего изучения.

JohnSUN

Это не сложно. Фокус в том, чтобы подсунуть раскрывающемуся списку правильно организованную таблицу данных - в первой колонке те данные, которые должны отображаться в списке и по которым пользователь собственно будет делать выбор, а где-то дальше (обычно во второй колонке) - значение, которое будет выбираться на самом деле. Обычно это числовой индекс, но совсем не обязательно.
То есть можно, конечно, подсунуть в Список и таблицу данных, но для этого она должна быть сразу организована именно в таком порядке: первое поле - отображаемый текст, а уже второе или какое-то дальше - ID записи. Такая таблица выглядит довольно неуклюже, непривычно - обычно ключевое поле ставится первым (а для некоторых СУБД это даже обязательное требование).
Поэтому используют другой приём.
В качестве данных для Списка используют запрос по таблице - то ли готовый Запрос, сохранённый отдельно ("тип содержимого списка" на вкладке Данные - Запрос), то ли прямо встроенный в элемент управления (тип содержимого - SQL).
На конкретном примере. shifr_knigi - целое число, именно его нужно будет вписать в поле записи vidacha_knig. Чтобы выбрать и увидеть в Списке "настоящее" название книги, создадим простой SQL-запрос:
SELECT "avtor"||' "'|| "nazvanie"||'"' "kniga", "shifr_knigi" -- в таблице-результате будет два поля:
-- первое текстовое (автор+книга), второе числовое
FROM "literatura" -- выбранные из таблицы "literatura" (при желании можно наворотить довольно
-- сложную конструкцию из нескольких таблиц и запросов)
ORDER BY "avtor" ASC, "nazvanie" ASC -- И последнее предложение - порядок сортировки по автору,
-- а потом по названиям
-- можно было бы указать, например,
-- ORDER BY "nazvanie" ASC - только по названиям в алфавитном порядке
Теперь осталось указать Списку, что нам из этого запроса нужно использовать ВТОРОЕ поле. Поэтому в "Связываемое поле" указываем единичку (нумерация полей идёт слева направо начиная с нуля)
Конечно, в этом запросе не хватает предложения WHERE, которое ограничивало бы список только теми книгами, которые еще не выданы на руки или уже возвращены. Но такой трюк потребовал бы довольно глубоких знаний SQL. Дело в том, что написание такого условия "в лоб"
WHERE "shifr_knigi" IN
  ( SELECT "literatura"."shifr_knigi"
       FROM { oj "vidacha_knig"
         RIGHT OUTER JOIN "literatura"
           ON "vidacha_knig"."shifr_knigi" = "literatura"."shifr_knigi" }
     WHERE "vidacha_knig"."data_facticheskogo_vozvrata" IS NOT NULL )
привело бы к неожиданному результату: выпадающий список действительно показывал бы только имеющиеся книги, но при этом перестали бы отображаться названия выданных книг.
Для облегчения этих мучений придумана специальная форма - только ввода новых данных. Но используют её редко - пользователю привычнее видеть на экране чуть больше данных, чем требуется для реальной работы... "Но это уже совсем другая история..."(с)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

kikimer

Открытый и ражёванный ответ! Всё понял, всё получилось! :)Большое спасибо!) Буду изучать запросы :)

Ильдар

#5
Цитата: JohnSUN от 11 февраля 2015, 11:05Поэтому в "Связываемое поле" указываем единичку (нумерация полей идёт слева направо начиная с нуля)
не совсем понятно, где поставить эту единичку, чтобы поле со списком использовало для ввода данных ВТОРОЕ поле.
И возможно ли, чтобы в результате объединения текста (если одно из таких текстов нулевое), не выводилось пустое поле?

JohnSUN

Так нагляднее?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Ильдар

Цитата: JohnSUN от 21 октября 2015, 12:20Так нагляднее?
Спасибо. А я искал это в свойствах поля со списком. Видимо такого там нет.

PSovenok

Как добавить/удалить поля в списке пользователей? Скажем, не нужен мне сейчас основной лицевой счет пользователя, а надо мне группы, в которые он входит...
.