我有一个包含以下字段的表:
StudentID
ClassID
TestID
TestScore
对于学生和班级的每种独特组合,最多可以有10个测试ID和相应的测试分数。我有一个带有10个未绑定文本框的表单,该文本框对应于10个测试ID的测试分数。我正在尝试使用该表格将数据编辑和添加到我的表(StudentScores)。由于学生可能错过一堂课,因此每个学生课组合不一定在表中有10条记录。
我希望能够在事件过程中使用循环,根据选择的学生和班级ID从表中检索测试成绩,以输入到文本框中。这些文本框的名称分别为textbox1到textbox10,对应于10个TestID。
通过在这样的论坛上进行搜索,我已经能够提供以下代码来从10个未绑定文本框中提取数据,并将其作为新记录添加到表中:
Dim i As Integer
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("StudentScores", dbOpenTable)
For i = 1 To 10
rst.AddNew
rst![StudentID] = Me.StudentCombo1
rst![ClassID] = Me.ClassCombo1
rst![TestID] = i
If Not IsNull(Controls("Textbox" & i)) Then
rst![TestScore] = CLng(Controls("Textbox" & i))
End If
rst.Update
Next
好的,因此下面的代码似乎至少在最初是有效的。我最初遇到的问题是由于打字错误造成的。但是,当我更改组合框的值并重新运行该例程时,我收到一条错误消息,即记录集为空。
Dim rst As DAO.Recordset
mmySQL = "SELECT * from StudentScores where ClassID =" & Me.ClassCombo1 & "AND StudentID =" & Me.StudentCombo1
Set rst = CurrentDb.OpenRecordset(mmySQL)
rst.MoveFirst
Do Until rst.EOF
Controls("Textbox" & rst![TestID]) = rst![TestScore]
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
在深入探讨问题之前,请注意以下几点:
目前,您可以Null
在StudentScores表中允许考试成绩。我很想禁止它们(即,将字段的Required属性设置为True
),尽管您知道自己的数据。也就是说,以下代码假定不允许使用null。
即使是小格式,我也避免使用默认控件名称,例如TextBox1
-常见的Access约定是使用三个字母的前缀(例如txtTestScore1
)。另外,为什么ClassCombo1
以及StudentCombo1
如果每个都只有一个?为了清楚起见,我将在下面继续使用您当前的命名。
您的描述涉及添加或编辑,但是您用于记录代码的文本框仅覆盖前者...尽管我看到您现在已经对此进行了评论。
对于这种事情,您可以使用纯DAO或一些内联SQL。在数据量达到一定大小之前(10个测试分数远不及此),选择哪种方法并不重要,但是我将在第二篇文章中介绍。
如果尚未安装,则可能需要在该TestID
字段上放置验证规则以强制使用介于1到10之间的值。
因此,首先需要几个常量-在form模块的顶部声明它们:
Const MaxTextScoreCount = 10
Const TestScoreTextBoxPrefix = "TextBox"
接下来,是一种清除表单上现有值的方法:
Sub ClearTestScoreTextBoxes()
Dim I As Integer
For I = 1 To MaxTextScoreCount
Me.Controls(TestScoreTextBoxPrefix & I).Value = Null
Next I
End Sub
第三,一个帮助函数,从组合框构建一个WHERE子句:
Function BuildWhereClause() As String
BuildWhereClause = " WHERE StudentID = " & StudentCombo1.Value & _
" AND ClassID = " & ClassCombo1.Value
End Function
第四,一种使用选择填充文本框的方法:
Sub UpdateTestScoreTextBoxes()
Dim RS AS DAO.Recordset, SQL As String
SQL = "SELECT TestID, TestScore FROM StudentScores" + BuildWhereClause
Set RS = CurrentDb.OpenRecordset(SQL, dbForwardOnly)
ClearTestScoreTextBoxes
While Not RS.EOF
Me.Controls(TestScoreTextBoxPrefix & RS!TestID).Value = RS!TestScore
RS.MoveNext
Wend
End Sub
第五,一种从文本框中更新数据库的方法:
Sub UpdateDatabase()
Dim DB AS DAO.Database, I As Integer, Score As Variant, WhereClause as String, SQL As String
Set DB = CurrentDb
For I = 1 To MaxTextScoreCount
Score = Me.Controls(TestScoreTextBoxPrefix & I).Value
WhereClause = BuildWhereClause + " AND TestID = " & I
If IsNull(Score) Then
SQL = "DELETE FROM StudentScores" + WhereClause
ElseIf DB.OpenRecordset("SELECT 1 FROM StudentScores" + WhereClause).EOF Then
SQL = "INSERT INTO StudentScores(StudentID, ClassID, TestID, TestScore) " + _
"VALUES (" & StudentCombo1.Value & "," & ClassCombo1.Value & "," & _
I & "," & Score & ")"
Else
SQL = "UPDATE StudentScores SET TestScore = " & Score & WhereClause
End If
DB.Execute SQL
Next I
End Sub
应该做...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句