Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сортировка таблицы в Delphi: решение ошибки "Field Index out of range"

Delphi , Базы данных , Сортировка и Фильтр

При работе с таблицами в Delphi может возникнуть ошибка "Field Index out of range", когда пытаешься создать индекс по нескольким полям. В этой статье мы рассмотрим, как физически отсортировать таблицу, чтобы получить таблицу с записями в желаемом порядке.

Проблема

При попытке создать индекс по полям "Payee" и "Payer" в таблице "mytable.dbf" возникает ошибка "Field Index out of range". Необходимо отсортировать таблицу по полям "Payee" и "Payer" в алфавитном порядке.

Альтернативный ответ

Delphi не любит многоfeldные индексы. Чтобы физически отсортировать таблицу, нужно получить таблицу с записями в желаемом порядке.

Пример таблицы "mytable.dbf":

| Поле | Имя поля | Тип поля | Размер | | --- | --- | --- | --- | | 0 | Плательщик | Символьный | 35 | | 1 | Получатель | Символьный | 35 | | 2 | Дата платежа | Дата | | | 3 | Сумма | Валюта | |

Нужно отсортировать таблицу по полям "Payee" и "Payer" в алфавитном порядке.

При попытке создать индекс "Payee+Payer" возникает ошибка "Field Index out of range".

Подтвержденный ответ

Если вы все еще используете BDE, можно использовать API BDE для физической сортировки таблицы DBF:

uses
  DbiProcs, DbiTypes, DBIErrs;

procedure SortTable(Table: TTable; const FieldNums: array of Word; CaseInsensitive: Boolean = False; Descending: Boolean = False);
var
  DBHandle: hDBIDb;
  RecordCount: Integer;
  Order: SORTOrder;
begin
  if Length(FieldNums) = 0 then
    Exit;

  Table.Open;
  RecordCount := Table.RecordCount;
  if RecordCount = 0 then
    Exit;
  DBHandle := Table.DBHandle;
  Table.Close;

  if Descending then
    Order := sortDESCEND
  else
    Order := sortASCEND;

  Check(DbiSortTable(DBHandle, PAnsiChar(Table.TableName), nil, nil, nil, nil, nil,
    Length(FieldNums), @FieldNums[0], @CaseInsensitive, @Order, nil, False, nil, RecordCount));
end;

Например, для таблицы "mytable.dbf" можно отсортировать данные по полям "Payee" и "Payer" следующим образом:

SortTable(Table1, [2, 1]); // отсортировать по получателю, плательщику

Альтернативный ответ

Можно создать индекс на таблице с помощью метода AddIndex компонента TTable в одном вызове. Это отсортирует данные при чтении таблицы, если использовать новый индекс, установив свойство IndexName компонента TTable на новый индекс. Пример:

xTable.AddIndex('NewIndex', 'Field1;Field2', [ixCaseInsensitive]);
xTable.IndexName := 'NewIndex';
// Прочитать таблицу сверху вниз
xTable.First;
while not xTable.EOF do begin
  ...
  xTable.Next;
end;

Вывод

При работе с таблицами в Delphi может возникнуть ошибка "Field Index out of range". Чтобы физически отсортировать таблицу и получить таблицу с записями в желаемом порядке, можно использовать API BDE или создать индекс на таблице с помощью метода AddIndex компонента TTable.

Создано по материалам из источника по ссылке.

Устранение ошибки 'Field Index out of range' при сортировке таблицы в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 22:06:31/0.0060079097747803/0