Newsgroup: it.comp.lang.visual-basic
Titolo: Altro problemaccio -  query

Devo scrivere del codice per fare delle ricerche in una tabella access e fin
qui non ci sono problemi.
I criteri di ricerca vanno letti da textbox e ancora va bene.
I criteri li deve scegliere l'utente e possono essere al massimo 15. Ora
come posso evitare di scrivere tutte le combinazioni ( su 15 numeri sono
tantissime). C'è il modo di scrivere una sola istruzione sql che mi tenga
conto solo dei textbox in cui è inserito il criterio e che mi tralasci
quelli vuoti (es. text1(5).text="")?
Potete aiutarmi?

 ha scritto nel messaggio 
news:5fAYd.10298$zZ1.2...@twister1.libero.it...

Un esempio (con campi tutti di tipo testo - chiaramente se sono di tipo 
diverso devi formattare l'sql correttamente
    strWHERE =  ""
    If txtCampo1.text<> "" Then strWHERE = strWHERE & " AND Campo1= '" & 
replace(txtCampo1.text,"'","''") & "'"
    If txtCampo2.text<> "" Then strWHERE = strWHERE & " AND Campo2= '" & 
replace(txtCampo2,.text"'","''") & "'"
    If txtCampo3.text<> "" Then strWHERE = strWHERE & " AND Campo3= '" & 
replace(txtCampo3.text,"'","''") & "'"
    If txtCampo4.text<> "" Then strWHERE = strWHERE & " AND Campo4= '" & 
replace(txtCampo4.text,"'","''") & "'"
    If txtCampo5.text<> "" Then strWHERE = strWHERE & " AND Campo5= '" & 
replace(txtCampo5.text,"'","''") & "'"
    ' se almeno uno dei campi era valorizzato sostituisce il primo AND con 
WHERE
    If strWHERE <> "" Then strSQL = strSQL & " WHERE " & Mid(strWHERE, 6)
    strSQL = "SELECT * FROM tabella" & strWHERE
Ciao
Elef 

Ottimo, grazie mille.
Francesco

 ha scritto nel messaggio
news:5fAYd.10298$zZ1.2...@twister1.libero.it...

VB permette la gestione di Matrici di controlli(se non sbaglio, provengo da
VBA
dove non esistono).
In questo caso con pochissime righe di codice iterando la matrice puoi
comporre
la stringa WHERE in modo dinamico io userei la proprietà TAG(del Controllo
Text) per inserire il
Nome del Campo relativo:
Dim x as integer
Dim sSQL as string
Dim strWhere as string
For x=0 to Ubound(txtCriteria())
    If not IsNull(txtCriteria(x).TEXT) and len(txtCriteria(x).TEXT)>0 then
        strWhere=strWhere & "[" & txtCriteria(x).TAG & "]=" &
txtCriteria(x).TEXT & " AND "
    end if
Next
If len(strWhere)>0 then
    'Sottracco 5 perchè è il Len(" AND") che mi ritrovo alla fine
    strWhere=Mid(strWhere,1,Len(strWhere)-5)
    sSQL="SELECT * FORM NomeTabella WHERE " & strWhere
Else
     sSQL="SELECT * FORM NomeTabella "
End if
Potresti concedere la possibilità di attribuire in modo dinamico
l'Operatore AND/OR nella composizione del criterio.
Scusate le eventuali imprecisioni o errori dovuti alla poca esperienza
di metodi e proprietà non VBA compatibili.
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

 Potete aiutarmi?
Altro approccio.
Una classe definita così:
Private FCondName As String
Private FOperator As String
Private FCondValue As String
Property Get CondName() As String
   CondName = FCondName
End Property
Property Let CondName(RHS As String)
   FCondName = RHS
End Property
Property Get Operator() As String
   Operator = FOperator
End Property
Property Let Operator(RHS As String)
   FOperator = RHS
End Property
Property Get CondValue() As String
   CondValue = FCondValue
End Property
Property Let CondValue(RHS As String)
   FCondValue = RHS
End Property
Property Get CompleteCondition() As String
   Dim Result As String
   Result = ""
   If CondValue <> "" Then
     Result = "(" & CondName & " " & Operator & " " & CondValue & ")"
   End If
   CompleteCondition = Result
End Property
Adesso per ogni edit puoi creare una nuova istanza e metterla in una
Collection. L'istanza può essere creata sia in qualche evento che
premendo un pulsante per esempio.
Ora che hai tutto, ti basta fare un semplice "for each" dal quale per
ogni condizione richiami CompleteCondition . Se la condizione non c'è,
otterrai una stringa vuota la quale non avrà effetto sulla costruzione
finale della WHERE. Concateni tutto in una variabile che poi passi allo
statement SQL ed hai risolto.
Come vantaggio accessorio, se devi definire una nuova condizione un 
codice del genere ti consente di farlo con semplicemente un'altra
istanza e senza dover perdere la testa negli IF.
Ciao,
Andrea