Subform - adodb filtrato - limite 100 record

di il
12 risposte

Subform - adodb filtrato - limite 100 record

Ciao,
ho una form con un controllo a schede e in una scheda una subform, lo dico per dare qualche info in + ma non credo sposti la questione.
La subform viene associata in esecuzione ad un recordset adodb così

    ...
    Set RS_Prest = New ADODB.Recordset
    ID_PREST = 0
    With RS_Prest
        .Fields.Append "ID", adInteger
        .Fields.Append "DATA_PREST", adDBDate
        .Fields.Append "ID_PREST", adInteger
        .Fields.Append "PRESTAZIONE", adVarChar, 255
        .Fields.Append "QUANTITA", adDouble
        .Fields.Append "NOTE_PREST", adVarChar, 4000, adFldMayBeNull    
        .Fields.Append "FLAG_ARCHIVIATA", adBoolean
        .Open , , adOpenDynamic, adLockOptimistic
        Set rsIn = DBEngine(0)(0).OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)
        While Not rsIn.EOF
            .AddNew
            ID_PREST = ID_PREST + 1
            .Fields("ID") = ID_PREST
            .Fields("ID_PREST") = rsIn.Fields("ID_PRESTAZIONE")
            .Fields("PRESTAZIONE") = rsIn.Fields("DES_PRESTAZIONE")
            .Fields("DATA_PREST") = rsIn.Fields("DATA_PREST")
            .Fields("QUANTITA") = rsIn.Fields("QUANTITA")
            .Fields("NOTE_PREST") = rsIn.Fields("NOTE_PREST")
            .Fields("FLAG_ARCHIVIATA") = rsIn.Fields("FLAG_ARCHIVIATA")
            .Update
            rsIn.MoveNext
        Wend
        rsIn.Close
        Set rsIn = Nothing
    End With
    RS_Prest.Filter = "FLAG_ARCHIVIATA=False"
    RS_Prest.Sort = "DATA_PREST DESC, PRESTAZIONE"
    Set Me.SUB_PREST.Form.Recordset = RS_Prest

supponiamo che io me ne aspetti 150, così facendo invece mi taglia i record a 100
la cosa per me curiosa è che se escludo la riga del FILTER

   ' ----> commentata ----> RS_Prest.Filter = "FLAG_ARCHIVIATA=False"
    RS_Prest.Sort = "DATA_PREST DESC, PRESTAZIONE"
    Set Me.SUB_PREST.Form.Recordset = RS_Prest
il limite dei 100 viene superato.

Viene superato anche se lascio il FILTER e aggiungo il ".clone" nell'ultima istruzione
    RS_Prest.Filter = "FLAG_ARCHIVIATA=False"
    RS_Prest.Sort = "DATA_PREST DESC, PRESTAZIONE"
    Set Me.SUB_PREST.Form.Recordset = RS_Prest.Clone
non vi sembra strano? C'è una spiegazione?

12 Risposte

  • Re: Subform - adodb filtrato - limite 100 record

    Hi Mutt,
    difficile darti una spiegazione ... con un uso misto di ADO e DAO con (sub)form associato a runtime.
    Io vedo alcune cose che non mi convincono (ma che magari nulla centrano con quanto segnali) :
    - crei un recordset ADO a runtime che riempi utilizzando un recordset DAO (nulla di anomalo, io avrei usato tutto ADO)
    - utilizzi un recordset DAO che apri come Dynamic ma in reltà è sufficiente un ReadOnly (questo è un piccolo spreco di risorse)
    - associ un recordset ADO ad un form ... questo potrebbe essere un problema (io, in alcuni contesti probabilmente complicati, ho riscontrato il crash di Access 2013 associando recordset ADO a runtime, quindi lo evito)
  • Re: Subform - adodb filtrato - limite 100 record

    Questa è una mia curiosità, che senso ha creare un recordset al volo per poi filtrarlo ?
    Non faresti prima a crearlo direttamente con i solo dati che ti servono?

    Vado a memoria : le proprietà filter di ADO e DAO sono gestite in maniera diversa e questo potrebbe essere il tuo problema (che mi risulti i form di Access utilizzando recordset di tipo DAO e tu associ un recordset ADO al form).
    Forse converrebbe, dopo ado.filter e ado.sort fare un ado.requery prima di associare il recordset al form ...
  • Re: Subform - adodb filtrato - limite 100 record

    https://stackoverflow.com/questions/11978844/why-does-a-datasheet-view-show-only-100-records-when-based-on-sorted-and-filtere viene segnalato lo stesso tuo problema ...
  • Re: Subform - adodb filtrato - limite 100 record

    max.riservo ha scritto:


    Questa è una mia curiosità, che senso ha creare un recordset al volo per poi filtrarlo ?
    Non faresti prima a crearlo direttamente con i solo dati che ti servono?
    si hai ragione in teoria ma ho ristretto la cosa, nel senso che poi quel recordset (completo, senza filtro) mi serve anche per altro. In pratica carico sul recordset tutte le prest in carico ad un'azienda e visualizzo in quella sub quelle non ancora archiviate e le rimanenti su un elenco (list) ed eventualmente l'utente filtra ulteriormente l'uno e/o l'altro in base a criteri, oppure anche archivia prest.

    Ok , provo il tuo suggerimento, grazie
  • Re: Subform - adodb filtrato - limite 100 record

    max.riservo ha scritto:


    Hi Mutt,
    difficile darti una spiegazione ... con un uso misto di ADO e DAO con (sub)form associato a runtime.
    Io vedo alcune cose che non mi convincono (ma che magari nulla centrano con quanto segnali) :
    - crei un recordset ADO a runtime che riempi utilizzando un recordset DAO (nulla di anomalo, io avrei usato tutto ADO)
    carico su un recordset "volante" qualcosa di tabellato ... ho sempre fatto così... ci sono altri modi?
    - utilizzi un recordset DAO che apri come Dynamic ma in reltà è sufficiente un ReadOnly (questo è un piccolo spreco di risorse)
    giusto ottimizzare!
    - associ un recordset ADO ad un form ... questo potrebbe essere un problema (io, in alcuni contesti probabilmente complicati, ho riscontrato il crash di Access 2013 associando recordset ADO a runtime, quindi lo evito)
    boh, io lo uso spesso per alcune cose
  • Re: Subform - adodb filtrato - limite 100 record

    max.riservo ha scritto:


    https://stackoverflow.com/questions/11978844/why-does-a-datasheet-view-show-only-100-records-when-based-on-sorted-and-filtere viene segnalato lo stesso tuo problema ...
    grazie ci guardo
  • Re: Subform - adodb filtrato - limite 100 record

    Forse la proprietà PageSize è quello che ti serve (anche se da una prova veloce risulta essere imposta a 10) :
    https://www.devguru.com/content/technologies/ado/recordset-pagesize.html
  • Re: Subform - adodb filtrato - limite 100 record

    Ho provato a giochicchiare un pò con le proprietà ma ...
    requery su RS dà errore "operazione non consentita nel contesto corrente"
    pageSize non cambia nulla, immagino riguardi la paginazione in memoria

    comunque il "bug" non è sul recordset ado, se dopo il filter e sort guardo il recordcount è 129 correttamente.
    il problema è sull'assegnazione al controllo
    Set Me.SUB_PREST.Form.Recordset = RS_Prest
    ma come detto se lo clono va come ci si aspetta
    Set Me.SUB_PREST.Form.Recordset = RS_Prest.Clone
  • Re: Subform - adodb filtrato - limite 100 record

    Riassumendo:
    codice teoricamente giusto originale
        
        RS_Prest.Filter = "FLAG_ARCHIVIATA=False"
        RS_Prest.Sort = "DATA_PREST DESC, PRESTAZIONE"
        Set Me.SUB_PREST.Form.Recordset = RS_Prest
    
    ordina e filtra ma nel controllo se ne vedono solo 100
        
        RS_Prest.Sort = "DATA_PREST DESC, PRESTAZIONE"
        Set Me.SUB_PREST.Form.Recordset = RS_Prest
    
    ovviamente ordina, NON filtra perchè ho tolto la riga, e nel controllo se ne vedono 129 (tutte) ordinate
        
        RS_Prest.Filter = "FLAG_ARCHIVIATA=False"
        Set Me.SUB_PREST.Form.Recordset = RS_Prest
    
    ovviamente filtra, NON ordina perchè ho tolto la riga, e nel controllo se ne vedono solo 110 correttamente ma non sono ordinate (ovviamente)

    quindi il problema si crea con la doppia operazione ... bah
  • Re: Subform - adodb filtrato - limite 100 record

    Concludendo, la soluzione valida è quella proposta al link di Max

    max.riservo ha scritto:


    https://stackoverflow.com/questions/11978844/why-does-a-datasheet-view-show-only-100-records-when-based-on-sorted-and-filtere viene segnalato lo stesso tuo problema ...
    non trovo altre strade.
    Grazie Max, me lo stavo rifacendo a mano ma alla fine era praticamente lo stesso codice
  • Re: Subform - adodb filtrato - limite 100 record

    Potresti avere ancora un'altra possibilità :
    ordinare il recordset DAO dal quale prelevi i dati e crei il recordset ADO.
    Così eviti di usare filter e sort insieme ... ma se hai risolto con quanto indicato tanto meglio

    Ciao.
  • Re: Subform - adodb filtrato - limite 100 record

    Si ci avevo pensato ma poi ... dal ADODB.Recordset associo come detto la subform in un modo e la listbox in un altro, dalla form principale posso aggiungere record o eliminarli tutti o archiviare tutte le non archiviate e dalla sub posso archiviare o cancellare la singola... e mi sa che (quantomeno per i nuovi inserimenti) dovrei poi riordinare ... boh, sinceramente vedo meno "invasiva" quella modifica perchè mi basta cambiare i vari SET subform.record = mio adodb.recordset con l'attribuzione tramite la funzione.
Devi accedere o registrarti per scrivere nel forum
12 risposte