Newsgroup: it.comp.appl.access
Titolo: interrompere un loop

Ho il problema di interrompere un loop su un recordset, come faccio?
In dettaglio: estraggo un recordset Myrs, scorro il recordset mediante un
ciclo, e dal primo all'ultimo elemento, visualizzo tale elemento i-esimo
tramite una maschera dove aggiorno determinate informazioni. La maschera ha
un bottone di chiusura, chiudendo la maschera lui passa all'elemento
successivo. Il codice attuale, una volta avviato, mi costringe a far passare
tutto il recordset. Vorrei poter abortire il loop, come faccio?
Il codice che realizza il loop e' il seguente:
============================
    Set mydb = CurrentDb()
    Set myrs = mydb.OpenRecordset("select ecc.
    myrs.MoveFirst
   '
    Do While Not myrs.EOF
        '
        DoCmd.OpenForm "MSK Andamento situazione"
        Do While IsFormLoaded("MSK Andamento situazione")    (1)
           DoEvents
        Loop
        Me.Refresh
        '
    myrs.MoveNext  (2)
    Loop
    '
    Set myrs = Nothing
    Set mydb = Nothing
==================================
(1) funzione booleana vera se la maschera e' aperta, in tal caso si attiva
DoEvents che me la tiene aperta e me la lascia manipolare. Quando io la
chiudo, la funzione diventa falsa e lui esce dal do-loop interno, passando
(2) all'elemento successivo.
Io vorrei inserire nella maschera un bottone "abort" premendo il quale si
abortisce il do-loop esterno, ma praticamente non ci sono riuscito. Come
potrei fare?
TIA
B.

 wrote in message

    Perche' apri e chiudi la maschera?
    Dal codice che proponi non capisco cosa abbia di diverso la maschera ad
ogni apertura, e che relazione ci sia fra recordset e maschera. Perche' se
non c'e' relazione non capisco che senso abbia la cosa...
    Se tu approfittassi degli eventi potresti evitare il loop.
    Per esempio potresti istanziare la maschera secondaria in quella
principale ed intercettarne la chiusura (se proprio vuoi chiuderla) in modo
da far avanzare il recordset in questa occasione. Senza loop, come dicevo.
-- 
    (Facci sapere se ed eventualmente come hai risolto. Grazie.)
Ciao :o)
Maurizio
--------
?SPQR(C)
 X
--------

 ha scritto nel messaggio
news:b7goqp$nf7c$1...@ID-163647.news.dfncis.de...

Puoi uscire da un ciclo Do ... Loop con una istruzione Exit Do.
Per maggiori dettagli leggi sull'help Istruzione Exit.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 Per maggiori dettagli leggi sull'help Istruzione Exit.
Il mio problema e' come passare al loop l'informazione che occorre fare un
exit.
Sulla maschera che viene aperta a ogni giro del loop esterno c'e' un bottone
"bailout". Se lo premo diventa true. Il mio problema e' come faccio a
registrare il cambiamento di stato di tale tasto, per comunicarlo al loop
esterno.
Mentre la maschera e' aperta e io premo il bottone, il loop esterno e'
sospeso (DoEvents). Se io chiudo la maschera e restituisco il controllo al
loop esterno, l'informazione relativa a "bailout" si perde assieme alla
chiusura della maschera.
Ciao

 da far avanzare il recordset in questa occasione. Senza loop, come dicevo.
Ci rifletto su, in prima lettura non sono sicuro di aver capito.
Grazie, ciao!
B.

 chiusura della maschera.
solo per capire, visto che sei in due * due ottime mani.
Perche' dici che il loop esterno e' sospeso? Non mi risulta che la DoEvents 
"sospenda" il codice. Per quel che ne so il DoEvents dice a windows "....
se hai qualcosa da fare fallo e poi fammi continuare....". 
Un modo per sospendere il codice e' aprire una maschera in modalita'
"acdialog", questo si che sospende il codice.
--
a.cara 
Togli qualcosa dall'email

 Ciao


 ci sia o che non ci sia.
Ciao roberto 
noto con piacere che ti sei ripreso e che fra un maglione e l'altro trovi anche
il tempo
di risolvere qualche problema
uhmmmm.... il doevents "non" e' ininfluente. Se non lo mette non dovrebbe essere
in
grado di intervenire sulla maschera aperta


 Togli qualcosa dall'email
--


 maschera usando l'argomento acDialog del metodo OpenForm.
Negativo, se tolgo il loop interno su IsFormLoaded  non mi fa passare tutti
gli elementi del recordset, si ferma al primo. Se uso il metodo acDialog
(che non conoscevo, e che non mi propone fra le opzioni mentre scrivo il
codice) non mi apre la maschera, ma una specie di rozza vista-query.
Continuo a indagare, non era una cosa banale.
ciao e grazie mille per la condivisione del mio quesito
B.

 B.


 maschera "MSK Andamento situazione" lo imposti Pippo a True?
Si' si', il bottone in se' funziona,  setto pippo (che veramente io chiamo
"egress") a true, lo testo con un msgbox (e' true), chiudo la maschera, lo
testo con un msgbox appena fuori dall'inner loop (do while isFormLoaded ...
loop), e' diventato falso.
Ho anche provato a dichiarare la subroutine on click del bottone bailout
"public sub" ma niente.
La variabile e' dichiarata pubblica booleana in cima al codice della
maschera del menu' principale che apre l'applicazione, dopodiche' quando la
referenzio in vari punti del codice non fa problemi, segno che e'
inizializzata correttamente, non lo so perche' si perde.

 Ci rifletto su, in prima lettura non sono sicuro di aver capito.
    Vedo dagli ultimi post del thread che ancora non ne sei venuto a capo.
Come e' andata la riflessione? Fischia, se occorre una spinta, perche' la
strada del loop, come ti abbiamo fatto notare un po' tutti, non e' quella
piu' felice.
-- 


 ha scritto nel messaggio
news:b7k1m8$1na12$1...@ID-163647.news.dfncis.de...

Penso proprio che tu debba dichiarare la variabile pubblica Pippo in un
modulo.
Se l'hai dichiarata in cima al codice del modulo di classe della maschera
che apre l'applicazione, Pippo la dovresti vedere solo dal codice VBA che fa
parte del codice di classe di quella maschera.


 modulo.
Fatto, funziona. (non avevo mai usato moduli a se' stanti prima. pensavo
andassero invocati o simili. Invece, se ci sono, access li legge, ed e'
fatta). La variabile viene intercettata e riesco a interrompere il ciclo,
come desideravo. Il problema pratico e' risolto.
L'uso di un Loop (procedurale) effettivamente non e' elegante e non e' nello
spirito di access, era l'automazione iterativa di una cosa che facevo a
mano. Tempo avanzando, qs. sezione dell'applicazione andrebbe ripensata
ciao, e ancora grazie a te e a tutti.
B.