Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Coded SQL statement using and with or

Posted on 2009-07-06
3
Medium Priority
?
185 Views
Last Modified: 2013-11-28
Hi, I have very nearly finished creating a form which builds up an SQL statement to create a query which helps user build a mailing list.  There are lots of different criteria, most of which is pretty straightforward, and working well.  However the "status" of each customer is selected from a drop down list. I want the user to be able to select three different types of status for their criteria -  for example they may want to know which customers are "new", "existing" and on "trial" in one hit.  This works fine using "or" but the problem comes when I then add on more criteria using "and" - the statement it builds just can't handle it.  I think this is because the statement should read something like

WHERE (((Children.Status)="Interested") AND ((Children.HadTrial)=Yes)) OR (((Children.Status)="rejected") AND ((Children.HadTrial)=Yes))

My problem is that I'm very green when it comes to doing a. writing SQL and b. trying to build up a string using it!  How do I get this to work using a similar process as I have below (I don't really want to re-write the whole thing!)

Please bear with me if I disappear for periods of time.  I have a young family who need feeding, bedtime stories etc.  - I will keep track and follow up as soon as I can.
Function BuildSQLString(strSQL As String) As Boolean
 
Dim strSELECT As String
Dim strFROM As String
Dim strWHERE As String
Dim qdf As QueryDef
Dim boolResultCode As Boolean
 
strSELECT = "CustomerNumber, Title, FirstName, c.LastName, [Street&HouseNumber], [Town/City], County, [Post-Code], HomeTelephoneNumber, MobilePhoneNo, CarerattendingSession, MarketingID, EMail, ChFirstName, s.LastName, DateofBirth, Dateoftrial, s.ClassName, Status "
 
strFROM = "(customers c INNER JOIN children s " & _
        "ON c.CustomerNumber = s.CustomerNo) "
    
    If chkStatus1 Then
        strWHERE = strWHERE & " AND s.status = " & Chr(34) & Me!cboStatus1 & Chr(34)
    End If
 
    If chkStatus2 Then
        strWHERE = strWHERE & " OR s.status = " & Chr(34) & Me!cboStatus2 & Chr(34)
    End If
 
    If chkStatus3 Then
        strWHERE = strWHERE & " OR s.status = " & Chr(34) & Me!cboStatus3 & Chr(34)
    End If
    
    If chkBirthDate Then
        If Not IsNull(txtBirthdate1) Then
            strWHERE = strWHERE & " AND s.dateofbirth >= " & _
            "#" & Format$(txtBirthdate1, "mm/dd/yyyy") & "#"
        End If
        
        If Not IsNull(txtBirthdate2) Then
            strWHERE = strWHERE & " AND s.dateofbirth <= " & _
            "#" & Format$(txtBirthdate2, "mm/dd/yyyy") & "#"
        End If
    End If
    
    If chkPostCode Then
        strWHERE = strWHERE & " AND [Post-Code] Like " & Chr(34) & txtPostCode & "*" & Chr(34)
    End If
      
    If chkTown Then
        strWHERE = strWHERE & " AND [Town/City] = " & Chr(34) & txtTown & Chr(34)
    
    End If
    
    If chkCounty Then
        strWHERE = strWHERE & " AND County = " & Chr(34) & txtCounty & Chr(34)
    
    End If
    
    If chkHeard Then
        strWHERE = strWHERE & " AND MarketingID = " & cboHeard
    End If
    
    If chkDateContacted Then
        If Not IsNull(txtDateContacted1) Then
            strWHERE = strWHERE & " AND c.datefirstcontacted >= " & _
            "#" & Format$(txtDateContacted1, "mm/dd/yyyy") & "#"
        End If
        
        If Not IsNull(txtDateContacted2) Then
            strWHERE = strWHERE & " AND c.datefirstcontacted <= " & _
            "#" & Format$(txtDateContacted2, "mm/dd/yyyy") & "#"
        End If
    End If
    
    If chkTrial Then
        strWHERE = strWHERE & " AND s.Hadtrial = " & cboTrial
    End If
    
    If chkWaiting Then
        strWHERE = strWHERE & " AND s.WaitingList = " & cboTrial
    End If
    
    If chkReenrol Then
        strWHERE = strWHERE & " AND [Re-enrol] = " & cboReenrol
    End If
    
    If chkClass Then
        strWHERE = strWHERE & " AND s.ClassName = " & Chr(34) & cboClass & Chr(34)
    End If
    
    If chkTeacher Then
        strFROM = strFROM & " INNER JOIN Classes " & _
        "ON s.ClassName = Classes.ClassName "
        strWHERE = strWHERE & " AND Classes.TeacherName = " & Chr(34) & cboTeacher & Chr(34)
    End If
    
    If chkVenue Then
        If chkTeacher Then
            strWHERE = strWHERE & " AND Classes.VenueID = " & cboVenue
        Else: strFROM = strFROM & " INNER JOIN Classes " & _
                "ON s.ClassName = Classes.ClassName "
                strWHERE = strWHERE & " AND Classes.VenueID = " & cboVenue
        End If
    End If
        
       
strSQL = "SELECT " & strSELECT
strSQL = strSQL & "FROM " & strFROM
If strWHERE <> " " Then strSQL = strSQL & "WHERE " & Mid$(strWHERE, 6)
 
BuildSQLString = True
 
If strSQL = "" Then
    boolResultCode = False        'no query string to use!
  Else
    On Error Resume Next          'get ready to handle any errors
    Set qdf = CurrentDb.CreateQueryDef("qryMailingList") 'create the new query object
    If Err.Number <> 0 Then
      boolResultCode = False      'failed for some reason so cannot continue
    Else
      qdf.SQL = strSQL            'succeeded so load the query object with the query string
      qdf.Close                   'finished with the query object so close it
      RefreshDatabaseWindow       'update the Query window
      boolResultCode = True       'Report a success
    End If
    On Error GoTo 0               'reset error handler
  End If
  
  MakeQueryDef = boolResultCode   'report what happened
 
 
End Function

Open in new window

0
Comment
Question by:luigi_prego
  • 2
3 Comments
 
LVL 12

Accepted Solution

by:
ErezMor earned 2000 total points
ID: 24787254
replace lines 14 to 24 (the criteria for the checkboxes) with the attached code

If chkStatus1 Or chkStatu2 Or chkStatus3 Then
    If chkStatus1 Then
        strWhere = strWhere & Chr(34) & Me!cboStatus1 & Chr(34) & ","
    End If
    If chkStatus2 Then
        strWhere = strWhere & Chr(34) & Me!cboStatus2 & Chr(34) & ","
    End If
    If chkStatus3 Then
        strWhere = strWhere & Chr(34) & Me!cboStatus3 & Chr(34) & ","
    End If
    strWhere = " And s.Status In(" & Left(strWhere, Len(strWhere) - 1) & ")"
End If

Open in new window

0
 

Author Comment

by:luigi_prego
ID: 24787382
Thank you so much ErezMor, worked like a dream and learned something in the process.  Thanks - full points winging their way to you, Louise
0
 

Author Closing Comment

by:luigi_prego
ID: 31600241
Thanks for your help
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Traditionally, the method to display pictures in Access forms and reports is to first download them from URLs to a folder, record the path in a table and then let the form or report pull the pictures from that folder. But why not let Windows retr…
In a use case, a user needs to close an opened report by simply pressing the Escape (Esc) key. This can be done by adding macro code in Report_KeyPress or Report_KeyDown event.
Using Microsoft Access, learn some simple rules for how to construct tables in a relational database. Split up all multi-value fields into single values: Split up fields that belong to other things into separate tables: Make sure that all record…
With Microsoft Access, learn how to specify relationships between tables and set various options on the relationship. Add the tables: Create the relationship: Decide if you’re going to set referential integrity: Decide if you want cascade upda…
Suggested Courses

824 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question