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

 
Сортировка таблицы, как создать индекс
AHDPE
Отправлено: 08.03.2005, 17:30


Ученик-кочегар

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



Открываю таблицу *.dbf через TTable. Необходимо отсортировать таблицу по какому-то полю.
Gedeon
Отправлено: 09.03.2005, 12:24


Ветеран

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



Как по мне, так проще TTable заменить на TQuery и явно в запросе указать инструкцию ORDER BY, правда я не силен в дбф, но вроде так.
olegenty
Отправлено: 09.03.2005, 12:28


Ветеран

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



как вариант — открывать таблицу не через TTable, а через TQuery с инструкцией ORDER BY
индексы создаются посредством инструкции CREATE INDEX
BDE эти инструкции поддерживает
AHDPE
Отправлено: 10.03.2005, 21:48


Ученик-кочегар

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



Понятно, попробую через TQuery.
AHDPE
Отправлено: 12.03.2005, 09:41


Ученик-кочегар

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



Что-то я не пойму, создаю такой запрос
CODE
Select torg_date, name, base, exec_date, day_end, quotation from F_OBL.DBF;
INSERT INTO f_obl.dbf
(torg_date,name,base,exec_date.day_end,quotation)
VALUES
('04.02.1996', '21057-1602', 'SU21057RMFS', '16.02.1996', '17.04.1996', '91.11');
ORDER BY torg_date;

и компилятор Builderа выдает ошибку, что не может разобрать слово INSERT.
Gedeon
Отправлено: 12.03.2005, 10:49


Ветеран

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



Ну, давно я так не веселился, если надо выбрать записи на какой лях тут INSERT?
SQL
Select torg_date, name, base, exec_date, day_end, quotation from F_OBL.DBF ORDER BY torg_date;

Так пробуйте.
А вообще для работы с базами данных на более-менее нормальном уровне почитайте хоть какую-ниюудь книгу по SQL.
AHDPE
Отправлено: 12.03.2005, 11:07


Ученик-кочегар

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



Вообще-то мне надо вставить новую запись в таблицу, а потом отобразить ее на мониторе.

Отредактировано AHDPE — 12/03/2005, 11:09
Gedeon
Отправлено: 12.03.2005, 11:31


Ветеран

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



Ну тогда берите и вставляйте сначала с помощью например TADOComand (или что там у Вас) т.е.
CODE

ADOCommand1->CommandText = "INSERT INTO f_obl.dbf (torg_date,name,base,exec_date.day_end,quotation)
VALUES
('04.02.1996', '21057-1602', 'SU21057RMFS', '16.02.1996', '17.04.1996', '91.11')";

ADOCommand1->Execute();

А потом уже выбирайте с помощбю выше приведенного запроса.
Просто научитесь понимать, что делает сервер при выполнении того или иного запроса, и что надо Вам. Ну и все ж подчитайте книгу по SQL, самому же легче будет.
AHDPE
Отправлено: 12.03.2005, 11:42


Ученик-кочегар

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



Т.е. каждый новый запрос надо выполнять поочереди, а один запрос, состоящий из INSERT и SELECT за один раз выполнить нельзя ?
Gedeon
Отправлено: 12.03.2005, 12:18


Ветеран

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



Да, вообще-то можно, только просто не понятно зачем такие операции обьединять, где-нить потом и проблемы могут начаться, сразу вроде не присутсвующие. Вот так только это делается
CODE
INSERT INTO f_obl.dbf
(torg_date,name,base,exec_date.day_end,quotation)
VALUES
('04.02.1996', '21057-1602', 'SU21057RMFS', '16.02.1996', '17.04.1996', '91.11');
Select torg_date, name, base, exec_date, day_end, quotation from F_OBL.DBF ORDER BY torg_date;

Т.е. сначала инсерт, потом сэлэкт, только все же советую 30 раз подумать прежде чем так сделать, ИМХО нет смысла обьединять такие операции.

Наприемер если датасет при разработке Active=true; то при запуске приложения одна строка уже влетает в базу, далее, нет возможности обновить данные при таком запросе с помощью Requery() только закрытие-открытие и при этом вставка строки, устроит ли Вас такая работа, все ли упомните потом?

Отредактировано Gedeon — 12/03/2005, 10:25
AHDPE
Отправлено: 12.03.2005, 12:49


Ученик-кочегар

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



Новая запись создается когда пользователь нажимает на кнопку:
CODE
Query1->SQL->Clear();
Query1->SQL->Add("insert into F_OBL.DBF(torg_date,name,base,exec_date.day_end,quotation) values ('04.02.1996','21057-1602','SU21057RMFS','16.02.1996','17.04.1996','91.11');");
Query1->SQL->Add("Select * from f_obl.dbf order by torg_date");
Query1->Open();

Но выдается ошибка — select не распознается.
Gedeon
Отправлено: 12.03.2005, 12:54


Ветеран

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



Ну во первых напишите что за ошибка выдается, попробуйте разными запросами выполнить, я не силен в ДБФ, может там это не поддерживается, да если используете Query, то для инсерт — ExecSQL() т.к. не возвращает данные, для SELECT — Open(); это если в разных запросах, если вместе open() работает, но у меня, проверьте по отдельности.

Отредактировано Gedeon — 12/03/2005, 10:55
AHDPE
Отправлено: 12.03.2005, 13:06


Ученик-кочегар

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



Попробовал вот так:
CODE
Query1->SQL->Clear();
Query1->SQL->Add("insert into F_OBL.DBF(torg_date,name,base,exec_date.day_end,quotation) values ('04.02.1996','21057-1602','SU21057RMFS','16.02.1996','17.04.1996','91.11');");
Query1->ExecSQL();

Выдает ошибку: EDBEngineError whith message 'Invalid parameter'
Если использовать Query1->Open(); то результат тот же.
Gedeon
Отправлено: 12.03.2005, 13:33


Ветеран

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



Ну, тогда читайте про синтаксис скл вашей БД, тут я уже не помошник, но судя по ошибке Вы ей неправильно дату скармливаете, посмотрите в каком она д.б. виде.
AHDPE
Отправлено: 12.03.2005, 13:46


Ученик-кочегар

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



Да, вы правы. Я сократил запрос:
CODE
Query1->SQL->Clear();
Query1->SQL->Add("insert into F_OBL.DBF(quotation) values ('0.05');");
Query1->ExecSQL();

Новая запись добавляется, но после этого таблица не отображается на форме.
Я сделал такой запрос:
CODE
Query1->SQL->Clear();
Query1->SQL->Add("insert into F_OBL.DBF(quotation) values ('0.05');");
Query1->SQL->Add("select * from f_obl.dbf");
Query1->ExecSQL();

Выдается такая ошибка: Invalid use of keyword. Token :select ....
Gedeon
Отправлено: 12.03.2005, 14:29


Ветеран

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



Если сэлэкт, то используйте Open() т.к. метод ExecSQL() в Query используется для выполнения запросов не возвращающих данные
AHDPE
Отправлено: 12.03.2005, 14:47


Ученик-кочегар

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



Я использовал Open() вместо ExecSQL(), но ошибка таже.
Компилятор не понимает второй запрос.
AVC
Отправлено: 14.03.2005, 09:26


Ветеран

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



Есть сервера, клторые текст типа
Insert ....;
Select ...;
в одном запросе не понимают. Следовательно лучше их не объединять в одну команду на уровне SQL текста (или написать свой "разбивщик" текста на атомарные запросы — очень полезная штука).

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