03ffc4546c22a6ef74469bf444d5cf3d.ppt
- Количество слайдов: 54
ООП IDE Borland C++ Builder Лекция 3_4. Программиров ание работы для локальных баз данных 1
Содержание 1. Состояние набора данных, пересылка записи в базу данных 2. Методы доступа к полям, навигации и поиска записей 3. Методы установки диапазона допустимых значений 4. Методы создания и модификации таблиц 5. Клиентские наборы данных 2
Состояние набора данных, пересылка записи в базу данных • Сложные приложения с БД требуют программирования и написания различных обработчиков событий. • Начнем рассмотрение вопросов программирования с основного свойства State компонента Таble работы с базами данных, определяющего состояние набора данных. • Это свойство доступно только во время выполнения и только для чтения 3
Состояние набора данных, пересылка записи в базу данных Набор данных может находиться в одном из следующих основных состояний: ds. Inactive Набор данных закрыт, данные недоступны. ds. Browse Данные могут наблюдаться, но не могут изменяться. Это состояние по умолчанию после открытия набора данных. ds. Edit Текущая запись может редактироваться. ds. Insert Может вставляться новая запись. ds. Set. Key Доступен режим поиска записи и операция задания диапазона изменений Set. Range. Может наблюдаться только ограниченное множество данных и не может проводиться редактирование или вставка новой записи. 4
Состояние набора данных, пересылка записи в базу данных • Состояния могут устанавливаться в приложении во время выполнения с использованием различных методов. В частности, следующие методы: • Close закрывает соединение с базой данных, устанавливая свойство Active набора данных в false. • При этом State переводится в состояние ds. Inactive. • Open открывает соединение с базой данных, устанавливая свойство Active набора данных в true. • При этом State переводится в состояние ds. Browse. 5 • Edit переводит набор данных в состояние ds. Edit.
Состояние набора данных, пересылка записи в базу данных • Insert и Insert. Record вставляют новую пустую запись в набор данных и переводят State в состояние dslnsert. • Edit. Key, Set. Range. Start, Set. Range. End и Apply. Range, связанные с поиском записи и с заданием допустимого диапазона изменения данных, переводят State в состояние ds. Set. Key. • При программировании работы с базой данных надо следить за тем, чтобы набор данных вовремя был переведен в соответствующее состояние. • Например, если редактировать запись, не переведя предварительно набор данных в состояние ds. Edit методом Edit, то будет сгенерировано исключение EDatabase. Error с сообщением «Набор данных не в режиме Edit или Insert» . 6
Состояние набора данных, пересылка записи в базу данных • • Пересылка записи в базу данных. Пока идет редактирование текущей записи, изменения осуществляются в буфере, а не в самой базе данных. Пересылка записи в базу данных производится только при выполнении метода Post. Метод Post() может вызываться только тогда, когда набор данных находится в состоянии ds. Edit или dslnsert. Post можно вызывать явно, например, Table 1 ->Post(). 7
Состояние набора данных, пересылка записи в базу данных Пересылка записи в базу данных. • Но он вызывается и неявно при любых перемещениях по набору данных, т. е. при перемещении курсора на другую запись, если набор данных находится в состоянии ds. Edit или dslnsert. • Отменить изменения, внесенные в запись, можно методом Cancel. • Здесь, если предварительно не был вызван метод Post, запись возвращается к состоянию, предшествовавшему редактированию, и набор данных переводится в состояние ds. Browse. 8
Состояние НД, пересылка записи в БД • Перед началом выполнения каждого из рассмотренных методов и после его выполнения генерируются соответствующие события набора данных Table. • Например, перед выполнением метода Post возникает событие Before. Post, а после его окончания - событие After. Post. • Аналогичные события Beforelnsert и Afterlnsert сопровождают выполнения метода Insert и т. п. • Подобные события и надо использовать для проверки данных и получения подтверждения на их изменение. • Один из множества возможных вариантов заключается в использовании события Before. Post. 9
Состояние НД, пересылка записи в БД void _fastcstll TFom 1: : Table 1 Before. Post (TData. Set *Data. Set) { if (проверка введенных данных) { if (Application->Message. Box("Хотите занести текущую запись в базу данных? ", "Подтвердите занесение в базу данных", MB_YESNOCANCEL + MB_ICONQUESTION)!= IDYES) { Table 1 ->Cancel (); Abort () ; } } else { Application->Message. Box("Ошибочные данные", "Ошибка", MB_ICONST 0 P); Abort () ; } } 10
Состояние НД, пересылка записи в БД • К этому обработчику будет происходить обращение перед выполнением метода Post, как бы он не был вызван: явно или вследствие перемещения по базе данных, если текущая запись была изменена. • В обработчике сначала производится проверка данных в записи. • Если результат неудовлетворительный, то пользователю дается сообщение об ошибочности данных и выполняется функция Abort, прерывающая выполнение Post. • Текущая запись остается в состоянии ds. Edit, но ошибочные данные в ней не сбрасываются, что позволяет пользователю исправить их. 11
Состояние НД, пересылка записи в БД • Если проверка данных в записи показала их правильность, то у пользователя, запрашивается подтверждение изменений в базе данных. • Если он ответит отрицательно, то для набора данных выполняется метод Cancel, а затем выполняется функция Abort. • Cancel возвращает данные в текущей записи к состоянию, которое было до их редактирования. • Таким образом, приведенный обработчик Before. Post позволяет предотвратить непроизвольное или ошибочное изменение данных. 12
Состояние НД, пересылка записи в БД • • Часто безопасность данных обеспечивается несколько иначе: при переходе в режим редактирования данные из текущей записи переносятся в какие-то обычные окна редактирования, не связанные с данными, там проводится их изменение после того, как проведены все проверки и получено подтверждение пользователя на их сохранение, эти данные переносятся в таблицу. 13
Состояние НД. Доступ к полям • Поля отображаются объектами класса TField и производных от него классов TString. Field, TSmallint. Field, TBoolean. Field и т. п. • Эти объекты могут создаваться тремя способами: ü Автоматически генерироваться для каждого компонента набора данных (Table и др. ) ü Создаваться в процессе проектирования с помощью Редактора Полей ü Создаваться программно в процессе выполнения приложения. • Автоматическая генерация объектов класса TField происходит в момент открытия БД, если эти объекты не создаются другими способами: в процессе проектирования с помощью РП или программно во время выполнения. 14 • Объекты генерируются для всех полей таблицы.
Состояние НД. Доступ к полям • Автоматическая генерация объектов класса TField происходит в момент открытия БД, если эти объекты не создаются другими способами. • Объекты генерируются для всех полей таблицы. • Создание объектов полей в процессе проектирования с помощью РП исключает автоматическое создание объектов. • Таким образом, все поля, объекты которых не созданы с помощью РП, недоступны для приложения. • Использование РП очень удобно, так как позволяет задать в процессе проектирования множество полезных свойств для каждого поля. • Программное создание объектов класса TField используется сравнительно редко и мы его 15 рассматривать не будем.
Состояние НД. Доступ к полям Доступ к объектам полей возможен тремя способами: • По порядковому индексу объекта • По имени поля • По имени объекта 16
Состояние НД. Доступ к полям • Доступ по порядковому индексу осуществляется через свойство TField* Fields[int i], где i - индекс объекта. Индексация начинается с 0. Пример: • Table 1 ->Fields[0] - это первый объект поля таблицы Table 1. • Доступ по имени поля осуществляется с помощью метода Field. By. Name("имя"). Пример: • Table 1 ->Field. By. Name("Fam") - это объект, связанный с полем Fam. 17
Состояние НД. Доступ к полям • Доступ по имени объекта возможен только к объектам, созданным с помощью Редактора Полей. • По умолчанию C++Builder формирует имена объектов полей (Name) из имени таблицы и имени поля. Например, Table 1 Dep. • Эти имена отображаются в Редакторе Полей. • Обращение к объекту по имени не требует ссылки на таблицу. • Можете просто написать Table 1 Dep объект. • Автоматически создаваемые объекты имени не имеют - их свойство Name пусто. • Для них обращение по имени невозможно. 18
Состояние НД. Доступ к полям • Наиболее быстрый способ доступа к полям - доступ по имени объекта. • Недостаток - жесткая кодировка поля, к которому производится обращение. • Если надо, чтобы строка кода в разных ситуациях обращалась к разным полям, то надо использовать или доступ по индексу Fields[i], или по имени поля методом Field. By. Name(s). • Объекты класса TField и производные от них классы имеют множество свойств. • Это свойства Readonly, Display. Label, Custom. Constraint и многие другие. 19
Состояние НД. Доступ к полям • Рассмотрим, как добраться до главного свойства объекта - хранящегося в нем значения поля текущей записи. • Значение поля хранится в свойстве Value. • Тип этого свойства - Variant, т. е. тип определяется типом поля. Tabiel->Field. By. Name("Fam")->Value - это строка, Table 1 ->Field. By. Name("Year_b")->Value - это целое число. • Имеется также ряд свойств, переводящих один тип значений в другой. • Свойство As. String переводит тип любого поля в строку при чтении значения поля, и осуществляет обратный перевод строки в тип поля при записи значения поля 20
Состояние НД. Доступ к полям EDep->Text = Table 1 ->Field. By. Name ("Dep")->As. String; EYear->Text = Table 1 ->Field. By. Name("Year_b")>As. String; EPol->Text = Table 1 ->Field. By. Name("Pol")->As. String; • В окна редактирования EDep, EYear и EPol будут занесены в текстовом виде значения в текущей записи полей Dep, Year_b и Pol, хотя поле Dep имеет тип строки, поле Year_b - целое значение, а поле Pol - булево. • Если для поля Pol не заданы значения Display Values, то в EPol будут отображены значения «true» или «false» . • Если же заданы значения свойства Display. Values, например «м; ж» или «мужск; женск» , то отобразятся именно эти заданные значения. 21
Состояние НД. Доступ к полям • Свойство As. String работает и как обратное преобразование типов. • Например, после редактирования значений в полях EDep, EYear и EPol, внесем эти значения в текущую запись следующим кодом: Table 1 ->Edit(); Table 1 ->Field. By. Name("Dep")->As. String = EDep>Text; Table 1 ->Field. By. Name("Year_b")->As. String = EYear>Text; Table 1 ->Field. By. Name("Pol")->As. String = EPol>Text; Table 1 ->Post(); 22
Состояние НД. Доступ к полям • Для полей Year_b и Pol текст будет преобразован соответственно в целое и булево значение. • Описанный способ один из наиболее надежных для редактирования записи в базе данных. • Прежде, чем вносить отредактированные данные в таблицу, можно их всесторонне проверить, запросить подтверждение записи и только после этого заносить изменения в базу данных. • При этом в процессе редактирования и проверки не связаны ни с какими событиями и состояниями базы данных. 23
Состояние НД. Доступ к полям • Помимо As. String имеются еще аналогичные свойства As. Integer, As. Float, As. Boolean, As. Date. Time. Ø As. Integer осуществляет преобразования между типом данного поля и целым 32 битным числом, Ø As. Float делает то же самое для действительных чисел с плавающей запятой, Ø As. Boolean - для булевых значений, Ø As. Date. Time - для значений дат и времени в формате TDate. Time. 24
Состояние НД. Методы навигации • Наборы данных имеют ряд методов, позволяющих осуществлять навигацию по таблице: First Перемещение к первой записи Last Перемещение к последней записи Next Перемещение к следующей записи Prior Перемещение к предыдущей записи Move. To(int i) Перемещение к концу (при i > 0) или к началу (при i < 0) на i записей 25
Состояние НД. Доступ к полям • При перемещениях можно совершить ошибку, выйдя за пределы имеющихся записей. • Если курсор находится на первой записи и выполняется метод Prior, то будет выход за начало таблицы, • Если на последней записи и выполняете метод Next, то будет выход последней записи. • Чтобы контролировать начало и конец таблицы, существуют два свойства: Eof (end-of-file) - конец данных, и Bof (beginning of file) - начало данных. • Эти свойства становятся равными true, если делается попытка переместить курсор соответственно за пределы последней или первой записи, а также после выполнения методов 26 соответственно Last и First.
Состояние НД. Доступ к полям • Пусть в приложении имеется выпадающий список с именем CBdep, который нужно заполнить данными, содержащимися в полях Dep всех записей таблицы, соединенной с компонентом Table 1. CBdep->С 1 еаг () ; Table 1 ->First() ; while (!Table 1 ->Eof) { CBdep->Items->Add(Table 1 Dep->As. String) ; Table 1 ->Next () ; } CBdep->Item. Index = 0; Table 1 ->First () ; 27
Состояние НД. Доступ к полям • Первый оператор очищает список CBdep. • Второй - устанавливает курсор таблицы на первую запись. • Далее в цикле по всем записям, пока не достигнута последняя, (проверяется выражением Table 1 ->Eof) для каждой записи в список заносится значение поля Dep, после чего методом Next курсор перемещается к следующей записи. • После окончания цикла индекс списка и курсор таблицы переводятся соответственно на первую строку и запись. 28
Состояние НД. Поиск записей • Одна из важнейших операций с базами данных - поиск записей по некоторому ключу. • Существует несколько методик поиска записей: Ø Set. Key Ø Find. Key Ø Lookup Ø Locate. 29
Состояние НД. Поиск записей • Методика Set. Key. Таблица предварительно должна быть индексирована по тому полю, по которому должен будет проводиться поиск. • Затем таблица устанавливается в состояние поиска ds. Set. Key методом Set. Key. • В состоянии ds. Set. Key набор данных воспринимает последующий оператор присваивания значения полю не как присваивание, а как задание ключа поиска. • После установки состояния ds. Set. Key оператором присваивания устанавливается требуемое значение ключа поиска по интересующему полю. • Методом Goto. Key курсор переводится на запись, в которой значение указанного поля равно ключу. 30
Состояние НД. Поиск записей • Если таких записей несколько, то курсор переводится на первую из них. • Если соответствующая запись не находится, то метод Goto. Key возвращает false. • Для полей типа строк лучше использовать метод Goto. Nearest. • Этот метод перемещает курсор на первую запись, значение поля в которой максимально близко к ключу. • Метод Goto. Nearest можно применять и к цифровым полям. • В этом случае он переместит курсор на первую запись, значение поля в которой больше или равно заданному значению ключа. 31
Состояние НД. Поиск записей • Нужно найти первую запись, в которой год рождения (поле Year_b) равен заданному пользователем в окне редактирования Eyear: Table 1 ->Index. Field. Names = "Year_b"; Table 1 ->Set. Key(); Table 1 ->Field. By. Name("Year_b")->As. String = EYear>Text; if (!Table 1 ->Goto. Key()) Show. Message("Запись не найдена"); • Первый оператор индексирует набор данных по полю Year_b, второй переводит набор данных в состояние ds. Set. Key, третий задает ключ поиска, а четвертый осуществляет переход к соответствующей записи или сообщает об отсутствии такой записи. 32
Состояние НД. Поиск записей • Если нужно найти в таблице сотрудника по его фамилии, заданной пользователем в окне редактирование EFam, можно выполнить код: Table 1 ->Index. Field. Names = "Fam"; Table 1 ->Set. Key(); Table 1 ->Field. By. Name("Fam")->As. String = EFam>Text; Table 1 ->Goto. Nearest(); • Даже если точно такой фамилии не найдется, курсор перейдет на наиболее похожую. 33
Состояние НД. Поиск записей • Методика поиска Find. Key еще богаче по своим возможностям. • В ней таблица также должна быть проиндексирована по тем ключевым полям, по которым осуществляется поиск. • Функция Find. Key определена следующим образом: • bool _fastcall Find. Key(const System: : TVar. Rec * Key. Values, const int Key. Val. Size); • Параметр Key. Values представляет собой открытый массив: разделяемый запятыми список значений полей, по которым индексирован набор данных, в той последовательности, в которой они входят в индекс. 34
Состояние НД. Поиск записей • При этом не обязательно перечислять все поля - достаточно перечислить первое или несколько первых. • Параметр Key. Val. Size определяет индекс последнего поля в массиве, участвующего в поиске. • Поскольку индексы начинаются с 0, то Key. Val. Size на единицу меньше количества полей, участвующих в поиске. • Для строковых полей эффективнее использовать метод Find. Nearest, обеспечивающий переход к наиболее совпадающей строке, если полного совпадения не получено. • Объявление и параметры этого метода те же, что и в методе Find. Key. 35
Состояние НД. Поиск записей • Метод Find. Nearest можно применять и к цифровым полям. • В этом случае он переместит курсор на первую запись, значение полей в которой больше или равны заданных значений ключей. • Для методов Find. Key и Find. Nearest удобно применять макрос OPENARRAY, создающий временный открытый массив и определяющий его размер: OPENARRAY(TVar. Rec, (список ключей)) • Макрос OPENARRAY может воспринимать список, включающий до 19 элементов, разделенных запятыми. 36
Состояние НД. Поиск записей • Нужно выполнить тот же поиск по фамилии, что и приведенный выше. В этом случае код может иметь вид: Table 1 ->Index. Field. Names = "Fam"; Table 1 ->Find. Nearest(&TVar. Rec(EFam->Text) , 0) ; • Если нужно выполнить поиск сотрудника с заданной фамилией и работающего в конкретном подразделении, заданном в окне редактирования EDep, то поиск можно осуществить с помощью макроса OPENARRAY следующим образом: Table 1 ->Index. Field. Names = "Dep; Fam"; Table 1 ->Find. Nearest(OPENARRAY(TVar. Rec, (EDep>Text, EFam->Text))); • Первый оператор индексирует таблицу по полям Dep и Fam, а второй задает ключи для этих полей. 37
Состояние НД. Поиск записей Пример. • Пользователь будет набирать фамилию в окне Efam • При вводе каждого нового символа курсор должен перемещаться на запись, наиболее близко совпадающую с уже введенными символами. • Для этого сначала надо индексировать таблицу по полю Fam. • А затем достаточно в событие On. Change окна редактирования EFam вставить обработчик Table 1 ->Find. Nearest(&TVar. Rec(EFam->Text) , 0) ; 38
Состояние НД. Поиск записей • Метод Locate - наиболее универсальный метод, поскольку, он применим к любым наборам данных. Метод объявлен следующим образом: bool _fastcall Locate(const System: : Ansi. String Key. Fields, const System: : Variant SKey. Values, TLocate. Options); • В качестве параметра Key. Fields передается строка, содержащая список ключевых полей. • В качестве параметра SKey. Values передается Key. Values - массив ключевых значений. • Параметр Options является множеством опций, элементами которого могут быть lo. Case. Insensitive - нечувствительность поиска к регистру, в котором введены символы, и lo. Partial. Key - допустимость частичного 39
Состояние НД. Поиск записей • Метод возвращает false, если искомая запись не найдена. • В простейшем случае применение Locate отличается от рассмотренных методов только отсутствием необходимости индексировать набор данных определенным образом. • поиск по фамилии может осуществляться операторами TLocate. Options Search. Options; Search. Options < lo. Partial. Key < lo. Caselnsensitive; Table 1 ->Locate("Fam", EFam->Text, Search. Options); • будет работать независимо от того, как индексирована база данных. • Если набор данных индексирован, то поиск производится быстрее. 40
Состояние НД. Поиск записей • Приведенный код сократить до двух операторов: TLocate. Options Search. Options; Table 1 ->Locate("Fam", EFam->Text, Search. Options<lo. Partial. Key<lo. Case. Insensitive); • При поиске по нескольким полям можно воспользоваться функцией Var. Array. Of, которая формирует тип Variant из задаваемого ей массива параметров любого типа. • Рассмотренный ранее поиск по отделу и фамилии может быть осуществлен операторами TLocate. Options Search. Options; Variant locvalues[] = {EDep->Text, EFam->Text}; Tabiel->Locate("Dep; Fam", Var. Array. Of(locvalues, 1), Search. Options<lo. Partial. Key<lo. Case. Insensitive); 41
Состояние НД. Поиск записей • Метод Lookup. Этот метод определен следующим образом: System: : Variant _fastcall Lookup(const Key. Fields, const SKey. Values, const Result. Fields); • Первые два параметра аналогичны методу Locate. Третий параметр - строка, перечисляющая поля, значения которых возвращаются в виде массива Variant. • Если не найдено соответствующей записи, функция возвращает false. • Поиск записи, относящейся к сотруднику, фамилия которого указана в окне EFam, и вывести в окно EDep название отдела, в котором он работает: EDep->Text = Table 1 ->Lookup("Fam", EFam->Text, "Dep"); 42
Состояние НД. Поиск записей • Метод Lookup не изменяет положения курсора. • Он только возвращает значения указанных полей. • Они могут использоваться любым способом. • В частности, они могут использоваться вместо параметра Key. Values в другом операторе Lookup или Locate. • Это открывает широкие возможности формирования сложных запросов по нескольким таблицам. 43
Состояние НД. Методы установки диапазона допустимых значений • Рассмотрим методы, позволяющие задавать диапазон допустимых значений поля во время выполнения приложения. • Метод Set. Range. Start переводит набор данных в состояние ds. Set. Key и следующий оператор присваивания значения полю воспринимается как задание для поля нижней границы диапазона возможных значений. • Метод Set. Range. End действует аналогично, но последующий оператор присваивания воспринимается как задание верхней границы диапазона. • После того как пределы диапазона установлены, можно выполнить метод Apply. Range. 44
Состояние НД. Методы установки диапазона допустимых значений • При этом начнут использоваться установленные границы диапазона • Доступными для просмотра и редактирования будут только те записи, в которых значения указанного поля находятся внутри диапазона. Например: Table 1 ->Index. Field. Names = "Fam"; Table 1 ->Set. Range. Start(); Table 1 ->Field. By. Name ("Fam")->As. String = "A"; Table 1 ->Set. Range. End(); Table 1 ->Field. By. Name ("Fam")->As. String = "Г"; Table 1 ->Apply. Range(); • доступными будут записи сотрудников, фамилии которых начинаются с букв «А» , «Б» , «В» . 45
Состояние НД. Методы установки диапазона допустимых значений • На результаты работы методов Set. Range. Start и Set. Range. End для числовых полей влияет свойство набора данных Key. Exclusive. • Оно определяет, будут ли считаться сами заданные границы входящими в диапазон (при Key. Exclusive = false, это значение принято по умолчанию), или не входящими (при Key. Exclusive =true). • При Key. Exclusive = false используются операции отношения >=, <=, при Key. Exclusive = true - >, <. 46
Состояние НД. Методы установки диапазона допустимых значений • Если нужно отобрать записи, в которых год рождения сотрудников лежит в определенных пределах, то при коде Table 1 ->Index. Field. Names = "Year_b" ; Table 1 ->Set. Range. Start() ; Table 1 ->Field. By. Name("Year_b")->As. Integer = 1950; Table 1 ->Set. Range. End() ; Table 1 ->Field. By. Name("Year-b")->As. Integer = I 960; Table 1 ->Apply. Range() ; • будут отобраны записи, в которых год рождения лежит в пределах 1950 -1960, включая годы 1950 и 1960. 47
Состояние НД. Методы установки диапазона допустимых значений При коде Table 1 ->lndex. Field. Names = "Year_b"; Table 1 ->Set. Range. Start(); Table 1>Field. By. Name("Year_b")->As. Integer = 1950; Table 1 ->Key. Exclusive = true; Table 1 ->Set. Range. End(); Table 1>Field. By. Name("Year_b")->As. Integer = 1960; Table 1 ->Apply. Range(); • записи, соответствующие 1950 году, не войдут в число отобранных. 48
Состояние НД. Методы установки диапазона допустимых значений • Имеется и более простой способ установки диапазона - метод Set. Range - определен следующим образом: void _fastcall Set. Range(Start. Values, Start. Values_Size, End. Values, End. Values_Size); • Открытые массивы Start. Values и End. Values должны содержать соответственно нижние и верхние значения диапазонов полей, являющихся ключевыми. • Таким образом, метод Set. Range заменяет последовательное обращение к методам Set. Range. Start, Set. Range. End и Apply. Range. 49
Состояние НД. Методы установки диапазона допустимых значений • Приведенные ранее операторы, задающие диапазон фамилий в отобранных записях, могут быть заменены следующими: Table 1 ->Index. Field. Names = "Fam"; Table 1 ->Set. Range(STVar. Rec("A") , 0, STVar. Re. C("Г") , 0) ; • Если нужно выбрать тех сотрудников, фамилии которых начинаются на «А» - «В» и которые работают в цехе 1, то приведенные выше операторы можно изменить следующим образом: Table 1 ->Index. Field. Names = "Dep; Fam"; Table 1 ->Set. Range(OPENARRAY(TVar. Rec, ("Цех 1", "А")), OPENARRAY(TVar. Rec, ("Цех 1", "Г"))); 50
Методы создания и модификации таблиц • Table имеет ряд методов, позволяющих модифицировать таблицы и индексы Create. Table Создает новую таблицу, исходя из установок компонента Table, содержащихся в свойствах Fields или Field. Defs. Если таблица с именем, указанным в свойстве Table. Name уже имеется, она будет переписана. Применение этого метода позволяет, например, взять структуру существующей таблицы, как-то изменить ее, затем изменить свойство Table. Name на имя новой таблицы и создать эту таблицу. Delete. Table Метод уничтожает существующую таблицу, которая задана свойствами Database. Name и Table. Name. Таблицу надо предварительно закрыть. Rename. Table(s) Метод переименовывает существующую таблицу, присваивая ей новое имя, содержащееся в s. Одновременно переименовываются все сопутствующие таблице файлы. Deletelndex(s) Удаляет вторичный индекс с именем s из таблицы. 51
Методы создания и модификации таблиц • Код, создающий таблицу Dep. • Предположим, что в приложении имеется компонент Table 1, связанный с базой данных, в которой создается таблица. Table 1 ->Active = False; // Компонент Table 1 делается неактивным Table 1 ->Table. Name = "Dep. db"; // Указывается имя таблицы // Таблица создается, если в базе данных нет такой таблицы if(! Table 1 ->Exists) { // Указывается тип таблицы Table->Table. Туре = tt. Paradox; // Начало описания полей таблицы 52
Методы создания и модификации таблиц Table 1 ->Field. Defs->Clear(); // Создается указатель на объект описания поля TField. Def *p. New. Def = Table 1 ->Field. Defs>Add. Field. Def(); // Описание первого поля p. New. Def->Name = "Dep"; p. New. Def->Data. Type = ftstring; p. New. Def->Size = 20; p. New. Def->Required = True; // Описание второго поля p. New. Def = Table 1 ->Field. Defs->Add. Field. Def() ; p. New. Def->Name = "Proisv"; p. New. Def->Data. Type = ft. Boolean; 53
Методы создания и модификации таблиц // Описание индекса Table 1 ->Index. Defs->Clear() ; // Индекс без имени первичный ключ таблицы Table 1 ->Index. Defs->Add(" ", "Dep", TIndex. Options() <ix. Primary < ix. Unique); // Создание таблицы методом Create. Table 1 ->Create. Table(); Table 1 ->Open(); // Вставка первой записи Table 1 ->Insert() ; Table 1 ->Field. By. Name("Dep")->As. String = "Бухгалтерия"; Table 1 ->Field. By. Name("Proisv")->As. Boolean = false; Table 1 ->Post(); 54
03ffc4546c22a6ef74469bf444d5cf3d.ppt