Автор: admin | 14.12.2007 в 2:14 | Рубрики: Базы данных

Есть такая утилита, к делфям в комплекте идет. DataPump называется. Перекинет тебе все, что надо, индексы создаст, но свою .db заранее не создавай, пусть она создаст. Если надо будет, потом изменишь структуру.

Автор: admin | в 2:14 | Рубрики: Базы данных

Надежней и намного быстрее (если вы ищите отдельные записи) выполнить поиск строки с помощью Seek (если найдена первая запись), или выполнить Locate (индекс не требуется)

например

Table1.UpdateCursorPos;
if DBFSeek( Table1, xVal1 ) then {_не_ delphi-функция - смотри ниже}
begin
if DBFLocate( Table1, ‘CUSTNAME’, xVal2 ) then {_не_ delphi-функция - модификация из faq}
begin
//… делаем все, что необходимо
end;
end; Читать полностью…

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

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

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

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

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

if (( Pos(’(',cTagExp) + Pos(’+',cTagExp) ) > 0 ) then
Table1.AddIndex( cTagName, cTagExp, [ixExpression]) {<- ixExpression - _литерал_}
else
Table1.AddIndex( cTagName, cTagExp, []);

Связки Master/Detail в выражениях дочерних индексов
вызов процедуры BDE DbiLinkDetailToExp() вместо обычной DbiLinkDetail()

Пакование таблиц

with Table1 do
StrPCopy( TName, TableName );
Result := DBIPackTable( DbHandle, Handle, TName, szDBASE, TRUE );

Задание видимости удаленных записей - вкл/выкл (например, dBase SET DELETED ON/OFF)

DbiSetProp( hDBIObj(Table1.Handle), curSOFTDELETEON, LongInt(bValue));

Задание частичного/полного соответствия символов - вкл/выкл (например, 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;
except
on 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

Рукописи не горят…

Чайник y хакеpа спpашивает, что такое UNIX, Windows’95, OS/2 и DOS?
- Hy пpедставь себе аэpопоpт. Hа взлетной полосе стоит навоpоченный кpасивый самолет. Пассажиpы в него заходят - там ковpы везде, все класно. Запyскают двигатели - и самолет медленно объезжает вокpyг аэpопоpта, после чего пассажиpы выходят. Вот это полyось. Hа дpyгой полосе стоит еще один самолет - тоже весь из себя, внyтpи ковpы. Садяться в него пассажиpы, самолет pазгоняется, взлетает, и тyт же pазваливается на кyски - это Windows. А в стоpоне на поле стоит стаpый, помятый, гpязный кyкypyзник - пассажиpы подходят, кладyт вещи, потом толкают самолет, pазгоняют его и сами запpыгивают - потом с тpyдом летят - это DOS.
- А что такое UNIX?
- Ну я же тебе говорил: - Представь себе аэропорт…

При использовании DOS DBF файлов можно сделать небольшую программку (или процедурку), которая произведет перекодировку между форматами. что-то типа:

function update_dos(s:string):string;
var c:STRING;
I:INTEGeR;
l:byte;
dd:char;
begin
i:=1;
c:=”;
while i< length(s)+1 do
begin
l:=ord(s[i]);
inc(i);
if (l>=128) and (l<=192)then l:=l+64 else
if (l>=224) and (l<240) then l:=l+16 else
if l=241 then l:=184 else
if l=240 then l:=168;
dd:=chr(l);
c:=c+dd;
end;
update_dos:=c;
end;

function update_win(s:string):string;
var c:STRING;
I:INTEGeR;
l:byte;
dd:char;
begin
i:=1;
c:='';
while i< length(s)+1 do
begin
l:=ord(s[i]);
inc(i);
if (l>=192) and (l<240)then l:=l-64 else
if (l>=240) and (l<256) then l:=l-16 else
if l=184 then l:=241 else
if l=168 then l:=240;
dd:=chr(l);
c:=c+dd;
end;
update_win:=c;
end;

это и туда и обратно, у меня работает на старых DBF. Осталось только вызвать в нужный момент

Автор: admin | в 2:14 | Рубрики: Базы данных

Vnhead_Cdx := TStringList.Create;
Vnhead_Cdx.Add(’c:\parus\bumi1\idx\vnhead.cdx’);
Vnhead.IndexFiles := Vnhead_Cdx;

при это сам dbf находится в c:\parus\bumi1\dbf