【问题标题】:MS Access SQL to copy part of a record displayed on a form, insert into same table as new record, and display the new record on a formMS Access SQL 复制表单上显示的记录的一部分,插入到与新记录相同的表中,并在表单上显示新记录
【发布时间】:2014-05-09 03:49:53
【问题描述】:

我继承了一个 Microsoft Access 2010 数据库,该数据库用于将职位/员工信息保存在一个表中。该表的每条记录都有一个自动编号字段。该数据库有一个表单——ScreenB——它使用查询来根据用户输入的搜索条件(人员编号、姓氏、社会保险号等)在 ScreenB 中提取和显示一条记录。该记录包含大约 25 个字段,显示有关职位的信息以及有关该职位的人员的信息。当然,每隔一段时间,一个人会离开一个职位,而另一个人会被雇用到空缺的职位上。我的用户想要 ScreenB 上的一个按钮,当点击该按钮时:

  1. 复制表单中显示的记录信息,仅用于 ScreenB 上显示的 12 个左右的位置信息字段。
  2. 将信息作为新记录粘贴到表中。
  3. 在表单中显示带有粘贴信息的新记录。

由于查询提取了一条记录,我的想法是创建一个新表单 - ScreenC - 在所有方面都与 ScreenB 相同以显示新记录。因此,按钮会从 ScreenB 上显示的记录中复制位置信息,将其作为新记录粘贴到表中,打开 ScreenC,跳转到表中记录的末尾并显示新(最后)记录(其中包含屏幕C上只有职位信息),然后关闭屏幕B,给用户留下的只有职位信息和一个可以填写员工信息的表格。这将保留前任员工在该职位上的信息,这是必需的。

我不是受过训练的程序员,所以下面的代码可能充满了错误,但这是我能想到的最好的:

Dim strSQL as String
strSQL = "INSERT INTO [tblNewCurrent Emp] (numCostCenter, numPosition, txtTitles, txtClassCode. numGrade, txtPositionType, txtUnit1, txtFieldStaff, txtFedMatch, txtPositionLicReq, txtPositionOrigin, datPosAcquired, datPosLastVacated, datPosTransferred, txtOrigTitle, txtOrigClassCode, numOrigGrade, datPosReclassified) "
strSQL = strSQL & "SELECT numCostCenter, numPosition, txtTitles, txtClassCode. numGrade, txtPositionType, txtUnit1, txtFieldStaff, txtFedMatch, txtPositionLicReq, txtPositionOrigin, datPosAcquired, datPosLastVacated, datPosTransferred, txtOrigTitle, txtOrigClassCode, numOrigGrade, datPosReclassified from [tblNewCurrent Emp] "
strSQL = strSQL & "WHERE (numSystemNumber = " & Me.numSystemNumber & ")"
DoCmd.RunSQL (strSQL)
DoCmd.OpenForm frmScreenC
DoCmd.GoToRecord , , acLast
DoCmd.Close frmScreenB

该表名为“tblNewCurrent Emp”,这就是我将其放在括号中的原因。 numSystemNumber 是自动编号字段的名称。所有表单、查询和表都在一个数据库/文件中。上面代码中的字段名称是字段的实际名称。

当我尝试运行代码时,我收到一条错误消息,指出“INSERT INTO 语句中的语法错误”。没有其他信息,Access Help 系统中也没有任何信息。我尝试从表名中删除括号,并得到相同的错误消息。我将不胜感激任何意见、想法或建议。 INSERT INTO 语句有什么错误?还有其他方法可以完成这项任务吗?不幸的是,我无法对数据库进行结构更改,并且由于它是许多其他数据库的后端,因此更改表名也不是一种选择。用户只能通过表单访问数据库。没有数据表或其他视图。谢谢。

编辑:谢谢 billmac1 和 Remou。 "...,txtClassCode.numGrade,..." 是 SQL 的问题。更正后,我使用您的建议在带有 print.debug 的即时 Windows 中运行代码。跑得很好,所以剩下的就是清理用于打开和关闭表单的 VBA 代码。对于其他尝试相同的人,我还将 ScreenC 设置为打开到 Load 属性中的最后一条记录。它现在完美运行。下面是完成的代码。

Dim strSQL As String
strSQL = "INSERT INTO [tblNewCurrent Emp] (numCostCenter, numPosition, txtTitles, txtClassCode, numGrade, txtPositionType, txtUnit1, txtFieldStaff, txtFedMatch, txtPositionLicReq, txtPositionOrigin, datPosAcquired, datPosLastVacated, datPosTransferred, txtOrigTitle, txtOrigClassCode, numOrigGrade, datPosReclassified) "
strSQL = strSQL & "SELECT numCostCenter, numPosition, txtTitles, txtClassCode, numGrade, txtPositionType, txtUnit1, txtFieldStaff, txtFedMatch, txtPositionLicReq, txtPositionOrigin, datPosAcquired, datPosLastVacated, datPosTransferred, txtOrigTitle, txtOrigClassCode, numOrigGrade, datPosReclassified FROM [tblNewCurrent Emp] "
strSQL = strSQL & "WHERE (numSystemNumber = " & Me.numSystemNumber & ")"
DoCmd.RunSQL (strSQL)
DoCmd.OpenForm "frmScreen C"
DoCmd.Close acForm, "frmScreen B"

【问题讨论】:

    标签: sql ms-access-2010 insert-into


    【解决方案1】:

    这个网站太新了,不能留下这个作为评论,但你的部分 SQL 字符串引起了我的注意“...,txtClassCode.numGrade,...”。您的字段字符串和值字符串中都有一个句点和一个空格。

    正如 Remou 建议的那样,“...尝试 debug.print strSQL 并将结果粘贴到查询设计窗口中以检查问题。”您可能还会发现只使用语句的 SELECT 部分并让它工作,然后尝试 INSERT 部分是有益的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多