Newsgroup: it.comp.appl.access
Titolo: goto o exit sub

ciao a tutti
 
su click di un pulsante ho inserito questo codice...
la domanda è:
per uscire dalla procedura è bene usare
goto fine (per poter annullare le variabili) oppure exit sub?
 
grazie
________________ inizio _______________
Dim Rs As DAO.Recordset, Rs1 As DAO.Recordset, RS2 As DAO.Recordset
 
Set Rs = Me.Recordset
Set Rs1 = Me!SM_CarichidaFatturare.Form.Recordset
Set RS2 = Me!SM_DettMiaFattura.Form.Recordset
 
Rs.Bookmark = Me.Bookmark
 
If Not Rs1.BOF And Not Rs1.EOF Then
  Rs1.MoveFirst
  Do Until Rs1.EOF
  If Me!DataMioDoc < Rs1!DataCarico Then
    MsgBox "Puoi inserire i carichi solo se superiori alla data Fattura " _
      & Me!DataMioDoc & ".", vbExclamation, "Attenzione!"
 
    Exit Sub oppure goto fine?
 
  ElseIf (Not IsNull(Rs!IdCliente) And _
    Rs!IdCliente <> Rs1!IdCliente) Or _
    (Not IsNull(Rs!IdFornitore) And _
    Rs!IdFornitore <> Rs1!IdFornitore) Or _
    (Not IsNull(Rs!IdAgenzia) And _
    Rs!IdAgenzia <> Nz(Rs1!IdAgenzia, 0)) Then
      MsgBox "Stai cercando d'inserire Carichi non corrispondenti.", vbExclamation, "Attenzione!"
 
      Exit Sub oppure goto fine?
 
  Else
    RS2.AddNew
 
    RS2!IdFattura = Rs!IdFattura
    RS2!IdCarico = Rs1!IdCarico
    RS2!IdSconto = Rs1!IdSconto
    RS2!IdSconto1 = Rs1!IdSconto1
    RS2!NumeroDoc = Rs1!NumeroDoc
    RS2!DataDoc = Rs1!DataDoc
    RS2!MioSconto = Rs1!MioSconto
 
    RS2.Update
    Rs1.MoveNext
 
  End If
  Me!SM_CarichidaFatturare.Requery
  Me!SM_DettMiaFattura.Form!CboCarico.Requery      
  Loop
 
End If
 
MsgBox "Non ci sono più record da aggiungere.", vbExclamation, "Messaggio!"
(Goto fine:)    
Set Rs = Nothing
Set Rs1 = Nothing
Set RS2 = Nothing
___________ fine _______________

Goto non si usa più... come il gosub...
Il modo giusto per uscire potrebbe essere Exit... ma non perderti dei pezzi...
Alcune volte si preferisce controllare il valore opposto per rimanere e non per uscire... in questo modo quando si esce si passa sempre per la parte finale della routine che ha il compito di Distruggere Oggetti e liberare risorse ed evitare di dover riscrivere ad ogni Exit tutta la pappardelle
 
Re.close
Set rs=Nothing
 
Ovviamente devi ragionare bene sui salti condizionati e sulla logica della condizione in quanto non è sempre uguale...
 
@Alex


grazie Alex
 
ma prendendo d'esempio questo codice
 
If Not Rs1.BOF And Not Rs1.EOF Then
  Rs1.MoveFirst
  Do Until Rs1.EOF
  If Rs!DataMioDoc < Rs1!DataCarico Then <-----
    MsgBox "Puoi inserire i carichi solo se superiori alla data Fattura " _
      & Rs!DataMioDoc & ".", vbExclamation, "Attenzione!"
  ElseIf (Not IsNull(Rs!IdCliente) And _
    Rs!IdCliente <> Rs1!IdCliente) Or _
    (Not IsNull(Rs!IdFornitore) And _
    Rs!IdFornitore <> Rs1!IdFornitore) Or _
    (Not IsNull(Rs!IdAgenzia) And _
    Rs!IdAgenzia <> Nz(Rs1!IdAgenzia, 0)) Then
      MsgBox "Stai cercando d'inserire Carichi non corrispondenti.", vbExclamation, "Attenzione!"
  Else
    RS2.AddNew
 
    RS2!IdFattura = Rs!IdFattura
    RS2!IdCarico = Rs1!IdCarico
    RS2!IdSconto = Rs1!IdSconto
    RS2!IdSconto1 = Rs1!IdSconto1
    RS2!NumeroDoc = Rs1!NumeroDoc
    RS2!DataDoc = Rs1!DataDoc
    RS2!MioSconto = Rs1!MioSconto
 
    RS2.Update
 
  End If
  Rs1.MoveNext
  Loop
 
quando arrivo in questo punto
 If Rs!DataMioDoc < Rs1!DataCarico Then
 
ed ho molti record con la data diversa,
msgbox viene ripetuto tante volte quanti sono i record;
come posso fare per interrompere il ciclo
senza usare exit sub o goto ecc. ecc.?

Per terminare i cicli si usa EXIT [tipoCiclo]
 
Per i Cicli FOR..Next si usa Exit [For]
 
Per uscire dal Ciclo DO...UNTIL/LOOP si usa Exit Do, in quel modo passi sempre per quella parte di codice che annulla/distrugge gli Oggetti senza usare Exit Sub.
 
https://www.tutorialspoint.com/vba/vba_exit_do_statement.htm
 
 
@Alex


Grazie 1000