Zoekstring maken voor filteren

Status
Niet open voor verdere reacties.

Robbin R

Gebruiker
Lid geworden
14 jul 2010
Berichten
29
Ik heb een apart formulier om records te zoeken gemaakt.
Als ik hierin waardes invul zou ik graag records kunnen filteren.

de code tot dusverre is:
Code:
Private Sub cmdSearch_Click()
    Dim varWhere As Variant
    Dim rs As DAO.Recordset
    
    ' Begin met Null
    varWhere = Null
        
    ' Als Customer niet leeg is
    If Not IsNull(Me.cmbCustomer) Then
        ' .. dan toon berichtvenster OK!
        MsgBox "Zoekwaarde OK!", vbInformation, "Zoeken"
    End If
    
    ' Als IDnumber niet leeg is
    If Not IsNull(Me.txtIDnumber) Then
        ' .. dan maak zoek string
        varWhere = "([IDnumber] LIKE '" & Me.txtIDnumber & "*');"
        MsgBox varWhere, vbInformation, "Zoeken"
    End If
    
    ' Is er een zoek string gemaakt?
    If IsNull(varWhere) Then
        MsgBox "U moet tenminste één zoek criterium ingeven.", vbCritical, "Zoeken: Error!"
        Exit Sub
    Else
        MsgBox "Er is een zoek string gevormd.", vbInformation, "Zoeken"
    End If
    
    ' Controleer of een recordset gevonden wordt met de zoekcriteria
    Set rs = CurrentDb.OpenRecordset("SELECT tblProductions.* FROM tblProductions WHERE " & varWhere)
    ' Als geen records gevonden
    If rs.RecordCount = 0 Then
        ' .. dan berichtvenster Geen items gevonden
        MsgBox "Er zijn geen items die voldoen aan uw criteria.", vbInformation, "Zoeken: resultaat"
    Else
        ' anders toon aantal gevonden records
        MsgBox "Er zijn " & rs.RecordCount & " items gevonden.", vbInformation, "Zoeken: resultaat"
    End If
    
    ' Open frmProductions met filter
    DoCmd.OpenForm "frmProductions", WhereCondition:=varWhere
    ' Zet focus op frmProductions
    Forms!frmProductions.SetFocus
End Sub

Maar nu volgt er een foutopsporing bij:
Code:
    ' Open frmProductions met filter
    DoCmd.OpenForm "frmProductions", WhereCondition:=varWhere

Gebruik ik de varWhere verkeerd?
 
Ik denk dat je wat dubbel werk doet in de procedure, en er zitten een paar kleine foutjes in:
Eerst het belangrijkste foutje: ik vermoed dat je een getal in je filterstring probeert te stoppen:
Code:
varWhere = "([IDnumber] LIKE '" & Me.txtIDnumber & "*');"
Als dat zo is, moet de string er zo uit zien:
Code:
varWhere = "([IDnumber] LIKE " & Me.txtIDnumber & "*);"
Anders kun je hem uiteraard laten staan...
De code zou ik dus zelf zo doen; met Nz i.p.v. IsNull.
Code:
Private Sub cmdSearch_Click()
Dim rs As DAO.Recordset
Dim varWhere As String, strSQL As String
    
    varWhere = ""
    If Not Nz(Me.txtIDnumber, "") = "" Then
        varWhere = "([IDnumber] LIKE '" & Me.txtIDnumber & "*');"
        MsgBox varWhere, vbInformation, "Zoeken"
    Else
        MsgBox "U moet tenminste één zoek criterium ingeven.", vbCritical, "Zoeken: Error!"
        Exit Sub
    End If
    strSQL = "SELECT tblProductions.* FROM tblProductions WHERE " & varWhere
    
    Set rs = CurrentDb.OpenRecordset(strSQL)
    If rs.RecordCount = 0 Then
        MsgBox "Er zijn geen items die voldoen aan uw criteria.", vbInformation, "Zoeken: resultaat"
    Else
        MsgBox "Er zijn " & rs.RecordCount & " items gevonden.", vbInformation, "Zoeken: resultaat"
    End If
    
    DoCmd.OpenForm "frmProductions", WhereCondition:=varWhere
    Forms!frmProductions.SetFocus
End Sub
 
IDnumber kan zowel een serienummer zijn als een lettercode. Daarom geldt deze niet als unieke waarde,
maar heb ik voor de moeilijkheid een ProductionID die autonummering is.;)

Ik heb nu wel IsNull aangepast naar Nz( ), maar nog steeds krijg ik een error bij
Code:
    ' Open frmProductions met filter
    DoCmd.OpenForm "frmProductions", WhereCondition:=varWhere

fout3075.png
 
Edit: Fout gevonden!
Er stond een puntkomma achteraan in de varWhere.
Deze weghalen leidde tot het gewenste resultaat.

Volledige code staat hieronder:
Code:
Private Sub cmdSearch_Click()
    Dim varWhere As String
    Dim strSQL As String
    Dim rs As DAO.Recordset
    
    ' Begin met lege zoek string
    varWhere = ""
    
    ' Als IDnumber niet leeg is
    If Not Nz(Me.txtIDnumber, "") = "" Then
        ' .. dan maak zoek string
        varWhere = "(tblProductions.[IDnumber] LIKE '" & Me.txtIDnumber & "*')"
        ' MsgBox varWhere, vbInformation, "Zoeken"
    End If
    
    ' Is er een zoek string gemaakt?
    If Nz(varWhere, "") = "" Then
        MsgBox "U moet tenminste één zoek criterium ingeven.", vbCritical, "Zoeken: Error!"
        Exit Sub
    Else
        MsgBox "Er is een zoek string gevormd.", vbInformation, "Zoeken"
    End If
    
    ' Maak een SQL string voor de zoekopdracht
    strSQL = "SELECT tblProductions.* FROM tblProductions WHERE " & varWhere
    MsgBox strSQL, vbInformation, "Zoeken"
    
    ' Controleer of een recordset gevonden wordt met de zoekcriteria
    Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
    ' Als geen records gevonden
    If rs.RecordCount = 0 Then
        ' .. dan berichtvenster Geen items gevonden
        MsgBox "Er zijn geen items die voldoen aan uw criteria.", vbInformation, "Zoeken: resultaat"
    Else
        ' .. anders ga naar laatste record om het aantal hits te bepalen
        rs.MoveLast
        ' toon aantal gevonden records
        MsgBox "Er zijn " & rs.RecordCount & " items gevonden.", vbInformation, "Zoeken: resultaat"
    End If
    
    ' Open frmProductions met filter
    DoCmd.OpenForm "frmProductions", WhereCondition:=varWhere
    ' Zet focus op frmProductions
    Forms!frmProductions.SetFocus
End Sub

Bedankt voor de hulp Octafish!
 
Tot nu toe gaat het prima met onderstaande code.
Ik ben nu inmiddels aangekomen bij de keuzelijst met invoervak voor de Printer.

Hierbij gaat het echter weer fout.

Code:
Private Sub cmdZoeken_Click()
    Dim varWhere As Variant
    Dim rs As DAO.Recordset
    
    ' FILTER OPBOUWEN
    ' **ID-number**
    
    ' **Title**
    
    ' **Customer**
    
    ' **Contact person**
    
    ' **Printer**
    If Not Nz(Me.cmbPrinter, "") = "" Then
        If Not Nz(varWhere, "") = "" Then
            varWhere = (varWhere + " AND ") & "([Printer].Value = " & Me.cmbPrinter & ")"
        Else
            varWhere = "([Printer].Value = " & Me.cmbPrinter & ")"
        End If
    End If
    
    ' NA-CONTROLE
    ' Controle of een zoekstring is gevormd
    If Nz(varWhere, "") = "" Then
        MsgBox "U moet minstens één criterium om te zoeken invullen.", vbInformation, "Zoeken"
        Exit Sub
    Else
        MsgBox varWhere, vbInformation, "Zoeken: string gevormd"
    End If
    
    ' Open database
    Set rs = CurrentDb.OpenRecordset("SELECT tblProductions.* FROM tblProductions WHERE " & varWhere)
    ' Controleer of er een item is gevonden
    If rs.RecordCount = 0 Then
        MsgBox "Er zijn geen items die aan uw criteria voldoen.", vbCritical, "Zoeken"
    Else
        rs.MoveLast
        MsgBox "Er zijn " & rs.RecordCount & " items gevonden.", vbInformation, "Zoeken"
    End If
        
End Sub

De printer kan worden gekozen in een keuzelijst met invoervak. De waarde wordt opgeslagen in de tabel tblProductions. Er is een formulier frmProductions waarin de printer eveneens gekozen kan worden met een keuzelijst met invoervak.

In het formulier frmSearch kan dus een printer worden gekozen. Vervolgens moet het formulier frmProductions worden geopend met filtering op Printer.

Iemand een idee wat er fout gaat, waarschijnlijk klopt er iets niet in de string varWhere?
 
Waarom heb je de code zo gemaakt?
Code:
    If Not Nz(Me.cmbPrinter, "") = "" Then
        If Not Nz(varWhere, "") = "" Then
            varWhere = (varWhere & " AND ") & "([Printer].Value = " & Me.cmbPrinter & ")"
        Else
            varWhere = "([Printer].Value = " & Me.cmbPrinter & ")"
        End If
    End If
Als je de procedure aanroept, is de variabele leeg. (overigens zou ik 'm als string definieren, niet als variant). Er is dus geen enkele reden om in het begin te testen of hij leeg is, want hij begint leeg.
Code:
    If Not Nz(Me.cmbPrinter, "") = "" Then
        varWhere = "([Printer].Value = " & Me.cmbPrinter & ")"
    Else
        MsgBox "U moet minstens één criterium om te zoeken invullen.", vbInformation, "Zoeken"
        Exit Sub
    End If
    MsgBox varWhere, vbInformation, "Zoeken: string gevormd"
 
Oh nee, dat komt omdat ik voor Id-number t/m Contact ook al een zoekfunctie heb gemaakt,
maar ik dacht dat zal ik even weghalen anders wordt de code zo lang.

Code:
Private Sub cmdZoeken_Click()
    Dim varWhere As Variant
    Dim rs As DAO.Recordset
    
    ' FILTER OPBOUWEN
    ' **ID-number**
    If Not Nz(Me.txtIDnumber, "") = "" Then
        varWhere = "([IDnumber] LIKE '" & Me.txtIDnumber & "*')"
    End If
    
    ' **Title**
    If Not Nz(Me.txtTitle, "") = "" Then
        If Not Nz(varWhere, "") = "" Then
            varWhere = (varWhere + " AND ") & "([Title] LIKE '" & Me.txtTitle & "*')"
        Else
            varWhere = "([Title] LIKE '" & Me.txtTitle & "*')"
        End If
    End If
    
    ' **Customer**
    If Not Nz(Me.cmbCustomer, "") = "" Then
        If Not Nz(varWhere, "") = "" Then
            varWhere = (varWhere + " AND ") & "([ProductionID] IN (SELECT ProductionID FROM tblContactProductions " & _
                "WHERE tblContactProductions.CompanyID = " & Me.cmbCustomer & "))"
        Else
            varWhere = "([ProductionID] IN (SELECT ProductionID FROM tblContactProductions " & _
                "WHERE tblContactProductions.CompanyID = " & Me.cmbCustomer & "))"
        End If
    End If
    
    ' **Contact person**
    If Not Nz(Me.cmbContactID, "") = "" Then
        If Not Nz(varWhere, "") = "" Then
            varWhere = (varWhere + " AND ") & "([ProductionID] IN (SELECT ProductionID FROM tblContactProductions " & _
                "WHERE tblContactProductions.ContactID = " & Me.cmbContactID & "))"
        Else
            varWhere = "([ProductionID] IN (SELECT ProductionID FROM tblContactProductions " & _
                "WHERE tblContactProductions.ContactID = " & Me.cmbContactID & "))"
        End If
    End If
    
    ' **Printer**
    If Not Nz(Me.cmbPrinter, "") = "" Then
        If Not Nz(varWhere, "") = "" Then
            varWhere = (varWhere + " AND ") & "([Printer].Value = " & Me.cmbPrinter & ")"
        Else
            varWhere = "([Printer].Value = " & Me.cmbPrinter & ")"
        End If
    End If
    
    ' NA-CONTROLE
    ' Controle of een zoekstring is gevormd
    If Nz(varWhere, "") = "" Then
        MsgBox "U moet minstens één criterium om te zoeken invullen.", vbInformation, "Zoeken"
        Exit Sub
    Else
        MsgBox varWhere, vbInformation, "Zoeken: string gevormd"
    End If
    
    ' Open database
    Set rs = CurrentDb.OpenRecordset("SELECT tblProductions.* FROM tblProductions WHERE " & varWhere)
    ' Controleer of er een item is gevonden
    If rs.RecordCount = 0 Then
        MsgBox "Er zijn geen items die aan uw criteria voldoen.", vbCritical, "Zoeken"
    Else
        rs.MoveLast
        MsgBox "Er zijn " & rs.RecordCount & " items gevonden.", vbInformation, "Zoeken"
    End If
        
End Sub

Als er iets is ingevuld bij printer én er is al een zoekstring (op basis van IDnumber, titel, customer of contact) dan moet de string worden toegevoegd aan de bestaande zoekstring.
Als er iets is ingevuld bij printer en er is nog geen zoekstring, dan moet deze worden aangemaakt.
Als er niets is ingevuld, dan mag er ook geen zoekstring worden gemaakt.

maar de foutmelding komt bij
Code:
    Set rs = CurrentDb.OpenRecordset("SELECT tblProductions.* FROM tblProductions WHERE " & varWhere)

Dat is al vaker geweest (zie: bovenaan de pagina) en meestal lag het dan aan de varWhere.
Dus ik was met name benoemd of [Printer].Value wel juist is.


Edit: gevonden, in de tblProductions stond Printer nog opgemaakt als gegevenstype Tekst, waardoor er twee extra quotes geplaatst moesten worden.
 
Laatst bewerkt:
Ik denk dat er inderdaad in je printer filter een foutje zit:
Code:
        If Not Nz(varWhere, "") = "" Then
            varWhere = varWhere & " AND ([Printer] = " & Me.cmbPrinter & ")"
        Else
            varWhere = "([Printer]= " & Me.cmbPrinter & ")"
        End If
Ik zou de code wat versimpelen, want je gebruikt erg veel haakjes, en howel het niet fout (hoeft) te zijn, zou ik tekstreeksen altijd met een & koppelen, niet met een +
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan