首页 > 解决方案 > DoCmd.OpenForm 以只读模式打开表单。访问 2016 (VBA)

问题描述

我正在尝试使用一个前端和一个后端文件来模拟客户端-服务器结构的访问。我的前端包含一个索引表单,其中列出了我的后端表的所有记录。双击一个条目应该打开相应的单个表单,它就是这样做的,但是一旦打开,我就无法编辑单个页面(类似于不久前的这篇文章vba access form not read-only) . 在左下角只闪烁一个简短的“Formular ist schreibgeschützt”,这意味着表单处于只读模式。

附带说明:我自己没有创建任何一个访问数据库。它们是作为培训课程的一部分提供的。

我尝试了几件事,但很明显,我没有牢牢掌握任何与 VBA 相关的东西,所以我似乎遗漏了一些东西(可能是一些显而易见的东西)。

由于我不确定它是否与 NTFS 权限有关(我通常不在 Windows 上工作),所以我将两个文件(后端和前端)都放在了我的 c 驱动器上的一个文件夹中,并让每个人都可以完全访问该文件夹,尽管我是唯一一个尝试与他们合作的人,但可以肯定的是。由于这并没有改变任何东西,我认为错误必须在我的代码中。

我将给出一个可能相关的代码位的逻辑列表,尽管这并不反映我之前尝试寻找解决方案的顺序。

我使用早期绑定 ADODB 连接到 access 2016 后端数据库,因此在 References 中“Microsoft ActiveX Data Objects 6.1 Library”处于活动状态。

连接以及记录集和基本 sql 字符串是全局声明的(在它们自己的模块中),因此可以在整个代码中访问它们。

Public Conn As ADODB.Connection
Public rs As ADODB.Recordset
Public xSQL As String

加载索引表单时建立连接(打开数据库时加载)。起初,我没有设置 conn.Mode,然后我尝试了 adModeReadWrite 和 adModeShareDenyNone 无济于事。

Private Sub Form_Load()

  Set Conn = New ADODB.Connection
  Conn.Provider = "Microsoft.ACE.OLEDB.16.0"
  Conn.ConnectionString = CurrentProject.Path & "\MitgliederlisteDaten.accdb"
  Conn.CursorLocation = adUseClient
  Conn.Mode = adModeShareDenyNone

  Conn.Open

  'conn.state at this point is 1

  xSQL = "SELECT * FROM tblMitgliederliste INNER JOIN tblTyp ON tblMitgliederliste.TypID = tblTyp.TypID"

  Set rs = New ADODB.Recordset
  rs.Open xSQL, Conn, adOpenDynamic, adLockOptimistic

  Set Me.Recordset = rs

End Sub

只要正确显示索引表单和单个表单,连接就可以正常工作。

双击一个条目应该打开相应的单个表单,该表单使用简单的 docmd.openform 完成,尽管我尝试将 DataMode 设置为 acFormEdit

Private Sub MitgliedsNr_DblClick(Cancel As Integer)
  DoCmd.OpenForm "frmAdresse"
  'DoCmd.OpenForm "frmAdresse", , , , acFormEdit
End Sub

填充单个表单发生在相应的加载事件中。

Private Sub Form_Load()

  Dim memberSQL As String
  memberSQL = xSQL & " WHERE MitgliedsNr= " & Forms("frmAdressliste")!MitgliedsNr

  Dim rs As New ADODB.Recordset
  rs.Open memberSQL, Conn, adOpenDynamic, adLockPessimistic
  Set Me.Recordset = rs

  Dim cmbSQL As String
  cmbSQL = "SELECT TypID, Typ FROM tblTyp IN '"
  cmbSQL = cmbSQL & CurrentProject.Path & "\MitgliederlisteDaten.accdb"
  cmbSQL = cmbSQL & "' ORDER BY Typ"

  Me.cmbTyp.RowSource = cmbSQL
  Me.cmbTyp.ColumnCount = 2
  Me.cmbTyp.ColumnWidths = "0cm;4cm"
  Me.Form.AllowEdits = True

End Sub

我已经盯着它看了很长时间,以至于我无法弄清楚可能是明显的错误。希望有人能指出我正确的方向。提前感谢您的任何回答或建设性的批评。

亲切的问候

标签: vbalocaladodbms-access-2016

解决方案


谢谢你们的帮助。我刚刚从头开始重建整个东西,现在它可以工作了。我不明白为什么,但。

为了尽快解决问题,我构建了 xSQL 字符串,我用它来以不同的方式为我的索引表单构建记录集。代替

xSQL = "SELECT * FROM tblMitgliederliste INNER JOIN tblTyp ON tblMitgliederliste.TypID = tblTyp.TypID"

我选择了更短的

xSQL = "SELECT * FROM tblMitgliederliste"

计划稍后实施 JOIN。但这实际上就是全部,因为现在我可以通过双击打开单个表单并编辑和删除我心中的内容,而无需更改原始代码中的任何其他内容。

一旦我完成了备份并呼吸了一些新鲜空气,我将开始使用加长的琴弦来看看它是否真的是问题所在,尽管我不太清楚它可能是怎么回事。


推荐阅读