Консультация № 176080
16.01.2010, 15:31
0.00 руб.
0 10 1
Добрый день, уважаемые эксперты.

Задавал этот вопрос на куче форумов, нигде не ответили. Надежда только на вас осталась .

Делаю приложение на Borland C++ Builder 6. Имеется база данных Paradox. Требуется выполнить запрос к таблице, чтобы вывести N-ое количество строк.
Я написал так - SELECT * FROM MyTable LIMIT 20.
Выдало ошибку. Оператор LIMIT, как я понял, в Paradox не работает. Подскажите, как мне правильно выполнить запрос.

Спасибо.

Обсуждение

давно
Профессор
230118
3054
16.01.2010, 17:05
общий
Кохан Владимир Иванович:
LIMIT не входит в стандарт SQL, попробуйте сделать запрос, select * where rownum<20.
Неизвестный
16.01.2010, 21:31
общий
Кохан Владимир Иванович:
Добрый вечер! Несколько тупых вопросов:)
1.Нужен именно Paradox?
2.Можно ли эту задачу решить средствами Builder, то есть в запросе взять все, а ограничить при обработке?
3. Какая у Вас версия Paradox?
4. Какая структура базы и в чем суть задачи? Может быть, найдем какой-то трюк.
Неизвестный
16.01.2010, 23:38
общий
lamed:
Отвечаю по пунктам:)

1. Да, Paradox, ибо я начинающий и других пока не знаю.
2. Как решить эту задачу средствами Билдера не знаю.
3. Версия Paradox та, что в самом Builder'е
4. Таблица - уплата взносов членами общества. Суть задачи - выбрать определенное количество уплативших
Неизвестный
16.01.2010, 23:39
общий
Гаряка Асмик:
[q=230118][/q]
Попробовал, не получилось.
давно
Профессор
230118
3054
16.01.2010, 23:56
общий
Кохан Владимир Иванович:
Совершенно верно, надо выбрать все, а отобразить 20.
Неизвестный
17.01.2010, 00:11
общий
Гаряка Асмик:
Я написал в запросе так - SELECT * From MyTable WHERE rownum<20. Не получилось. Подскажите, как надо правильно написать.
давно
Профессор
230118
3054
17.01.2010, 00:53
общий
Кохан Владимир Иванович:
Стандартные средства SQL не позволяют. LIMIT используется в mySQL, можете использовать ее, это бесплатная СУБД.
Неизвестный
17.01.2010, 09:22
общий
Гаряка Асмик:
В общем, как я понял, при использовании Paradox в Builder такое сделать не получится.
Неизвестный
17.01.2010, 10:40
общий
Кохан Владимир Иванович:
Доброе утро! Пока нашел следующую схему. Предполагается, что в запрос попадает уникальное поле таблицы. Допустим, таблица такая
Иванов 100, Петров 200, Сидоров 300, Николаев 200. Вы хотите получить первые 3 фамилии.
1. Компонента Query1. Запрос SELECT Name, Pays FROM Payers
2. Компонента Query2. Пока пустая
3. Проходом по Query1 от до N=3 формируете SELECT для Query2, например, SELECT Name, Pays FROM Payers WHERE Name IN ("Иванов", "Петров", "Сидоров").
4. Закрываете запрос Query1, открываете запрос Query2, отображаете запрос Query2.
Завтра до 12-00 будет полноценный ответ
давно
Академик
320937
2216
18.01.2010, 11:05
общий
это ответ
Здравствуйте, Кохан Владимир Иванович. Для примера взял базу DBDemos.Порядок работы.
1. Ввод числа записей
2. Открываем запрос q1 по таблице Countries и формируем текст запроса q2, содержащего не более введенного числа записей
3. Закрываем q1 и открываем q2
4. Обработчик нажатия кнопки в приложении
Ссылка на проект.176080.ZIP (716.5 кб)
Задавайте вопросы. С уважением.

Приложение:
void __fastcall TForm1::btStartClick(TObject *Sender)
{
int i;
int records; // количество записей для показа
AnsiString ans=""; // просто строка для показа чего-то из первых записей
AnsiString s="";

records = StrToInt(txtRecords->Text); // берем из Edit
if (q1->Active) q1->Close(); // если запрос открыт - закроем
if (q2->Active) q2->Close(); // то же
q2->SQL->Clear(); // очистим текст запроса
// наращиваем строку s
// например, SELECT Name, Capital FROM country.db Country WHERE Name IN
// ("Argentina", "Brazil")
//
s="SELECT Name, Capital FROM country.db Country WHERE Name IN (";

q1->Open(); // Откроем первый запрос
if (q1->RecordCount<records)
records = q1->RecordCount;
for (i=0; i<records; i++)
// Сформировали строку для показа
// и строку для создания текста второго запроса
{
ans+=q1->FieldByName("Name")->AsString+'\n';
if (i>0)
s=s+',';
s=s+'"'+q1->FieldByName("Name")->AsString+'"'+' ';
q1->Next();
}
s=s+")";
q2->SQL->Add(s);
q1->Close(); // первый запрос уже не нужен
ShowMessage(ans); // показали строку
if (records>0) q2->Open(); // открыли запрос
}
5
Супер! Все получилось. Большое спасибо. Но как же все сложно оказалось. Оценка 5+ однозначно.
Форма ответа