Большаков Сергей Алексеевич, к.т.н., доц.,
технический консультант Interface Ltd.
©2002
После создания БД мы можем приступить к созданию приложения работающего с
БД.
Мы построим приложение представленное одним окном (см. рисунок 10), в котором
будут выполнятся основные операции: подключение к БД и отключение от БД; заполнение
списка данными и заполнение таблиц на основе SQL запросов разного вида. Окно
в начальном состоянии (до заполнения) представлено на рисунке ниже.
Рис. 10 Вид окна приложения для изучения работы с БД
Отметим, что до подключения к БД кнопки заполнения недоступны. Подключение к БД выполняется нажатием кнопки "Подключится". Если БД, пользователь и пароль не указаны, то у нас используются параметры подключения по умолчанию: COMPANY/SYSADM/SYSADM. При выполнении операции подключения кнопки заполнения включаются. При отключении от БД (кнопка "Отключиться") кнопки заполнения возвращаются в исходное состояние.
После выполнения операций заполнения объектов оконного интерфейса из БД оно должно выглядеть так, как показано на рисунке 11. Список должен быть заполнен данными (NAME) из таблицы DOLG, после нажатия кнопки "Добавить из БД". Поле "Выбрано" показывает значение текущего выбранного в списке элемента. Таблица "Автоматически - сотрудники" заполняется при нажатии кнопки "Добавить без колонок" из таблицы EMPLOY. Особенность такого заполнения заключается в том, что предварительно таблица, подлежащая заполнению, не содержит заранее определенных столбцов (колонок) – они формируются на основе самого SQL запроса. Таблица "Таблица по запросу для сотрудников" формируется на основе SQL запроса с колонками созданными и поименованными заранее. Этот запрос строиться на основе связки (JOIN) двух таблиц: сотрудников (EMPLOY) и должностей (DOLG).
Рис. 11 Окно приложения (step5) после заполнения данных их БД
Окно "Отделы" заполняется из БД при нажатии на кнопку "Добавить из БД отделы". Информация выбирается из таблицы OTDEL. Кнопки "Очистить …" предназначены для очистки таблиц. Отметим, что в данном случае (режиме заполнения), после заполнения оконных таблиц все таблицы БД освобождаются для дальнейшего использования. В нашем приложении мы применяем простейший способ заполнения интерфейсных объектов на основе функций популяции: SQLxxxPopulate (SQLListPopulate и SQLTblPopulate). Эти функции представляют "средний" уровень взаимодействия с БД. Более высоким уровнем является способ взаимодействия на основе специальных классов – QUICK OBJECT, а более низкими уровнями: взаимодействие на основе SQL API или на основе работы с выборкой (Result Set). Эти механизмы для работы с БД из TD мы рассмотрим в следующих статьях данного цикла. Здесь же остановимся на самом наглядном и достаточно эффективном способе. Суть его заключается в том, что для работы с БД используются специальные функции, в качестве одного из параметров является строка SQL запроса (тип String), записанного в естественном виде (как – "SELECT * FROM…"). Вторым обязательным параметром этих функций является курсор (Sql Handle) получаемый после подключения к БД (connect). Пока курсор существует, мы имеем возможность доступа к БД. После отключения (disconnect) БД становиться недоступной. Так как в языке SAL предусмотрены все возможности работы со строками, то сделать запрос, а вместе с ним и приложение динамически настраиваемым. Данные возможности мы также затронем впоследствии.
Ниже представлен перечень объектов нашего приложения. Думаю, что не нужны дополнительные пояснения их назначения, так как многое ясно по названию объектов в данном списке и легко их сопоставить с визуальными объектами окна приложения. Если же у вас возникнут затруднения в этом, обратитесь к программе приложения (step5.app), которая доступна для вас ниже.
Рис. 12 Объекты приложения для изучения операций с БД
Для подключения к БД необходимо определить переменные типа курсор (Sql Handle). Это делается в разделе переменных (Variables) окна, как показано на рис. 13.
Рис. 13 Описание курсоров окна
После нажатия кнопки подключения выполняется процедура, текст которой показан на рисунке 14 ниже. В этой процедуре устанавливается обработчик ошибок при подключении с помощью предложения When SqlError. Блок команд размещенных на вложенном уровне будет выполняться при возникновении ошибок.
Примечания:
Далее в программе идет несложный для понимания (поэтому частично скрытый) текст проверки заполнения полей интерфейса, установленных для: БД (dfDBName), пользователя (dfUser) и пароля (dfPassword). На основе них или стандартных значений (по умолчанию) формируются значения глобальных, встроенных, системных переменных SAL, которые определяют подключение к БД. Это, соответственно, переменные: SqlDatabase, SqlUser и SqlPassword. Само подключение выполняется функцией SqlConnect, в качестве единственного параметра которой используется курсор (у нас -hSql). При успешном подключении выполняется группа операторов, в частности, получается еще один курсор (hSql2). Отметим, что число курсоров в одном приложении практически не ограничивается. Кроме этого с помощью функции SqlSetIsolationLevel устанавливается режим работы с данным курсором. О режимах конкуренции мы будем говорить ниже в других статьях. В нашем случае установим RL (Release Lock) – режим освобождения от блокировки после завершения запросов. И, наконец, в данном фрагменте, включаются кнопки заполнения оконных таблиц и выключается кнопка подключения к БД.
Рис. 14 Процедура подключения к БД из программы
В случае успешного и неуспешного подключения к БД выдается информационное сообщение. Причем при возникновении ошибки первоначально формируется сообщение предусмотренного выше обработчика (When SqlError), а затем сообщение после проверки кода возврата функции SqlConnect. Если не было определено ни одного обработчика ошибок, то срабатывает встроенный механизм и сообщение об ошибке выдается в специальном окне SAL. Отключении от БД (если нажата кнопка "Отключиться") выполняется следующий фрагмент программы. Текст представлен на рисунке 15. Отключение для каждого курсора выполняется с помощью функции SqlDisconnect, единственным параметром этой функции является курсор (hSql и hSql2 соответственно).
Рис. 15 Процедура отключения от БД из программы
Для заполнения комбинированного списка (cmBox1), которое происходит при нажатии кнопки pbAddList вызывается процедура, представленная на рисунке 16. Заполнение выполняется функцией SalListPopulate, имеющей три параметра: первый определяет список (объект для заполнения - cmBox1), второй параметр задает курсор (hSql), а третий параметр представляет собой строку SQL запроса, используемого для заполнения. Отметим попутно, что запрос может иметь и более сложную запись в соответвии со стандартом языка SQL (можно использовать WHERE составляющую, подзапросы и т.п.). После заполнения текущим элементом списка становиться нулевой элемент (напомним, что элементы нумеруются с нуля) и полю dfFromList присваивается это значение. При изменении состояния списка (SAM_Click для cmBox1) выполняются аналогичные действия для установки нового состояния поля dfFromList.
Рис. 16 Заполнение cmBox1 из БД функцией SalListPopulate и переключение списка.
Очистка списка выполняется при нажатии на кнопку "Очистить", функцию очистки SalListClear мы уже рассматривали ранее. Функции очистки таблиц аналогичны и мы здесь их не показываем. Для очистки таблиц использована функция SalTblReset.
Рис. 17 Очистка списка cmBox1
При заполнении таблицы можно предварительно не создавать колонки они могут быть сформированы автоматически, в зависимости от содержания запроса. Такой пример показан на рисунке 18, при заполнении таблицы tblNoCol. Эти действия выполняются функцией SalTblPopulate, которая имеет уже четыре параметра. Первые три параметра совпадают с описанными ниже. Отметим только, что в данном случае мы даже не перечисляем паля таблицы EMPLOY, а указываем только "*", означающую выбор всех полей таблицы. При выполнении этой функции колонки будут сгенерированы автоматически. Четвертый параметр функции SalTblPopulate, определяет режим заполнения таблицы. Режим TBL_FillAll, означает заполнение всей таблицы а затем возврат в программу. Может быть использован режим TBL_FillNormal, в этом случае заполняется только видимая часть таблицы и выполнение программы продолжается. При прокрутке записи дополняются в таблицу. Возможен и третий режим - TBL_FillAllBackground. При его использовании заполнение оставшихся записей в таблице выполняется в фоновом режиме. Для второго и третьего режима нельзя использовать данный курсор до тех пор пока не заполнена вся таблица. В противном случае могут возникнуть проблемы с отображением записей. Недостатком первого режима является необходимость ожидания заполнения всей таблицы записями. В данном фрагменте показано, что операторы обработки ошибок (When SqlError) могут быть расположены и ниже текста самого запроса. Главное, чтобы они располагались на одном уровне одного фрагмента процедуры.
Рис. 18 Заполнение таблицы tblNoCol из БД функцией SalTblPopulate без выделения заносимых полей
Следующий пример (рис. 19) связан с заполнением таблицы tblOtdel и практически аналогичен предыдущему. Отличие в том, что мы явно указываем поля таблицы БД, которые будут передаваться в экранную таблицу.
Рис. 19 Заполнение таблицы tblOtdel из БД функцией SalTblPopulate с указанием полей таблицы БД (NAME и CODE)
Для заполнения экранной таблицы tblTest необходимо предварительно описать колонки экранной таблицы, которые в дальнейшем будут корреспондироваться с выбираемыми колонками из таблицы БД. Мы уже рассматривали описание колонок таблицы в предыдущих статьях. Мы опишем три колонки: colName – для имени сотрудника (Имя – название колонки), colOklad– для оклада сотрудника (Оклад – название колонки) и colDolg– для должности сотрудника (Должность – название колонки). Описание показано на рисунке 20.
Pис. 20 Описание колонок экранной таблицы
В фрагменте, представленном на рисунке 21, используется запрос с явным указанием колонок экранной таблицы. Это достигается применением специального предложения INTO в SQL запросе. В конструкции INTO определяются связующие переменные (bind variables), которые соответствуют выбираемым полям SELECT запроса. Эти переменные перечислены через запятую, а каждой из них должно предшествовать двоеточие. Таков синтаксис предложения INTO. В дополнение скажем, что такой запрос определяет слияние двух таблиц (DOLG, EMPLOY) и называется JOIN. Для освобождения курсора hSql2 для других целей используется функция SqlCommit.
Рис. 21 Заполнение таблицы tblTest из БД функцией SalTblPopulate c явным указанием колонок таблицы (colName, colOklad и colDolg)
Если вы проделали правильно все операции: создали БД, заполнили ее значениями, создали окно и оконные объекты и внесли в их обработчики соответствующий текст, то вы получите приложение, представленное на рисунках 10 и 11. Можете попробовать изменить вид запросов, структуру таблиц как экранных, так и БД.
Приложение, которое вы получите (step5.app), можно скачать здесь.
В следующей статье этого цикла мы рассмотрим другие методы работы с БД в рамках TD. В частности использование выборки для доступа к данным, синхронизацию оконных таблиц и таблиц БД. Создание связанных таблиц и другие важные элементы программирования при построении информационных систем.
За дополнительной информацией обращайтесь в компанию Interface Ltd.
INTERFACE Ltd. |
|