【问题标题】:Refer to OpenArgs to identify field name请参阅 OpenArgs 以识别字段名称
【发布时间】:2017-10-11 15:07:06
【问题描述】:

我在尝试使用 OpenArgs 来引用表中的字段名称时遇到了一些问题。我对此很陌生,所以请多多包涵。

所以我有一个报告(CourseCatalog),其中包含带有课程名称的文本框,它是从表格(tblCourses)中提取的。当您点击一门课程时,它会打开一个表格,让您可以选择对课程进行评分(frmRate)。我使用 OpenArgs(从报告到评分表)为 frmRate 制作标题。工作正常。

现在我需要获取先前在代码中定义的数据(选择的星数,(intNumStars)),并将其放入表中。该表(“Allratings”)将课程名称(OpenArgs 值)作为列名,我想将 intNumStars(1-5) 放入这些列中的单元格中。

我似乎在引用 VarArgs 来实现这一点时遇到了一些问题。我的语法/逻辑可能(可能)是错误的,如果有人知道完成此任务的更好方法,请告诉我您的想法!谢谢!

Private Sub btnSubmit_Click()
Dim varargs
Dim rst As dao.Recordset
Dim db As dao.Database
Dim fld As dao.Field
varargs = Me.OpenArgs
Set db = CurrentDb()
Set rst = db.OpenRecordset("Allratings")

For Each fld In rst.Fields
    If fld.Name = "varargs" Then
        rst.AddNew
        rst!"varargs" = intNumStars
        rst.Update
    End If
Next

结束子

【问题讨论】:

  • 该表(“Allratings”)将课程名称作为字段名称 - 如果这是真的(并且您并不意味着您有课程名称列),这是糟糕的设计。这应该是一个联结表(参见 Wikipedia)。
  • 我说错了,它是列名而不是字段名。我编辑了帖子以反映更正

标签: ms-access vba ms-access-2013


【解决方案1】:

你正在用字符串做奇怪的事情,当你尝试保存/编译它时,你应该得到一个描述性的编译错误。

varargs 引用变量varargs

"varargs" 是包含字母 v、a、r 等的文字字符串。

rst!"varargs" 应该是 rst.Fields("varargs") 以避免编译错误,但实际上应该是 rst.Fields(varargs)

如果你更正所有错误放置的引号,你会得到:

Private Sub btnSubmit_Click()
Dim varargs As String
Dim rst As dao.Recordset
Dim db As dao.Database
Dim fld As dao.Field
varargs = Me.OpenArgs
Set db = CurrentDb()
Set rst = db.OpenRecordset("Allratings")

For Each fld In rst.Fields
    If fld.Name = varargs Then
        rst.AddNew
        rst.Fields(varargs) = intNumStars
        rst.Update
    End If
Next
End Sub

这似乎是有效的,如果 Me.OpenArgs 只包含一个字段名

【讨论】:

  • 我以为我犯了这样的错误。我不知道在引用对象时何时使用引号,何时不使用。但是,在进行了您建议的更正后,我遇到了与以前相同的问题。我没有收到错误,但什么也没发生。正在保存数据的表没有保存评分
  • 嗯,那可能是因为Me.OpenArgs 永远不会等于fld.Name。这是您数据库中其他地方的问题。
【解决方案2】:

Eric 已经展示了如何使您的代码工作,但您的表格设计将被证明是不切实际的。为每门新课程添加新列并不是您使用数据库的方式。

我建议

tblCourses

+----------+------------+
| CourseID | CourseName |
+----------+------------+
|        1 | foo        |
|        2 | bar        |
+----------+------------+

tblUsers

+--------+----------+
| UserID | UserName |
+--------+----------+
|      7 | John     |
|      8 | Kate     |
+--------+----------+

allRatings(这是Junction table

+----------+--------+----------+
| CourseID | UserID | NumStars |
+----------+--------+----------+
|        1 |      7 |        1 |
|        1 |      8 |        4 |
|        2 |      7 |        3 |
+----------+--------+----------+

因此,新评级是allRatings 中的新记录,具有固定的列名。您可以通过 DLookup 调用从传递的课程名称中获取 CourseID

通过交叉表查询可以实现将课程及其评分作为列的视图。

【讨论】:

  • 基本上,我的任务是设计一个数据库,该数据库将对我们的课程进行评分,并创建一个目录,显示所有评论的平均评分并使用星标。因此,我以这种方式设置表的原因是为了使使用没有条件的字段名称查找 DAvg 更容易一些。我对VBA不太了解。是否可以使用 Junction 表来查找曾经提交的所有评分的平均值?
  • 是的,这对于聚合 (GROUP BY) 查询来说是微不足道的。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 2016-11-10
  • 2022-11-10
  • 2013-01-13
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多