2012-12-27 58 views
0

我的功能:指着訪問控制,Visual Basic中

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. 使用'!'有什麼區別?和'。'訪問屬性?我明白那個 '!'用於訪問控制器和'。'用於訪問表格記錄,對嗎?

回答

2

爲(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): 從Microsoft Blog

  • 的點給你提前綁定,並在編譯時解析,爆炸在運行時解析。
  • 對於Forms,底層查詢中的控件和字段都可以通過點引用,因爲它們全都位於表單的類型庫中。
  • 同樣在Forms的情況下,如果在運行時更改基礎查詢 - 由於表單的類型庫更新不會在運行時發生,所以在運行時對舊查詢字段的點引用將失敗。
  • 因爲這個點是早期綁定的,默認情況下,智能感知發生在圓點上,而不是爆炸。
  • 該點(因爲它是早期綁定的)比爆炸更快,但沒有人運行足夠多的代碼,使用這些項目足以導致性能差異非常重要。