gimi |
Отправлено: 04.06.2003, 11:53 |
|
Не зарегистрирован
|
Существует такая проблема. Есть база данных содержащая вопрос и варианты ответов и еще кой-какие поля для теста (опроса). Например: в базе около 100 вопросов, нужно выводить по очереди определенное число вопросов (например 20) выдернутых из базы в произвольном порядке, с тем чтобы избежать повторяемости, т.е. каждому тестируемому должны выводиться разные последовательности вопросов.
Сложность состоит в том, что я не знаю как получить доступ к конкретной записи и отобразить ее на экране.
|
|
Anry |
Отправлено: 06.06.2003, 13:26 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 56
|
Честно сказать не совсем понял в чем у тебя проблема. Всем всегда советую использовать SQL-запросы. Есть таблица с кодом и текстом вопроса и ответа. Генеририруется случайная последовательность кодов вопроса. По коду вопроса с помощью SQL-запроса получаешь данную запись со всеми необходимыми полями.
|
|
Admin |
Отправлено: 06.06.2003, 14:13 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Если у Вас есть база, значит в ней есть таблицы,
если в ней есть таблицы, значит в них есть поля,
если есть поля — какое-то из полей ключевое,
например это может быть поле номер вопроса
или номер ответа или просто номер.
Например таблица вопросов myQuestion, поле номер вопроса num integer, настроенный на эту таблицу компонент Table1
Порядок может быть примерно таким:
1. Установите количество вопросов в таблице вопросов
(если они у вас в отдельной таблице)
2. Заведите массив int nums[20]; куда будете помещать номера
3. С помощью датчика случайных чисел выберите 20
номеров вопросов и поместите их в массив nums,
проверяя чтобы не было повторов
int count=0;
while(count<20){
// Получить случайное число
int r = ....
if(!Table1->Locate("num",r,TLocateOptions())) continue; // получить следующее число, если такого номера нет в таблице
// проверяем на повторение
for(int j=0; j
if(nums[j] == r) continue; // повтор — получить следующее число
nums[count] = r;
count++;
}
В свойстве SQL компонента Query разместите запрос
AnsiString s="", sql = "Select * from myQuestion where num in(";
for(int i=0; i<20; i++) s += IntToStr(nums[i])+",";
s[s.Length()] = ')';
sql += s;
Query1->SQL->Add(sql);
Query1->Open();
то есть получите в запросе 20 случайных записей.
отобразить их на экране можно в компоненте DBGrid,
или в компонентах с вкладки DataControls.
-----
Или можете получить в отдельном запросе Query2
все ваши номера вопросов и поместить их, например,
в отдельный массив номеров вопросов
int allnum[1000];
int count = 0;
Query2->SQL->Add("Select num from myQuestion");
Query2->Open();
while(!Query2->Eof){
allnum[count] = Query2->FieldByName("num")->Value;
count++;
}
Query2->Close();
а потом уже достаете 20 из них, проверяете на
неповторяемость и формируете вышеуказанный запрос
Отредактировано Admin — 6 Jun 2003, 14:48
|
|
pasha |
Отправлено: 07.06.2003, 10:18 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 62
|
QUOTE | Сложность состоит в том, что я не знаю как получить доступ к конкретной записи и отобразить ее на экране |
// Открыть таблицу — стоим на 1 записи
Table1->Open();
// Перейти на следующую запись
Table1->Next();
// Перейти на предыдущую запись
Table1->Prior();
// Проверить на конец таблицы
if(!Table1->Eof){
...
}
// количество полей в таблице
int pcount = Table1->FieldCount;
// Получить данные записи ( !!! см.также эти ответы из архива форума)
for(int i=0; i < pcount; i++){
ShowMessage(Table1->Fields->Fields[i]->AsString);
}
// Закрыть таблицу
Table1->Close();
Отредактировано pasha — 7 Jun 2003, 10:20 |
|
gimi |
Отправлено: 09.06.2003, 09:55 |
|
Не зарегистрирован
|
Всем спасибо за внимание!
Друг подсказал следующий способ:
randomize();
Table1->RecNo=random(Table1->RecordCount);
Добавил циклик, чтобы записи не повторялись и все
|
|