MS Access:使用 VBA 从表单字段向记录添加附件
MS Access: Add attachment to record from Form field using VBA
我有一个带 属性 'Data Entry = Yes' 的有界表单,它有多个文本框和一个附件类型的字段。
我有一个“保存”按钮,提示确认保存记录。
在表单上,我放置了一个标记为 'Includes training' 的复选框。
如果选中该复选框,我想向同一个 table 添加一条附加记录(不同于通过有界表单添加的记录),其信息与有界表单中插入的记录完全相同形式,除了一个文本字段,该文本字段将有所不同并在 VBA 代码中定义。
我尝试了 CurrentDB.Execute SQL
查询,但它不适用于附件字段类型。
solution proposed in the documentation 不适用于这种情况,因为我想获取包含在表单上的有界附件字段中的附件,而不是来自磁盘上的路径。
我认为像下面这样的东西可以工作,但是当我测试它时,它保存了来自有界表单的记录,但没有保存我想用 VBA 代码添加的附加记录,并且它结束了错误:
424 Object Required
VBA代码:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
On Error GoTo Err_BeforeUpdate
If Me.Dirty Then
If MsgBox("Do you want to save the new record?", vbYesNo + vbQuestion, _
"Save Record") = vbNo Then
Me.Undo
MsgBox "Changes discarded."
Else
If Me.checkbox.Value = True Then
Set rsTable = db.OpenRecordset("Table")
With rsTable
.AddNew
!TextField1 = Me.TextField1.Value
!TextField2 = "My Own Text Field"
!AttachmentField = Me.AttachmentField.Value
.Update
.Bookmark = .LastModified
End With
MsgBox "Record was correctly saved."
End If
End If
End If
End Sub
非常感谢您的帮助。
编辑:
很明显,这不是保存新记录的正确方法,但我需要将此记录保存在有界窗体上的同一时间(或之后)。我不希望用户填写另一个有界表单。
之所以这样是因为我输入的是语言认证记录,而且有更广泛的认证,包括两个级别。
因此,复选框表示“您是否也想包括之前的级别?”,如果选中,则上传的 PDF 证书对于级别 1 和级别 2 均有效。
除了记录的级别名称外,所有信息都相同。
我需要这两个是单独的记录,因为我也可以单独拥有它们,稍后我会根据这些单独的语言水平检查条件。
要使用附件字段,您可以使用特殊方法 LoadFromFile
将附件放入数据库中,并使用 SaveFromFile
将附件从数据库中取回。您似乎试图将字符串分配给附件字段。
我没看到 db
在哪里定义。您是说 CurrentDb
吗?
我看到的另一个问题是您在 With
块中使用了 bang 符号。 Bang 表示法是字符串查找。如果您想按名称调用该项目,您可以这样做:
With CurrentDb.OpenRecordset("Table")
.AddNew
.Fields.Item("TextField1").Value = Me.TextField1.Value
.Fields.Item("TextField2").Value = "My Own Text Field"
.Fields.Item("AttachmentField").LoadFromFile Me.AttachmentField.FileName
.Update
.Bookmark = .LastModified
.Close
End With
这些项目的名称必须正确。
我最终通过创建一个单独的边界来解决这个问题,如果复选框被选中,当我在原始边界表单上点击“保存”时弹出。用户可以选择是上传与原始绑定表单相同的文档,还是上传不同的文档。
我有一个带 属性 'Data Entry = Yes' 的有界表单,它有多个文本框和一个附件类型的字段。
我有一个“保存”按钮,提示确认保存记录。
在表单上,我放置了一个标记为 'Includes training' 的复选框。
如果选中该复选框,我想向同一个 table 添加一条附加记录(不同于通过有界表单添加的记录),其信息与有界表单中插入的记录完全相同形式,除了一个文本字段,该文本字段将有所不同并在 VBA 代码中定义。
我尝试了 CurrentDB.Execute SQL
查询,但它不适用于附件字段类型。
solution proposed in the documentation 不适用于这种情况,因为我想获取包含在表单上的有界附件字段中的附件,而不是来自磁盘上的路径。
我认为像下面这样的东西可以工作,但是当我测试它时,它保存了来自有界表单的记录,但没有保存我想用 VBA 代码添加的附加记录,并且它结束了错误:
424 Object Required
VBA代码:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
On Error GoTo Err_BeforeUpdate
If Me.Dirty Then
If MsgBox("Do you want to save the new record?", vbYesNo + vbQuestion, _
"Save Record") = vbNo Then
Me.Undo
MsgBox "Changes discarded."
Else
If Me.checkbox.Value = True Then
Set rsTable = db.OpenRecordset("Table")
With rsTable
.AddNew
!TextField1 = Me.TextField1.Value
!TextField2 = "My Own Text Field"
!AttachmentField = Me.AttachmentField.Value
.Update
.Bookmark = .LastModified
End With
MsgBox "Record was correctly saved."
End If
End If
End If
End Sub
非常感谢您的帮助。
编辑:
很明显,这不是保存新记录的正确方法,但我需要将此记录保存在有界窗体上的同一时间(或之后)。我不希望用户填写另一个有界表单。
之所以这样是因为我输入的是语言认证记录,而且有更广泛的认证,包括两个级别。 因此,复选框表示“您是否也想包括之前的级别?”,如果选中,则上传的 PDF 证书对于级别 1 和级别 2 均有效。 除了记录的级别名称外,所有信息都相同。
我需要这两个是单独的记录,因为我也可以单独拥有它们,稍后我会根据这些单独的语言水平检查条件。
要使用附件字段,您可以使用特殊方法 LoadFromFile
将附件放入数据库中,并使用 SaveFromFile
将附件从数据库中取回。您似乎试图将字符串分配给附件字段。
我没看到 db
在哪里定义。您是说 CurrentDb
吗?
我看到的另一个问题是您在 With
块中使用了 bang 符号。 Bang 表示法是字符串查找。如果您想按名称调用该项目,您可以这样做:
With CurrentDb.OpenRecordset("Table")
.AddNew
.Fields.Item("TextField1").Value = Me.TextField1.Value
.Fields.Item("TextField2").Value = "My Own Text Field"
.Fields.Item("AttachmentField").LoadFromFile Me.AttachmentField.FileName
.Update
.Bookmark = .LastModified
.Close
End With
这些项目的名称必须正确。
我最终通过创建一个单独的边界来解决这个问题,如果复选框被选中,当我在原始边界表单上点击“保存”时弹出。用户可以选择是上传与原始绑定表单相同的文档,还是上传不同的文档。