Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 6 su 6

filtro su recordset ADODB

  1. #1
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    Ciao, ho un problema di filtraggio di un recordset "in memoria"
    ho questo codice (semplificato):
        Dim RS as ADODB.Recordset    
        Dim RS_base as Recordset
       
        Set RS = New ADODB.Recordset
        With RS
            .Fields.Append "Campo1", adInteger
            .Fields.Append "Campo2", adVarChar, 50
            .Open , , adOpenDynamic, adLockOptimistic
    
            Set RS_base = DBEngine(0)(0).OpenRecordset("SELECT * FROM TABELLA ORDER BY ID")
            While Not RS_base.EOF
                .AddNew
                !Campo1 = RS_base!Campo1
                !Campo2 = RS_base!Campo2
                .Update
                RS_base.MoveNext
            Wend
            RS_base.Close
            Set RS_base = Nothing
        End With
        RS.Filter = "(FLAG_Principale=" & Me.FLAG_Princ & ")"
        set me.ElencoX.recordset=RS
    
    che mi crea un Recordset ADODB in memoria che poi viene filtrato e associato ad una casella di riepilogo (ElencoX)
    ... e fin qui tutto bene...

    ad un certo punto devo applicare filtri diversi in base a filtri selezionati tramite doppioclick sull'elenco o tramite altri controlli ma in alcuni casi mi da errore...
    ad esempio se metto
    RS.Filter = "(Campo1 IN (1,2,3))"
    
    oppure
    RS.Filter = "NOT(Campo1 = 5)"
    
    quando invece la stessa senza il NOT funziona
    RS.Filter = "(Campo1 = 5)"
    
    ... ci sono limitazioni nelle operazioni di filtraggio evidentemente ma non trovo nessuna guida...
    grazie

  2. #2
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    anche se non ho trovato una vera e propria guida, o meglio... c'è quella di MSDN ma non è che evidenzi la cosa + di tanto, ho letto in vari siti che in effetti la proprietà Filter dei recordset ADODB permettono solo =, <, >, <>, like, AND, OR ... ma non IN o NOT ... il perchè devo veramente capirlo?!?!
    ok... adatterò il filtro mettendo una spropositata lista di OR al posto dell'IN e trasformerò il NOT in modo da usare il <> ... ma lo trovo pietoso...
    poi sicuramente ci saranno motivi a me sconosciuti a giustificazione...

  3. #3
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Come hai già potuto appurare, il metodo Filter dell'oggetto ADODB.Recordset ha dei limiti:
    Gli operatori ammessi sono:

    <, >, <=, >=, <>, =, e LIKE

    In linea di massima, se i dati provengono da un database, può essere più conveniente ricreare un recordset impostando i filtri nella query di SELECT.
    Ma queste sono valutazioni che puoi fare solo tu, in funzione di quante colonne e righe devono essere caricate.

    In ogni caso, osservando il tuo codice, quello che non capisco è il perché tu apra 2 recordset, uno DAO ed un ADO, per copiare i dati dal primo al secondo, e la cosa mi sconcerta un po'...

    Perché non usare direttamente un solo recordset di ADO?


    Se vuoi una guida ben fatta su ADO, scaricati il SDK di ADO 2.0.
    Guida davvero esaustiva (ADO, ADO MD, ADOX, ...) e con tantissimi esempi

    ℹ️ Leggi di più su gibra ...

  4. #4
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    SELECT * FROM TABELLA ORDER BY ID
    Invece di estrarre tutti i campi della tabella per crearti un recordset (in memoria) con solo 2 campi (peraltro senza indici)
    perchè non estrai solo i campi che ti servono filtrandoli con la clausola WHERE appropriata (che NON soffre delle limitazioni della proprietà ado.filter)?

  5. #5
    L'avatar di nman
    nman non è in linea Topo di biblioteca
    Concordo con gibra
    Perché un DAORecordset che passa TUTTI i dati a un ADORecordset
    e poi applicare il filtro

    io lo farei solo con una query filtrata da una adeguata strWHERE che non compaia se non ci sono crireti
    Dim strWh As String
    If Nz(Me.FLAG_Princ.Value, "") <> "" Then
        strWh = "WHERE (TABELLA.FLAG_Principale = " & Me.FLAG_Princ.Value & ") "
    End If
    
    Dim strSq As String
    strSq = "SELECT TABELLA.Campo1, TABELLA.Campo2 FROM TABELLA " & strWh & "ORDER BY TABELLA.ID;"
    
    Me.ElencoX.RowSource = strSq
    
    .
    Ultima modifica di nman; 29-05-2015 10:21 

  6. #6
    L'avatar di muttley005
    muttley005 non è in linea Topo di biblioteca
    innanzitutto grazie Gibra per l'indicazione del "SDK di ADO 2.0." che scaricherò sicuramente
    e su
    In ogni caso, osservando il tuo codice, quello che non capisco è il perché tu apra 2 recordset, uno DAO ed un ADO, per copiare i dati dal primo al secondo, e la cosa mi sconcerta un po'... Perché non usare direttamente un solo recordset di ADO?
    ... perchè in realtà ci sono altri campi nel recordset ADO che esistono solo in memoria, questa è una semplificazione



    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Invece di estrarre tutti i campi della tabella per crearti un recordset (in memoria) con solo 2 campi (peraltro senza indici) perchè non estrai solo i campi che ti servono filtrandoli con la clausola WHERE appropriata (che NON soffre delle limitazioni della proprietà ado.filter)?
    sulla prima parte per lo stesso motivo scritto sopra a Gibra, per la seconda si, ci avevo anche pensato ma ho modificato leggermente il filtro e mi basta... sicuramente quella sarebbe stata l'alternativa (anche + comoda) e nulla mi vieta di passare a quella, grazie.



    per nman stesse motivazioni di Gibra



    Grazie a tutti.

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 3
    Ultimo Post: 25-09-2020, 22:27
  2. delete su recordset ADODB in memoria
    Da muttley005 nel forum Microsoft Access
    Risposte: 18
    Ultimo Post: 19-06-2015, 15:23
  3. Problema ADODB Recordset
    Da cadthac76 nel forum Microsoft Word
    Risposte: 6
    Ultimo Post: 03-10-2008, 14:16
  4. Risposte: 5
    Ultimo Post: 13-09-2007, 11:11
  5. ADODB.Recordset (0x800A0BCD)
    Da delfinista nel forum ASP 3, ASP .Net
    Risposte: 1
    Ultimo Post: 15-06-2005, 10:09