MS在vba中访问SELECT INTO

时间:2012-07-05 17:11:50

标签: sql ms-access vba

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

我在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语句初始化局部变量。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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


如果真的需要使用两个表并复制行,那么您需要an INSERT INTO query(和not 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中,您可以在变量OR表中选择一行。在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

答案 1 :(得分:1)

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

如果解释正确,则无需担心查询和记录集。只需使用DLookup Function检索值,类似于此未经测试的代码示例。

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. 我假设idtblPending字段的数据类型是数字。如果它实际上是文本数据类型,请像这样更改strCriteria

    strCriteria =“id ='”& pid& “'”

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