我在“数据表视图”中的一个子窗体中有一个查询,其中包含用户需要添加到的信息。具体地说,需要编辑2列。查询是不可编辑的,因为有大量的GROUP BY子句。有没有一种方法可以添加这两列并使其每行可编辑,而无需更改查询/重写它以使其可编辑?
到目前为止,我已经尝试添加一个未绑定的列,但它不能保存每行的数据。现在,我已经设置了一个包含两列的新表,但我不能编辑数据表中的任何内容,因为该记录是只读的。
发布于 2019-05-17 13:42:40
您无法在分组查询中进行编辑,因为无法告诉数据库您实际编辑的是哪些分组记录。您没有提到是否需要仅在表单上下文中编辑这些列(一旦表单关闭或使用不同的数据重新加载,这些列中的任何数据都将被丢弃),或者这些编辑是否希望以某种方式更新您的记录。
无论哪种情况,都可以使用临时表并用查询数据填充它。这将允许您在数据表视图中对其进行编辑,并维护每个记录的值。但是,如果希望这些值以某种方式永久影响原始数据,则必须在VBA中手动处理,可能会捕获窗体关闭或重新加载事件,并使用临时表数据来更新原始表。
发布于 2019-05-17 14:15:00
您可以这样做:创建ADODB记录集,并用窗体记录集中的数据填充它。
这是我的数据库中的示例:
Private Sub Form_Open(Cancel As Integer)
Dim RS As New adodb.Recordset, RST As DAO.Recordset, InvTotal As Currency
Set RS = New adodb.Recordset
With RS
' It's a free field that doesn't belong to form query:
.Fields.Append "InvCounter", adInteger
.Fields.Append "InvProduct", adVarChar, 255
.Fields.Append "InvUnit", adVarChar, 3
.Fields.Append "InvQuantity", adInteger
.Fields.Append "InvPrice", adCurrency
.Fields.Append "InvValue", adCurrency
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockPessimistic
.Open
End With
Set RST = CurrentDb.OpenRecordset("SELECT * FROM tblWarehouse WHERE wOrder = " & idf, dbOpenSnapshot)
InvTotal = 0
If RST.RecordCount Then
Do Until RST.EOF
RS.AddNew
' I fill my free field with row number but i can edit it
' manually in form:
RS.Fields("InvCounter") = RST.AbsolutePosition + 1
RS.Fields("InvProduct") = RST("wProduct")
RS.Fields("InvUnit") = "p"
RS.Fields("InvQuantity") = RST("wQuantity")
RS.Fields("InvPrice") = RST("wPrice")
RS.Fields("InvValue") = RS.Fields("InvPrice") * RST("wQuantity")
InvTotal = InvTotal + RS.Fields("InvValue")
RS.Update
RST.MoveNext
Loop
Set Me.Recordset = RS
Me.InvTotal = InvTotal
RST.Close
Set RST = Nothing
RS.Close
Set RS = Nothing
End If
End Sub
如果你想保存你在该字段中所做的编辑,你也必须通过VBA来完成。
https://stackoverflow.com/questions/56186058
复制相似问题