0

我的功能:

Public Function openRpt(strReportName As String, form as ??, subform as ??)
    On Error Resume Next
    If (Forms![form]![subform].Form.lock = False) Then
        DoCmd.RunCommand acCmdSaveRecord
    End If
    DoCmd.OpenReport strReportName, acViewPreview, "", _
        "[num]=Forms![form]![subform].Form.[num]"
End Function

它的作用是保存subform未锁定的记录,然后启动报告。我想切换fromsubform使用指向正确形式的匹配变量,并将作为参数给出。

  1. 我应该使用什么类型的变量?
  2. 使用“!”有什么区别?和 '。' 访问属性?我明白那个 '!' 用于访问控制器和“。” 用于访问表记录,对吗?
4

1 回答 1

2

for (1):
首先,调用变量形式和子形式可能很诱人,但如果您使用的名称匹配或接近保留名称,请注意可能出现的错误。
此外,锁不是表单或子表单的有效属性。如果您尝试测试表单是否已更改,您将测试.Dirty 这就是我将如何编写您的函数:

Option Explicit
Public Function openRpt(strReportName As String, frm as String, sFrm as string)
    If (Forms(frm).Form(sFrm).Form.Dirty = True) Then
        DoCmd.RunCommand acCmdSaveRecord
    End If
    DoCmd.OpenReport strReportName, acViewPreview, "", _
        "[num]=Forms(""" & frm & """).Forms(""" & sFrm & """).Form.[num]"
End Function

(2):来自微软博客

  • 点为您提供早期绑定并在编译时解决,爆炸在运行时解决。
  • 在表单的情况下,底层查询中的控件和字段都可以通过点来引用,因为它们都在表单的类型库中。
  • 同样在 Forms 的情况下,如果您在运行时更改基础查询 - 对旧查询字段的点引用将在运行时失败,因为在运行时无法更新 Form 的类型库。
  • 因为点是早期绑定的,所以 IntelliSense 默认情况下与点一起发生,而不是与 bang 一起发生。
  • 点(因为它是早期绑定)比爆炸快,但是没有人运行足够的代码来使用这些项目,足以使性能差异真正重要。
于 2012-12-27T17:50:39.617 回答