Сортировка в tdbf
Модератор: Модераторы
Сортировка в tdbf
Как в tdbf отсортировать таблицу по определённому полю?
создать индекс по полю.
if not FileExists(ExtractFilePath(ParamStr(0)) + 'dom.dbf') then
begin
with DBF1.FieldDefs do
begin
Add('id', ftAutoInc, 0, True);
Add('dm', ftString, 100, True);
end;
DBF1.CreateTable;
DBF1.Open;
DBF1.AddIndex('dom.ndx', 'ID', [ixPrimary, ixUnique]);
DBF1.AddIndex('dom.ndx', 'dm', [ixDescending]);
end;
затем
DBF1.OpenIndexFile('dom.ndx');
DBF1.IndexName := 'dm';
DBF1.Refresh;
или
DBF1.OpenIndexFile('dom.ndx');
DBF1.IndexFieldName := 'dm';
DBF1.Refresh;
не сортируется ничего
begin
with DBF1.FieldDefs do
begin
Add('id', ftAutoInc, 0, True);
Add('dm', ftString, 100, True);
end;
DBF1.CreateTable;
DBF1.Open;
DBF1.AddIndex('dom.ndx', 'ID', [ixPrimary, ixUnique]);
DBF1.AddIndex('dom.ndx', 'dm', [ixDescending]);
end;
затем
DBF1.OpenIndexFile('dom.ndx');
DBF1.IndexName := 'dm';
DBF1.Refresh;
или
DBF1.OpenIndexFile('dom.ndx');
DBF1.IndexFieldName := 'dm';
DBF1.Refresh;
не сортируется ничего
Код: Выделить всё
MyDbf.Exclusive := True;
MyDbf.Open;
MyDbf.PackTable;
// давайте также перестроим индексы
MyDbf.RegenerateIndexes;
MyDbf.Close;
MyDbf.Exclusive := False;http://wiki.freepascal.org/Lazarus_Tdbf_Tutorial/ru
кратко:
1. если пустая таблица индекс добавляется в момент работы с бд
2. если данные уже внесены то RegenerateIndexes. Плюс MyDbf.Exclusive := True...
Есть ещё учебник по работе с данным компонентом. На соурсфоге кажись. Там где и сам компонент.
Ну и мат. часть никто не отменял.
Я создаю базу, создаю индексы и импортирую в неё данные
По идее индекс должен создаться правильно
Чтото DBF1.IndexName := 'dm'; не присваивается,
и так тоже не присваивается
DBF1.IndexFieldName := 'dm';
тоесть
DBF1.IndexName = ''
и
DBF1.IndexFieldNames = ''
последнюю версию компонента tdbf использую, может в ней просто не работают индексы?
По идее индекс должен создаться правильно
Чтото DBF1.IndexName := 'dm'; не присваивается,
и так тоже не присваивается
DBF1.IndexFieldName := 'dm';
тоесть
DBF1.IndexName = ''
и
DBF1.IndexFieldNames = ''
последнюю версию компонента tdbf использую, может в ней просто не работают индексы?
пример в студию... Т.е. исходники.
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
По ссылке пример для форка xdbf
http://visual-t.ru/files/tDbf.zip
Сам xdbf здесь:
http://visual-t.ru/download.html
Не знаю, будет ли работать с дефолтным TDBF, но TxDBF сортирует
http://visual-t.ru/files/tDbf.zip
Сам xdbf здесь:
http://visual-t.ru/download.html
Не знаю, будет ли работать с дефолтным TDBF, но TxDBF сортирует
procedure TFrmMain.FormCreate(Sender: TObject);
VAR
DBName : STRING;
begin
DragAcceptFiles (Handle, TRUE);
DBF1.Exclusive:= True;
DBF1.FilePath:= ExtractFilePath(ParamStr(0));
DBF1.TableName:= 'dom.dbf';
DBF1.IndexName:= 'dom.ndx';
Dbf1.TableLevel:= 7;
if not FileExists(ExtractFilePath(ParamStr(0)) + 'dom.dbf') then
begin
with DBF1.FieldDefs do
begin
Add('id', ftAutoInc, 0, True);
Add('dm', ftString, 100, True);
end;
DBF1.CreateTable;
DBF1.Open;
DBF1.AddIndex('dom.ndx', 'ID', [ixPrimary, ixUnique]);
DBF1.AddIndex('dom.ndx', 'dm', [ixDescending]);
end
else
begin
DBF1.Open;
DBF1.OpenIndexFile('dom.ndx');
DBF1.IndexName := 'dom.ndx';
end;
end;
Добавлено спустя 4 минуты 50 секунд:
*Rik* спасибо, нужно будет попробовать.
pupsik
Спасибо, заработало, похоже я делал следующую ошибку:
DBF1.OpenIndexFile('dom.ndx'); только при создании формы а нужно было после каждого открытия базы.
VAR
DBName : STRING;
begin
DragAcceptFiles (Handle, TRUE);
DBF1.Exclusive:= True;
DBF1.FilePath:= ExtractFilePath(ParamStr(0));
DBF1.TableName:= 'dom.dbf';
DBF1.IndexName:= 'dom.ndx';
Dbf1.TableLevel:= 7;
if not FileExists(ExtractFilePath(ParamStr(0)) + 'dom.dbf') then
begin
with DBF1.FieldDefs do
begin
Add('id', ftAutoInc, 0, True);
Add('dm', ftString, 100, True);
end;
DBF1.CreateTable;
DBF1.Open;
DBF1.AddIndex('dom.ndx', 'ID', [ixPrimary, ixUnique]);
DBF1.AddIndex('dom.ndx', 'dm', [ixDescending]);
end
else
begin
DBF1.Open;
DBF1.OpenIndexFile('dom.ndx');
DBF1.IndexName := 'dom.ndx';
end;
end;
Добавлено спустя 4 минуты 50 секунд:
*Rik* спасибо, нужно будет попробовать.
pupsik
Спасибо, заработало, похоже я делал следующую ошибку:
DBF1.OpenIndexFile('dom.ndx'); только при создании формы а нужно было после каждого открытия базы.
Код: Выделить всё
procedure TFrmMain.FormCreate(Sender: TObject);
var
DBName : STRING;
begin
DragAcceptFiles (Handle, TRUE);
DBName := ExtractFilePath(ParamStr(0));
DBF1.Close;
DBF1.FilePath:= DBName;
DBF1.TableName:= 'dom.dbf';
DBF1.IndexName:= 'dom.ndx';
Dbf1.TableLevel:= 7;
if not FileExists(DBName + 'dom.dbf') then
begin
With DBF1 do
begin
Exclusive:= True;
with FieldDefs do
begin
Clear;
Add('id', ftAutoInc, 0, True);
Add('dm', ftString, 100, True);
end;
CreateTable;
Open;
//
AddIndex('dom.ndx', 'ID', [ixPrimary, ixUnique]);
AddIndex('dom.ndx', 'dm', [ixDescending]);
Close;
Exclusive:= False;
end;
end;
DBF1.Open;
DBF1.OpenIndexFile('dom.ndx');
DBF1.IndexName := 'dom.ndx';
end;А если так?
п.с.
Походу с кириллицей в путях вы ещё не столкнулись
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
Не знаю как сейчас, исправили или нет, но стандартный TDBF раньше ещё и с кодировками не по человечески работал, пихал туда UTF-8 не взирая не на что и что0то мне подсказывает, что ни чего не изменилось... Попробовал справочник BIK в дефолтном TDBF открыть и увидел там квадраты...
Ну мне utf8 и нужен будет в дальнейшем для экспорта на сервер под linux.
Надеюсь всё будет ок.
Надеюсь всё будет ок.
*Rik*
есть решение: http://wiki.freepascal.org/Guide_for_usage_of_Tdbf_component/ru
стандартный TDBF - работает с кодировкой. Автоматом не распознает но работает. А вот причина по которой он "не работает" кроется не в нем. Уже рассматривалось на этом форуме.

есть решение: http://wiki.freepascal.org/Guide_for_usage_of_Tdbf_component/ru
стандартный TDBF - работает с кодировкой. Автоматом не распознает но работает. А вот причина по которой он "не работает" кроется не в нем. Уже рассматривалось на этом форуме.
будет...будет.. Когда Lazutf8, LazFileUtils подключитеНадеюсь всё будет ок.
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
pupsik писал(а):*Rik*
есть решение: http://wiki.freepascal.org/Guide_for_usage_of_Tdbf_component/ru
стандартный TDBF - работает с кодировкой. Автоматом не распознает но работает. А вот причина по которой он "не работает" кроется не в нем. Уже рассматривалось на этом форуме.будет...будет.. Когда Lazutf8, LazFileUtils подключитеНадеюсь всё будет ок.
У меня тоже вопрос в TxDBF решен.
Таки причина в дефолтном TDBF, кто мешает в самом TDBF для строковых полей по умолчанию транслитерацию включить и функцию Translate исправить под условия Lazarus. На этом косяки не заканчиваются, не смотря на все эти ухищрения описанные по Вашей ссылке, фильтры, методы Locate и SetRange работать не будут. К тому же Вы всегда обязаны самостоятельно задавать кодировку, хотя для DBASE IV кодировка строковых полей (866 или 1251 к примеру) указывается в заголовке DBF. Даже если в заголовке DBF указана кодировка, она все равно дефолтным компонентом игнорируется и обязанность следить за кодировкой, возлагается на Вас.
Чтобы задать кодировку в TxDBF при создании таблицы есть специальная переменная DBFGlobals.DefaultCreateLangID, я могу её указать и дальше все конвертации делает сам компонент. Для таблиц DBASE III, которые не содержат информацию о кодировке в заголовке файлов, использую штатную переменную DBFGlobals.DefaultOpenCodePage, которую устанавливаю при открытии таблицы, если таблица DBASE IV, то используется кодировка указанная в заголовке, то что задано в DBFGlobals.DefaultOpenCodePage игнорируется. Мой вариант то-же не идеален, основан на старой версии TDBF многолетней давности (хотя он возможно и не менялся особо), может работать только с кодовыми страницами 866 и 1251 (хотя если посмотреть код оригинального TDBF, там авторы то-же позаботились чтобы cp1252 работал), но зато работает штатными методами без ухищрений, указываю значения фильтра или в методах SetRange, Locate в UTF8, компонент сам конвертирует в зависимости от заданных кодировок. Обмениваюсь данными через TxDBF с разными конторами и с Почтой России, пока никаких нареканий не было.
*Rik* ссылка не моя, а из вики. Тем более тот кто писал не знает о маленькой интересности с полями:
Повторяю: компонент вполне работоспособный. Кстати: никто не запрещает использовать с десяток подобных компонентов. Да и самому разобрать дбф можно.
п.с.
в этой ветке всё куда скромнее.. Ну не верно вопрошающий индексы создавал/подключал. Что бы изменило при использовании вашего варианта? Они бы сами создались/подключились ??? 
А это в книжечке описано (самого компонента)1. При попытке узнать тип и размерность поля не всегда полученный результат соответствует действительности.
Повторяю: компонент вполне работоспособный. Кстати: никто не запрещает использовать с десяток подобных компонентов. Да и самому разобрать дбф можно.
п.с.
У меня тоже вопрос в TxDBF решен.
