Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 41
1. Создание и пересоздание индекса
>– DbiRegenIndexes( Table1.Handle ); { Регенерация всех индексов }
– создание индекса (зависит от того, существует ли выражение или нет)
>if ((Pos('(',cTagExp) + Pos('+',cTagExp)) > 0) then Table1.AddIndex(cTagName, cTagExp, [ixExpression]) ( <– ixexpression – _литерал_)
>else Table1.AddIndex(cTagName, cTagExp, []);
2. Связки Master/Detail в выражениях дочерних индексов
– вызов процедуры BDE DbiLinkDetailToExp() вместо обычной DbiLinkDetail()
3. Пакование таблиц
>with Table1 do StrPCopy(TName, TableName);
>Result := DBIPackTable(DbHandle, Handle, TName, szDBASE, TRUE);
4. Задание видимости удаленных записей – вкл/выкл (например, dBase SET DELETED ON/OFF)
>DbiSetProp( hDBIObj(Table1.Handle), curSOFTDELETEON, LongInt(bValue));
5. Задание частичного/полного соответствия символов – вкл/выкл (например, dBase SET EXACT ON/OFF)
>DbiSetProp( hDBIObj(Table1.Handle), curINEXACTON, LongInt(bValue));
<– Конец –>
Ну и теперь сами вопросы:
<– Начало –>
«Как мне увидеть записи dBASE, помеченные для удаления?»
В обработчике события AfterOpen вызовите приведенную ниже функцию. Включите DBITYPES, DBIERRS, DBIPROCS в список используемых модулей. Для вызова функции передайте ей в качестве аргумента имя TTable и TRUE/FALSE в зависимости от необходимости показа/скрытия удаленных записей. Пример:
>procedure TForm1.Table1AfterOpen(DataSet: TDataset);
>begin
>SetDelete(Table1, TRUE);
>end;
>procedure SetDelete(oTable:TTable; Value: Boolean);
>var
> rslt: DBIResult;
> szErrMsg: DBIMSG;
>begin
> try
> Table.DisableControls;
> try
> rslt := DbiSetProp(hDBIObj(oTable.Handle), curSOFTDELETEON,LongInt(Value));
> if rslt <> DBIERR_NONE then
> begin
> DbiGetErrorString(rslt, szErrMsg);
> raise Exception.Create(StrPas(szErrMsg));
> end;
> excepton E: EDBEngineError do ShowMessage(E.Message);
> on E: Exception do ShowMessage(E.Message);
> end;
> finally
> Table.Refresh;
> Table.EnableControls;
> end;
>end;
«Могу ли я создать в табличной сетке колонку, в которой будут показываться записи, помеченные для удаления из таблицы dBASE?»
Создайте вычисляемое поле, затем в обработчике события таблицы OnCalcField замените его таким образом:
>procedure TForm1.Table1CalcFields(DataSet: TDataset);
>var
> RCProps : RecProps;
> Result : DBIResult;
>begin
> Result := DbiGetRecord(Table1.Handle, dbiNo
Рукописи не горят…
Определение номера записи в таблице dBASE
Таблицы dBASE применяют довольно статическую систему нумерации записей. Номер записи для данной записи (извините за тавтологию) отражает физическую позицию в табличном файле. Эти номера записей не изменяются вследствие фильтрации, упорядочивания данных или сортировки. К примеру, первая запись, хранящаяся в .DBF файле, будет иметь номер записи 1. Возможно, после некоторого упорядочивания индекса, запись будет последней из 100 записей. В этом случае запись должна оставаться с тем же номером, а не номером 100, отражающим новую позицию в сортированном наборе данных. Это противоречит таблицам Paradox, где соблюдается последовательная нумерация. Последовательная нумерация Paradox похожа на нумерацию записей dBASE, за исключением большей гибкости и отражению в номере записи ее текущей позиции в наборе данных. То есть, запись может не всегда иметь номер, установленный для нее фильтром набора данных, уменьшившим общее число записей, или при активном индексе, из-за чего может измениться отображаемый порядок записи.
В приложениях для работы с базами данных, созданных с помощью Delphi и Borland Database Engine (BDE), DB-компонентами не предусмотрено извлечение и определение записи таблицы dBASE. Такая операция, тем не менее, возможна с помощью вызова из вашего приложения функций BDE.
Существует несколько функций BDE, возвращающих информацию о текущей записи dBASE, например, ее номер. На самом деле, любая функция, заполняющая структуру BDE pRECProps, вполне достаточна. Например, функции BDE DbiGetRecord, DbiGetNextRecord и DbiGetPriorRecord. Естественно, только первая из них реально позволяет получить информацию о текущей записи. Две других перемещают при вводе указатель на запись, подобно методам Next и Prior компонентов TTable и TQuery.