VELIKAN |
Отправлено: 07.05.2006, 23:48 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
Кто знает, как написать сортировку? И возврат в исходное состояние.
БД Access.
Заранее спасибо. |
|
olegenty |
Отправлено: 08.05.2006, 11:28 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
? сортировать таблицу точно есть смысл ?
может речь идёт о сортировке результирующего набора данных?
|
|
** VELIKAN |
Отправлено: 08.05.2006, 22:26 |
|
Не зарегистрирован
|
Да, о сортировке результирующего набора данных для TTable. |
|
Valdemar |
Отправлено: 10.05.2006, 08:11 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
VELIKAN, вы определитесь, что вам надо. Вся таблица целиком или какая-то выборка из нее. В первом случае сортировку можно сделать с помощью индексов, во втором случае в тексте запроса надо указать порядок сортировки. |
|
Guest |
Отправлено: 11.05.2006, 13:45 |
|
Не зарегистрирован
|
Если под выборкой вы понимаете фильтрацию, то я её уже реализовал.
Мне нужно отсортировать, например, поле год рождения в порядке убывания чисел, в порядке возрастания. Если возможно, сортировать фамилии по алфавиту.
Но список должен быть полным, т.е. без выборки, таблица целиком.
Я не знаю ни как первый случай написать, на как второй.
Судя по всему мне нужен первый случай (с помощью индексов).
Подскажите пожалуёста! |
|
VELIKAN |
Отправлено: 11.05.2006, 14:01 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
Извините, не вошёл. |
|
olegenty |
Отправлено: 11.05.2006, 14:23 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
компонент TTable лучше не использовать. есть TQuery.
для TQuery, если надо выбрать всё с сортировкой по полю/полям, то в SQL пишешь:
SQL | select * from MyTable order by MyField1 [, MyField2, ...]
|
|
|
VELIKAN |
Отправлено: 13.05.2006, 21:44 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
Я пока сделал сортировку по возрастанию с TTable с помощью IndexFieldNames. А как сделать сортировку по убыванию не знаю. Заглянул в хэлп: написано, что используя финкцию IndexFieldNames по убыванию отсортировать нельзя. Однако AddIndex позволяет это сделать. Я попробовал — не получилось. |
|
olegenty |
Отправлено: 14.05.2006, 08:33 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
а в TQuery просто пишешь order by SomeField desc — и всё, вот тебе сортировка по убыванию.
|
|
VELIKAN |
Отправлено: 14.05.2006, 21:29 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
Код:
TIndexOptions Options;
Options << ixDescending;
Form1->Table1->Active = false;
Form1->Table1->AddIndex("Ind", "Год", Options);
Form1->Table1->DeleteIndex("Ind");
Form1->Table1->Active = true;
Ничего не делает. Почему?
Радует то, что не выдаёт сообщение об ошибке. |
|
olegenty |
Отправлено: 15.05.2006, 07:33 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
ну ты же удаляешь индекс сразу после создания, чего ж ты ждал?
|
|
VELIKAN |
Отправлено: 18.05.2006, 08:43 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
Вот:
TIndexOptions Options;
Options << ixDescending;
Table1->Active = false;
if(a==1) Table1->DeleteIndex("Ind");
Table1->AddIndex("Ind", "Number", Options);
Table1->Active = true;
a=1;
При первом запуске ничего на удаляется, т.к. а!=1. При последующих запусках сначала удаляется индекс, а затем создаётся и должно сортироваться.
Только всё равно ничего не делает!!!
Удалять нужно, т.к. при повторном создании появляется сообщение о том, что индекс уже существует. |
|
gvg |
Отправлено: 18.05.2006, 09:35 |
|
Машинист паровоза
Группа: Участник
Сообщений: 222
|
Каков смысл во всех этих манипуляциях? |
|
Лена |
Отправлено: 18.05.2006, 16:13 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Если нет желания сохранять индекс в физической таблице, то может на период выполнения приложения создать динамический индекс, который по окончании работы приложения не будет сохранен на диске?
Table1->IndexDefs->Add(...................);
|
|
VELIKAN |
Отправлено: 18.05.2006, 22:26 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
За Table1->IndexDefs->Add(...................); спасибо! Буду знать.
О смысле этих манипуляций догадаться не сложно (Я ведь не знал про IndexDefs).
Но это проблемы на решает. Придётся садиться на SQL запросы с TQuery!!! |
|
Guest |
Отправлено: 19.05.2006, 01:12 |
|
Не зарегистрирован
|
Table1->Active = false;
if(a==1)Table1->DeleteIndex("Ind");
Table1->AddIndex("Ind", "Number", TIndexOptions() << ixDescending);
Table1->Active = true;
Table1->IndexName = "Ind";
a=1; |
|
VELIKAN |
Отправлено: 19.05.2006, 23:31 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
[QUOTE="Guest"]Table1->IndexName = "Ind";[/QUOTE]
Спасибо конечно за эту строчку. Теперь что-то делает, т.е. сортирует по возрастанию. НЕ ТО!!!
Ну допустим есть таблица Number с единственным столбцом Number (экспериментальная)
Код:
CODE |
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("select * from Number order by Number desc");
Query1->Open(); |
Ошибка синтаксиса в предложении from. |
|
Guest |
Отправлено: 20.05.2006, 00:49 |
|
Не зарегистрирован
|
QUOTE (VELIKAN @ 19/05/2006, 23:31) | [QUOTE="Guest"]Table1->IndexName = "Ind";[/QUOTE]
Спасибо конечно за эту строчку. Теперь что-то делает, т.е. сортирует по возрастанию. НЕ ТО!!!
Ну допустим есть таблица Number с единственным столбцом Number (экспериментальная)
Код:
CODE |
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("select * from Number order by Number desc");
Query1->Open(); |
Ошибка синтаксиса в предложении from. |
Сортирует ПО УБЫВАНИЮ. Проверено.
Если не то, значит ты что-то не так делаешь.
select * from Number order by Number desc
Выражение правильное. Тоже проверено.
|
|
Valdemar |
Отправлено: 23.05.2006, 14:06 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Попробуйте слово Number написать в одинарных кавычках. |
|
olegenty |
Отправлено: 23.05.2006, 16:38 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
для Access, по-моему, надо писать [Number]
|
|