Лекция 5 - СУБД.ppt
- Количество слайдов: 40
Разработка БД-приложений Каждая таблица СУБД Paradox может иметь один первичный индекс (Primary Key), его называют также ключом. Первичный индекс может состоять из одного первого поля или нескольких подряд идущих полей, начиная с первого. Для формирования первичного индекса необходимо при создании таблицы в Database Desktop для соответствующих полей в столбце Key поставить знак «*» (например, с помощью клавиши «пробел» ). Первичный индекс выполняет несколько функций.
Разработка БД-приложений 1) Первичный индекс задает сортировку записей таблицы: порядок следования записей в таблице определяется по значениям первого ключевого поля, для записей с одинаковыми значениями первого ключевого поля – по значениям второго ключевого поля и т. д. В следующей таблице записи по всем студентам будут упорядочены по возрастанию номера курса, затем по алфавиту, в соответствии с фамилией студента. Для каждого студента последовательно будут располагаться записи по увеличению дат сессий, а для одной и той же сессии по алфавиту, в соответствии с наименованием дисциплины.
Разработка БД-приложений Наименование поля Тип Ключ Примечание, поясняющее назначение поля Course_Stud S * Текущий курс студента Name_Stud A 50 * ФИО студента Date_Sem D * Name_Subj A 30 * Date_Exam D Mark S Дата завершения сессии Наименование дисциплины Дата сдачи экзамена Оценка
Разработка БД-приложений 2) Первичный индекс позволяет эффективно, используя специальные алгоритмы поиска в отсортированных наборах данных, осуществлять поиск записей в таблице по значениям ключевых полей. 3) Первичный индекс позволяет поддерживать целостность данных таблицы БД: ключевые поля двух записей таблицы не могут содержать одинаковые значения! В данной таблице может храниться для каждого студента для каждой сессии только одна оценка по каждой дисциплине. При попытке внести в таблицу еще оценку будет выведено сообщение Key violation. В этом случае необходимо либо отменить изменения, либо изменить вводимые данные.
Разработка БД-приложений 2) Первичный индекс позволяет эффективно, используя специальные алгоритмы поиска в отсортированных наборах данных, осуществлять поиск записей в таблице по значениям ключевых полей. 3) Первичный индекс позволяет поддерживать целостность данных таблицы БД: ключевые поля двух записей таблицы не могут содержать одинаковые значения! В данной таблице может храниться для каждого студента для каждой сессии только одна оценка по каждой дисциплине. При попытке внести в таблицу еще оценку будет выведено сообщение Key violation. В этом случае необходимо либо отменить изменения, либо изменить вводимые данные.
Разработка БД-приложений 4) Первичный индекс позволяет поддерживать связь один-ко-многим между таблицами. Эта связь позволяет эффективно работать одновременно с двумя связанными содержательно таблицами. Наличие ключевых полей позволяет однозначно определять запись главной таблицы (master table), с которой могут быть связано несколько записей подчиненной таблицы (detailed table). Первичный индекс в СУБД Paradox представляется файлом с именем <имя таблицы>. px.
Разработка БД-приложений Каждая таблица СУБД Paradox может иметь несколько вторичных индексов. Вторичный индекс может также состоять из одного или нескольких полей (вне зависимости от порядка полей в таблице БД). Вторичный индекс выполняет функции сортировки, повышения скорости поиска записей по указанным значениям полей, может поддерживать уникальность записей с индексными полями.
Разработка БД-приложений Вторичные индексы создаются в Database Desktop. Для создания вторичного индекса необходимо в режиме создания или переструктурирования таблицы: vвыбрать в окне Table properties (свойства таблицы) значение Secondary Indexes (вторичные индексы); vнажать кнопку Define (определить); vвыбрать в появившемся окне поля таблицы БД, участвующие в формировании индекса, и определить их порядок; vзадать при необхо димости опции nique (уникальность U значений полей индекса), Maintained (автоматическое перестраивание индекса), Case sensitive (учет регистра), Descending (убывающий порядок сортировки); vввести имя индекса; vсохранить таблицу.
Разработка БД-приложений
Разработка БД-приложений Во время работы приложения можно программно изменять текущий вторичный индекс с помощью метода Index. Name компонента Table: <имя таблицы>. Index. Name: =<строка, содержащая имя индекса>. Например, Table 1. Index. Name: ='Ind_Mark' (в предположении, что для таблицы БД, связанной с компонентом Table 1, существует вторичный индекс с именем Ind_Mark). Отменить программно установленный вторичный индекс можно с помощью оператора <имя таблицы>. Index. Name: = ''. Если вторичный индекс не установлен, для сортировки и поиска используется первичный индекс.
Разработка БД-приложений Поиск записей Find. Key – ищет в таблице по первичному или вторичному индексам запись, значения полей которой соответствуют значениям, заданным в параметрах. function Find. Key(const Key. Values: <массив констант или переменных>): Boolean; В параметре Key. Values через запятую перечисляются константы или переменные, определяющие значения полей поиска. Последовательность полей поиска соответствует полям установленного для компонента Table индекса или ключевым полям физической таблицы БД, если индекс не установлен.
Разработка БД-приложений Если нужная запись найдена, Find. Key возвращает значение True и делает текущей найденную запись, в противном случае возвращается значение False, и текущей остается та же запись, которая была до поиска. Пусть таблица БД, представляемая компонентом Table 1, содержит три поля: F_Id (S*), F_Date (D*) и F_Text (A). Для поиска в таблице могут использоваться, например, следующие обращения к методу Find. Key: Table 1. Find. Key([PId, '1. 01. 2001', Ptext]), где PId – переменная целого типа, содержащая значение для поиска в поле таблицы F_Id; '1. 01. 2001' – константа; PText – переменная строкового типа, содержащая значение для поиска в поле таблицы F_Text. Если в таблице БД существует запись, поля F_Id, F_Date и F_Text, которой содержат указанные значения, то эта запись станет текущей.
Разработка БД-приложений Table 1. Find. Key([PId]), где PId – переменная целого типа, содержащая значение для поиска в поле F_Id. Если в таблице БД существует запись, поле F_Id которой содержит указанное значение, то текущей станет первая такая запись в соответствии с порядком первичного ключа. Table 1. Find. Key([PDate]), где PDate – переменная типа TDate, содержащая значение для поиска в поле F_Date. Для таблицы Table 1 должен быть установлен вторичный индекс, в котором первом полем является поле F_Date. Если в таблице БД существует запись, поле F_Date которой содержит заданное в переменной PDate значение, то эта запись станет текущей.
Разработка БД-приложений // Установка вторичного индекса по полю F_Date Table 1. Index. Name: ='Index_Date'; //Ввод значения даты для поиска в таблице PDate: =Str. To. Date(Input. Box('Поиск по дате', 'Дата', '')); //Поиск записи if not Table 1. Find. Key([PDate]) then showmessage('Нет такой даты!') else <обработка данных найденной записи>; Если нет первичного ключа, и не установлен ни один вторичный, то метод не работает!
Разработка БД-приложений Locate – ищет в таблице запись, значения заданных полей которой соответствуют значениям, заданным в параметрах поиска. Если нужная запись найдена, метод возвращает значение true и делает текущей найденную запись, в противном случае возвращается значение false и текущая запись не изменяется. Заголовок метода имеет вид: function Locate(const Key. Fields: String; const Key. Values: Variant; Options: TLocate. Options): Boolean;
Разработка БД-приложений В параметре Key. Fields через точку с запятой перечисляются имена полей поиска. В параметре Key. Values, если поиск осуществляются по одному полю, указывается константа или переменная, задающая значение поиска. Например, Table 1. Locate('F_Date', '1. 01. 2001', []) или Table 1. Locate('F_Date', PDate, []). Если поиск осуществляется по нескольким полям, в этом параметре с помощью конструкции Var. Array. Of задается совокупность переменных и констант, определяющих значения для поиска: Table 1. Locate('F_Id; F_Text', Var. Array. Of([PId, '1. 01. 2001']), []). Конструкция Var. Array. Of позволяет объединить в одну структуру разные типы данных.
Разработка БД-приложений Последний параметр Options позволяет осуществлять для строковых полей частичный поиск или поиск без учета регистра. Если значения параметра не задано ([]), ищется запись с полным совпадением значений. Значение параметра lo. Case. Insensitive предполагает поиск без учета регистра, lo. Partial. Key – поиск по начальным символам. Например, обращение к методу Table 1. Locate('F_Text', 'информатика', [lo. Case. Insensitive]) позволит найти записи со значениями в поле F_Text «информатика» , «Информатика» , «ин. Форматика» и т. д. Обращение к методу Table 1. Locate('F_Text', 'инфо', [lo. Partial. Key]) найдет записи со значениями в поле F_Text «информатика» , «информатизация» , «информационные технологии» и т. д. Можно указать оба значения: Table 1. Locate('F_Text', 'инфо', [lo. Partial. Key, lo. Case. Insensitive]).
Разработка БД-приложений Последний параметр Options позволяет осуществлять для строковых полей частичный поиск или поиск без учета регистра. Если значения параметра не задано ([]), ищется запись с полным совпадением значений. Значение параметра lo. Case. Insensitive предполагает поиск без учета регистра, lo. Partial. Key – поиск по начальным символам. Например, обращение к методу Table 1. Locate('F_Text', 'информатика', [lo. Case. Insensitive]) позволит найти записи со значениями в поле F_Text «информатика» , «Информатика» , «ин. Форматика» и т. д. Обращение к методу Table 1. Locate('F_Text', 'инфо', [lo. Partial. Key]) найдет записи со значениями в поле F_Text «информатика» , «информатизация» , «информационные технологии» и т. д. Можно указать оба значения: Table 1. Locate('F_Text', 'инфо', [lo. Partial. Key, lo. Case. Insensitive]).
Разработка БД-приложений Если нужная запись найдена, она становится текущей и функция возвращает значение True, в противном случае функция возвращает значение False. В тексте программы этот метод вызывается оператором Table 1. Locate(<параметры>), где Table 1 – имя компонента Table, связанного с таблицей БД, в которой происходит поиск. // В поле таблицы БД, связанной с компонентом Table 1, ищется первая запись, которая в поле Name_Product содержит значение ‘молоко’ if Table 1. Locate('Name_Product ', 'молоко ', []) then // Искомая запись найдена, она становится текущей Showmessage('Товар найден!') else // Искомая запись не найдена, текущая запись не изменяется v Showmessage('Товар не найден!')
Разработка БД-приложений Связанное (lookup) поле используется для визуального отображения в одной таблице значения какого либо поля другой таблицы. Для этого должны быть определены правила, по которым каждой записи исходной таблицы ставится в соответствие одна запись другой таблицы (обычно последние таблицы называются справочными). Такая связь называется один-к-одному (one to one). Для определения связи необходимо указать поля одной и второй таблицы, по которым осуществляется связь. Связываемое поле второй таблицы должно быть ключевым, чтобы обеспечить однозначность связи. Пусть компонент с именем ta. Marks представляет таблицу БД Marks. db, с полями: Id типа S* (код оценки) и Name типа A (наименование оценки), а компонент ta. Students представляет таблицу БД Students. db, имеющую поле Id_Mark (код оценки). Требуется создать поле Name_Mark для ta. Students, в котором отображалось бы наименование оценки, в зависимости от кода оценки в таблице Students. db.
Разработка БД-приложений Для создания требуемого lookup поля необходимо: 1. Щелкнуть дважды по компоненту ta. Students, нажать правую кнопку мыши и в появившемся коротком меню выбрать команду New Field. 2. В появившемся окне New Field (рис. 6. 2) задать значения следующих реквизитов: Field properties/Name – имя нового поля, Name_Mark; Field properties/Type – тип нового поля, String; Field properties/Size – наибольшая длина строки, например, 20; Field type – выбрать значение Lookup;
Разработка БД-приложений Lookup Definition/Data. Set – выбрать из списка таблицу ta. Marks (компонент Table, представляющий таблицу справочник). Lookup Definition/Lookup Keys – выбрать из списка полей таблицы ta. Marks поле Id (данное поле используется для связи с исходной таблицей: связываются записи, в которых значения выбранных полей исходной таблицы и таблицы справочника совпадают). Lookup Definition/Result Field – выбрать из списка полей таблицы ta. Marks поле Name. Значение поля Name таблицы БД Marks. db будет доступно для отображения через компонент ta. Students. Новое поле появляется не в физической таблице БД, а только в компоненте, ее представляющем!
Разработка БД-приложений
Разработка БД-приложений Вычисляемое поле (calculated fields) позволяет использовать значения полей физической таблицы БД для вычисления значений выражений и их представления в визуальных компонентах, связанных с таблицей. Значение вычисляемого поля формируется заново каждый раз, когда изменяются значения соответствующих полей таблицы. Программный код, реализующий алгоритм формирования значения вычисляемого поля, вставляется в обработчик события On. Сalc. Fields визуального компонента Table, представляющего таблицу. Для создания вычисляемого поля необходимо: Дважды щелкнуть по компоненту Table соответствующей таблицы. Нажать правую кнопку мыши и в появившемся меню выбрать команду New Field
Разработка БД-приложений
Разработка БД-приложений Ввести наименование вычисляемого поля в строке Field properties/Name. Выбрать нужный тип в строке Field properties/Type. Выбрать значение Calculated в строке Field type и нажать кнопку OK. Вставить в событие On. Сalc. Fields визуального компонента Table, представляющего таблицу, программный код, определяющий значение вычисляемого поля.
Разработка БД-приложений Пусть, например, таблица БД Products. db содержит поля Price тип $ (цена за единицу товара) и Amount тип N (количество закупленного товара в единицах, в которых установлена цена). Требуется создать поле для вычисления стоимости всего приобретенного товара. Для этого необходимо: ввести имя поля Sum в строку Field properties/Name; выбрать тип поля Currency в строке Field properties/Type; выбрать значение Calculated в строке Field type; вставить в событие On. Сalc. Fields визуального компонента Table 1 следующий программный код: Table 1 Sum. Value: =Table 1 Price. Value*Table 1 Amount. Value
Разработка БД-приложений Мультиформы Часто возникает необходимость на одной форме отобразить информацию из двух связанных содержательно таблиц: реквизиты студента и его оценки; наименование фирмы поставщика и список товаров; автор и список его произведений и т. д. Для этого необходимо между таблицами установить связь один-ко-многим. Эта связь подразумевает, что каждой записи главной таблицы (master table) может соответствовать несколько записей подчиненной таблицы (detailed table) и каждой записи подчиненной таблицы соответствует не более одной записи главной таблицы. Соответствие устанавливается по равенству значений выбранных полей двух таблиц.
Разработка БД-приложений Для создания такой связи между таблицами необходимо: для компонента Table подчиненной таблицы выбрать для свойства Master. Source имя источника данных (TData. Source), связанного с главной таблицей; в свойстве Master. Fields компонента Table подчиненной таблицы определить для полей подчиненной таблицы соответствующие поля главной таблицы. Соответствие может устанавливаться по первичному или вторичным индексам, но необходимо, чтобы по каждой записи подчиненной таблицы однозначно определялась запись главной таблицы
Разработка БД-приложений
Разработка БД-приложений Такая связь между таблицами позволяет для текущей записи главной таблицы отображать на форме только связанные с ней записи подчиненной таблицы. Обычно для обеспечения удобного интерфейса пользователя на форме представляются «идентификационные» поля главной таблицы (фамилия, наименование, номер счета и т. д. ) в виде TDBEdit и поля подчиненной таблицы в виде TDBGrid. Поля, по которым реализуется связь (они имеют одинаковые значения для двух таблиц), целесообразно отображать на форме только один раз для главной таблицы.
Разработка БД-приложений
Разработка БД-приложений Запросы представляет в программе специальный класс TQuery. Этот класс задается компонентом Query (страница BDE). Для использования запроса в приложении необходимо компонент Query и задать значения свойствам: Database. Name и SQL. Значение свойства SQL – совокупность строк запроса на языке SQL.
Разработка БД-приложений
Разработка БД-приложений Для запуска запроса используется оператор: <имя компонента запроса>. Close; <имя компонента запроса>. Open; Отображение результатов запроса 1. установить на форме компоненты Data. Source и DBGrid (с именами, например, Data. Source 1 и DBGrid 1); 2. свойству Data. Set компонента Data. Source придать значение имени комонента запроса (например, Query 1); 3. свойству Data. Source компонента DBGrid придать значение имени источника данных (Data. Source 1);
Разработка БД-приложений Для запуска запроса используется оператор: <имя компонента запроса>. Close; <имя компонента запроса>. Open; Отображение результатов запроса 1. установить на форме компоненты Data. Source и DBGrid (с именами, например, Data. Source 1 и DBGrid 1); 2. свойству Data. Set компонента Data. Source придать значение имени комонента запроса (например, Query 1); 3. свойству Data. Source компонента DBGrid придать значение имени источника данных (Data. Source 1);
Разработка БД-приложений Для обеспечения большей гибкости запросов в тексте запроса могут указываться вместо конкретных значений переменные, которые получают конкретные значения при выполнении запроса. Такие запросы – запросами с параметрами. Перед переменной, обозначающей параметр в тексте запроса необходимо поставить знак «: » , а перед открытием запроса – вызвать специальный метод Param. By. Name класса TQuery: <имя объекта класса TQuery (имя запроса)>. Param. By. Name (<имя параметра>). Value: =<выражение> Тип выражения должен соответствовать типу значения, который заменяет параметр в запросе. После выполнения метода Param. By. Name значение выражения заменяет в запросе параметр. Приведем пример. Пусть требуется в качестве результата запроса получить книги всех писателей, проживающих в заданной стране, и вышедшие не позднее заданного года.
Разработка БД-приложений SELECT b. name FROM authers a, books b, country c WHERE (b. id_aut=a. id) AND (a. id_country=c. id) AND (c. name=: param 1) AND (b. year_publ>=: param 2) ORDER BY b. name Перед обращением к данному запросу необходимо задать значения двух параметров и выполнить запрос: Country: =Input. Box(‘Наименование страны ’, ‘Введите наименование страны’, ’’); Year: =Str. To. Int(Input. Box(‘Год’, ‘Введите год’, ’’)); Query 1. Close; Query 1. Param. By. Name('param 1'). Value: =Country; Query 1. Param. By. Name('param 2'). Value: =Year; Query 1. Open;
Разработка БД-приложений Для оператора Select используется Query 1. Open. Для операторов Insert, Update, Delete Query 1. Exec. SQL DELETE FROM books WHERE books. year<1917 Вызов запроса: Query 1. Close; Query 1. Exec. SQL;
Лекция 5 - СУБД.ppt