Realizzare un cerca "Dinamico" in database access

di il
24 risposte

Realizzare un cerca "Dinamico" in database access

Ciao a tutti, avrei necessità di creare una ricerca variando alcuni campi, faccio un esempio.

 myConnection.Open()
 Dim Readdatabase As OleDbDataReader
 Dim Trova As String
 Trova = "SELECT * From Rupa WHERE settore = '" & CBtrova.Text & "'"
 Dim Cmd As New OleDb.OleDbCommand(Trova, myConnection)
 Cmd.ExecuteNonQuery()
 Readdatabase = Cmd.ExecuteReader
 DGVrupa.Rows.Clear()
 While Readdatabase.Read
     DGVrupa.Rows.Add(Readdatabase("nome"), Readdatabase("dominio"), Readdatabase("ip1"), Readdatabase("ip2"), Readdatabase("gateway"), Readdatabase("note"), Readdatabase("armadio"), Readdatabase("ipswitch"), Readdatabase("nswitch"), Readdatabase("porta"), Readdatabase("presa"), Readdatabase("virus"), Readdatabase("note2"), Readdatabase("utente"), Readdatabase("applicativo"), Readdatabase("telefono"), Readdatabase("settore"), Readdatabase("piano"), Readdatabase("stanza"), Readdatabase("user"), Readdatabase("datareg"), Readdatabase("datamod"))
 End While
 myConnection.Close()

nel caso specifico trovo correttamente tutti i campi in "settore" che corrispondono al testo della CBtrova.Text, la mia esigenza sarebbe di poter variare "settore" con gli altri campi che sono nel database tipo nome o dominio o gateway sempre che corrispondano al testo della combobox 

Come posso fare secondo voi? 

Grazie Marco

24 Risposte

  • Re: Realizzare un cerca "Dinamico" in database access

    Ciao, penso di non aver capito bene cosa vuoi fare,

    comunque .... devi saper utilizzare la where condition e quindi conoscere meglio Sql.

    Per studiarti velocemente questo argomento e se conosci e hai a disposizione MsAccess oppure meglio ancora Sql SSMS, prendi la tua tabella e vai in designer per creare una query con le varie condizioni di ricerca che vuoi eseguire.
    Quando il risultato ottenuto è quello desiderato, prendi la stringa Sql che viene generata e la riporti con la sintassi corretta, nel tuo codice.

    Questo è un modo semplice e veloce per creare e verifica una stringa Sql.
    Cerca nel Supporto Tecnico sul web quali operatori puoi utilizzare nella where e vedrai che in meno che non si dica risolvi tutte le tue selezioni e ricerche.

  • Re: Realizzare un cerca "Dinamico" in database access

    Grazie By65Franco per l'interessamento, cercherò sicuramente di percorrere la strada che mi stai indicando se è la più logica attualmente.

    io pensavo di fare una cosa del genere ma ovviamente non funziona

     myConnection.Open()
     Dim Readdatabase As OleDbDataReader
     Dim Trova As String
     Trova = "SELECT * From Rupa WHERE '" & CBtrova.Text & "' = '" & TBtrova.Text & "'"
     Dim Cmd As New OleDb.OleDbCommand(Trova, myConnection)
     Cmd.ExecuteNonQuery()
     Readdatabase = Cmd.ExecuteReader
     DGVrupa.Rows.Clear()
     While Readdatabase.Read
         DGVrupa.Rows.Add(Readdatabase("nome"), Readdatabase("dominio"), Readdatabase("ip1"), Readdatabase("ip2"), Readdatabase("gateway"), Readdatabase("note"), Readdatabase("armadio"), Readdatabase("ipswitch"), Readdatabase("nswitch"), Readdatabase("porta"), Readdatabase("presa"), Readdatabase("virus"), Readdatabase("note2"), Readdatabase("utente"), Readdatabase("applicativo"), Readdatabase("telefono"), Readdatabase("settore"), Readdatabase("piano"), Readdatabase("stanza"), Readdatabase("user"), Readdatabase("datareg"), Readdatabase("datamod"))
     End While
     myConnection.Close()
  • Re: Realizzare un cerca "Dinamico" in database access

    Premessa:

    Hai bisogno di N caselle di edit tante quanti i campi che vuoi filtrare.

    Una funzione (eseguiricerca per esempio) che esegue la sql da richiamare nel metodo keypress di ogni edit.

    nel keypress: se tasto=invio eseguiricerca

    --------------------------------------------------------------------------------------------------------------

    vediamo la funzione esegui ricerca in dettaglio:

    per brevità inserisco una ricerca su un campo ma quello che vale per un campo vale per tutti i campi dove applichi la ricerca:

    parametro1=Edit.value
    select * from tabella 
    where (campo1=[parametro1] and [parametro1]<>'')
    sql.requery

    se edit.value='pippo' la sql diventa

    select * from tabella
    where campo1='pippo'

    se edit.value='' la sql diventa

    select * from tabella

    ignorando la parte where in quanto non soddisfa una delle condizioni ([parametro1]<>'') e mostrando tutti i record (imposta un limite se necessario con 'limit')

    Vediamo adesso con due campi:

    parametro1=edit1.value
    parametro2=edit2.value
    select * from tabella 
    where (campo1=[parametro1] and [parametro1]<>'')
    and (campo2=[parametro2] and [parametro2]<>'')

    in questo caso:

    se parametro 1 è valorizzato ('pippo') e parametro 2 è valorizzato ('pluto')

    select * from tabella 
    where campo1='pippo'
    and campo2='pluto'

    se parametro1='' e parametro2='pluto'

    select * from tabella
    where campo2='pluto'

    e viceversa se parametro1 è valorizzato e parametro2=''

    moltiplica il tutto per ogni campo in cui vuoi fare ricerche e hai finito.

    se usi combobox abbi cura che la fonte sia una sql con un valore '' in questo modo:

    select campoid, campodescrizione from tabella
    union 
    select '', ''
    order by campodescrizione

    al primo valore della combo avrai '' che sarebbe il vlore del parametro che annula la ricerca 

    parametroN=combo.value dove combo.value=''

    nel caso di combo invece di usare il metodo keypress usa change...

    Fai attenzione al tipo di dato: sia edit che combo sono string quindi devi convertire i valori numerici ove presenti.

    Se la ricerca vuoi farla parziale basta che la sql sia così:

    if edit1.value<>'' then 
       parametro1='*' & edit1.value 
    else parametro1=''
    endIf
    parametro2=edit2.value
    select * from tabella 
    where (campo1 like [parametro1] and [parametro1]<>'')
    and (campo2=[parametro2] and [parametro2]<>'')

    in bocca al lupo!

  • Re: Realizzare un cerca "Dinamico" in database access

    Ciao, quei apicini ?

    Presumo che CBtrova possa essere una combobox ?
    Ma CBtrova cosa è ? una textbox ?

    Se la prima è una combobox e la seconda è una textbox , ovviamente non ti ritorna nessun risultato.

    Ma non capisco il ragionamento che devi fare con la where per la tabella rupa... mi puoi spiegare meglio?

  • Re: Realizzare un cerca "Dinamico" in database access

    Ciao  riguardavo la tua prima esposizione nel thread 

    Perchè non usi il command parameters ?

    Esempio:

    ' reset datagridview
    DGVrupa.Rows.Clear()
    
    ' open connection
    myConnection.Open()
    ' set sql string and connction 
    Dim Trova As String = "SELECT * FROM Rupa WHERE settore = @settore"
    Dim Cmd As New OleDb.OleDbCommand(Trova, myConnection)
    
    ' add parameters
    Cmd.Parameters.AddWithValue("@settore", CBtrova.Text)
    
    ' exexute reader 
    Dim Readdatabase As OleDbDataReader = Cmd.ExecuteReader()
    
    ' read
    While Readdatabase.Read()
        DGVrupa.Rows.Add(
            Readdatabase("nome"), Readdatabase("dominio"), Readdatabase("ip1"), Readdatabase("ip2"), 
            Readdatabase("gateway"), Readdatabase("note"), Readdatabase("armadio"), 
            Readdatabase("ipswitch"), Readdatabase("nswitch"), Readdatabase("porta"), 
            Readdatabase("presa"), Readdatabase("virus"), Readdatabase("note2"), 
            Readdatabase("utente"), Readdatabase("applicativo"), Readdatabase("telefono"), 
            Readdatabase("settore"), Readdatabase("piano"), Readdatabase("stanza"), 
            Readdatabase("user"), Readdatabase("datareg"), Readdatabase("datamod")
        )
    End While
    ' close
    myConnection.Close()

    In questo caso se vuoi trovare tutti i records che corrispondono a settore = CBtrova , sei a posto... adesso che vorresti fare oltre a questa ricerca ? devi aggiungere AND oppure OR altre condizioni di ricerca per le altre fields della tabella interrogata?

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - By65Franco ha scritto:

    Ciao  riguardavo la tua prima esposizione nel thread 

    Perchè non usi il command parameters ?

    Esempio:

    ' reset datagridview
    DGVrupa.Rows.Clear()
    
    ' open connection
    myConnection.Open()
    ' set sql string and connction 
    Dim Trova As String = "SELECT * FROM Rupa WHERE settore = @settore"
    Dim Cmd As New OleDb.OleDbCommand(Trova, myConnection)
    
    ' add parameters
    Cmd.Parameters.AddWithValue("@settore", CBtrova.Text)
    
    ' exexute reader 
    Dim Readdatabase As OleDbDataReader = Cmd.ExecuteReader()
    
    ' read
    While Readdatabase.Read()
        DGVrupa.Rows.Add(
            Readdatabase("nome"), Readdatabase("dominio"), Readdatabase("ip1"), Readdatabase("ip2"), 
            Readdatabase("gateway"), Readdatabase("note"), Readdatabase("armadio"), 
            Readdatabase("ipswitch"), Readdatabase("nswitch"), Readdatabase("porta"), 
            Readdatabase("presa"), Readdatabase("virus"), Readdatabase("note2"), 
            Readdatabase("utente"), Readdatabase("applicativo"), Readdatabase("telefono"), 
            Readdatabase("settore"), Readdatabase("piano"), Readdatabase("stanza"), 
            Readdatabase("user"), Readdatabase("datareg"), Readdatabase("datamod")
        )
    End While
    ' close
    myConnection.Close()

    In questo caso se vuoi trovare tutti i records che corrispondono a settore = CBtrova , sei a posto... adesso che vorresti fare oltre a questa ricerca ? devi aggiungere AND oppure OR altre condizioni di ricerca per le altre fields della tabella interrogata?

    Ciao dovrei cambiare la ricerca da settore a uno degli altri campi tipo dominio o gateway etc...

    praticamente se dalla combobox seleziono dominio e nella textbox scrivo un testo lui vada a cercare solo in dominio oppure seleziono gateway e cerca solo in gateway

  • Re: Realizzare un cerca "Dinamico" in database access

    Scrivi il codice adeguato per creare la corretta stringa sql in base alla selezione della combobox. E usa I parametri relativi.

    Per capirci, fai in modo che questa 

    Trova = "SELECT * From Rupa WHERE settore = '" & CBtrova.Text & "'"

    venga costruita in base alla scelta.

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - orione1976 ha scritto:

    praticamente se dalla combobox seleziono dominio e nella textbox scrivo un testo lui vada a cercare solo in dominio oppure seleziono gateway e cerca solo in gateway

    Ma delle due una o entrambe le ricerche combinandole ?

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - orione1976 ha scritto:

    Ciao dovrei cambiare la ricerca da settore a uno degli altri campi tipo dominio o gateway etc...

    ?? non credo di aver capito. se sbaglio mi correggi.

    gli elementi della combo sono i nomi dei campi?

    in base alla selezione della combo, per esempio "gateway" vuoi cercare il valore di una editbox sul campo "gateway"?

    e se la selezione della combo, per esempio "ip" vuoi cercare il valore di una editbox sul campo "ip"?

    se si:

    non puoi usare parametri per descrivere i campi ma puoi costruirti la sql.

    sql=''
    testodacercare='select * from tabella'
    if (combo.index>0 and edit.text<>'') then
      sql=testodacercare & ' where ' & combo.text & '=' & edit.text
    else 
      sql=testodacercare
    endIf

    supponendo che il primo valore della combo sia ''.

    per completezza controlla i valori da cercare: se cerchi ip assicurati che edit sia del tipo xxx.xxx.xxx.xxx ma penso sia superfluo dirlo... 

    in base all'index della combo richiami il controllo (funzione) della formattazione del testo da cercare.

    PS. una cosa del genere vuole che la combo sia readonly... e i valori esattamente uguali ai nomi dei campi.

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - By65Franco ha scritto:

    While Readdatabase.Read() DGVrupa.Rows.Add( Readdatabase("nome"), Readdatabase("dominio"), Readdatabase("ip1"), Readdatabase("ip2"), Readdatabase("gateway"), Readdatabase("note"), Readdatabase("armadio"), Readdatabase("ipswitch"), Readdatabase("nswitch"), Readdatabase("porta"), Readdatabase("presa"), Readdatabase("virus"), Readdatabase("note2"), Readdatabase("utente"), Readdatabase("applicativo"), Readdatabase("telefono"), Readdatabase("settore"), Readdatabase("piano"), Readdatabase("stanza"), Readdatabase("user"), Readdatabase("datareg"), Readdatabase("datamod") ) End While

    tutto questo non lo capisco... a che serve?

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - sihsandrea ha scritto:

    28/01/2025 - By65Franco ha scritto:

    While Readdatabase.Read() DGVrupa.Rows.Add( Readdatabase("nome"), Readdatabase("dominio"), Readdatabase("ip1"), Readdatabase("ip2"), Readdatabase("gateway"), Readdatabase("note"), Readdatabase("armadio"), Readdatabase("ipswitch"), Readdatabase("nswitch"), Readdatabase("porta"), Readdatabase("presa"), Readdatabase("virus"), Readdatabase("note2"), Readdatabase("utente"), Readdatabase("applicativo"), Readdatabase("telefono"), Readdatabase("settore"), Readdatabase("piano"), Readdatabase("stanza"), Readdatabase("user"), Readdatabase("datareg"), Readdatabase("datamod") ) End While

    tutto questo non lo capisco... a che serve?

    Forse vuole alimentare una datagridview ? ;-)

    In tal caso basterebbe una riga di codice

    Ma forse basterebbe anche applicare i filtri al caricamento "fill" del bindinsource con  il suo relativo tableadapter del dataset.

    Boh... non ho capito bene lo scopo. Seguo per capire meglio... 

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - By65Franco ha scritto:

    28/01/2025 - orione1976 ha scritto:

    praticamente se dalla combobox seleziono dominio e nella textbox scrivo un testo lui vada a cercare solo in dominio oppure seleziono gateway e cerca solo in gateway

    Ma delle due una o entrambe le ricerche combinandole ?

    una alla volta ovviamente

    vorrei che cambiando in la combobox in settore, se corrisponde al testo della textbox mi filtra il settore

    se invece cambio la combobox in gateway, se corrisponde al testo della textbox mi filtra il gateway

    e cosi dicendo per il resto

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - orione1976 ha scritto:

    una alla volta ovviamente

    vorrei che cambiando in la combobox in settore, se corrisponde al testo della textbox mi filtra il settore

    se invece cambio la combobox in gateway, se corrisponde al testo della textbox mi filtra il gateway

    Beh, ti è stato spiegato come fare.

    Da oregon e da me.

    Butta giù un po di codice

  • Re: Realizzare un cerca "Dinamico" in database access

    28/01/2025 - sihsandrea ha scritto:

    28/01/2025 - orione1976 ha scritto:

    una alla volta ovviamente

    vorrei che cambiando in la combobox in settore, se corrisponde al testo della textbox mi filtra il settore

    se invece cambio la combobox in gateway, se corrisponde al testo della textbox mi filtra il gateway

    Beh, ti è stato spiegato come fare.

    Da oregon e da me.

    Butta giù un po di codice

    Si, si sto studiando le vostre soluzioni, ho risposto alla domanda di prima... studio un po e poi mi riaffaccio.

    Grazie

Devi accedere o registrarti per scrivere nel forum
24 risposte