0

Classic ASP でクライアント向けの簡単なアンケートを作成しています。

アイデアは、10の質問があるということです。ユーザーが登録すると、最初の質問に送られます。これに答えると、2番目の質問などに進みます。質問はスキップして後で戻すことができ、各質問は 1 回だけ回答できます。

ユーザーが回答した各質問のデータベースにカンマ区切りのリストがあります。

したがって、ユーザーがログインすると、回答済みの質問のリストを含む配列が作成されます。

このリストをループして、最初の未回答の質問に移動する最良の方法は何ですか?

回答済みの質問の配列の例は、この「1,4,6」のようになるため、このユーザーは質問番号 1、4、および 6 に回答したことになります。ユーザーがログインすると、最初の未回答の質問に誘導したいと思います。この場合は 2 です。2 番目の質問に回答すると、ユーザーは次の未回答の質問にリダイレクトされます。

何か提案はありますか?

4

1 に答える 1

0

@Dog、これはあなたが探している機能を提供すると思います。

ヒント: Microsoft の正式な WSH リファレンスを Windows ヘルプ ファイルとしてダウンロードする方法については、この回答を参照してください。

Option Explicit

Dim oQsm : Set oQsm = New QuestionStatusManager

With oQsm
    .NumberOfQuestions = 10
    .RestoreStatus("1,4,6")
    .MarkQuestionAnswered(2)
    WScript.Echo "Questions " & .ToString() & " have been answered."
    WScript.Echo "Next unanswered question is: " & .GetNextUnansweredQuestion()
End With

Set oQsm = Nothing

' ------------------------------------------------------------------------

Class QuestionStatusManager

Private m_nNumberOfQuestions
Private m_aQuestionList()

Sub Class_Initialize()
    m_nNumberOfQuestions = -1
End Sub

Sub Class_Terminate()
    Erase m_aQuestionList
End Sub

Public Property Let NumberOfQuestions(n)
    Dim bValid : bValid = False

    If IsNumeric(n) Then
        If n = CInt(n) Then
            bValid = True
        End If
    End If

    If Not bValid Then
        Err.Raise vbObjectError + 1, "", _
           "Value '" & n & "' is not an integer."
    End If

    m_nNumberOfQuestions = CInt(n)
    ReDim m_aQuestionList(n)
End Property

Public Property Get NumberOfQuestions()
    CheckState
    NumberOfQuestions = m_nNumberOfQuestions
End Property

Private Sub CheckState()
    If m_nNumberOfQuestions = -1 Then
        Err.Raise vbObjectError + 1, "", _
           "Property 'NumberOfQuestions' has not been set."
    End If
End Sub

Sub RestoreStatus(sAlreadyAnswered)
    CheckState

    Dim aAlreadyAnswered : aAlreadyAnswered = Split(sAlreadyAnswered, ",")
    Dim i

    For i = 0 To UBound(m_aQuestionList)
        m_aQuestionList(i) = False
    Next

    For i = 0 To UBound(aAlreadyAnswered)
        m_aQuestionList(CInt(aAlreadyAnswered(i))) = True
    Next
End Sub

Sub MarkQuestionAnswered(n)
    Dim sDesc

    CheckState

    On Error Resume Next
    m_aQuestionList(n) = True

    If Err Or n = 0 Then
        sDesc = Err.Description
        On Error GoTo 0
        Err.Raise vbObjectError + 1, "", _
           "Can't mark question number '" & n & "' as answered: " & sDesc
    End If
End Sub

Function GetNextUnansweredQuestion()
    CheckState

    Dim i

    For i = 1 To UBound(m_aQuestionList)
        If Not m_aQuestionList(i) Then
            GetNextUnansweredQuestion = i
            Exit Function
        End If
    Next

    GetNextUnansweredQuestion = -1
End Function

Function ToString()
    CheckState

    Dim sDelim : sDelim = ""
    Dim i

    ToString = ""
    For i = 1 To UBound(m_aQuestionList)
        If m_aQuestionList(i) Then
            ToString = ToString & sDelim & CStr(i)
            sDelim = ","
        End If
    Next
End Function

End Class
于 2012-08-22T01:47:34.130 に答える