DoCmd.OpenForm以只读模式打开表单。 Acces 2016(VBA)

时间:2018-06-15 20:19:40

标签: vba local adodb ms-access-2016

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

作为旁注:我自己没有创建任何访问数据库。它们是培训课程的一部分。

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

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

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

我使用早期绑定ADODB连接到访问2016后端数据库,因此在引用“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

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

亲切的问候

1 个答案:

答案 0 :(得分:0)

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

为了尽可能快地到达故障点,我构建了xSQL字符串,我用它来为我的索引表单构建不同的记录集。 而不是

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

我选择了更短的

xSQL = "SELECT * FROM tblMitgliederliste"

计划稍后实施JOIN。但实际上这就是我现在所能花的所有事情,因为现在我可以通过双击打开单个表单,编辑并删除我心中的内容,而不会改变原始代码中的任何内容。

一旦我完成备份并获得新鲜空气,我将开始玩扩展字符串以查看它是否真的是问题,但我不太清楚它是怎么回事。 / p>