首页 > 解决方案 > 使用 INSERT 保存记录 - SAVE 和 1 INSERT 不起作用,但其余工作正常

问题描述

我正在尝试创建或保存记录,如果关联的记录存在于辅助表中,它只会保存/更新表单上的记录。INSERT 语句工作得很好,但我不擅长引用表单/子表单,我觉得它与这些有关。

Private Sub cmdSave_Click()
    On Error GoTo cmdSave_Click_Err

DoCmd.RunCommand acCmdSaveRecord

If DCount("*", "[tblRegSR]", "[WorkOrderID] = " & [Forms]![frmWelcome]![sfrmWorkOrders].Form![txtID]) > 0 Then
    DoCmd.GoToRecord , "", acNewRec
    Me.lstWorkOrders.Requery
    Me.lstWorkOrders.Value = ""
    Me.txtComments.Value = ""
    MsgBox "Save Completed"
Else
    DoCmd.SetWarnings True
    DoCmd.OpenQuery "qryInsertSR"
    RunSQL "INSERT INTO tblFirstSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblSecondSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblInflatorSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblHPSPGSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblOctoSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblComputerSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    DoCmd.GoToRecord , "", acNewRec
    Me.lstWorkOrders.Requery
    Me.lstWorkOrders.Value = ""
    Me.txtComments.Value = ""
    MsgBox "Sub Tables Injected"
End If


cmdSave_Click_Exit:
    Exit Sub

cmdSave_Click_Err:
    MsgBox Error$
    Resume cmdSave_Click_Exit

End Sub

我希望该过程检查是否存在与tblRegSR相关tblWorkOrders的记录并且该记录与适当的链接字段匹配([WorkOrderID]intblRegSR匹配到[ID]in tblWorkOrders)。如果关联的记录不存在,tblRegSR则将其与子表一起创建(tblFirstSR依此类推)。

此外,它只是没有更新/保存原始记录,DoCmd.RunCommand acCmdSaveRecord
所以我不完全确定它在哪里引起了问题。它不是 INSERT'ingtblWorkOrderstblRegSR,而是 INSERT'ing 到所有其他表中。我敢肯定,一旦我确定了其他两个 INSERT 语句,该IF语句就会正常工作...我希望...

编辑如下:这里
有几个数据
类型
屏幕截图表(等)。但是,它不是插入到中,也不是将记录保存在表单中(在 中)。希望这能回答您的问题@Nathan_Sav - 谢谢!



ELSEINSERTtblFirstSRtblRegSRtblWorkOrders

编辑二:
这是违反验证规则的图像:违反
验证规则

编辑三:
我决定只共享整个数据库。这是一个链接。工单数据库

编辑四(19 年 1 月 10 日):
这是我正在使用的新代码以及我在追加查询中使用的代码qryInsertSR

qryInsertSR是我正在使用的 SQL:
INSERT INTO tblRegSR (WorkOrderID, CustomerID) VALUES (Forms![frmWelcome]![sfrmWorkOrders].Form![txtID], Forms![frmWelcome]![sfrmWorkOrders].Form![Customer])

此外,我更新了上面的代码片段以反映我所做的任何更改。

编辑五(19 年 1 月 11 日):
这是我的对象浏览器的图像,显​​示了数据库中的所有内容。包括 sfrmWorkOrders。
这里

标签: vbams-access

解决方案


当尝试在DLookUpSQL 查询中使用表单值时,您必须将值作为参数或通过连接使用。除非使用保存的查询,否则表单值需要传递到所需的 SQL 中,或者DLookUp不使用字符串进行硬编码。

否则,Access 引擎使用'[Forms]![frmWelcome]![sfrmWorkOrders].Form![txtID]'失败的文字值,因为它不是数字并使用未转义的特殊字符。这可能是类型转换违规的原因。

因此,调整DCount为:

If DCount("*", "[tblRegSR]", "[WorkOrderID] = " & [Forms]![frmWelcome]![sfrmWorkOrders].Form![txtID]) > 0 Then
        ...

并将您的追加查询保存为 MS Access 对象。这些类型的查询可以读取表单/报告参数或任何打开到屏幕的对象:

INSERT INTO tblRegSR (WorkOrderID, CustomerID) 
VALUES (Forms![frmWelcome]![sfrmWorkOrders].[Form]![txtID], 
        Forms![frmWelcome]![sfrmWorkOrders].[Form]![Customer])

要在 VBA 中运行,如下所示(无需将其关闭为操作查询):

If DCount("*", "[tblRegSR]", "[WorkOrderID] = " & [Forms]![frmWelcome]![sfrmWorkOrders].[Form]![txtID]) > 0 Then
    MsgBox "Save Completed"
Else
    DoCmd.SetWarnings True           ' REDUNDANT AS WARNINGS START AS TRUE
    DoCmd.OpenQuery "mySavedQuery"
    RunSQL "INSERT INTO tblFirstSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblSecondSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblInflatorSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblHPSPGSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblOctoSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblComputerSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    MsgBox "Sub Tables Injected"
End If

DoCmd.RunCommand acCmdSaveRecord     ' MOVE SAVE INSTANCE TO END
DoCmd.GoToRecord , "", acNewRec
Me.lstWorkOrders.Requery
Me.lstWorkOrders.Value = ""
Me.txtComments.Value = ""

表关系

话虽如此,请仔细考虑您的表关系,这会导致父表和子表之间的引用完整性违规,具体取决于更新。具体来说,您上面的工作流程会在保存父表记录尝试更新子表。父项的主键必须存在于子项的外键之前。仅当它与tblWorkOrder的关系被破坏时,上面才会填充tblRegSR

表关系图像


推荐阅读