Newsgroup: it.comp.appl.access
Titolo: problema con ricerca.

Salve a tutti e vi ringrazio già da ora.
Non sono un esperto di access e sto incontrando qualche problema uno di
questi è il seguente.
Ho realizzato una maschera con parecchi campi e vorrei creare un tasto che
mi generi una maschera identica alla precedente vuota su cui poter inserire
i dati e quindi fare una ricerca diciamo incrociata  su più campi, in
pratica come fa la  funzione filtro in base a maschera della barra degli
strumenti. Come devo agire per implementare questa funzione??Mi sarebbe
molto utile poter riuscire a ricercare anche campi in cui ad esempio si
scrive un nome incompleto, esempio Mauriz*.
grazie attendo una vostra risposta

 ha scritto nel messaggio
news:gV4Od.21701$Of5....@nntpserver.swip.net...

Copia la Form elimina tutte le Associazioni dei controlli ed il Codice
contenuto
non eliminare l'associazione della Form all'Origine dati(poi capirai
perchè)...!
Ora ti crei il codice di gestione della ricerca.
Se hai avuto l'accortezza di aver lasciato il nome dei Controlli = al
nome dei Campi la cosa sarà estremamente semplice.
Ora ti manca solo il metodo per comporre automaticamente la
sintassi SQL....!
Vai al link:
http://www.mantuanet.it/alessandro.baraldi/
Sezione [FORMS]    1.30 Comporre la stringa WHERE correttamente
Per utilizzare in modo semplice e funzionale questo metodo sfruttiamo
il RecordSetClone della Form che non hai Disassociato al fine di recuperare
il FieldType da passare alla Funzione BuildCriteria.
Se invece del RecordsetClone(nel caso il numero di Records fosse eccessivo)
vuoi usare un Recordset applica TOP 1 alla SELECT, tanto lo scopo è solo
quello di aver accesso alle proprietà del,'oggetto Field.
A questo punto non ti rimane che ciclare con un For Each ctl in Me.Controls
ed accedere a tutte le TextBox(eventualmente puoi usare la Proprietà TAG
per ridurre o gestirne le varianti).
StringaCrit=FunzioneBuildCriteria(
ctl.name
,
me.recordsetClone.Fields(
ctl.name
).Type,ctl)
Ovviamente devi gestire la concatenazione dei criteri, ma non sarà un grosso
problema.
Tieni conto che per i campi testo puoi inserire direttamente Mauriz* nella
textBox, ma
dovrai usare Like invece di =.
Poi con un pò di fantasia puoi rendere la tua Form decisamente flessibile.
Ti ho fatto chiarezza o poco....?
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

 wrote in message
news:420944fa$0$32340$5fc...@news.tiscali.it...

Grazie mille ora provo!!
ciao


Penso di aver capito più o meno ciò che devo fare ma mi mancano ancora dei
fondamentali. Ho scritto del codice VB preso dalla guida di access che
utilizza come mi dici tu  il metodo BuildCriteria
Sub SetFilter()
Dim frm As Form, strMsg As String
Dim strInput As String, strFilter As String
DoCmd.OpenForm "Ricerca Motori Elettrici 6000 V"
Set frm = [Forms]![Ricerca Motori Elettrici 6000 v]
strMsg = "Enter one or more letters of product name " _
        & "followed by an asterisk."
strInput = InputBox(strMsg)
strFilter = BuildCriteria("Nome", dbText, strInput)
frm.Filter = strFilter
frm.FilterOn = True
End Sub
Come posso farlo eseguire dalla mia maschera con i campi non associati come
mi dicevi tu?
Sto lavorando con un semplice esempio di database in cui è presente solo un
nome e un cognome.
Grazie

 Grazie
Allora come ti dicevo la Form è Associata, ma i controlli no, l'importante
è che i controlli abbiano il nome del Campo dell'Origine dati.
Questo lo ottieni contruendo una Form con l'Autocomposizione ed elimninando
l'origine Controllo dai Controlli.... ripetizione...!
Do per scontato che nella Form tutte le TextBox siano oggetto di
possibile Filtraggio, nel caso non sia così vedremo.
Quei campi che non ritieni possano essere inseriti nei criteri di
filtro li elimini eliminando i Controlli.
Vediamo un pò di codice non funzionante ma di principio.
Private Function BuiltFilter() as string
    Dim ctl             as Access.Control
    Dim strFilter     as string
    'Ciclo tutti i controlli della Maschera, ma uso solo
    'le TextBox come dicevamo prima
    For each ctl in Me.Controls
        if ctl.Controltype=acTextBox then
                'Quì costruisco la Stringa di Filtro con le Condizioni
Associative AND
                'devono essere vere tutte, se vuoi renderle più flessibili
                'si deve parametrizzare l'AND con una Scelta che io
solitamente gestisco
                'con un OPTION BUTTON a 2 selezioni
                strFilter=strFilter & FunzioneBuildCriteria(
ctl.name
,
me.recordsetClone.Fields(
ctl.name
).Type,ctl) & " AND "
        End if
    Next
    if len(strFilter>0) then
        strFilter=Mid(strFilter,1, len(strFilter)-5)
        BuiltFilter=strFilter
    Else
        BuiltFilter=""
    End if
    Set ctl=nothing
End Function
Ora +/- questa funzione dovrebbe realmente funzionare, ma l'ho buttata
giù ad occhio, quindi testala con un buon Debug.
A questo punto metti un CommandButton per generare la stringa
di Filtro ed applicarla alla Form Originale.
Private Sub NomeButton_Click()
    dim sf    as string
    sf=BuiltFilter()
    If sf="" then Exit Sub
    If Forms!NomeForm.FilterOn then
        Forms!NomeForm.FilterOn=False
        Forms!NomeForm.Filter=""
    End If
    Forms!NomeForm.Filter=sf
    Forms!NomeForm.FilterOn=True
End if
Spero di essere stato chiaro.
Ciao
-- 
@Alex (Alessandro Baraldi)
