Bei dBase-Dateien ist es möglich, Filter im Index zu definieren. Diese sehr gute Funktion wird von Delphi leider nicht direkt unterstützt.
procedure AddIndex(DB :TTable; const Name, aFields, Filter: string;
Options: TIndexOptions);
var
IndexDesc: IDXDesc;
procedure EncodeIndexDesc;
var
Pos: Integer;
begin
FillChar(IndexDesc, SizeOf(IndexDesc), 0);
with IndexDesc do
begin
AnsiToNative(DB.Locale, Name, szTagName, SizeOf(szTagName) - 1);
bPrimary := false;
bUnique := ixUnique in Options;
bDescending := ixDescending in Options;
bMaintained := True;
bCaseInsensitive := false;
bSubSet:=true;
AnsiToNative(DB.Locale,Filter,szKeyCond,SizeOf(szKeyCond)-1);
if ixExpression in Options then
begin
bExpIdx := True;
AnsiToNative(DB.Locale, aFields, szKeyExp, SizeOf(szKeyExp) - 1);
end else
begin
Pos := 1;
while (Pos <= Length(aFields)) and (iFldsInKey < 16) do
begin
aiKeyFld[iFldsInKey] :=
DB.FieldDefs.Find(ExtractFieldName(aFields, Pos)).FieldNo;
Inc(iFldsInKey);
end;
end;
end;
end;
begin
if Filter='' then DB.AddIndex(Name,aFields,Options)
else begin
with DB do Begin
FieldDefs.Update;
EncodeIndexDesc;
if Active then
begin
CheckBrowseMode;
CursorPosChanged;
Check(DbiAddIndex(DBHandle, Handle, nil, nil, IndexDesc, nil));
IndexDefs.Update;
end
end;
end;
end;
|