vba - 使用 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'ingtblWorkOrders
或tblRegSR
,而是 INSERT'ing 到所有其他表中。我敢肯定,一旦我确定了其他两个 INSERT 语句,该IF
语句就会正常工作...我希望...
编辑如下:这里
有几个数据
类型
的
屏幕截图:表(等)。但是,它不是插入到中,也不是将记录保存在表单中(在 中)。希望这能回答您的问题@Nathan_Sav - 谢谢!
ELSE
INSERT
tblFirstSR
tblRegSR
tblWorkOrders
编辑二:
这是违反验证规则的图像:违反
验证规则
编辑三:
我决定只共享整个数据库。这是一个链接。工单数据库
编辑四(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。
这里
解决方案
当尝试在DLookUp
SQL 查询中使用表单值时,您必须将值作为参数或通过连接使用。除非使用保存的查询,否则表单值需要传递到所需的 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。
推荐阅读
- javascript - 使用从 Alphavantage 返回的 axios 对象更新 reactjs 状态
- c# - 为什么这个 C# 脚本会导致在 Unity 中循环的游戏对象之间出现延迟峰值?
- android - Android Oreo+:AppWidget 点击不调用 JobIntentService.onHandleWork()
- javascript - 函数在调用时正常运行,但总是返回 undefined
- python - 无法从 gevent 导入 wsgi
- android - BoxStore 中的最大盒子数
- reactjs - 在通用 React 应用程序上存储 JWT 令牌
- ios - 如何在不同的故事板中对导航堆栈中的某些视图控制器执行推送 segue?
- python-3.x - 从两个列表创建 dict,具有 1:2 键:值关系
- python - 如何从字典中的字典中删除重复条目?