Search code examples
sqlstringms-accessopenargs

How to Pass SQL Parameter to Form Using OpenArgs?


I have a Database (not built by me) that uses 3 separate forms to accomplish 1 thing.

I would instead like to pass a SQL string to the OpenArgs in order to utilize 1 form.

Original Code for form I'd like to utilize:

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

Each of the other forms is called by using

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

from the Main form and has the SQL string in the row source. I would like to eliminate the row source and utilize the 1 form. I set the string from each button to:

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

Passing the strManual to the form as a SQL string, however, every time I run it I get a "#Name?" in the name field instead of the name entered.

Here is the code I used on the form:

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

Solution

  • Well, you either pass one value, or you pass the whole sql string.

    But, if you passing the WHOLE sql string for the form, then this makes no sense:

    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
    

    I mean, OpenArgs is a WHOLE sel string, and I am VERY sure that ACCOUNT = " some huge sql string" will NEVER work.

    So, you would want this:

    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
    

    So, our logic is now:

    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