2010-07-28 3 views
1

Я переписываю небольшое приложение для доступа к MS для сдачи экзаменов.N Выбор верхней записи на основе собственного заявления SQL в MS-Access

Они хотят, чтобы тесты собирали набор случайных вопросов в зависимости от размера экзамена.

Если у каждого экзамена было заданное количество вопросов, я мог бы просто вставить номер в оператор TOP и сделать с ним, но для каждого экзамена есть переменное количество вопросов, поэтому я хочу заменить постоянное число рядом с TOP с полем из запроса.

То, что я в принципе хочу, как это:

SELECT TOP tblExam.[ExamSize] * 
FROM tblExamQuestions INNER JOIN tblExam 
ON tblExamQuestions.ExamID = tblExam.ExamID 
WHERE tblExam.ExamID = 10 
ORDER BY Rnd(tblExamQuestions.ExamQuestionID); 

Я поставляет новый ExamID на этот запрос для каждой экзаменационной сессии, когда я открыть отчет, так что это, вероятно, получить в пути.

DoCmd.OpenForm strExamName, , , "tblExam.ExamID = " & strExamID 
+0

N в TOP N нельзя параметризовать. Вам нужно будет написать источник данных во время выполнения. Событие OnOpen формы будет подходящим местом для этого. –

+0

Я закончил с немного уродливым взломом. Я храню размер экзамена в целое число уровня формы с «DLookUp», а затем сохраняю счетчик, который увеличивается с каждым ответом на вопрос, а затем выходит из экзамена после того, как счетчик превышает размер хранимого экзамена. – Nitrodist

ответ

2

Думаю, что вам придется строить запрос динамически.

sSQL="SELECT TOP " & DlookUp("ExamSize","tblExam","ExamID = 10") _ 
    & " FROM tblExamQuestions INNER JOIN tblExam " _ 
    & "ON tblExamQuestions.ExamID = tblExam.ExamID " _ 
    & "WHERE tblExam.ExamID = 10 " _ 
    & "ORDER BY Rnd(tblExamQuestions.ExamQuestionID)" 

'' Permanently change an existing query 
CurrentDB.QueryDefs("MyReportQuery").SQL=sSQL 
+0

Хорошее предложение, но я бы сделал так, чтобы он просто вставлял 'TOP' в оператор' SELECT'. Получите запрос, затем получите подстроку (0,5) + «TOP» + DlookUp (ExamSize) + substring (5, strLength) в качестве SQL-запроса, таким образом мы можем просто получить 5 лучших результатов любого запроса SELECT, повторное использование, если мы его изменим. – Nitrodist