【问题标题】:vba access table not updated from a sql stringvba 访问表未从 sql 字符串更新
【发布时间】:2021-02-10 08:12:42
【问题描述】:

我是一名“星期日”开发人员,试图在 MS Access 中创建一个关于“作家和书籍”的数据库,与多对多的关系。 我有一张“书”表、一张“作者”表和一张用于多对多关系的中间表。 我写了几行来更新“中间”表,在表单(作者)的子表单(书)上有一个组合框。 问题是:当我通过组合框添加新的“书”时,代码更新表“书”和中间表,刷新不是立即的,所以我无法立即在组合框上找到新值,而只能按下菜单栏上的“全部刷新”图标后。

   Private Sub ID_COL_LIBRO_NotInList(NewData As String, Response As Integer)
   On errot GoTo Error_Handler
   Dim IntAnswer As Integer
   Dim Sqlstring As String
   IntAnswer = MsgBox(" " & NewData & " è un nuovo nominativo.  " & vbCrLf _
   & "vuoi aggiungerlo adesso ?", vbYesNo + vbQuestion, "Nome Sconosciuto")
   Select Case IntAnswer
       Case vbYes
           Sqlstring = "INSERT INTO LIBRI (TITOLO) VALUES ( '" & NewData & "')"
           DoCmd.SetWarnings False
           DoCmd.RunSQL Sqlstring
           Dim datab As DAO.Database
           Dim rcslibri As DAO.Recordset
           Dim strultrec As String
           Set prova_relazione_m_a_m = CurrentDb
           Set rstlibri = prova_relazione_m_a_m.OpenRecordset("LIBRI")
           rstlibri.MoveLast
           strlastrifliblibro = rstlibri!RIF_LIB_LIBRO
           Dim str_idcolaut As String
           str_idcolaut = Me!RIF_AUT_AUTORE.Value
           Sqlstring = "INSERT INTO tab_collegamento (id_col_libro, id_col_autore) VALUES ( '" & strlastrifliblibro & "','" & str_idcolaut & "')"
           DoCmd.RunSQL Sqlstring
           DoCmd.SetWarnings True
           rstlibri.Close
           Response = acDataErrAdded
       Case vbNo
           MsgBox "Allora seleziona un nome dalla lista.", vbExclamation + vbOKOnly, "Selezione errata"
   End Select
   Response = acDataErrContinue
exit_procedure:
DoCmd.SetWarnings True
Exit Sub
Error_Handler:
MsgBox Err.Number & ", " & error_Description
Resume exit_procedure
Resume
End Sub

【问题讨论】:

  • 您不需要输入更多关于新书的数据而不仅仅是书名吗?为什么不打开输入此记录的表格?评论blueclawdatabase.com/notinlist-event-code
  • 您需要.Requery 数据源才能获取更新。如果您的组合源是查询,则需要调用其 requery 方法来更新项目,例如Combo.Requery。表单也是如此。
  • @KostasK.,acDataErrAdded 应该是重新查询组合框。也不应该需要重新查询命令。 docs.microsoft.com/en-us/office/vba/api/…
  • @Gianni,应该在代码模块的顶部添加Option Explicit。可以在具有应用程序选项设置的新模块中默认实现这一点。你有单步调试过的代码吗?
  • 最佳实践是在过程顶部声明所有变量。 On errort GoTo Error_Handler 中存在拼写错误。缩进使代码更易于阅读 - 我已经为此进行了编辑。

标签: vba ms-access refresh relationship


【解决方案1】:

您的表单/子表单设计不正确。书籍不应该是作者的子形式。 Books 和 Authors 是用于将数据输入到联结表 (BooksAuthors) 中的查找表。通常的方法是:

  1. 主窗体绑定到书籍,子窗体绑定到连接表,并带有一个用于选择作者的组合框;或
  2. 主窗体绑定到作者,子窗体绑定到连接表,并带有一个用于选择书籍的组合框;或
  3. 一个绑定到连接表的表单,带有两个组合框来选择书籍和作者。

然后在向 BookAuthors 输入数据期间,使用 NotInList 事件“即时”向 Books 或 Authors 输入新记录。

【讨论】:

  • 确实,我在联结表上设置了子表单源。问题是当我选择一个未在组合框中列出的值(其来源是 LIBRI 和 JUNCTION 表的查询)时,它不会更新列表。我注意到,如果我在菜单栏上按下“全部更新”,组合框列表就会更新。我尝试插入要重新查询的代码(我尝试了一切,在组合框上,在子表单上,在表单上,​​在查询上,所有)但消息错误给出错误运行时 2115,说无法保存数据,因为在更新前或“valido se”属性上设置的宏或函数。抱歉英语不好
  • 您的叙述似乎说子形式是书籍。为什么组合框 RowSource 加入 LIBRI 和 JUNCTION 表?什么是 SQL?是用 INNER JOIN 吗? BeforeUpdate 事件中的代码是什么? “valido se”是什么属性 - ValidationRule?使用所有这些相关信息编辑问题。
  • 我错误地写道,子表单是基于 libri,尽管它正确地基于考虑三个表(AUTORI、LIBRI 和联结表)的字段的查询。这里的SQL:SELECT AUTORI.AUTORE,AUTORI.RIF_AUT_AUTORE,TAB_COLLEGAMENTO.ID_COL_AUTORE,TAB_COLLEGAMENTO.ID_COL_LIBRO,LIBRI.TITOLO,LIBRI.RIF_LIB_LIBRO FROM AUTORI INNER JOIN(利布里INNER JOIN TAB_COLLEGAMENTO ON利布里[RIF_LIB_LIBRO] = TAB_COLLEGAMENTO [ID_COL_LIBRO]。) ON AUTORI.[RIF_AUT_AUTORE] = TAB_COLLEGAMENTO.[ID_COL_AUTORE];
  • 为什么使用查询而不是绑定到表?我认为是 INNER JOIN 导致组合框 RowSource 出现问题,这也是 INNER JOIN 的查询。 INNER JOIN 需要两个表中的相关记录才能显示数据。由于 INNER JOIN,这可能会在数据输入过程中“不同步”。应该使用查询信息编辑问题,而不是评论或答案。编辑其他有问题的信息。
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多