Come attendere la popolazione casella combinata?

di il
6 risposte

Come attendere la popolazione casella combinata?

Ok, il titolo è poco esplicativo, ma ho un problema un po'.....particolare.
in apertura di una maschera popolo una casella combinata con l'istruzione:

Me.cbo1.RowSource = "Select AAA From Tb_tabella..... "

(una lista di String relativamente piccola, 14 righe)
Funziona alla perfezione.
il problema e' che subito dopo richiamo una funzione che tra le altre cose fa:

Dim dbs as database, rst1 as recordset
set rst = me.cbo1.recordset
msgbox(rst.recordcount)

mi da errore:

"variabile oggetto o variabile del blocco with non impostata"

Ma se prima di richiamare la funzione metto un msgbox o "perdo tempo" con un ciclo Do funziona perfettamente.
Fondamentalmente mi pare di capire che se non perdo tempo prima di richiamare la funzione il set rst va a pescare nel vuoto perche' la casella combinata non ha finito di popolarsi.
A parte escamotage tipo msgbox, cicli farlocchi o wait a caso c'e' un modo per aggirare questo problema?

6 Risposte

  • Re: Come attendere la popolazione casella combinata?

    Possiamo capire perchè hai deciso di popolare la CBO da codice su OPEN di Form e non invece assegnando direttamente il ROWSOURCE dal generatore...?
    Hai valutato e provato se, come ti ho suggerito, il problema del Sincroniscmo del RS persiste ancora...?
    Perchè non hai dichiarato in modo ESPLICITO il Recordset come provenienza...? (DAO.Recordset)
    Perchè hai sovuto assegnare l'oggetto Recordset della CBO ad un Oggetto Recordset esterno...?

    Ci sono cose che se non le spieghi ci fanno venire dubbi sulle risposte da darti.
  • Re: Come attendere la popolazione casella combinata?

    Ciao,
    non so se ho capito il tuto intento, per certo dipende da me...
    prova in questo modo :

    Dim rst As DAO.Recordset
    Me.Paese.RowSource = "Select AAA From Tb_tabella..... "
    Set rst = DBEngine(0)(0).OpenRecordset(Me.Paese.RowSource)
    MsgBox rst.RecordCount

    la faccenda del perdere tempo mi è oscura...
    dichiara ad inizio modulo option explicit.
    Hai dichiarato rst1 come recordset e poi utilizzi invece rst.
    concordo con l'intervento precedente, meglio specificare dao.recordset.
    sia Ado che Ago espongno l'oggetto recordset, meglio specificare che sia tratta di dao.

    un saluto.
  • Re: Come attendere la popolazione casella combinata?

    Alex, grazie innanzi tutto x avermi fatto vincere una scommessa con il mio collega. Ero sicuro che il primo che mi avrebbe risposto non avrebbe provato a capire quale fosse il problema ma mi avrebbe chiesto come mai facevo questo o quello.
    Comunque definisco tutto da codice perché i record set puntano a tabelle che variano in base alla data quindi mi viene più semplice annodare le query nel codice.
    Ho sbagliato a scrivere una volta rst e l'altra rst1, sono lo stesso.
    Per ora nelle mie maschere non ho mai usato Da, e per mia ignoranza non so cosa cambi.
    Fatto sta che il codice che ho scritto ha il difetto che funziona solo se interpongo una pausa.
  • Re: Come attendere la popolazione casella combinata?

    Prova a mettere un DOEVENTS dopo l'assegnazione...

    In generale credo sarebbe meglio andare a riscrivere il predicato SQL di una QUERY e lasciare come ORIGINERIGA sulla combo sempre la stessa Query...
    
    DbEngine(0)(0).QueryDefs("NomeQuery").SQL="SELECT * FROM T1 WHERE..."
    Quindi apri la Form e la Combo viene popolata con i dati dinamici...

    Detto ciò prova con il suggerimento iniziale se non ti va questo ...
  • Re: Come attendere la popolazione casella combinata?

    In generale credo sarebbe meglio andare a riscrivere il predicato SQL di una QUERY e lasciare come ORIGINERIGA sulla combo sempre la stessa Query...
    
    DbEngine(0)(0).QueryDefs("NomeQuery").SQL="SELECT * FROM T1 WHERE..."
    Quindi apri la Form e la Combo viene popolata con i dati dinamici...

    Mi fa sempre piacere imparare cose nuove, cosa cambia dal mio metodo sicuramente più "grezzo",
    a questo?

    tornando invece al problema iniziale quindi non è ben chiaro il motivo per cui il programma per funzionare ha bisogno di una "pausa".....
  • Re: Come attendere la popolazione casella combinata?

    La differenza, non è sostanziale, ma funzionale, nel senso che andrai a modificare il predicato SQL prima di aprire la FORM e di conseguenza non avrai più il problema che ora lamenti di DISSINCRONIA nel Recordset, quindi dovrebbe non generare il tuo PROBLEMA INIZIALE.

    Chiaramente devi fare delle prove quando ti vengono dati suggerimenti...
Devi accedere o registrarti per scrivere nel forum
6 risposte