C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сортировка в Table1, помогите сделать нормальную!
Dmitri
  Отправлено: 19.06.2003, 20:05


admin@localhost

Группа: Модератор
Сообщений: 110



Такая проблема: есть Table1, он сортируется по числам (не № п/п). Table1->IndexName=Num (Num — это числа). НО: в DBgrid сортировка получается корявая:

CODE

1
10
2
3
4
5
6
7
8
9


Как сортировать числа по-нормальному? И вместе с тем, оставить возможность сортировать по другим колонкам Table1?

Help!!!
Nick
Отправлено: 02.07.2003, 07:32


Машинист паровоза

Группа: Участник
Сообщений: 247



Наверно лучше использовать Query и в нем написать
Order By ...
iAlexander
Отправлено: 11.07.2003, 13:12


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Зря оставили сообщение без ответа. Если использовать Query, то невозможным станет редактирование этой таблицы, допустим, в Grid'e.
По умолчанию сортировка происходит по первичному ключу, если установлен DefaultIndex.
Можно попробовать его сбросить.
И если, допустим, сортировку нужно производить не по уникальному значению, а по bool — сначала все true, потом все false, можно ли воспользоваться IndexName?
KrisK
Отправлено: 11.07.2003, 13:37


Не зарегистрирован







такой вид сортировки — 1,10,2,3,4 — обычно означает, что поле содержит символьную информацию типа Char(10).
Если это так, то поможет индекс с выражением Val(Num).
а по поводу редактирования Query — есть такой компонент
UpdateSQL — и делай с Query что хош — добавляй, удаляй, изменяй.
iAlexander
Отправлено: 11.07.2003, 17:42


Дежурный стрелочник

Группа: Участник
Сообщений: 70



И все-таки тема — Сортировка в Table1[U]
Т.е. с Table ничего сделать нельзя?
Admin
Отправлено: 11.07.2003, 19:39


Владимир

Группа: Администратор
Сообщений: 1190



Можно.
Так уже KrisK правильно ответил.


QUOTE

1
10
2


Это может быть если поле в Table имеет тип ftString, а не ftInteger
и индекс тут не причем:

Если вот так создаю поле в таблице:

CODE

 Table2->FieldDefs->Clear();
  TFieldDef *pNewDef = Table2->FieldDefs->AddFieldDef();
  pNewDef->Name = "ID";
  pNewDef->DataType = ftString;
  pNewDef->Size = 10;

 // а потом и индекс по этому полю
 Table2->Active = false;
  Table2->Exclusive = true;
  Table2->Active = true;
  Table2->AddIndex("IDidx", "ID" ,TIndexOptions()<<ixPrimary<<ixUnique);



то сортировка и поолучится кривая (точнее как и должно быть
у типа ftString)

а если-же создается поле целочисленное:

CODE

Table2->FieldDefs->Clear();
  TFieldDef *pNewDef = Table2->FieldDefs->AddFieldDef();
  pNewDef->Name = "ID";
  pNewDef->DataType = ftInteger;
  pNewDef->Required = true;

  // и индексируем его
  Table2->Active = false;
  Table2->Exclusive = true;
  Table2->Active = true;
  Table2->AddIndex("IDidx", "ID" ,TIndexOptions()<<ixPrimary<<ixUnique);


то и сортировка в Table по данному индексу получается нормальная,
то есть

1
2
3
4
5
6
7
8
9
10
11
12

и так далее...


и индекс
QUOTE

Table1->IndexName=Num (Num — это числа)


тут не поможет, как раз и проиндексируется таблица
по типу ftString, если поле таблицы имеет этот тип.
iAlexander
Отправлено: 12.07.2003, 17:19


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Нельзя ли подсказать об UpdateSQL?
UpdateObject у Query задал, ModifySQL у UpdateSQL задал.
Возник вопрос — как именно модифицировать запись? В хелпе что — то насчет кешированных изменений. Непонятно. Когда именно вызывается то, что использует ModifySQL ?
Поставил в QueryUpdateRecordTour()
{UpdateSQL->ExecSQL(UpdateKind)}
Попробовал после задания ModifySQL вызывать Query->ApplyUpdates(); — говорит, что ... not in cahed update mode...
Nick
Отправлено: 13.07.2003, 08:41


Машинист паровоза

Группа: Участник
Сообщений: 247



QUOTE (iAlexander @ 12/07/2003, 18:21)
Нельзя ли подсказать об UpdateSQL?
UpdateObject у Query задал, ModifySQL у UpdateSQL задал.
Возник вопрос — как именно модифицировать запись? В хелпе что — то насчет кешированных изменений. Непонятно. Когда именно вызывается то, что использует ModifySQL ?
Поставил в QueryUpdateRecordTour()
{UpdateSQL->ExecSQL(UpdateKind)}
Попробовал после задания ModifySQL вызывать Query->ApplyUpdates(); — говорит, что ... not in cahed update mode...

Если CahedUpdates = False то запросы на добавление, изменение и удаление UpdateObject вызываются сразу после модификации данных и вызов их вручную вызывает ошибку указанную Вами.

Вернуться в Работа с базами данных в C++Builder