Newsgroup: it.comp.appl.access
Titolo: Applicare un filtro ad un recordset

Ho bisogno di filtrare un oggetto DAO.recordset con la condizione che il
campo sì/no 'Nascosto' sia off.
Qual è la sintassi corretta?
Ho trovato nell'help in linea la proprietà filter, ma non è riportato nessun
esempio.
Chi può aiutarmi?
Grazie
GioVe

 ha scritto nel messaggio
news:AN2_c.194293$OR2.9...@news3.tin.it...

Ciao Gio.Ve
ti riporto l'esempio dell'help in linea di Access 2003:
nel tuo caso il criterio dovrebbe essere: "[Nascosto] = false"
Cinzia
Esempio di proprietà Filter
Nel seguente esempio si utilizza la proprietà Filter per creare un nuovo
oggetto Recordset da un oggetto Recordset esistente in una condizione
specificata. Per eseguire questa routine, è necessaria la funzione
FilterField.
Sub FilterX()
   Dim dbsNorthwind As Database
   Dim rstOrders As Recordset
   Dim intOrders As Integer
   Dim strCountry As String
   Dim rstOrdersCountry As Recordset
   Dim strMessage As String
   Set dbsNorthwind = OpenDatabase("Northwind.mdb")
   Set rstOrders = dbsNorthwind.OpenRecordset("Orders", _
      dbOpenSnapshot)
   ' Populate the Recordset.
   rstOrders.MoveLast
   intOrders = rstOrders.RecordCount
   ' Get user input.
   strCountry = Trim(InputBox( _
      "Enter a country to filter on:"))
   If strCountry <> "" Then
      ' Open a filtered Recordset object.
      Set rstOrdersCountry = _
         FilterField(rstOrders, "ShipCountry", strCountry)
      With rstOrdersCountry
         ' Check RecordCount before populating Recordset;
         ' otherwise, error may result.
         If .RecordCount <> 0 Then .MoveLast
         ' Print number of records for the original
         ' Recordset object and the filtered Recordset
         ' object.
         strMessage = "Orders in original recordset: " & _
            vbCr & intOrders & vbCr & _
            "Orders in filtered recordset (Country = '" & _
            strCountry & "'): " & vbCr & .RecordCount
         MsgBox strMessage
         .Close
      End With
   End If
   rstOrders.Close
   dbsNorthwind.Close
End Sub
Function FilterField(rstTemp As Recordset, _
   strField As String, strFilter As String) As Recordset
   ' Set a filter on the specified Recordset object and then
   ' open a new Recordset object.
   rstTemp.Filter = strField & " = '" & strFilter & "'"
   Set FilterField = rstTemp.OpenRecordset
End Function
Nota Per visualizzare i risultati del filtro di rstOrders, è necessario
impostare la relativa proprietà Filter, quindi aprire un secondo oggetto
Recordset basato su rstOrders.
Nota Conoscendo i dati da selezionare, in genere risulterà più efficiente
creare un oggetto Recordset tramite un'istruzione SQL. Nel seguente esempio
viene illustrato come è possibile creare un solo oggetto Recordset e
ottenere i record da un particolare paese.
Sub FilterX2()
   Dim dbsNorthwind As Database
   Dim rstOrders As Recordset
   Set dbsNorthwind = OpenDatabase("Northwind.mdb")
   ' Open a Recordset object that selects records from a
   ' table based on the shipping country.
   Set rstOrders = _
      dbsNorthwind.OpenRecordset("SELECT * " & _
      "FROM Orders WHERE ShipCountry = 'USA'", _
      dbOpenSnapshot)
   rstOrders.Close
   dbsNorthwind.Close
End Sub

 ha scritto nel messaggio
news:chaiuk$skj$1...@lacerta.tiscalinet.it...

Ciao Cinzia,
Il primo esempio è troppo difficile da implementare.
Il secondo invece è comprensibilissimo.
Come al solito mi risolvi un bel po' di problemi.
Visto che ci siamo, mi puoi spiegare come faccio ad associare il record
corrente del recordset (trovato col find) ad una scheda? Come faccio cioè a
vedere il record che è stato trovato col metodo find applicato ad un
recordset?
Fino ad oggi pensavo che l'unico metodo fosse con Bookmark, ma ho letto che
c'è anche la proprietà recordset applicata alla maschera. Che vuol dire?
Grazie di tutto.
GioVe

 ha scritto nel messaggio
news:ec5_c.195047$OR2.9...@news3.tin.it...

Ciao GioVe,
non sono sicura di aver capito bene quello che ti serve.
Ad ogni maschera è associato un recordset e per ottenerlo e farci delle
operazioni ad esempio una Find la proprietà è
RecordsetClone.
Ti metto un esempio tratto sempre dall'help di utilizzo di RecordsetClone,
Find e BookMark per visualizzare il record trovato con una Find.
Esempio
Per verificare l'esempio riportato di seguito nel database di esempio
Northwind, è necessario aggiungere un pulsante di comando denominato
cmdTrovaNomeContatto alla maschera Fornitori e quindi aggiungere il codice
specificato di seguito all'evento Click del pulsante. Quando si preme il
pulsante, verrà chiesto di immettere una parte del nome del contatto da
trovare. Se si trova tale nome, la proprietà Bookmark della maschera verrà
impostata sulla proprietà DAO Bookmark dell'oggetto Recordset, che sposta il
record corrente della maschera sul nome trovato.
Private Sub cmdFindContactName_Click()
    Dim rst As DAO.Recordset
    Dim strCriteria As String
    strCriteria = "[ContactName] Like '*" & InputBox("Enter the " _
        & "first few letters of the name to find") & "*'"
    Set rst = Me.RecordsetClone
    rst.FindFirst strCriteria
    If rst.NoMatch Then
        MsgBox "No entry found.", vbInformation
    Else
        Me.Bookmark = rst.Bookmark
    End If
    Set rst = Nothing
End Sub
Non so se risponde alle tue domande, altrimenti chiariscimi meglio quello
che vorresti fare!CiaoCinzia

CUT

Ciao Cinzia,
 l'utilizzo di RecordsetClone e bookmark mi è noto.
In questi giorni ho scoperto la proprietà .recordset, ed è a questa che mi
riferisco.
Ti riporto uno stralcio dell'help in linea:
La proprietà Recordset restituisce l'oggetto recordset che rende disponibili
i dati visualizzati in una maschera, un report, un controllo Casella di
riepilogo o un controllo Casella combinata. Ad esempio, se una maschera è
basata su una query, fare riferimento alla proprietà Recordset equivale a
duplicare un oggetto Recordset utilizzando la stessa query. Tuttavia,
diversamente dall'utilizzo della proprietà RecordsetClone, anche la modifica
del record corrente nel set di record restituito dalla proprietà Recordset
della maschera imposta il record corrente della maschera.
Da queste note ho capito che non ho più bisogno di usare bookmark per
sincronizzare il record corrente della maschera al record corrente del
recordset. Questa conclusione è rafforzata anche dall'esempio:
Nell'esempio riportato di seguito la proprietà Recordset e l'oggetto
Recordset vengono utilizzati per sincronizzare un set di record con il
record corrente della maschera. Quando si seleziona il nome di una società
in una casella combinata, per individuare il record di tale società viene
utilizzato il metodo FindFirst. In questo modo la maschera visualizza il
record trovato.
Sub SupplierID_AfterUpdate()
    Dim rst As DAO.Recordset
    Dim strSearchName As String
    Set rst = Me.Recordset
    strSearchName = CStr(Me!SupplierID)
    rst.FindFirst "SupplierID = " & strSearchName
    If rst.NoMatch Then
        MsgBox "Record not found"
    End If
    rst.Close
End Sub
E' così?CiaoGioVe

 ha scritto nel messaggio
news:k_E_c.201322$OR2.9...@news3.tin.it...

Ciao  Gio.Ve
ho provato l'esempio di codice dell'help adattandolo ad un db che avevo già,
in effetti la procedura così com'è ho l'impressione che non funzioni.
Sostanzialmente c'è l'istruzione rst.Close che chiude il recordset della
maschera per cui non può funzionare.
Se togli l'istruzione rst.Close vedrai che funziona
Questo è il codice che ho usato io:
in una maschera ho messo una casella di testo e un bottone Find che una
volta premuto mi posiziona sul record contenente la parola che ho scritto
nella casella di testo.
Come vedrai anzichè usare una variabile rst che "punta" al recordset della
maschera ho usato direttamente il recordset ma il risultato non cambia, puoi
usare il modo che preferisci  (ho lasciato commentate le istruzioni per
usare la variabile anzichè il recordset direttamente):
Private Sub btn_find_Click()
On Error GoTo Err_btn_find_Click
  '  Dim rst As DAO.Recordset
    Dim strSearchName As String
  '  Set rst = Me.Recordset
    strSearchName = Me!txtFind
   ' rst.FindFirst "Squadra1 = '" & strSearchName & "'"
    Me.Recordset.FindFirst "Squadra1 = '" & strSearchName & "'"
   ' if rst.NoMatch then
    If Me.Recordset.NoMatch Then
        MsgBox "Record not found"
    End If
Exit_btn_find_Click:
    Exit Sub
Err_btn_find_Click:
    MsgBox Err.Description
    Resume Exit_btn_find_Click
End Sub
Spero questa volta di averti dato la spiegazione che volevi!
Ciao
Cinzia

 ha scritto nel messaggio
news:chfpjd$oth$1...@lacerta.tiscalinet.it...

Grazie Cinzia, come farei senza di te? (senza nulla togliere agli altri del
NG)
GioVe

 ha scritto nel messaggio
news:nZY_c.205674$OR2.9...@news3.tin.it...

Prego!
Ci sarebbe sicuramente qualcun altro nel NG che risponde!
Cinzia


Non vorrei essere un rompi e non credo di esserci
riuscito. perņ
un filo di quoting per i ringraziamenti???
Massimiliano


Cia Massimiliano,
se intendi dire che per rispondere ai ringraziamenti, sarebbe il caso di
eliminare il testo precedente, concordo con te, lezione imparata! Prometto
non lo farò mai più.
Se invece l'obiezione era di altro tipo, scusa ma non l'ho capita!
saluti
Cinzia


ha scritto nel messaggio
news:chi1hm$ad6$1...@lacerta.tiscalinet.it...

Ciao Cinzia,
hai proprio centrato, per il primo motivo sia per
te che per chi ti ringrazia.
Scusami se inmaniera brusca/brutta ma era
necessario,
poi ti sono molto riconoscente (anche se non ho
mai approfittato finora della tua competenza)
per tutto l'aiuto che dai al Ng - e per il garbo
con cui lo dai - .
Ti prego solo di una cosa: non cedere mai alle
lusinghe di Antonio Biso.
;-P
con molta stima
ciao MAssimiliano


Ciao Massimiliano,
nessun problema per la tirata d'orecchi, meritatissima!
Non esitare a rifarlo se dovessi fare qualche altra cavolata, sono
abbastanza "inesperta" nell'uso del NG ma imparo in fretta...
Grazie per la stima che è assolutamente ricambiata
Tranquillo per il Biso, i "warning" sono già stati numerosi!
Ciao Cinzia