需要帮助返回 ms-access 测试库的随机顺序多项选择答案

Posted

技术标签:

【中文标题】需要帮助返回 ms-access 测试库的随机顺序多项选择答案【英文标题】:Need help returning random order multiple-choice answers for ms-access test bank 【发布时间】:2017-11-18 17:51:26 【问题描述】:

我有一个 Access2013 选择题测试数据库,它以随机顺序将测试问题返回到表单。这可以正常工作,但是对于提出的每个问题,每次都以相同的顺序显示答案。此特定 Db 的每个表都设置为:

tblTest(按课程)

ID (PK)

课程

音量

问号

部分

问题

答案

回答 B

Ans C

答案

正确答案

我知道这不是优化的数据,因此无法随机化答案。一些网站建议拆分表,所以我现在所做的是创建 2 个单独的表,如下所示:

tblRnd_Ques

ID (PK)

课程

音量

问题号

部分

问题

tblRnd_Ans

ID (PK)

Q_ID (FK)

回答

正确(是/否)

然后,我通过随机化 tblRnd_Ques.ID 和 tblRnd_Ans.Q_ID 创建了随机化两个表的查询,然后是一个查询以连接两个随机查询。我想做的是在表单中显示问题,然后在 qryRnd_Ans 中找到答案并按照它们在查询中出现的顺序返回答案。需要做的是显示问题,然后搜索记录集以找到下一个相关答案并将其作为答案#2,等等。每个问题都有一个唯一的 ID 号,并在整个记录集中重复 4 次,并带有相应的答案。

我已经在几个网站上搜索过寻找方法,包括使用 FindNext 等。我是 VBA 的新手,不知道如何让它做我需要的事情。这是我用来返回每个问题的代码(感谢之前 *** 的帮助):

Private Sub LoadNextQuestion()   'reusable code to load questions

rcdCnt = rcdCnt + 1

    If (rcdCnt > 100) Or rsCourse.EOF Then
        GetQuestionTotal
        LogTestResults
        DoCmd.OpenReport "rptResults_Test"
        rsCourse.Close
        DoCmd.Close acForm, "frmIntro"
        DoCmd.Close acForm, "frmQues"
        DoCmd.OpenQuery "qryEmptyQuestions"
        DoCmd.OpenQuery "qryEmptyResults"
        DoCmd.CloseDatabase

    Exit Sub
    End If

With rsCourse
    intQues = !ID
    strCDC = !CDC
    intVol = !Vol
    strSect = !Section
    strQues = !Question
    strAns = !Answer
    blnCorr = !Correct

    ctlQ_No = rcdCnt
    ctlQuestion = !Question
    ctlSection = ![Section]

 MsgBox intQues & _
    Chr(13) & Chr(10) & "CDC:  " & strCDC & _

    Chr(13) & Chr(10) & "Volume:  " & intVol & _

    Chr(13) & Chr(10) & "Section:  " & strSect & _

    Chr(13) & Chr(10) & "Q:  " & strQues & _

    Chr(13) & Chr(10) & "A:  " & strAns & _

    Chr(13) & Chr(10) & blnCorr

    ctlAns_A = ![Answer]
'        ctlAns_B = ![Ans B]    (Commented out for testing purposes)

'        ctlAns_C = ![Ans C]    (Commented out for testing purposes)

'        ctlAns_D = ![Ans D]    (Commented out for testing purposes)

    strSect = ctlSection
    strCorrectAnswer = ![Correct]
    optAnswer = Null   'clears previous answer
    optAnswer.SetFocus

    .MoveNext

End With
End Sub

我假设我可能需要一个子表单来获取答案,但不知道如何正确生成问题和答案。非常感谢我能得到的任何帮助。

【问题讨论】:

每门课程都有单独的问答表?为什么不只是一个问题表和 CourseID 的另一个字段?然后只有一张答案表? 我有两张桌子。 tblRnd_Ques 包含课程(这将是说明 CourseID 和所有问题的另一种方式。tblRnd_Ans 有答案以及每个答案是正确还是不正确。现在,我可以严格为课程编号创建另一个表,但这不会只是添加代码的另一个复杂之处? 好的,两张桌子,不是几十张。听起来不错。 但是,您描述的表格并非用于保存回复。这两个表格可以在报告/子报告中用于打印问卷。保存回复将需要另一个包含 UserID、QuestionID、AnswerID 字段的表。有一个绑定到用户的主表单和一个用于响应表的子表单。现在的问题是如何在响应表中创建用户/问题/响应的记录集?目标是让响应者将他们的响应直接输入数据库吗? 是的,上面显示的两个表是严格创建测试/问卷的。我确实有另一个名为 tblResults 的表,其中记录了个人姓名(取自另一种形式),以及所修课程、回答的总问题、分数、日期和时间。至于他们的反应,这些只保存在一个易变的记录集中,并且这个记录集在测试结束时被清空。你们的cmets都在点上。抱歉,如果我没有完全描述我正在使用的 Db。 【参考方案1】:

我假设您在查询 ORDER BY 子句中使用了 Rnd() 函数。随机化 ID 上的答案,而不是 Q_ID。然后使用子表单/子报表容器主/子链接来同步记录。我测试过,不需要任何 VBA。使用报告/子报告排列中的这些表格来打印问卷。没有看到以随机顺序在表单/子表单中显示这些表格有什么用处。如果向测试库添加新问题和答案,而不是用于用户响应,则需要此表单/子表单。

【讨论】:

这是我目前用于答案表的 SQL:SELECT Rnd([ID]) AS Rnd_ID, tblRnd_Ans2.ID, tblRnd_Ans2.Q_ID, tblRnd_Ans2.Answer, tblRnd_Ans2.Correct FROM tblRnd_Ans2 ORDER BY Rnd ([ID]);我知道这个回复看起来不太漂亮,但我不知道如何在 cmets 中添加回车。 您可以编辑您的问题以提供更多信息。在 SELECT 子句中不需要 Rnd(ID),只需在 ORDER BY 中即可。你试过建议吗?它对我有用。 是的,打印问卷会容易得多,但是,我们将其严格用作基于计算机的打印。

以上是关于需要帮助返回 ms-access 测试库的随机顺序多项选择答案的主要内容,如果未能解决你的问题,请参考以下文章

在C#中使用C/C++库的方法返回一个随机值,而不是上面的返回

ms-access 2003:表单打不开!帮助!

是否可以看到测试运行的顺序?

XCTest 从以随机顺序运行的测试中获取执行顺序

使用 ggplot2 库的热图上的变量顺序 [重复]

pytest文档58-随机执行测试用例(pytest-random-order)