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

 
Сортировка в БД
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



Извините, не вошёл. smile.gif
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!!! wink.gif
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]

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