Sql MS access在vba中选择输入

Sql MS access在vba中选择输入,sql,ms-access,vba,Sql,Ms Access,Vba,我的应用程序的某些功能出现问题。有一个特殊的实例,我在表单上有一个“挂起类”的实例,供管理员查看。表单中填充了与此待定类关联的学生。在他们的成绩完成后,我在页脚有一个按钮,它将从我的“待定”表中删除这个类,并将成绩添加到所有学生。这很有效。 但是,我想将这个挂起的类复制到一个完整的类表中,然后再将其从挂起中删除。由于除了主键类编号外,该类的其他数据在整个表单中都不存在,因此我无法将其他字段class name、行的日期填充到已完成的类表中 我正在VBA中尝试执行SELECT INTO操作以获取这

我的应用程序的某些功能出现问题。有一个特殊的实例,我在表单上有一个“挂起类”的实例,供管理员查看。表单中填充了与此待定类关联的学生。在他们的成绩完成后,我在页脚有一个按钮,它将从我的“待定”表中删除这个类,并将成绩添加到所有学生。这很有效。 但是,我想将这个挂起的类复制到一个完整的类表中,然后再将其从挂起中删除。由于除了主键类编号外,该类的其他数据在整个表单中都不存在,因此我无法将其他字段class name、行的日期填充到已完成的类表中

我正在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 INTO CompletedClassTable (ClassName, Teacher)
SELECT ClassName, Teacher FROM tblPending WHERE id = 123

从这里开始,我对每个其他变量执行相同的操作,构建插入查询并执行它。问题是-我的select-into不起作用。Debug.print显示本地变量从未从SELECT INTO语句初始化。有什么想法吗?

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

如果确实需要通过使用两个表和复制行来实现这一点,那么就需要和,正如Remou在注释中已经提到的,因为SELECT INTO会创建一个新表或覆盖一个同名的现有表(如果已经存在)

INSERT 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 INTO CompletedClassTable (ClassName, Teacher)
SELECT ClassName, Teacher FROM tblPending WHERE id = 123
最后,你在评论中问了这个问题:

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

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

将查询加载到记录集中并输出ClassName字段的示例代码:


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

如果这种解释是正确的,您就不必费心处理查询和记录集。只需使用检索值,类似于此未测试的代码示例

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 & "'"
注:

我假设tblpend中id字段的数据类型是数字。如果它实际上是文本数据类型,请按如下方式更改strCriteria:

   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 INTO CompletedClassTable (ClassName, Teacher)
SELECT ClassName, Teacher FROM tblPending WHERE id = 123
strCriteria=id='&pid&'

如果未找到匹配项,DLookup将返回Null。因为我们将函数的返回值赋给字符串变量,所以我使用Nz将Null转换为空字符串。或者,您可以将cname声明为Variant,这样它就可以接受Null值并去掉Nz


这是一个make表查询,我想您需要一个append查询。我真的不认为你的身份证是文本。如果pid为null空,那么很可能是[Forms]![frmClasses]![txtID]为空。尝试使用Me关键字,看看它会产生什么控件名-Me。将启动intellisense。在这种情况下,我不能使用Me关键字。我没有使用参数打开表单,而是使用上一个表单中的字段。具有txtID的字段和具有相关类ID的文本框位于上一个表单中。此外,此部件正在按预期工作。打印出来的查询是从tblpend中将ClassName选择为cName,其中tblpend.id='17';我还尝试删除id条件周围的单引号,因为它是一个整数,但这没有什么区别。根据我从上一个表单中所做的选择,我将获得正确的对应类IDSELECT INTO以创建一个表,您需要的是INSERT INTO,它将附加到表中。另外,add db.execute qry,dbFailOnerror-如果表存在,您的查询将失败,否则您将不会收到警告。在MS Access中,您可以使用DLookup选择一个变量,您可能会发现其他域函数很有用:DMin;DMax;达夫格;等等。我觉得我对“select into”的预期用途被误解了。我的意图是从一行中获取一个值,并从我知道PK的表中将其分配给VBA中的一个变量,就像在PL/SQL中一样。正如您所提到的,迭代RS似乎是访问的比较解决方案。就数据库设计而言,挂起的表和完成的表并不完全相同。我完成的表包含挂起表的所有字段,并添加了几个字段。在这种情况下,我将已完成的类和正在进行的类视为不同的实体。我不确定我的问题是否含糊不清或我的意图是否不清楚,但我会继续并将其标记为“已回答”-在VBA中不可能使用“选择到”将行中的值指定给变量。要实现这一点,我需要打开一个记录
设置必要的查询。在您看来,这是一个合适的总结吗?我不知道Oracle和PL/SQL,所以除了您所说的之外,我无法告诉您它是如何工作的。要将行中的值分配给变量,需要一个记录集,或者,如果只需要一个值,则需要一个记录集。但如果您只想将一行复制到另一个表中,我会使用INSERT INTO查询。依我看,这是最简单的方法。听起来不错,谢谢你的意见。我会接受这一点,并认为这也是可行的。在您发布对我的问题的评论后,我使用dLookup实现了我的表单,它可以正常工作。我的代码与您在回答此问题时提供的代码类似。以前,我在以前的表单上使用了一个隐藏控件来存储变量——这是一个丑陋的解决方法,因为我不知道DLookup。感谢您让我意识到了这一点,我相信我以后会经常使用它,因为我更习惯于用VBA编写插入、更新和删除代码,而不是使用向导提供的默认操作。一旦我意识到您真的想选择一个变量,DLookup就成为了一个简单的解决方案。当我第一次读到你的问题时,我错误地将目标理解为将选定的值存储在新的或现有的表中。我认为这也是Remou和Christian的想法。我习惯于使用SELECTINTO将表中的值转换为PL/SQL中的局部变量。这就是造成混乱的原因。我不想“选择进入”,我想知道该操作的访问等价物是什么。德卢库普是我们一直在寻找的答案。