Смекни!
smekni.com

Робота з таблицями засобами Lazarus (стр. 2 из 4)

MyDbf.AddIndex(‘custname.ndx’,’Name’,[ixCaseInsensitive]);

Кожного разу при відкритті TDbf, необхідно завантажити файл індексів:

MyDbf.OpenIndexFile(‘custname.ndx’);

Також індекси повинні бути описані включаючи розширення:

MyDbf.IndexName := ‘custname.ndx’;

Індексні файли можуть бути упаковані простим використанням:

MyDbf.CompactIndexFile(‘custname.ndx’);

Приклад, описаний раніше, показує, як створити нову таблицю бази даних програмно. Використання цієї таблиці більш ніж просте.Компоненти доступу до даних у Lazarus (як наприклад TDbEdit) вказують на компонент TDataSource використовуючи свої властивості "DataSource" і "DataField".Компонент TDataSource обробляє сполучення між движком бази даних і компонентами доступу до даних.Потім компонент TDataSource вказує на компонент TDbf використовуючи його властивість "DataSet".Зв'язок нагадує таке:

Переконайтеся, що Ви встановили властивості FilePath (або FilePathFulll), TableLevel, і TableName вашого компоненту TDbf перед викликом:

TDbf.Active := True;

Коли запис видаляється, насправді він фізично залишається в таблиці.Періодично Ви повинні "пакувати" таблицю щоб відновити втрачене місце.Це може бути зроблено установкою ексклюзивного режиму доступу:

MyDbf.Exclusive := True;

MyDbf.Open;

MyDbf.PackTable;

//давайте, також, переробимо індекси

MyDbf.Regenerate.Indexes;

MyDbf.Close;

MyDbf.Exclusive := False;


Справжня сила програмування баз даних починається коли Ви маєте декілька таблиць які посилаються один на одного.Поки TDbf не підтримує довідкову цілісності, але підтримує подання головна/підпорядкована між таблицями TDbf.

Якщо ви хотіли показати всі накладні для наданого клієнта, підпорядкована таблиця (invoices) може залишатися синхронізованою з головною таблицею (customers) автоматично.

На компоненті накладні TDbf встановлюють наступне:

InvDbf.IndexName := ‘idxcustid’;

InvDbf.MasterSource := dsCustomers;

InvDbf.MasterFields := ‘Id’;

Можливості TDbf на цьому не закінчуються. Для більш складних програм знадобляться багато інших властивостей TDbf. Нижче розглянемо всі методи та властивості компонента TDbf.


1. Методы

1.1 GetFieldData

function GetFieldData(Field:TField; Buffer:Pointer): Boolean;override;

Більшості додатків не потрібно викликати GetFieldData.Об'єкт TField викликає цей метод, через реалізацію в методі GetData.Параметр Field або FieldNo вказує поле, з якого мають бути вилучені дані.Параметр Field вказує на сам компонент, у той час як FieldNo вказує на номер поля.Параметр Buffer це буфер в пам'яті, який повинен бути достатнього розміру, щоб помістити значення поля, так як вона подана в базі (не відформатовано і не перетрансльовано).Параметр NativeFormat вказує, що компонент dataset витягує поле в рідному форматі C Builder для зазначеного типу поля.Коли NativeFormat дорівнює false, компонент dataset повинен конвертувати значення поля в належний тип.Це дозволяє обслуговувати дані з наборів різних типів (ADO, BDE або інших) витрат платника податку.GetFieldData повертає значення вказує, що дані були витягнуті успішно.GetFieldData повертає true, якщо буфер успішно заповнений даними з поля, і false, якщо дані не були витягнуті.

1.2 Resync

procedure Resync(Mode: TResyncMode); override;

TDbf підтримує заборону виклику resync.

Див. властивість DisableResyncOnPost.

1.3 CreateBlobStream

function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override; {virtual}

Викличте CreateBlobStream для створення потоку (stream) для читання з BLOB поля або для запису в нього (binary large object BLOB).Параметр Field повинен вказувати на компонент TBlobField з властивості Fields.Параметр Mode вказує, як використовується потік - для читання, для запису або для оновлення вмісту поля.Потоки Blob створюються в зазначеному режимі для конкретної запису.Додатки повинні створювати новий потік щоразу, коли змінюється запис, замість повторного використання існуючого потоку.

1.4 Translate

{$ifdef DELPHI_4}

function Translate(Src, Dest: PChar; ToOem: Boolean): Integer;

override; {virtual}

{$else}

procedure Translate(Src, Dest: PChar; ToOem: Boolean); override; {virtual}

{$endif}

Дані записуються в DBF файл в конкретній кодової сторінці, "OEM".Windows використовує кодові сторінки "ANSI" для показу даних.Ця функція перетрансльовує між цими кодовими сторінками.Вказівка true в ToOem транслює з Windows в DBF.Вказівка false в ToOem транслює з DBF в Windows.

1.5 ClearCalcFields

procedure ClearCalcFields(Buffer: PChar); override;

Внутрішній метод.


1.6 CompareBookmarks

function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;

Викличте CompareBookmarks для визначення того, що обидві закладки (bookmarks) ідентичні чи ні.Параметри Bookmark1 і Bookmark2 це закладки для порівняння.Якщо закладки розрізняються, то CompareBookmarks повертає 1.Якщо закладки ідентичні або обидві закладку рівні NULL, то CompareBookmarks повертає 0.

1.7 ChekDbfFieldDefs

procedure CheckDbfFieldDefs(DbfFieldDefs: TDbfFieldDefs);

Робить перевірку на допустимість типів полів ваших визначеннь в TDbfFieldDef на відповідність поточному стану TableLevel.При використанні TableLevel менш ніж 7, не всі типи є допустимими.

1.8 AddIndex

{$ifdef DELPHI_5}

procedure AddIndex(const AIndexName, Fields: String;

Options: TIndexOptions; const DescFields: String = '');

{$else}

procedure AddIndex(const AIndexName, Fields: String;

Options: TIndexOptions);

{$endif}

Параметр AIndexName це ім'я нового індексу.AIndexName повинен містити ім'я індексу, довжиною не більше 10 символів.

Параметр Fields це значення типу AnsiString value містить поле або вираз на основі якого базується новий індекс.

Параметр Options це безліч атрибутів для індексу.Параметр Options може містити одне, декілька або жодного значення TIndexOptions: ixPrimary, ixUnique, ixDescending, ixCaseInsensitive і ixExpression.

1 . Значення ixPrimary вказує на справді унікальний індекс.При спробі вставки двох однакових ключів буде порушено виняток.

2 . Значення ixUnique вказує на унікальний індекс.Повторні ключі ігноруються.

3 . Значення ixDescending вказує зворотний порядок сортування.

4 . Значення ixCaseInsensitive не використовується.

5 . Значення ixExpression не обов'язково вказувати, це визначається автоматично при розборі параметра Fields.

1.9 RegenerateIndexes

procedure RegenerateIndexes;

Очищає всі підключені індекси і потім створює їх з нуля.

1.10 CancelRange

procedure CancelRange;

Викличте CancelRange для видалення встановленого діапазону в поточній таблиці.Видалення діапазону відновлює доступ до всіх записів набору даних.

1.11 SearchKey

function SearchKey(Key: Variant; SearchType: TSearchKeyType): Boolean;

function SearchKeyPChar(Key: PChar; SearchType: TSearchKeyType): Boolean;

Ця функція припускає, що Ви використовуєте на належний індекс, властивість IndexName.Параметр Key вказує значення для пошуку з активного індексу.Ви можете вказати ключ, як варіантний тип або передати буфер, використовуючи функцію SearchKeyPChar.У даному випадку, передача буфера повинна відповідати таким правилам, заснованим на індексі і типу параметра key:

· Рядковий індекс: вказівник на перший символ рядка, обмежений нулем.

· MDX, цифровий: покажчик на буфер, який містить BCD, у форматі dBase.

· NDX, цифровий: покажчик на тип double.

Параметр SearchType це одне з наступних значень:

· Значення stEqual пошук точної відповідності ключа.Повертає false, якщо ключ не знайдено.

· Значення stGreaterEqual пошук точної відповідності ключа або якщо не знайдено, то такий запис по порядку, яка більше за значенням, ніж ключ. Повертає false, якщо досягнуто кінець файлу.

· Значення stGreater пошук першого запису, значення якої більше значення ключа.Повертає false, якщо досягнуто кінець файлу.

Якщо повертається значення false то вказівник не рухається.

1.12 SetRange

procedure SetRange(LowRange: Variant; HighRange: Variant);

procedure SetRangePChar(LowRange: PChar; HighRange: PChar);

Ця функція припускає, що Ви використовуєте на належний індекс, властивість IndexName. Функція встановлює діапазон записів для поточного набору записів.Параметр LowRange вказує початкову границю, а параметр HighRange вказує кінцеву.Для форматування параметра дивіться функцію SetRangePChar і SearchKeyPChar.


1.13 UpdateIndexDefs

procedure UpdateIndexDefs; override;

Внутрішній метод, який викликає оновлення визначень полів (FieldDefs), оновлює обидва визначення для полів і для індексів, читаючи їх з dbase і індексних файлів.

1.14 GetIndexNames

procedure GetIndexNames(Strings: TStrings);

Параметр Strings вказує список, який при поверненні буде містити список всіх індексів.Значення з цього списку можуть бути використані для установки властивості IndexName.

1.15 TryExclusive

procedure TryExclusive;

Вимагає установки властивості Active в true.Викличте TryExclusive для отримання монопольного доступу до відкритого файлу, без виклику Close, встановлює властивість Exclusive в значення true і заново відкриває таблицю.Властивість Exclusive оновлюється для відображення нового стану.Перевірте властивість Exclusive для того, щоб переконатися, що встановлення режиму пройшла успішно.

1.16 EndExclusive

procedure EndExclusive;

Якщо Ви працювали в монопольному режимі, то виклик EndExclusive повертає вас у попередній стан.


1.17 LockTable

function LockTable(const Wait: Boolean): Boolean;

Викличте функцію LockTable для блокування всієї таблиці.Параметр Wait вказує, що компонент повинен чекати установки блокування або відмови, якщо блокування не вдається встановити.

Різниця між режимами LockTable і Exclusive полягає в тому, що в режимі Exclusive інші не можуть відкрити файл за винятком, коли властивість ReadOnly встановлено у true, а для LockTable вони можуть відкривати файл в режимі читання/запису.У режимі LockTable спроби зміни записів будуть відкинуті.

1.18 UnlockTable

procedure UnlockTable;

Коли таблиця була заблокована за допомогою LockTable, виклик UnlockTable призведе до розблокуванні табліци.