27 gen 2025, 16:57
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
27 gen 2025, 21:25
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.
28 gen 2025, 08:21
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()
28 gen 2025, 09:02
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!
28 gen 2025, 09:09
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?
28 gen 2025, 09:26
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?
28 gen 2025, 10:34
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
28 gen 2025, 10:49
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.
28 gen 2025, 12:04
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 ?
28 gen 2025, 13:05
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.
28 gen 2025, 13:06
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?
28 gen 2025, 13:12
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...
28 gen 2025, 14:28
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
28 gen 2025, 16:31
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
28 gen 2025, 16:33
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
28 gen 2025, 16:54
28/01/2025 - orione1976 ha scritto:
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
' retrieve combobox value
Dim fieldName As String = CBtrova.SelectedValue.ToString()
' set sql string
Dim Trova As String = $"SELECT * FROM Rupa WHERE {fieldName} = @valore"
' set sql command
Dim Cmd As New OleDb.OleDbCommand(Trova, myConnection)
' set parameters
Cmd.Parameters.AddWithValue("@valore", TBtrova.Text)
....
...
.
Una cosa di questo genere per eseguire la ricerca di tipo "Esatta"
Mentre se vuoi una ricerca di tipo "che contiene" con l'operatore LIKE
' retrieve combobox value
Dim fieldName As String = CBtrova.SelectedValue.ToString()
' set sql string
Dim Trova As String = $"SELECT * FROM Rupa WHERE {fieldName} LIKE @valore"
' set sql command
Dim Cmd As New OleDb.OleDbCommand(Trova, myConnection)
' set parameters
Cmd.Parameters.AddWithValue("@valore", "%" & TBtrova.Text & "%")
....
...
.
Più o meno una cosa di questo tipo
Prova a provare ;-))
[Edit..]
Mi dimenticavo di spiegarti l'importanza di utilizzare i parametri nella costruzione della stringa sql
Alcuni dei motivi sono:
- prevenire SQL Injection e non lasci spazio di vulnerabilità
- gestisce automaticamente la conversione dei valori da passare, per esempio le fields di tipo datetime, nvarchar, etc... non devi preoccuparti di convertirle preventivamente
- caratteri speciali: non devi preoccuparti di dover gestire gli apicini, escape, doppi apici, etc... lo farà in automatico
- in molti casi si migliorano le prestazioni della Sql
----
Con questo penso che adesso hai qualche spunto e argomenti da studiare e approfondire.
28 gen 2025, 20:37
Devi formattare il valore da trovare
Se combo è su gateway e edit vale 192.168.1.1
Appena cambi la combo su porta hai un errore perché la porra non può essere del tipo xxx.xxx.xxx.xxx
Io andrei con la prima soluzione prospettata
Metti un edit sopra ogni campo e al keypress vai in ricerca
Select.... Where gateway=editgateway and editgateway<>''
And idem per ogni campo
In questo modo puoi filtrare su più campi rendendo più utile la ricerca.
Gli edit li imposti con la relativa maschera di input e risolvi. Gateway sarà xxx.xxx.xxx.xxx porea sarà yyyy ecc...
Esempio edit
Gateway. Porta. Subnet.........
Esempio tabella
28 gen 2025, 21:16
28/01/2025 - sihsandrea ha scritto:
Gateway. Porta. Subnet.........
Esempio tabella
Direi proprio di si, infatti esistono diversi metodi e più efficaci ....
personalmente farei una cosa di questo tipo:
- popolare senza filtri la datagridview
- per le colonne dove eseguire le ricerche, come le tre sopra riportate, imposterei le tre combobox che conterranno il riepilogo dei gateway, delle porte e delle SubNet presenti nella datagridview
- per le combobox dove esiste una selezione <> da null si costruisce e si applica il filtro alla datagridview
---
End, non vi è altro da fare ... pochissime righe di codice, semplice, immediato e non porta l'utente a scrivere un bel nulla, ma bensì potrà velocemente cliccare nelle combobox gli elementi che si vogliono vedere nella datagridview