Сортировка в tdbf

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сортировка в tdbf

Сообщение eoleg » 23.05.2016 20:10:01

Как в tdbf отсортировать таблицу по определённому полю?
eoleg
новенький
 
Сообщения: 14
Зарегистрирован: 01.04.2016 10:43:20

Re: Сортировка в tdbf

Сообщение pupsik » 23.05.2016 20:20:57

создать индекс по полю.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Сортировка в tdbf

Сообщение eoleg » 23.05.2016 21:11:18

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;
не сортируется ничего
eoleg
новенький
 
Сообщения: 14
Зарегистрирован: 01.04.2016 10:43:20

Re: Сортировка в tdbf

Сообщение pupsik » 23.05.2016 21:56:02

Код: Выделить всё
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...
Есть ещё учебник по работе с данным компонентом. На соурсфоге кажись. Там где и сам компонент.
Ну и мат. часть никто не отменял.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Сортировка в tdbf

Сообщение eoleg » 23.05.2016 22:01:12

Я создаю базу, создаю индексы и импортирую в неё данные
По идее индекс должен создаться правильно

Чтото DBF1.IndexName := 'dm'; не присваивается,
и так тоже не присваивается
DBF1.IndexFieldName := 'dm';
тоесть
DBF1.IndexName = ''
и
DBF1.IndexFieldNames = ''
последнюю версию компонента tdbf использую, может в ней просто не работают индексы?
eoleg
новенький
 
Сообщения: 14
Зарегистрирован: 01.04.2016 10:43:20

Re: Сортировка в tdbf

Сообщение pupsik » 23.05.2016 22:09:56

пример в студию... Т.е. исходники.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Сортировка в tdbf

Сообщение *Rik* » 23.05.2016 22:39:02

По ссылке пример для форка xdbf
http://visual-t.ru/files/tDbf.zip

Сам xdbf здесь:
http://visual-t.ru/download.html

Не знаю, будет ли работать с дефолтным TDBF, но TxDBF сортирует
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Сортировка в tdbf

Сообщение eoleg » 23.05.2016 22:57:01

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'); только при создании формы а нужно было после каждого открытия базы.
eoleg
новенький
 
Сообщения: 14
Зарегистрирован: 01.04.2016 10:43:20

Re: Сортировка в tdbf

Сообщение pupsik » 23.05.2016 23:28:04

Код: Выделить всё
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;

А если так?

п.с.
Походу с кириллицей в путях вы ещё не столкнулись :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Сортировка в tdbf

Сообщение *Rik* » 24.05.2016 09:01:57

Не знаю как сейчас, исправили или нет, но стандартный TDBF раньше ещё и с кодировками не по человечески работал, пихал туда UTF-8 не взирая не на что и что0то мне подсказывает, что ни чего не изменилось... Попробовал справочник BIK в дефолтном TDBF открыть и увидел там квадраты...
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Сортировка в tdbf

Сообщение eoleg » 24.05.2016 09:42:32

Ну мне utf8 и нужен будет в дальнейшем для экспорта на сервер под linux.
Надеюсь всё будет ок. :D
eoleg
новенький
 
Сообщения: 14
Зарегистрирован: 01.04.2016 10:43:20

Re: Сортировка в tdbf

Сообщение pupsik » 24.05.2016 09:47:00

*Rik*
есть решение: http://wiki.freepascal.org/Guide_for_usage_of_Tdbf_component/ru

стандартный TDBF - работает с кодировкой. Автоматом не распознает но работает. А вот причина по которой он "не работает" кроется не в нем. Уже рассматривалось на этом форуме.

Надеюсь всё будет ок.
будет...будет.. Когда Lazutf8, LazFileUtils подключите :lol:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Сортировка в tdbf

Сообщение *Rik* » 24.05.2016 10:53:33

pupsik писал(а):*Rik*
есть решение: http://wiki.freepascal.org/Guide_for_usage_of_Tdbf_component/ru

стандартный TDBF - работает с кодировкой. Автоматом не распознает но работает. А вот причина по которой он "не работает" кроется не в нем. Уже рассматривалось на этом форуме.

Надеюсь всё будет ок.
будет...будет.. Когда Lazutf8, LazFileUtils подключите :lol:

У меня тоже вопрос в 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*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Сортировка в tdbf

Сообщение pupsik » 24.05.2016 16:39:22

*Rik* ссылка не моя, а из вики. Тем более тот кто писал не знает о маленькой интересности с полями:
1. При попытке узнать тип и размерность поля не всегда полученный результат соответствует действительности.
А это в книжечке описано (самого компонента) :wink:

Повторяю: компонент вполне работоспособный. Кстати: никто не запрещает использовать с десяток подобных компонентов. Да и самому разобрать дбф можно.

п.с.
У меня тоже вопрос в TxDBF решен.
:lol: в этой ветке всё куда скромнее.. Ну не верно вопрошающий индексы создавал/подключал. Что бы изменило при использовании вашего варианта? Они бы сами создались/подключились ??? :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 232

Рейтинг@Mail.ru