Лекция 2. Анализ предметной области. Проектирование логической и физической моделей данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лекция 2. Анализ предметной области. Проектирование логической и физической моделей данных



Лекция 2. Анализ предметной области. Проектирование логической и физической моделей данных

Этапы проектирования БД

2.1 Пример объекта

Рассмотрим на примере поставки сырья поставщиком.

Предприятие закупает сырье для производства продукции. Сырье закупается у поставщиков. Сырье поставляется по накладным.

После анализа особенностей автоматизируемой области деятельности следует приступить самому важному этапу — проектированию будущей БД, которое заключается в определении таблиц, состава полей таблиц и связей между таблицами. От того, насколько тщательно проведен анализ и насколько грамотно спроектирована БД, в существеннейшей мере зависит эффективность будущей СУБД и ее полезность для пользователя.

В рассматриваемой предметной области можно выделить два типа объектов: поставщик, выполненная поставка. Для упрощения модели не будем выделять еще один объект – сырье. Каждый экземпляр объекта содержит одинаковый набор свойств (характеристик), из которых следует рассматривать только те, которые необходимы для решения поставленной задачи (в нашем случае – учет поставок сырья). На рис.1 приведено описание объектов предметной области с указанием выбранных свойств этих объектов.

Поставщики

Имя свойства
Код поставщика
Наименование поставщика
Адрес поставщика
Тип поставщика (варианты: физическое или юридическое лицо)

Книга поставок

Имя свойства
Дата поставки
Номер документа
Наименование сырья
Поставщик
Количество сырья
Цена за 1 ед

Рис.1 Свойства объектов предметной области «Учет поставок сырья»

 

Выполним проектирование реляционной БД. Наиболее распространенным средством представления модели данных являются диаграммы "сущность-связь" Entity-Relataion Diagram (ERD). На этих диаграммах представляются важные для предметной области объекты (сущности), их свойства (атрибуты) и отношения друг с другом (связи). ERD непосредственно используются для проектирования реляционных баз данных, которое начинается с разработкой моделей данных.

Для автоматизации процесса проектирования используются специальные средства, относящиеся к классу CASE(computer-aided software engineering). Одним из распространенных CASE-средством моделирования данных является программное средство AllFusion ERWin Data Modeller фирмы Computer Associates (далее сокращенно ERWin).

ERWin имеет два уровня представления модели - логический и физический.

· Логический уровень - это абстрактный взгляд на данные, на нем данные представляются так, как выглядят в реальном мире, и могут называться так, как они называются в реальном мире, например "Поставщик" или "Наименования поставщика". Объекты модели, представляемые на логическом уровне, называют сущностями, а свойства этих объектов называют атрибутами. Логическая модель данных является универсальной и никак не связана с конкретной реализацией СУБД. Поэтому данное представление будет понятно даже для неспециалистов (заказчиков информационной системы).

· Физическая модель данных, напротив, зависит от конкретной СУБД, фактически являясь отображением системного каталога БД. В физической модели содержится информация о всех объектах БД, которые в физической модели называют таблицами. Поскольку единого стандарта на объекты БД не существует (например, для типов данных), физическая модель зависит от конкретной реализации СУБД. Следовательно, одной и той же логической модели могут соответствовать несколько разных физических моделей.

 

Выбор имен таблиц и колонок

Кириллицу желательно не использовать (точнее, это можно делать, только заключив выбранное имя в кавычки).

В именах полей целесообразно использовать содержательные названия. Если имя содержит несколько слов, то

- для разделения слов используется символ «подчеркивания»

- Каждое слово начинается с прописной буквы

Например, Post_kod

PostKod

И еще одна рекомендация: делать имена полей по возможности лаконичными (не использовать окончания при транслитерации Syr_kod вместо Syrie_kod) — это сократит код запросов.

Схема физической модели данных представлена на рис.3.

Рис.3 Физическая модель данных

Приложения БД

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

Взаимодействие с БД подразумевает:

- получение данных (включает поиск БД, поиск таблицы и чтение данных из нее),

- представление данных в определенном формате для просмотра пользователем,

- редактирование данных в соответствии с реализованными в программе бизнес-алгоритмами и возврат обработанных данных обратно в БД.

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

- получения и отправки данных,

- внутреннего представления данных в том или ином виде,

- пользовательского интерфейса для отображения и редактирования данных,

- бизнес-логику для обработки данных.

Средства получения и отправки данных обеспечивает соединение с источником данных (часто опосредованно через специальное ПО - СУБД). Приложение должно "знать", куда ему обращаться и какой протокол обмена данными использовать.

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

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

Бизнес-логика приложения представляет собой набор реализованных в программе алгоритмов обработки данных.

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

Архитектура приложений БД

Базовый механизм доступа к данным обеспечивается тремя типами компонентов:

· компоненты, инкапсулирующие набор данных (потомки класса TDataSet);

· компоненты диспетчеры TDataSource;

· визуальные компоненты отображения данных.

Рассмотрим схему взаимодействия этих компонентов в приложении баз данных (рис. 1).

Рис. 1. Механизм доступа к данным приложения баз данных

В приложении с БД через СУБД взаимодействует компонент доступа к данным, который представляет набор данных и обращается к функциям соответствующей технологии доступа к данным для выполнения различных операций. Компонент доступа к данным представляет собой "образ" таблицы базы данных в приложении.

При открытии набора данных компонент обеспечивает передачу в набор данных записей из требуемой таблицы БД. Курсор набора данных устанавливается на первую запись.

С каждым компонентом доступа к данным должен быть связан как минимум один компонент TDataSource. В его обязанности входит:

- соединение набора данных с визуальными компонентами отображения данных. Компонент TDataSource обеспечивает передачу в эти компоненты текущих значений полей из набора данных и возврат в него сделанных изменений.

- синхронизация поведения компонентов отображения данных с состоянием набора данных. Например, если набор данных не активен, то компонент TDataSource обеспечивает удаление данных из компонентов отображения и их перевод в неактивное состояние. Или, если набор данных работает в режиме "только для чтения", то компонент TDataSource передает в компоненты отображения запрещение на изменение данных.

Компонент TDataSource организует передачу в компоненты отображения данных значений необходимых полей из текущей записи. При перемещении по записям набора данных текущие значения полей в компонентах отображения данных автоматически обновляются.

При помощи компонентов отображения данных пользователь может просматривать и редактировать данные. Измененные значения сразу же передаются из элемента управления в набор данных при помощи компонента TDataSource. Затем изменения могут быть переданы в базу данных или отменены.

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

Доступ через ADO.

В Delphi реализовано достаточно большое число разнообразных технологий доступа к данным: Borland Database Engine (BDE), Microsoft ActiveX Data Objects (ADO) или dbExpress. Но последовательность операций при конструировании приложений баз данных остается почти одинаковой.

Скорость доступа к данным, обеспечиваемая технологией BDE, существенно выше, чем при использовании других.

ADO это технология стандартного обращения к реляционным данным от Microsoft. Для работы с ADO Delphi на вкладке компонентов ADO есть шесть компонентов:

TADOConnection,

TADOCommand, TADODataSet, TADOTable, TADOQuery, TADOStoredProc.

 

Модуль данных

Для размещения компонентов доступа к данным в приложении баз данных желательно использовать специальную "форму" — модуль данных (класс TDataModule). Модуль данных не является обычной формой приложения (его родителем является класс TComponent). В модуле данных можно размещать только невизуальные компоненты.

В репозитории объектов модулю данных соответствует значок Data Module расположен на странице New (New - Other -).

Сохраним файл модуля по именем uDM, а форме дадим имя DM.

Рис. 3. Модуль данных

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

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

implementation

uses DM;

...

DM.tblBook.Open;

 

Набор данных

Под набором данных (НД) понимается группа записей из одной или нескольких таблиц БД.

По технологии ADO родительским классом для всех НД является TCustomADODataSet (родитель TDataSet).

Производными от него являются компоненты TADOCommand, TADODataSet, TADOTable, TADOQuery, TADOStoredProc.

TADOCommand позволяет

- задать команду (оператор SQL)

- выполнить команду методом execute, который возвращает объект типа _RecordSet (набор строк)

Возможно получение данных и при выполнении компонента. Метод этого компонента Execute возвращает тип _Recordset (аналог TDataSet в Delphi). После чего его можно, например, связать с компонентом TADODataSet следующим образом

ADODataSet1.RecordSet:= ADOCommand1.Execute

 

Компоненты TADOTable, TADOQuery и TADOStoredProc являются дочерними компонентами TCustomADODataSet частными случаями команды, соответственно для таблицы, SQL запроса и хранимой процедуры.

 

Рассмотрим базовый класс НД TDataSet. Все излагаемые здесь сведения в равной степени относятся к любому дочернему компоненту НД.

 

События НД

События

Для реализации каскадных изменений и бизнес-правил в файл-серверных БД обычно используются обработчики событий AfterXXXX и BeforeXXXX. Эти две группы событий связаны с изменениями НД (вставка, удаление или редактирование записи) и отличаются тем, что события BeforeXXXX наступают непосредственно перед изменением НД, а события Afterxxxx — сразу посте изменения:

Вместо символов ХХХХ в названиях событий указываются, которые возникают:

Open — при открытия НД; (на «после» можно установить свойства полей)

Close — при закрытии НД;

Delete — при удаления записи НД;

Edit — при переходе НД в режим ред-я;

Insert — при перехода НД в режим вставки записи (на после можно задать начальные значения полей, например текущую дату);

Cancel — при отмене изменений в текущей записи;

Post — при выполнении сохранения в НД (на «до» можно проверить правильность заполнения полей и заполнить недостающие значения);

Scroll — после перехода к следующей записи

Обработчики этих событий в качестве параметра получают ссылку на НД, вызвавший соответствующее событие. Если необходимо прервать работу обработчика и предотвратить изменение таблиц БД, нужно возбудить исключение или вызвать процедуру Abort.

Поля набора данных

Любой НД состоит из полей (поля соответствуют колонкам таблицы).

Таблица БД и соответствующий ей набор данных приложения имеет собственную структуру, которая определяется совокупностью полей - свойство Fields, представляющее собой индексированный список объектов полей набора данных (Fields [ i ], i=0, FieldCount -1), где FieldCount -количество полей НД.

Каждому полю соответствует собственный объект - класс TFieid.

Класс TField

Ниже приведены свойства и методы класса TField.

property Name: TComponentName

Имя объекта используется для обращения к полю из программы НД.FieldByName(‘…’).AsТип, вместо многоточия поставляется значение Name поля Для статических полей имя формируется по правилу: имяНДимяПоля, например, tblBookBOOK_ID

property DataSet: TD ataSet

связанный с полем набор данных на этапе проектирования заполняется автоматически

Доступ к текущему значению полю.

К полю можно обратиться

а) по порядковому номеру, как к элементу индексированного списка

qBook.Fields[0]

б) по имени

qBook.FieldByName('Ndoc’) (для статич.полей имяНДимяПоля)

Значение можно получить несколькими свойствами

Значение поля property Value: Variant     Property As< тип >  

 

Например, qBook.Fields[1].Value

из-за использования вариантного типа свойство value является относительно медленным

Переводит значение в определенный тип данных

Например, qBook.Fields[0].AsString;

При работе со статическими объектами полей при передаче значений желательно использовать свойства из группы AS..., т. к. неявное задание типа свойством Value может привести к ошибке преобразования данных типа Variant.

Примеры использования:

1) получение значения поля из текущей записи НД и запись его в компонент формы:

Ed_Doc.Text:= qBook.Fields[0].AsString;

2) Присвоение значения поля в текущей записи из компонента формы

Tablel.FieldValues['SomeField']:= Editl.Text;

property Readonly: Boolean

позволяет запретить редактирование поля (Readonly:= True) или разрешить его (Readonly:= False)

Виды полей

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

Поля данных

Самыми распространенными полями являются поля данных, базирующиеся на реальных полях таблицы БД. Свойства объектов таких полей устанавливаются в соответствии с параметрами полей таблицы БД.

Кроме этого, в практике программирования часто применяются поля выбора и вычисляемые поля.

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

2) Поля выбора LookUp

Поле выбора – это поле, значения которого берутся из другого набора данных. Набор данных, из которого берется значение поля, называется родительским, а набор данных, который содержит LookUp-поле, называется дочерним. Наборы должны быть связаны по полям PK(родительского НД)-FK(дочернего НД)

Для создания поля-выбора в окне редактора полей НД необходимо в контекстном меню

- выбрать пункт New Field (далее см. рис. 3)

- переключатель FieldType установить в значение LookUp,

- задать параметры связи наборов данных:

DataSet - имя родительского НД;

KeyFields – поле связи с родительским НД (список полей, разделенных «;») – FK текущего НД, по которому устанавливается связь с родительским НД;

LookUpFields – ключевое поле (список полей, разделенных «;») – PK родительского НД, по которому устанавливается связь;

Result Field – поле родительского НД, возвращаемое в качестве результата.

Для поля НД нужно дополнительно установить свойство LookupCache=true. Иначе при редактировании поля при включенном режиме встроенной отладке (флаг Integrated debugging в настройках режимов отладки) возникает ошибка:

unknown error (EOleException) - Неопознананая ошибка.

Рассмотрим создание такого поля Post для НД Book:

DataSet=qSpost

KeyFields=PostKod

LookUpFields=PostKod

ResultField = PostName

Рис.3 Настройка поля выбора LookUp

Одновременно с изменением LookUp поля изменяется и ключевое поле (свойство KeyFields) исходного набора данных, что удобно использовать в процессе редактирования.

Для работы с LookUp-полями можно использовать любые компоненты отображения данных, но естественно будет применить специальные компоненты:

- в полноэкранной форме компоненты TDBLookUpComboBox (у него используется свой вариант настройки)

- в табличной форме в компоненте TDBGrid. Если такое поле связать с одной из колонок компонента, то для него автоматически заполняется выпадающий список. Его элементы хранятся в свойстве PickList, которое имеется в любой колонке.

Одновременно с изменением поля синхронного просмотра изменяется и ключевое поле (свойство KeyFields) исходного набора данных.

Вычисляемые поля

Вычисляемое поле – это поле, значение которого не существует в БД, а вычисляются по значениям других полей текущей записи(поля должны быть статическими).

Например, в таблице Book можно вычислить стоимость по одной строке (Стоимость=Цена*Количество):

Stoim = Cena * Kol.

Вычисляемые поля создаются в редакторе полей НД.

Для создания вычисляемого поля необходимо в модуле данных выбрать НД tblBook, далее вызвать Fields Editor и в контекстном меню выбрать команду New Field. Далее в редакторе создания нового поля:

- задать имя поля Name=Stoim

- переключатель FieldType установить в значение Calculate

Значение вычисляемого поля (выражение для вычисления) задается в обработчике для НД OnCalcField (в модуле данных):

procedure TDM.tblBookCalcFields(DS:TDataSet);

begin

tblBookStoim.AsFloat:= tblBookKol.AsFloat*tblBookCena.AsFloat;

end;

В обработчике можно присвоить значение только вычисляемым полям

Событие OnCalcField возникает:

- при перемещении курсора (указателя записи) по таблице (методы First, Next, …)

- при изменениях записи (Insert, Edit)

Ограничения

Контроль значений, вводимых в поля набора данных в Delphi возложен на объекты полей, а не на компоненты отображения данных.

Ограничения обеспечивают контроль значений, вводимых в поля НД. Ограничения реализованы в обработчиках класса TField.

OnChange, OnValidate, OnGetText, OnSetText.

Методы-обработчики удобнее всего использовать для проверки текущего значения с точки зрения программной логики. (Например, чтобы цена не была отрицательной). В обработчике можно вывести понятное сообщение об ошибке.

Методы обработчики назначаются:

· для статических полей на этапе проектирования

· для динамических полей в программе на событие НД.AfterOpen

1)Обработчик O n V alidate - вызывается перед сохранением значения поля в буфер записи (например, при смене фокуса).

Метод OnValidate проверяет значение поля целиком: проверка ограничений типа данных и дополнительных (своих) ограничений:

procedure TDM.tblBookCenaValidate (Sender: TFieid);

begin

if (Sender as TFieid).Value < 0 then

Raise Exception. Create (‘Цена не может быть отрицательной’)

end;

Если при проверке обнаружена ошибка, то выдается сообщение и фокус формы устанавливается на соответствующем компоненте отображения данных.

2) Обработчик события O n C hange - вызывается после записи значения поля в буфер (после OnValidate), если данные изменились. В принципе, можно предусмотреть операции по контролю данных и в этом методе, но тогда в случае ошибки возникает нежелательная исключительная ситуация, которая может привести к серьезным сбоям в работе приложения.

 

Визуализация данных

В предыдущих лекциях были рассмотрены аспекты создания приложений баз данных, касающиеся организации доступа к данным и создания в приложениях наборов данных. Теперь более подробно остановимся на вопросах отображения данных в приложениях (пользовательский интерфейс приложений).

Отображение данных обеспечивается достаточно представительным набором компонентов VCL Delphi. Многие из них унаследованы от компонентов, инкапсулирующих стандартные элементы управления TControl и TWinControl.

Для связи с набором данных компоненты отображения данных используют компонент TDataSource. Цепочка компонентов, по которым проходят данные от БД до компонента отображения:

БД -->TADOConnection -->TDataSet --> TDataSource --> TDBGrid

Пример настройки свойств компонентов, входящих в цепочку представлена на рис.1.

Рис.1 Настройка свойств компонентов

Рис. 2. Классификация компонентов отображения данных

 

1) Компоненты для отображения одного поля,

а) для представления и редактирования поля со скалярным значением используются компоненты: TDBEdit, TDBLookUpComboBox

б) для представления и редактирования полей, содержащих многострочный текст, используются компоненты: TDBMemo и TDBRichEdit

в) для просмотра (без редактирования) изображений используется компонент (TDBImage)

 

Для настройки данной группы компонентов используются свойства:

DataSource - задает компонент соединения с НД

DataField – задает поле НД.

2) Компоненты просмотра НД данных целиком или в произвольном сочетании полей TDBGri d и TDBCtrlGrid

Для настройки данной группы компонентов используются свойства:

DataSource - задает компонент соединения с НД

Columns – индексированное свойство; через него устанавливается связь с полями НД.

3) компонент, обеспечивающий навигацию по набору данных: TDBNavigator.

 

Наиболее важные свойства компонентов отображения данных представлены в таблице 1.

Таблица 1. Основные свойства компонентов отображения данных

Свойство Описание
DataSource: Указатель на компонент TDataSource
Readonly: Boolean; Управляет работой режима "только для чтения"
DataField: string; Имя поля набора данных (только для компонентов 1-й группы)
Field: Tfield; Обеспечивает доступ к классу TField, который соответствует полю набора данных, заданному свойством DataField (только для компонентов 1-й группы)

Компонент TDBEdit

Компонент представляет собой стандартный однострочный текстовый редактор, в котором отображаются и изменяются данные из поля связанного набора данных.

Компонент может осуществлять проверку редактируемых данных по заданной для поля маске. Маску можно задать в объекте TField, связанном поле (в свойстве EditMask)

Компонент TDBCheckBox

Компонент представляет собой почти полный аналог обычного флажка (компонент TCheckBox) и предназначен для отображения и редактирования любых данных, которые могут иметь только два значения.

Свойство V aluechecked (значение по умолчанию True) задает значение, соответствующее включенному флажку.

Свойство ValueUnchecked (по умолчанию False) задает значение, соответствующее выключенному флажку.

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

Связанные списки

При разработке приложений для часто возникает необходимость ввести значение:

- из заранее известного списка значений (например, могут быть только значения «приход» и «расход»)

- выбрать некоторый код из другого НД, связанного с текущим НД ссылочной связью ForeignKey - PrimaryKey.

Например, в таблице Book поле PostKod содержит код поcтавщика, для выбора и отображения удобно использовать не коды поставщиков, а их наименования из справочника SPost (рис. 3)

Рис.3 Связанные таблицы

 

Для этого существуют компоненты-списки.

Компоненты XXXXListBox (TDBListBox и TDBLookupListBox) могут отображать и добавлять значения из существующего списка

ХХХХСо mb оВох (TDBСоmbоВох и TDBLookupСоmbоВох) позволяют добавлять новые значения, не содержащиеся в связанном списке. Для этого в этих компонентах-списках есть строка ввода.

Компоненты TDBLookupXXXX могут использоваться двумя способами:

1) если в редактируемом НД есть нужное подстановочное поле, достаточно определить лишь DataField (имя подстановочного поля) и заполнить список возможных значений Items (например, тип поставщика: Физическое лицо, Юридическое лицо).

2) если в НД нет подстановочного поля (оно находится в другом НД), то выполняют более сложную настройку.

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

Таблицу, содержащую ключевое поле и поле данных для просмотра, будем называть связанной (родительской) таблицей. В примере это таблица SPost.

Настройка свойств связанного списка представлены в таблице 2.

Таблица 2. Основные свойства связанного списка

Свойство Описание
property ListSource: TDataSource; Указывает на компонент TDataSource, связанный с родительской таблицей
property KeyFieid: string; Ключевое поле родительской таблицы
property ListFieid: string; Поле или список отображаемых полей родительской таблицы
property KeyValue: Variant; Текущее значение ключевого поля исходной таблицы (FK)
property ListFieidindex: Integer; Номер основного поля из св-ва ListField (используется, когда свойство содержит список полей)
property NullValueKey: TShortCut; Определяет комбинацию клавиш, нажатие которых задает нулевое значение поля

 

Пример. Выбор поставщика по Наименованию

Ключевые свойства компонента настроены следующим образом.

Свойство DataField = PostKod (поле внешнего ключа)

Свойство ListSource = dsPost (указывает на ссылочную таблицу).

Свойство ListFieid = PostName (отображаемое поле в списке).

Свойство KeyField= PostKod (поле первичного ключа ссылочной таблицы.

Свойства

Своство

Описание

Columns

Содержит коллекцию объектов TColumn, описывающих колонки компонента

Это индексированное свойство

Options

Определяет особенности отображения и поведения компонента:

dgEditing — данные можно редактировать;

dgAlwaysShowSelection — выделение текущей ячейки сохраняется, даже если сетка не активна;

dgConfirmDelete — при удалении строк появляется запрос о подтверждении операции;

SelectedField

Содержит объект текущего поля

SelectedIndex

Содержит номер текущей колонки в массиве свойства Columns

Методы-обработчики событий

Метод

Описание

OnDrawColurnnCell

 

Позволяет управлять процессом отображения данных в ячейках. Вызывается при перерисовке ячейки. Параметры Rect определяет ячейку по координатам прямоугольника на канве. DataCol номер колонки в сетке. Column содержит объект колонки. State состояние колонки set of (gdSelected, gdFocused, gdFixed)

OnEditButtonClick:

Вызывается при щелчке мышью на кнопке в ячейке Для отображения кнопки в ячейке необходимо установить свойство колонки ButtonStyle= cbsEllipsis
     

 

Компонент TDBGrid состоит из колонок (набор объектов Tcolumn). Объект колонки обладает свойствами и методами (таблица 4), которые позволяют задавать параметры отображения данных (цвет, шрифт, ширину и т. д.).

Таблица 4. Свойства класса TColumn

Свойство Описание
ButtonStyle Задает способ редактирования данных в колонке: cbsAuto — кнопка в редактируемой ячейке появляется, если полем является поле связанного списка (LookUp); cbsEllipsis —в редактируемой ячейке появляется кнопка, щелчок на кнопке вызывает обработчик OnEditButtonClick; cbsNone — при редактировании ячейки кнопка не появляется (по умолчанию)
FieldName Название поля НД, связанного с колонкой
Font Шрифт данных в колонке
PickList Содержит разворачивающийся список, используемый при редактировании данных (список заполняется фиксированными значениями во время разработки или заполняется из некоторого НД, например: приход, расход)
Title Задает текст заголовка и его параметры. Примечание: Ec ли нужно оставить пустым з a головок какого-либо столбца, нужно поместить в заголовок хотя бы один пробел.
Visible Задает видимость колонки
Width Задает ширину колонки в пикселах

 

Это объект-столбец, несвязанный с каким-либо полем НД (свойство FieldName не заполнено). Рассмотрим примеры использования пустых столбцов

1) Вывод информации, определяемой значениями полей НД.

Например, сформируем одно поле ФИО из отдельных полей НД: Фамилия (Fam), Имя (Fname), Отчество (Patr).

В обработчик OnDrawColumnCell вставляем код:

if Column.Index=5 then

dbg.Canvas.TextOut(Rect.Left, Rect.Top,

НД.FieldByName('Fam').AsString+

НД.FieldByName('Fname').AsString+

НД.FieldByName('Patr').AsString)

2) Вывод картинки (иконки)

В обработчик OnDrawColumnCell вставляем код (иконка выводитяс в 6-й колонке)

if DataCol=6 then

dbgKart.Canvas.Draw(Rect.Left, Rect.Top,

Img_True.Picture.Bitmap)

Img _ True – это компонент TImage на той же форме с TDBGrid с загруженным изображением.

Заполнение значений колонки из списка PickList

1) В поле НД могут содержаться значения из списка фиксированных значений (например, приход/расход).

Для колонки грида, связанной с данным полем, надо задать свойства:

- заполнить свойство PickList значениями «приход», «расход» - и каждый элемент списка располагается в отдельной строке)

- ButtonStyle=cbsAuto

2) Списком могут быть значения справочника. Такой список можно заполнить в программе (на событие формы OnCreate/OnShow)

Примечание. Используют тогда, если справочник содержит одно поле. Если же показывается одно значение (например, наименование продукции), а подставляться должно другое значение (код продукции), то необходимо связать колонку с полем-списком НД LookUp.

Пример. Заполним список размеров для колонки, связанной с полем Kart.Size

 

With qSize do

Begin

First;

While not eof do

Begin

DbgKart.Columns[I].PickList.Add(FieldByName(′Size′).Value);

Next;

End

end

Навигация по данным

TDBNavigator представляет набор управляющих кнопок для выполнения операции навигации по НД и модификации записей целиком.

Набор кнопок задается свойством VisibleButtons.

Компонент TDBNavigator должен быть связан с НД при помощи свойства DataSource.

TDBNavigator только дает команду на выполнение перемещения по набору данных или другой управляющей операции, а всю реальную работу выполняют компонент набора данных и компонент TDataSource.

Свойство confirmDelete включает подтверждение операции удаления записи.

Рис. 4 Назначение кнопок компонента TDBNavigator

 

Компонент TDBNavigator содержит набор кнопок, каждая из которых отвечает за выполнение одной операции над набором данных. Всего имеется 10 кнопок, разработчик может оставить в наборе любое количество кнопок в любом сочетании. Видимостью кнопок управляет свойство-множество visibleButtons:

Каждый элемент этого свойства представляет одну кнопку, их назначение описывается ниже:

nbFirst — перемещение на первую запись набора данных;

nbPrior — перемещение на предыдущую запись набора данных;

nbNext — перемещение на следующую запись набора данных;

nbLast — перемещение на последнюю запись набора данных;

nb I nsert — вставка новой записи в текущей позиции набора данных;

nbDelete — удаление текущей записи, курсор перемешается на следующую запись;

nbEdit — набор данных переводится в режим редактирования;

nbPost — в базу данных переносятся все изменения в текущей записи;

nb C ancel — все изменения в текущей записи отменяются;

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

Лекция 7

Рис.1 Справочник поставщиков

 

Таблица Справочник поставщиков имеет поля:

Код поставщика (PostKod)

Наименование поставщика (PostName)

Адрес (Adres)

Тип (Tip)

Тип может принимать одно из двух значений: физическое лицо/юридическое лицо

НД, представляющий справочник в приложении, находится на форме Модуль данных DM. Для работы со справочником на модуль данных добавим 2 компонента:

TADOQuery (Name=qSpost)

TDataSource (Name=dsSpost)

Для работы со справочником в программном приложении используются 3 формы:

1) В главной форме должен быть пункт меню для вызова формы просмотра данных справочника в табличном формате;

2) Форма просмотра справочника;

3) Форма редактирования строки справочника в оконном формате.

 

Будем создавать новые формы и изменять существующие в обратном порядке.

Кроме того для НД необходимо добавить обработку исключительных ситуаций, связанных с ошибками взаимодействия с БД (ошибки уникальности, ссылочной целостности и др.)

Рис.2 Форма редактирования

Поля TDBEdit связываем с НД:

DataSource =DM.dsSpost

DataField - выбрать поле из выпадающего списка (PostKod, PostName, Adres)

Рис. 3 Свойства поля выбора

Рис.4 Задание значений в свойстве Items

 

Для кнопок настроим свойства

 

Надпись (свойство Caption) Name
«Сохранить» bOk
«Отмена» bCancel

 

Рис. 5 Форма просмотра справочника

 

Уберем кнопки навигатора, связанные с добавлением и редактированием (в свойстве VisibleButtons переводим кнопки в False). Вместо них добавим 2 кнопки TSpeedButton с именами sbIns (добавление), sbEdit (редактирование).

Иконки для кнопок загрузим через их свойство Glyph (стандартный набор изображений)

Glyph -> Load -> выбрать картинку из папки C:\Program Files\Common Files\Borland Shared\Images\Buttons

Можно загружать свои изображения для кнопок.



Поделиться:


Читайте также:




Последнее изменение этой страницы: 2020-12-17; просмотров: 233; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.181.231 (0.239 с.)