如何使用 OpenArgs 将 SQL 参数传递给表单?

How to Pass SQL Parameter to Form Using OpenArgs?

我有一个数据库(不是我建的),它使用 3 种不同的形式来完成一件事。

我想将 SQL 字符串传递给 OpenArgs 以便使用 1 种形式。

我想使用的表格的原始代码:

Private Sub Form_Open(Cancel As Integer)
Dim strSQL As String

If Not IsNull(Me.OpenArgs) Then

strSQL = "SELECT tbl_COMBINED.[First Name] AS [Name Badge], 'P' AS Logo, Format(Now(),""yyyy"") &  STOCKHOLDERS MEETING' AS MEETING " _
        & "FROM tbl_COMBINED " _
        & "GROUP BY tbl_COMBINED.[First Name], 'P', Format(Now(),""yyyy"") & ' STOCKHOLDERS MEETING', " _
        & "tbl_COMBINED.ACCOUNT, tbl_COMBINED.Came " _
        & "HAVING tbl_COMBINED.ACCOUNT = '" & CStr(Me.OpenArgs) & "' " _
        & "AND ((tbl_COMBINED.Came) Is Null Or (tbl_COMBINED.Came)) = 0"

    Me.RecordSource = strSQL
    

End If
End Sub

使用

调用其他每个表单
DoCmd.OpenForm "frm_newmanualnamebadge", "", "",, acNormal

来自主窗体,并且在行源中具有 SQL 字符串。我想消除行源并利用 1 形式。我将每个按钮的字符串设置为:

strManuel = "SELECT tbl_manual_name_badge.NAMEBADGE1, tbl_manual_name_badge.MEETING, " _
    & "tbl_manual_name_badge.LOGO, tbl_manual_name_badge.Stockerholder " _
    & "FROM tbl_manual_name_badge"

DoCmd.OpenForm "frm_newmanualnamebadge", "", "",, acNormal, strManual

将 strManual 作为 SQL 字符串传递给表单,但是,每次我 运行 它都会得到一个“#Name?”在名称字段中而不是输入的名称。

这是我在表格中使用的代码:

If Not IsNull(Me.OpenArgs) Then
    
strSQL = "SELECT tbl_COMBINED.[First Name] AS [Name Badge], 'P' AS Logo " _
        & "FROM tbl_COMBINED " _
        & "GROUP BY tbl_COMBINED.[First Name], 'P', " _
        & "tbl_COMBINED.ACCOUNT, tbl_COMBINED.Came " _
        & "HAVING tbl_COMBINED.ACCOUNT = '" & CStr(Me.OpenArgs) & "' " _
        & "AND ((tbl_COMBINED.Came) Is Null Or (tbl_COMBINED.Came)) = 0"


    Me.RecordSource = strSQL
    
ElseIf IsNull(Me.OpenArgs) Then

strSQL = "SELECT tbl_manual_name_badge.NAMEBADGE1, tbl_manual_name_badge.MEETING, " _
    & "tbl_manual_name_badge.LOGO, tbl_manual_name_badge.Stockerholder " _
    & "FROM tbl_manual_name_badge"
    
    Me.RecordSource = strSQL
    
End If

嗯,要么传递一个值,要么传递整个 sql 字符串。

但是,如果您为表单传递整个 sql 字符串,那么这就没有意义了:

If Not IsNull(Me.OpenArgs) Then

    strSQL = "SELECT tbl_COMBINED.[First Name] AS [Name Badge], 'P' AS Logo " _
    & "FROM tbl_COMBINED " _
    & "GROUP BY tbl_COMBINED.[First Name], 'P', " _
    & "tbl_COMBINED.ACCOUNT, tbl_COMBINED.Came " _
    & "HAVING tbl_COMBINED.ACCOUNT = '" & CStr(Me.OpenArgs) & "' " _
    & "AND ((tbl_COMBINED.Came) Is Null Or (tbl_COMBINED.Came)) = 0"

Me.RecordSource = strSQL

我的意思是,OpenArgs 是一个完整的 sel 字符串,我非常确定 ACCOUNT = "some huge sql string" 永远不会起作用。

所以,你会想要这个:

Dim strSQL As String
If Not IsNull(Me.OpenArgs) Then
      strSQL = me.OpenArgs
else
    strSQL = "SELECT tbl_manual_name_badge.NAMEBADGE1, tbl_manual_name_badge.MEETING, " _
& "tbl_manual_name_badge.LOGO, tbl_manual_name_badge.Stockerholder " _
& "FROM tbl_manual_name_badge"
   
End If

Me.RecordSource = strSQL

所以,我们现在的逻辑是:

if passed sql string (openargs), then that becomes our sql

if no open arges, then use the defined sql we have in the on-load