Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Ricerca tramite textbox VBA

  1. #1
    marcod non  in linea Novello
    Salve ragazzi ho scritto un p di tempo fa per quanto riguardava la ricerca di record all'interno di una tabella tramite textbox e grazie all'aiuto di Alex ero riuscito a risolvere. Ora ho provato ad effettuare cambiamenti al codice ma sbaglio qualcosa e ricevo errori!
    Praticamente ho una tabella di nome C contente vari dati: titolo, autore, editore, anno ecc ...poi ho una maschera di nome C che visualizza solo alcuni campi della tabella C; una maschera di nome ricerca dove vi sono diverse textbox e combobox per effettuare ricerche in base ai valori inseriti e infine una query di nome qrycerca dove vi come SQL solo SELECT * FROM C
    Il codice VBA implementato per la ricerca il seguente:

    Private Sub cmdFind_Click()
    Dim fld As DAO.Field
    Dim ctl As Access.Control
    Dim sSQL As String
    Dim Attr As String
    Dim RicAss As String
    Dim ctlVal As Variant
    Attr = "AND"
    RicAss = "*"

    For Each ctl In Me.Controls
    Select Case ctl.ControlType
    Case acTextBox, acComboBox
    If ctl <> "" Then
    ctlVal = ctl.Value
    If Me.RecordsetClone.Fields(ctl.Name).Type = dbText Then
    ctlVal = RicAss & ctlVal & RicAss
    End If
    sSQL = sSQL & (ctl.Name, Me.RecordsetClone.Fields(ctl.Name).Type, ctlVal) & Attr
    End If
    End Select
    Next
    If Len(sSQL) > 0 Then
    sSQL = Mid$(sSQL, 1, Len(sSQL) - Len(Attr))
    sSQL = "SELECT * FROM C WHERE " & sSQL
    CurrentDb.QueryDefs("qryCerca").SQL = sSQL

    If (DCount("*", "C", sSQL) = 0) Then
    MsgBox "Nessun libro trovato", vbExclamation, "Avviso"
    Exit Sub
    End If

    End If
    DoCmd.OpenForm "C"

    End Sub

    Sapete dirmi dove sbaglio?
    Grazie mille!
    Ultima modifica di marcod; 21-04-2011 14:57 

  2. #2
    L'avatar di @Alex
    @Alex non  in linea Moderatore Globale
    Sei sicuro di aver copiato bene...???

    Qu non manca qualche cosa...??
    sSQL = sSQL & (ctl.Name, Me.RecordsetClone.Fields(ctl.Name).Type, ctlVal) & Attr
    
    Ad esempio BuildCriteria...?
    ℹ️ Leggi di pi su @Alex ...

  3. #3
    marcod non  in linea Novello
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Sei sicuro di aver copiato bene...???

    Qu non manca qualche cosa...??
    sSQL = sSQL & (ctl.Name, Me.RecordsetClone.Fields(ctl.Name).Type, ctlVal) & Attr
    
    Ad esempio BuildCriteria...?
    Scusami Alex quella stringa la dovevo proprio cancellare perch altrimenti dico solo castronerie...
    la questione che il tuo codice originale come ben sai il seguente:
    Private Sub cmdFind_Click()
        Dim fld As DAO.Field
        Dim ctl As Access.Control
        Dim sSQL As String
        Dim Attr As String
        Dim RicAss As String
        Dim ctlVal  As Variant
        Attr = " AND "
        If Me!boxAttr = 2 Then
            Attr = " OR "
        End If
        RicAss = ""
        If Me.boxRicerca = 1 Then
            RicAss = "*"
        End If
        
        For Each ctl In Me.Controls
            Select Case ctl.ControlType
                Case acTextBox, acComboBox
                    If ctl <> "" Then
                       ctlVal = ctl.Value
                       If Me.RecordsetClone.Fields(ctl.Name).Type = dbText Then
                            ctlVal = RicAss & ctlVal & RicAss
                       End If
                       sSQL = sSQL & BuildCriteria(ctl.Name, Me.RecordsetClone.Fields(ctl.Name).Type, ctlVal) & Attr
                    End If
            End Select
        Next
        If Len(sSQL) > 0 Then
            sSQL = Mid$(sSQL, 1, Len(sSQL) - Len(Attr))
        End If
        DoCmd.OpenForm "Impiegati", , , sSQL
    End Sub
    
    Ecco ora io la ricerca non voglio farla tramite l'utilizzo di BuildCriteria ma tramite la lettura di textbox e combobox e la creazione di una query come ho scritto sopra ma praticamente vado a fare dei pastrocchi perch io scrivo:
    Private Sub cmdFind_Click()
        Dim fld As DAO.Field
        Dim ctl As Access.Control
        Dim sSQL As String
        Dim Attr As String
        Dim RicAss As String
        Dim ctlVal  As Variant
        Attr = "AND"
        RicAss = "*"
    
        For Each ctl In Me.Controls
            Select Case ctl.ControlType
                Case acTextBox, acComboBox
                    If ctl <> "" Then
                       ctlVal = ctl.Value
                       If Me.RecordsetClone.Fields(ctl.Name).Type = dbText Then
                          ctlVal = RicAss & ctlVal & RicAss
                       End If
    End If
            End Select
        Next
        If Len(sSQL) > 0 Then
            sSQL = Mid$(sSQL, 1, Len(sSQL) - Len(Attr))
            sSQL = "SELECT * FROM C WHERE " & sSQL
            CurrentDb.QueryDefs("qryCerca").SQL = sSQL
    
            If (DCount("*", "C", sSQL) = 0) Then
            MsgBox "Nessun libro trovato", vbExclamation, "Avviso"
            Exit Sub
            End If
    
        End If
        DoCmd.OpenForm "C"
    
    e manca qualcosa e non so dove andare a parare!

  4. #4
    L'avatar di @Alex
    @Alex non  in linea Moderatore Globale
    Non hai capito come funziona il sistema... e questo un grosso problema, perch ti ha portato a sconvolgere il codice e crearne uno senza senso... ed ovviamente non funzionante.

    [BuildCriteria] se perdi 21 secondi a leggere la guida non fa alcuna ricerca, ma serve solo a costruire in modo CORRETTO la stringa CRITERIO, che serve anche nel tuo esempio, sapendo dall'inizio che i campi di tipo NUMERICO/TESTO/DATA vanno formattati in modo diverso tra loro e non compatibile(lascio a te la ricerca del come...).
    Nel codice che ti ho proposto si sfrutta il RecordsetClone per ricavare il FieldType(tipo di Campo) da passare al metodo BuildCriteria che costruisce la stringa...!

    Se tu sai che i campi associati alle 2 TextBox sono sempre quelli... non ti serve ti basta Formattare la stringa come prevede il campo Testo...!
    ℹ️ Leggi di pi su @Alex ...

  5. #5
    marcod non  in linea Novello
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Non hai capito come funziona il sistema... e questo un grosso problema, perch ti ha portato a sconvolgere il codice e crearne uno senza senso... ed ovviamente non funzionante.

    [BuildCriteria] se perdi 21 secondi a leggere la guida non fa alcuna ricerca, ma serve solo a costruire in modo CORRETTO la stringa CRITERIO, che serve anche nel tuo esempio, sapendo dall'inizio che i campi di tipo NUMERICO/TESTO/DATA vanno formattati in modo diverso tra loro e non compatibile(lascio a te la ricerca del come...).
    Nel codice che ti ho proposto si sfrutta il RecordsetClone per ricavare il FieldType(tipo di Campo) da passare al metodo BuildCriteria che costruisce la stringa...!

    Se tu sai che i campi associati alle 2 TextBox sono sempre quelli... non ti serve ti basta Formattare la stringa come prevede il campo Testo...!
    Quindi se ho ben capito BuildCriteria che ha la struttura applicazione.Buildcriteria(campo, tipocampo, espressione) genera un criterio di selezione che viene poi applicato alla propriet filtro della maschera...
    e per usare BuildCriteria ho bisogno di sapere il FieldType del campo e quindi si utilizza RecordsetClone in questo caso...

    senti io avevo dato un'occhiata al tuo demo http://www.alessandrobaraldi.it/Dett....asp?IdFAQ=279 dove praticamente si effettuava la ricerca attraverso un diverso metodo dove si creava una query ecc...praticamente il pastrocchio che ho combinato nato dal voler realizzare un metodo di ricerca simile a questo ma molto meno complicato ossia preimpostando l'AND come operatore predefinito e quindi eliminando le combobox di scelta ed eliminando anche le combobox di scelta di confronto perch deve essere sempre una ricerca per contenuto della stringa ossia tramite LIKE...
    se mi puoi dare una mano perpiacere perch sto realmente sclerando...ce ho bisogno di implementare la ricerca pi semplice possibile per acquisire contenuto di textbox e combobox e creare una query che mi faccia questa ricerca in base ai valori inseriti. Ho provato anke a prendere spunto da questo tuo vecchio codice come partenza ma nulla
    Dim ctl As Access.Control
        Dim rs As DAO.Recordset
        Dim sWH As String
        Dim sV  As Variant
        Set rs = CurrentDb.OpenRecordset("SELECT * FROM T1 WHERE 1=0")
        For Each ctl In Me.Controls
           If ctl.Tag = "FILTRO" Then
             sV = ctl.Value
             If Not IsNull(sV) And Len(sV) > 0 Then
                sWH = sWH & BuildCriteria(ctl.Name, rs.Fields(ctl.Name).Type, Replace(ctl.Value, "'", "''")) & "' AND "
             End If
           End If
        Next
        If Len(sWH) = 0 Then
            MsgBox "Nessun Criterio"        
        Else
            sWH = Mid$(sWH, 1, Len(sWH) - 5)
            MsgBox "Il criterio  :" & vbnewLine & sWH
        End If
        rs.Close
        Set rs = Nothing
    
    Grazie in anticipo per il tuo aiuto e pazienza!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Gestione Textbox tramite una classe
    Da mrk88 nel forum Microsoft Word
    Risposte: 2
    Ultimo Post: 12-05-2011, 21:42
  2. Aiuto per ricerca record tramite textbox
    Da marcod nel forum Microsoft Access
    Risposte: 12
    Ultimo Post: 30-03-2011, 15:12
  3. Popolare i dataset tramite textbox
    Da cequeta nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 14-07-2009, 21:14
  4. Ricerca immagini tramite tag
    Da Nick nel forum Design, Internet Marketing e SEO
    Risposte: 0
    Ultimo Post: 08-07-2009, 15:37
  5. Da Textbox a SQL tramite databinding
    Da FedericoS nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 25-03-2009, 20:01