【问题标题】:MsgBox and SQL 'Insert Into' queryMsgBox 和 SQL“插入”查询
【发布时间】:2018-06-19 00:48:57
【问题描述】:

在 MS-Access 数据库中,我从 VBA 模块触发了以下 SQL 查询,该模块根据 WHERE 子句中所述的条件附加一条记录。我的问题是,我可以插入一个 MsgBox 来通知用户该记录是否已经存在或天气是新记录吗?目前,如果名为“Counterparty ID”的字段的值已经在目标表中,则查询将附加一条记录,否则不会。虽然机制是正确的,但我想通知用户他/她是否尝试插入重复记录。这有可能吗?我认为它必须在查询本身中发生。

"INSERT INTO Netting_Determinations_List ([Counterparty ID], [Counterparty Name], [Counterparty Type], [Counterparty Subtype],[DTCC_AVOX_Registered_LEI_CICI], " & _
        "[Data Point 1],[Data Point 2],[Data Point 3],[Data Point 4],[Data Point 5], [Matrix Legal Form], [Matrix Governing/Authorizing Power], " & _
        "[OnBoardings Color Determination], [Matrix Clarification],  [Audit_Append_User], [Audit_Append_Date], [Audit_Append_Time]) " & _
        "SELECT Repository_Redux.[Counterparty ID], Repository_Redux.[Counterparty Name], Repository_Redux.[Counterparty Type], Repository_Redux.[Counterparty Subtype], Repository_Redux.[DTCC_AVOX_Registered_LEI_CICI], " & _
        "[Forms]![Frm_Master_Form]![Txt_Input_1] AS [Data Point 1], [Forms]![Frm_Master_Form]![Txt_Input_2] AS [Data Point 2], " & _
        "[Forms]![Frm_Master_Form]![Txt_Input_3] AS [Data Point 3], [Forms]![Frm_Master_Form]![Txt_Input_4] AS [Data Point 4], " & _
        "[Forms]![Frm_Master_Form]![Txt_Input_5] AS [Data Point 5], [Forms]![Frm_Master_Form]![Cbo_LegalForm] AS [Matrix Legal Form], " & _
        "[Forms]![Frm_Master_Form]![Cbo_Status] AS [Matrix Governing/Authorizing Power], [Forms]![Frm_Master_Form]![Txt_Color] AS [OnBoardings Color Determination], " & _
        "[Forms]![Frm_Master_Form]![Txt_Matrix_Clarification] AS [Matrix Clarification], '" & strUsername & "' AS [Audit_Append_User], " & _
        "'" & StrDate & "' AS [Audit_Append_Date], '" & StrTime & "' AS [Audit_Append_Time] FROM Repository_Redux " & _
        "WHERE Repository_Redux.[Counterparty ID] IN (" & strCriteria & ") AND NOT EXISTS (SELECT [Counterparty ID] FROM Netting_Determinations_List WHERE [Counterparty ID] = (" & strCriteria & "))"

【问题讨论】:

  • 是的,你可以这样做。编写一个聚合查询,计算与新记录匹配的记录数。如果该计数 > 0,则通知用户。使用 Dlookup 为您完成工作。您不需要 Recordset 对象或任何复杂的东西。
  • 我认为你在这里是正确的。虽然没有受过训练,但我想我可以弄清楚。如果您对 SO 点感兴趣,可能希望将您的评论放在答案中,以便我可以投票
  • 使用 DCount 后跟一条消息。您甚至可以使用 DCount 返回的结果作为运行或不运行查询的条件。
  • 是的,我想是的。如果我这样做,我可能会摆脱上面发布的查询中的第二个 where 条件。

标签: sql ms-access vba


【解决方案1】:

这就是我的做法:

If Nz(DLookup("Counterparty ID","Netting_Determinations_List","[Counterparty ID]=" & strCriteria),0)=0 then
--Record does not exists, insert
else
--record exists notify user
end if

不要费心试图找出是否插入了记录。首先检查记录并采取相应措施更容易。

【讨论】:

  • 是的,就是这样。在这种特定情况下,我从源中删除了记录,但您概述的将是检查记录是否存在并在用户采取行动之前提供消息框的正确方法。
【解决方案2】:

众所周知,MS Access 处理记录的方式过于简单。例如,您可以从 VBA (Database.Execute "insert...") 调用插入,它可能会默默地插入失败;你必须自己去验证你想要写的东西是否真的被插入了。 (不过,DoSQL 操作会弹出对话框。)

由于您使用的是 VBA,我建议您先自己在 SQL 中进行测试。要么创建一个查询对象,要么执行选择记录是否存在的查询文本(Recordset.RecordCount > 0),然后弹出一个对话框通知用户。您不能将其写入查询文本。

请注意,您可能必须执行 .MoveLast 和 .MoveFirst 才能获得实际记录数,具体取决于记录集类型。

【讨论】:

  • 我应该分享我的查询是在 VBA 中触发的,但使用的是调用 SQL 查询的 DoCmd.OpenQuery,所以我确实得到了您正确指示的对话框。但是,如果我计算记录它不应该工作,因为记录将在那里,无论用户是否尝试重复......我认为我应该在调用上述 SQL 之前运行 SELECT IN 查询以验证记录是否存在已经,如果有退出子。
  • 是的,这正是我的意思——在运行插入查询之前运行选择测试查询。这就是你说的吗?您计算选择测试查询中的记录,看看它是否已经存在;如果没有,您可以放心插入。如果有,则提醒用户不要插入。
  • 是的,正确。我最终从我用作记录源的列表框中删除了记录,从而防止重复,但您的建议是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2016-04-04
  • 2013-06-29
相关资源
最近更新 更多