Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

 rError: DBIResult;

 rRecProp: RECprops;

 szErrMsg: DBIMSG;

begin

 Result := 0;

 try

oTable.UpdateCursorPos;

rError := DbiGetRecord(oTable.Handle, dbiNOLOCK, nil, @rRecProp);

if rError = DBIERR_NONE then Result := rRecProp.iPhyRecNum

else case rError of

DBIERR_BOF: Result := 1;

DBIERR_EOF: Result := oTable.RecordCount + 1;

else

begin

DbiGetErrorString(rError, szErrMsg);

ShowMessage(StrPas(szErrMsg));

end;

end;

 excepton

E: EDBEngineError do ShowMessage(E.Message);

 end;

end;

Как

открыть индексированную таблицу dBase, если отсутствует файл индекса?

Nomadic советует:

Для dBase-таблицы встроенными средствами ты не перестроишь индекс, если его нет. Для этой цели мне пришлось написать процедуру для физического удаления признака индексации в самом dbf-файле и после её применения добавлять индексы заново.

Для этого в заголовок файла dbf по смещению 28(dec) записываешь 0.

По другому никак не выходит(я долго бился) — вот для Paradox таблиц все Ok.

С помощью BDE Callbacks. Пример для Delphi 2.0, на первом не проверял:

=== Callback.pas ===

unit Callback;

interface

uses BDE, Classes, Forms, DB, DBTables;

type

 TForm1 = class(TForm)

Table1: TTable;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

 private

CBack: TBDECallback; // опpеделение BDE CallBack

CBBuf: CBInputDesc; // пpосто буфеp

function CBFunc(CBInfo: Pointer): CBRType; // Callback-функция

 public

 end;

var

 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

 Session.Open; //
В это вpемя сессия ещё не откpыта

 CBack := TBDECallback.Create(Session {Hапpимеp}, nil, cbINPUTREQ, @CBRegBuf, SizeOf(CBBuf), CBFunc, False); // Опpеделили Callback

 Table1.Open;

 //^^^^^^^^^^^ - здесь возможна ошибка с индексом, etc.

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

 CBack.Free; // Освобождаем CallBack

end;

function TForm1.CBFunc(CBInfo: Pointer): CBRType;

begin

 with PCBInputDesc(CBInfo)^ do case eCbInputId of

 cbiMDXMissing {, cbiDBTMissing - можно ещё и очищать BLOB-поля}:

begin

iSelection := 3; // Hомеp ваpианта ответа (1-й - откpыть только

// для чтения, 2-й - не откpывать, 3-й - отсоединить индекс).

// Возможный источник непpиятностей: а вдpуг в последующих веpсиях

// BDE номеpа будут дpугими?

Result := cbrCHKINPUT; // Обpабатывать введённый ответ

end;

 end;

end;

end.

=== Callback.pas ===

PS: конечно, это лишь пример, делающий минимум необходимого. В рамках данного письма невозможно дать какое-то описание BDE Callbacks. Информацию я взял из BDE32.HLP, BDE.INT и DB.PAS. В VCL.HLP совсем ничего нет по этому поводу.

Вообще, руки бы оторвал тем, кто писал справку по Дельфям: я неделю мучался с сабжем, пока случайно не набрёл на Callbacks.

Определение удаления записей в .DBF

Delphi 1

Взято из "Dtopics Database 1.10 from 3K computer Consultancy":

Dbase в BDE имеет большее количество ситуаций 'особого случая', чем таблицы SQL и Paradox, поскольку данный формат поддерживает выражения в индексах и прочие характеристики, например:

1. Создание и пересоздание индекса

– DbiRegenIndexes( Table1.Handle ); { Регенерация всех индексов }

 – создание индекса (зависит от того, существует ли выражение или нет)

if ((Pos('(',cTagExp) + Pos('+',cTagExp)) > 0) then Table1.AddIndex(cTagName, cTagExp, [ixExpression]) ( <– ixexpression – _литерал_)

Поделиться с друзьями: