3

我的应用程序的某些功能存在一些问题。有一个特定的实例,我在表单上有一个“待定类”的实例供管理员查看。表单中填充了与此待定课程相关联的学生。在他们的成绩完成后,我在页脚有一个按钮,可以从我的“待定”表中删除该课程并将成绩添加到所有学生。这行得通。但是,我想在从待处理中删除之前将这个待处理的课程(它只有课程名称、日期和教师)复制到已完成的课程表中。由于除了主键(类号)之外没有关于这个类的数据在整个表单中持续存在,我无法将该行的其他字段(类名、日期)填充到我完成的类表中。

我正在尝试在 VBA 中执行“SELECT INTO”操作来获取这些值。它是这样的:

   dim cname as String
   dim classdate as Date
   dim pid as integer
   dim teacher as String
   dim qry as String

    pid = [Forms]![frmClasses]![txtID]

   qry = "Select className INTO cname FROM tblPending WHERE tblPending.id = " & " ' " & pid & " ' " & ";"

   db.execute qry
   debug.print qry
   debug.print cname   

从这里开始,我对其他变量执行相同的操作,构建我的 INSERT 查询并执行它。问题是——我的选择不起作用。Debug.print 显示局部变量从未从 SELECT INTO 语句初始化。有什么想法吗?

4

2 回答 2

3

首先,将所有类放在一个表中并仅设置“NotPending”或“Completed”列会更好。
拥有两个相同的类表并将值从一个表移动到另一个表以指示状态更改是糟糕的数据库设计。


如果您确实需要通过使用两个表并复制行来执行此操作,那么您需要一个INSERT INTO查询(而不是SELECT INTO),正如 Remou 在评论中已经提到的那样,因为SELECT INTO创建一个新表(或覆盖具有相同名称的现有表,如果已经在那里)。

的语法INSERT INTO如下所示:

INSERT INTO CompletedClassTable (ClassName, Teacher)
SELECT ClassName, Teacher FROM tblPending WHERE id = 123

最后,您在评论中问了这个问题:

那么 SELECT INTO 在 Access 中与 Oracle 完全不同?在 Oracle 和 PL/SQL 中,您可以在变量或表中选择一行。在 Access 中,您不能选择变量吗?

要将行加载到变量中,您需要使用Recordset

将查询加载到 Recordset 并输出ClassName字段的示例代码:

Dim RS As DAO.Recordset

Set RS = CurrentDb.OpenRecordset("SELECT * FROM tblPending WHERE id = 123")
If Not RS.EOF Then
    Debug.Print RS("classname")
End If
RS.Close
Set RS = Nothing
于 2012-07-06T16:12:21.997 回答
1

似乎您想检索一个文本值 ,className从中tblPending找到tblPending.id与您的文本框中找到的值匹配的值txtID, 并将该文本值存储在一个名为 的字符串变量中cname

如果该解释是正确的,您就不必为查询和记录集而烦恼。只需使用DLookup 函数来检索值,类似于此未经测试的代码示例。

Dim cname As String
Dim pid As Integer
Dim strCriteria As String
pid = [Forms]![frmClasses]![txtID]
strCriteria = "id = " & pid
cname = Nz(DLookup("className", "tblPending", strCriteria), vbNullString)
Debug.Print "cname: '" & cname & "'"

笔记:

  1. 我假设id字段的数据类型tblPending是数字。如果它实际上是文本数据类型,则更改strCriteria如下:

    strCriteria = "id = '" & pid & "'"

  2. DLookup()如果未找到匹配项,则返回 Null。由于我们将函数的返回值分配给字符串变量,因此我曾经Nz()将 Null 转换为空字符串。或者,您可以将 cname 声明为 Variant(以便它可以接受 Null 值)并摆脱Nz().

于 2012-07-06T16:51:33.137 回答