1. Главная страница » Компьютеры

Libreoffice base связать таблицы

Автор: | 16.12.2019

Опубликовано: 27.06.14 / Автор: Катерина — 11 комментариев

Мы уже рассмотрели, как в LibreOffice Base создаётся база данных, формируются запросы и выполняется сортировка. Следующий этап — создание форм.

По сути форма представляет собой удобный и упрощённый интерфейс для ввода и редактирования данных в таблицы базы. Простой пользователь может испытывать сложности в работе со стандартным окном редактирования таблицы, а также иногда возникает необходимость разграничивать доступ к различной информации разным пользователям.
Создавать формы в LibreOffice Base можно так же как и предыдущие типы объектов: с помощью дизайнера или мастера форм. Мы испробуем оба варианта.
Для примера возьмём созданную ранее базу данных клиентов.

Здесь я вынуждена оговориться и признать, что при создании данного примера мы напоролись на Бритву Оккама: данные из таблицы Дисконтные карты должна была быть сразу включена в таблицу Клиенты. Верность этой ошибки подтверждает тот факт, что при создании связи мы получили тип «1-1», считающийся у проектировщиков не желательным. Поэтому я исправлю свою ошибку: создам новую сводную таблицу и перенесу в неё все имеющиеся данные:

Так как у СУБД этого типа нет специальных инструментов для объединения таблиц и данных в них, выносим закономерный урок, что исправлять ошибки проектирования в уже используемой базе данных довольно накладно.
А для наглядности создания форм с субформами (подчинёнными формами со связью «1-много») создадим таблицу Покупки, содержащую информацию о времени, дате, наименовании и сумме покупок клиентов:

Свяжем таблицы между собой по полю НомерДисконтнойКарты.

Итак, вернёмся к формам. Для таблиц Клиенты2 и Покупки мы сделаем две формы: одну для менеджера, который вносит данные по новым картам и связывается с клиентами и, соответственно, должен иметь возможность видеть и редактировать всю информацию, и другую — для кассира, который может только просмотреть данные клиента о бонусах и вносить информацию о покупках.
Откроем Мастер, выбрав пункт Использовать мастер для создания формы… в окне Задачи :

Читайте также:  Msi как войти в безопасный режим

Из выпадающего списка Таблицы или запросы выберем таблицу Клиенты и переместим все поля из списка Существующие поля в список Поля в форме :

На следующем шаге нам предлагается решить, нужна ли нам субформа. Так как мы собираемся получать информацию из двух таблиц — главной и подчиненной, нужна:

Сразу скажу, что Мастер автоматически свяжет для нас таблицы между собой, и при работе с формой мы будем видеть данные из таблиц, связанными по номеру дисконтной карты.

Для субформы выберем отображение всех имеющихся в таблице Покупки полей:

Теперь нам нужно выбрать расположение элементов на форме: для данных клиента целесообразнее выбрать столбцы или блоки — как правило, во время работы с подобными данными одномоментно нужна только одна запись, а не целый гурт. Я выбрала вариант Столбцы — подписи сверху . А вот для покупок возьмём таблицу (или Лист данных , как она названа в Мастере) — клиент и его покупки будут автоматически сопоставлены при выполнении формы и при выборе других вариантов отображения мы сможем увидеть только первую покупку клиента:

Нам шестом шаге выбирается источник данных, а по сути определяются права доступа. Мы предполагаем, что менеджеру доступны все действия, поэтому оставим настройки по умолчанию:

На следующем этапе можно изменить стиль элементов формы. Сейчас мы не будем этого делать и оставим всё, как есть:

Ну и восьмой, последний шаг — название формы и определение действий с ней. Так как мы ориентируемся на пользователя, назовём форму «Клиенты (для менеджера)»:

После нажатия кнопки Готово , форма откроется на выполнение:

Внизу, под ней, есть удобная панель Навигация формы :

С её помощью можно:
— найти нужную запись;
— последовательно просмотреть всю имеющуюся информацию;
— добавить/удалить/отредактировать и сохранить запись;
— сортировать и фильтровать данные;
— отобразить записи в виде таблицы из базы.
Согласитесь, основной функционал, необходимый пользователю, присутствует.

Теперь попробуем немного изменить внешний вид формы: закроем форму (естественно, с сохранением, если вы успели внести изменения) и отроем её на редактирование — на вкладке Формы основного окна Base вызовем контекстное меню для нашей формы и выберем Изменить . Откроется дизайнер (или редактор, как изволите), в котором мы можем изменить размер и расположение имеющихся элементов, добавить новые, запрограммировать их на выполнения конкретных действий и сделать многое другое. Вообще, по функционалу он напоминает IDE, пусть и сильно упрощённую. Поэтому рассказать обо всех её возможностях, да ещё и с примерами — дело целого курса, а не одной статьи. Но кое-что мы попробуем 🙂
Для начала немного изменим размеры полей и таблицы: одинарное нажатие на элементе высвечивает зелёные ключевые точки, потянув за которые можно изменить размер:

Немного опустим столбцы с данными о клиентах: для этого выделим все поля ввода с зажатым Shift’ом и сдвинем их вниз:

Добавим подписи к логически блокам о клиентах и покупках: для этого нам потребуется элемент Метка с панели Элементы управления слева. Нажмем на него и расположим над столбцами с информацией о клиентах:

Изменим её название и размер шрифта: двойной клик на метку откроет окно свойств, в котором мы изменим значение полей Текст (именно его, а не свойство Имя , которое обычно используется для программных обращений к элементу) и Шрифт (до 12 пт):

Теперь скопируем метку (команды Копировать/Вставить контекстного меню метки, либо комбинации клавиш Ctrl+C/Ctrl+V ) и озаглавим таблицу покупок, аналогично изменив текст метки. Получилось так:

Кстати, изменить названия созданных через Мастер полей и столбцов таблицы нельзя.

Ну и на закуску изменим фон формы: для этого откроем Галерею кнопкой и откроем в левом столбце папку Фоны . Выберем в окне справа наиболее приемлемый вариант и применим его через пункт контекстного меню Вставить фоном->Страница :

Также в галерее можно найти различный картинки, звуки и иконки для вставки на форму. Для примера я вставила картинку из папки Финансы 🙂
Закрываем галерею повторным нажатием на кнопку , сохраняем форму, закрываем редактор и запускаем на выполнение. В итоге форма выглядит так:

Для того, чтобы просто изменить цвет фона или вставить на его место своё изображение, воспользуйтесь пунктом основного меню Формат->Страница. , вкладкой Фон .

Теперь попробуем создать форму в режиме дизайна: откроем редактор форм через пункт Создать форму в режиме дизайна… в окне Задачи . Зададим для формы таблицу, с которой она будет работать, — на панели элементов управления найдём кнопку Свойства формы и в открывшемся окне на вкладке Данные выберем нашу базу данных и таблицу клиентов:

Добавим четыре текстовых поля и четыре метки с той же панели. Изменим текст меток на понятный для пользователя (как это сделать, рассказано выше) и назначим значения текстовых полей, открыв для них окно свойств. В нём изменим значения: пункт Поле данных (вкладка Данные) на соответствующее поле таблицы, Метка — соответствующая типу поля, Только для чтения — Да (мы заранее договорились, что кассир не сможет править данные клиента):

Теперь вставим на форму таблицу для вывода информации о покупках. Сначала для этого нужно изменить свойства формы так, чтобы мы смогли получать данные из подчинённой таблицы. Для этого зайдём на вкладку Данные свойств формы и изменим Тип содержимого на Команда SQL — иначе у нас не получится работать сразу с двумя таблицами на форме, не прибегая к запросам (хотя по сути это как раз он и будет и ещё не известно, что удобнее — сформировать запрос привычным способом или так 😎 ). Нажмем на кнопку . для пункта Содержимое и у нас откроется редактор запросов. Добавим в него таблицы Клиенты2 и Покупки и сформируем для них простой запрос — получим все поля обеих таблиц так, чтобы они были связаны по номеру дисконтной карты:

Этот же запрос на языке SQL будет выглядеть так: SELECT "Клиенты2".*, "Покупки".* FROM "Покупки", "Клиенты2" WHERE "Покупки"."НомерДисконтнойКарты" = "Клиенты2"."НомерДисконтнойКарты" .

Добавим таблицу для вывода данных по покупкам: выберем элемент Таблица на панели Дополнительные элементы управления (она открывается на панели Элементы управления слева). При этом откроется Мастер, в котором нам будет предложено выбрать поля для вывода:

Сохраним форму под именем «Клиенты (для кассира)» и откроем её на выполнение:

Конечно, на эту форму также можно добавить дополнительные метки, графические элементы и прочие плюшки, но выполнение этих приёмов мы рассмотрели выше и повторно останавливаться на них не будем.

Ну и закончим на сегодня. На этом уроке мы постарались рассмотреть основные приёмы, необходимые для создания форм и отчётов в базах данных LibreOffice Base. Однако, если у вас остались вопросы по данной теме, вы можете задать их в комментариях или на нашем форуме. Мы постараемся оперативно на них ответить 🙂

11 comments

Очень полезная статья!
Но не понял как можно изменять значения связанных таблиц, например изменение текста в одном поле изменяет соответствующий ему айди в другой таблице?
Да и вообще как назначить запросы на некоторые действия, можно назначать только макросы (((( ?

Спасибо, Михаил!
Вы создаёте таблицы и связи между ними. Если в процессе работы изменяете информацию в родительской таблице, то и в дочерней она сменится. Но есть момент. Если вы создаёте ID, значения которых база генерирует сама, менять их потом будет очень проблемно. Да и сложно придумать реальную потребность в этом, если честно. А остальные поля в связанных таблицах не дублируются при правильном их проектировании. Они только могут «встречаться» в запросах.
Про создание запросов у нас была отдельная статья. Их содержимое потом можно выводить на форму аналогично таблицам. Или вы что-то другое имеете ввиду?

Можно ли сделать форму с кнопками? Чтобы каждая кнопка вызывала свою форму. Можно ли сделать авторизацию? Имя пользователя, пароль. Чтобы было видно кто какую информацию внес.

Денис, конечно можно сделать на форме кнопки. Этот элемент есть на панели слева. По нажатию на него можно назначить событие. Открытие новой формы в вашем случае.
Чтобы сделать авторизацию, вам для начала нужно создать в базе таблицу с пользователями, куда вы занесете их логин и пароль. Для авторизации вам нужно будет сравнивать введённые данные с теми, что занесены в базу. И если они совпадут, то позволять пользователю работать (открывать форму, например). Чтобы было видно, кто что вносит, потребуется создать в таблицах, с которыми работают пользователи, поле с их ID. Или можно писать в таблицу или файл пользователь с каким номером с какими номерами записей работал.

Как в Base реализовать закрытую базу по типу файла .accdr в Access? То есть, чтоб автоматически открывалась главная форма и у пользователя не было возможности редактировать структуру таблиц, запросов и форм, а только работать с самой базой, вносить данные и т.д.

Keysee, можно сохранить нужную форму в формате *.odt, которая будет открываться в Libreoffice Writer. Далее, в Главном меню Libreoffice Writer -> Вид включить панель Конструктор форм. На нижней панели включить Режим разработки. В Свойствах формы выбрать Источник данных, Тип содержимого, Содержимое. Выключить Режим разработки.

У меня галочка «субформа основанная на существующей связи» неактивна. Я не могу ее выбрать. Что не так?

Денис, скорее всего вы хотите назначить субформу для той таблицы, которая в связи с какой-то другой является подчинённой. Это противоречит логике создания формы 🙂 Вы можете либо сделать для такой таблицы форму без субформы, либо создать форму для родительской таблицы, взяв из неё минимум полей, а нужную таблицу сделать как раз субформой.

подскажите, пожалуйста- модно ли в форме вставлять формулы?

меня интересует такой вопрос- есть поле 1 с датой. в поле 2 мне нужно получить дату, равную дате из поля 1 + 210 дней, например.

как это можно реализовать в base?

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

Ау. Народ.
Кто знает как решить следующий вопрос:
Есть каталог(папка) с рисунками. Как сделать так, чтобы в форме ввводить набор символов и Base в форме выдавал все рисунки в названии которых есть такие символы? И ссылки на них и желательно делал миниатюры.

База данных — удобное и функциональное хранилище информации, позволяющее осуществлять самую разноплановую работу с данными. Сегодня мы рассмотрим алгоритм создания небольшой базы данных в СУБД LibreOffice Base.

При запуске LibreOffice Base автоматически открывается Мастер баз данных, предлагающий создать новую БД, либо открыть существующую. Выберем пункт Создать новую базу данных и нажмем на кнопку Далее :

На втором этапе Мастер предлагает два варианта: открыть базу данных для редактирования или сразу приступить к созданию таблиц. Оставим настройки по умолчанию и нажмём кнопку Готово :

Теперь СУБД предложит нам сохранить нашу базу данных. Выбираем нужную папку, в которой будет хранится база, и даём ей название.

Названия для документов лучше выбирать осмысленные и отражающее содержание хранящейся в ней информации — такие документы сложнее потерять в общей массе и не придётся каждый раз мучительно вспоминать, в каком из них какая информация хранится.

В качестве примера мы создадим базу данных клиентов какого-то абстрактного магазина. Поэтому назовём её «База данных клиентов»:

Базы данных в LibreOffice Base сохраняются в формате .odb

После того как создан новый файл базы данных, редактор откроет основное рабочее окно СУБД. Здесь можно работать с таблицами, запросами, формами и отчётами. Создавать, редактировать и управлять ими. Каждую из этих форм можно создавать в двух режимах — с помощью мастера (для начинающих) или в режиме дизайна (для опытных пользователей).
Для начала создадим таблицы. Чтобы воспользоваться помощью мастера таблиц, щёлкнем на кнопке Таблицы в окне База данных , а в окне Задачи выберем Использовать мастер для создания таблицы… :

Мастер создания таблиц предлагает множество готовых шаблонов таблиц и полей в них. Остается только выбрать подходящие из нужной сферы или создать требуемую таблицу самим.
Создание таблицы с помощью шаблонов начинается с определения ее категории с помощью переключателей Деловые/Персональные . В данном контексте нам нужна категория Деловые. В списке Примеры таблиц выбираем название наиболее подходящего образца — в нашем случае это таблица Клиенты.
После щелчка по названию выбранного образца формируется содержимое списка Доступные поля . Нам нужно просмотреть этот список и отобрать те, которые необходимы в таблице. Чтобы поле попало в структуру формируемой таблицы, его нужно выделить, а затем щелкнуть по кнопке > . Для нашей таблицы выберем следующие поля:

При желании любое поле, включенное в список выбранных полей, можно переименовать. Это можно сделать в окне следующего шага. Мы переименуем поле КодКлиента в более понятное НомерДисконтнойКарты, а также изменим следующие параметры: поля НомерДисконтнойКарты, Имя, Фамилия и НомерМобильногоТелефона сделаем обязательными для заполнения:

На третьем шаге происходит задание первичного ключа. Если объяснять просто, то первичный ключ — это то поле, по которому мы можем однозначно идентифицировать каждую запись в таблице. А значит, значения первичных ключей в таблице никогда не повторяются. В нашем случае первичным ключом целесообразно сделать поле НомерДисконтнойКарты, так как эти номера, как правило, уникальны в рамках одного магазина/сети:

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

В последнем окне Мастер предлагает подправить название таблицы (если нужно) и три варианта дальнейших действий с ней: Немедленно вставить данные, Модифицировать дизайн таблицы, Создать форму на основе данной таблицы. Выберем Немедленно вставить данные и щёлкнем по кнопке Готово :

В качестве примера введём несколько строчек в нашу новоиспеченную таблицу:

Далее рассмотрим создание новой таблицы в режиме дизайна. Чтобы создать новую таблицу в режиме дизайна, выберем в окне Задачи пункт Создание таблицы в режиме дизайна .
В открывшейся таблице можно задать поля будущей таблицы. Создадим таблицу Дисконтные карты. В ней будут следующие поля: номер карты, размер предоставляемой скидки и количество баллов на счёте. Введем новые поля в строки сверху вниз: щелкаем ячейку Имя поля и вводим имя для каждого поля данных.
В следующей ячейке справа определяем Тип поля : щелкнув в этой ячейке, выбираем тип поля из списка.
Для каждого поля можно также ввести Описание . Текст описания будет возникать в виде всплывающей подсказки при наведении курсора на заголовок в представлении таблицы. Для примера сделаем пояснение, что скидка должна вводиться не в %, а в долях от 1:

Ниже таблицы полей вводятся Свойства поля для каждого выбранного поля данных.
Поле Автозначение позволяет автоматически нумеровать записи по возрастанию. В данном случае удобно автоматически получать номер дисконтной карты — для этого поля этот параметр установим в положение Да.
Поля Длина и Знаков после запятой изменяем в зависимости от того, какими будут вводимые данные: скидка у нас может быть до десятых долей процента, поэтому число знаков после запятой — 3.
В поле Значение по умолчанию вводим значения, которые будут подставляться в запись автоматически. Само собой, что в дальнейшем содержимое этого поля можно будет при необходимости изменить. Для нашей таблицы по умолчанию можно заполнять поля РазмерСкидки — скажем, вначале он для всех составляет 5%, а КоличествоБаллов при получении дисконтной карты как правило равно 0.
В поле Обязательное укажем, может ли поле оставаться пустым. В нашем случае специфика таблицы такова, что все поля должны быть заполнены, поэтому для всех установим Да.
Чтобы выбрать поле, которое станет первичным ключом таблицы, нужно правой кнопкой мыши нажать на серый квадрат слева от строки с нужным полем и установить галочку Первичный ключ .

В зависимости от типа базы данных или типа поля некоторые свойства полей могут быть недоступны.

Остаётся только сохранить таблицу — при этом нужно будет ввести её название. Назовём таблицу Дисконтные карты и сохранимся.

Также заполним таблицу Дисконтные карты данными:

В рамках данного занятия также рассмотрим создание связей между таблицами. Они будут необходимы нам для дальнейшей работы с БД — например, для создания запросов, использующих данные двух или более таблиц. Чтобы создать связь, в основном окне программы выберем пункт меню Сервис->Связи .

Создавать или изменять связи между открытыми таблицами нельзя! Поэтому вначале необходимо закрыть все ранее открытые таблицы базы данных и открыть окно базы данных.

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

В окне Связи выбираем таблицы, между которыми она создаётся (их может быть не больше 2, слева указывается таблица, которая будет главной), поля, с помощью которых она будет осуществляться — в нашем случае это поле НомерДисконтнойКарты, и отношения между таблицами в разных ситуациях. Так при обновлении номера карты в таблице дисконтных карт целесообразно обновлять этот номер и для клиента, держащего карту, а при удалении — обнулять её значение, чтобы не потерять данные клиента и видеть, что карты у него нет:
После нажатия кнопки ОК между таблицами будет создана связь:

Обозначение «1-1» указывает, что данная связь имеет тип «один-к-одному» и означает, что у одного клиента может и должна быть только одна дисконтная карта.

В данной статье мы постарались рассмотреть основные приёмы, необходимые для создания простой базы данных в LibreOffice Base. Однако, если у вас остались вопросы по данной теме, вы можете задать их в комментариях или на нашем форуме. Мы постараемся оперативно на них ответить 🙂

В части 2 будет рассмотрена связь между таблицами базы данных и формами. В частности как задавать связь между двумя таблицами и использовать таблицы-«справочники» в качестве источника данных для выпадающих списков.

Версии OpenOffice и LibreOffice, для которых актуально данное сообщения от 3.0 до 6.2 (текущая версия LibreOffice). Начиная именно с версии 3.0 в OpenOffice Base появилась возможность сохранять скрипты в файле базы данных (с расширением .odb), что позволяет удобно распространять код макросов OO Basic

С формами в OpenOffice Base произошла некоторая путаница. Дело в том, что в процессе эволюции программного обеспечения от офисного пакета к среде для работы с базами данных, оказалось, что Формы, Форма, Forms и Form — это немного не одно и то же. И Form — это не только Form. Поясню подробнее.

Когда Вы открываете базу данных OpenOffice Base в режиме редактирования, то видите в левой части экрана четыре закладки. В русифицированной версии это будет звучать как

  • Таблицы
  • Запросы
  • Формы
  • Отчеты

В этом смысле Форма является некоторым самостоятельным приложением, которое запускается в отдельном окне. Замечу еще, что на самом деле это окно в котором запускается экземпляр OpenOffice Writer.

Примечание. Поскольку форма это фактически экземпляр OpenOffice Writer — приложение можно создавать без загрузки компонента OpenOffice Base — прямо в OpenOffice Writer.

Каждая Форма имеет коллекцию Forms объектов Form. Вначале эта коллекция пустая. Несмотря на это, Вы можете открывать и закрывать Форму. И даже выводить в ней текстовую информацию. И только при добавлении нового элемента управления (например Button) система создаст объект Form с именем по умолчанию Form, если Вы до этого времени не создали такой объект сами.

Создавать новые Form удобнее всего из Навигатора форм (на палитре изображается в виде компаса), который также можно вызвать из меню View|Toolbar|Form Navigation. Объекты Form создаются или на верхнем уровне в коллекции Forms, или подчиненные другому объекту Form. Это никак не отражается на внешнем виде Формы, но может быть полезными при задании связей между таблицами.

Тут надо отметить одну аномалию объекта Form. Этот объект является в первую очередь объектом, связанным с таблицей базы данных или с запросом SQL. Можно думать о Form как об объекте ResultSet (так оно и есть на самом деле). С другой стороны, Form является контейнером для элементов управления, подобно FORM в документе HTML (и это тоже правда).

Откройте только что созданную Форму в режиме редактирования (правая кнопка мыши|Edit). Создайте в ней новый объект Form с именем Form, или другим Вам понравившимся именем. В этом элементе Form создайте дочерний элемент Form.

C каждой Form нужно связать существующую таблицу базы данных, запрос или SQL-запрос. В подчиненной Form можно задать правила, чтобы отражались данные отфильтрованные по значению связанных полей в основной Form по типу Master/Slave. Для этого в редакторе свойств подчиненной Form нужно заполнить свойства link master fields и link slave fields.

Теперь в каждую из Form добавим по элементу Table Control, выбрав соответствующую Form в Навигаторе форм>. Элемент Table Control отсутствует в панели доступных элементов. Для отображения расширенного списка элементов нужно в палитре элементов активировать кнопку More Controls. После добавления элемента Table Control необходимо войти в режим редактирования этого элемента и добавить необходимые для отображения колонки таблицы (правая кнопка мыши -> Insert/Replace/Delete Column)

Второй тип часто встречающийся на практике тип связи между таблицами (после Master/Slave), и который мы рассмотрим — связь типа Справочник. Мы храним в таблице данных ключ объекта GUID, autoincrement, а в отображаемой таблице выводим его полное наименование, взятое из связанной таблицы-«справочника». Для этого есть удобный механизм. В визуальном Конструкторе таблицы добавляем колонку типа List Box. Если была уже создана колонка типа Numeric/Text, в которой отображается ключ (а не наименование), есть возможность изменить его тип на List Box (правая кнопка мыши|Replace With|List Box). Далее редактируем список свойств колонки. На закладке data свойству Тype of List Content присваиваем значение SQL. Запрос в свойствеList Content должен в первой колонке содержать отображаемое значение, а свойство Bound Field индекс колонки с ключевым полем (если считать, что первая колонка имеет индекс 0). То есть в подавляющем большинстве запросов это будет 1 для запросов типа

Пока что была описана работа в режиме конфигуратора без программирования. Добавим функциональности при помощи макросов OO Basic.

Создадим фильтр для таблицы базы данных по значению, введенному в текстовое поле. Для этого напишем на языке OO Basic процедуру, обрабатывающую событие от клавиатуры.

Добавить комментарий

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