Newsgroup: it.comp.appl.access
Titolo: sottomaschera che non va!

Ciao ragazzi ho due problemi:
1° in un database ho creato una maschera con sottomaschera sull'evento 
clic del pulsante salva si dovrebbe verificare quanto scritto nel codice 
sottostante, solo che tutto è vero se applicato ai campi della maschera, 
se però mi sposto a compilare i campi della sottomaschera la condizione 
posta nel codice non funziona
dove sbaglio?
Private Sub Salva_Click()
Dim ctl As Control
For Each ctl In Me.Controls
         If ctl.Tag = "x" Then
             If IsNull(ctl) Or ctl = "" Then
             MsgBox "Il campo " & Mid$(ctl.Name, 1) & " non può essere 
vuoto!"
             DoCmd.GoToControl Mid$(ctl.Name, 1)
             Exit Sub
             End If
         End If
     Next ctl
     DoCmd.RunCommand acCmdSaveRecord
     Docmd.GoToRecord,,NewRecord
End Sub
2° se utilizzo il tabulatore per spostarmi da un campo allaltro, nel 
momento in cui arrivo all'ultimo campo della sottomaschera viene fatto 
un "salvataggio" in automatico del record e si passa ad un nuovo record, 
vorrei impedire tutto questo e costringere l'utente, per salvare ed 
andare avanti, a cliccare sul pulsante salva.
Ciao e grazie

 ha scritto nel messaggio
news:O0iyd.555789$35.23...@news4.tin.it...

Ciao Maurizio.
Il ciclo che hai impostato itera la Classe Controls di Controlli
riferiti alla Form(Me).
Tra questi trovi tutti i controlli di Me incluso il Controllo SubForm, ma
ovviamente non i Controlli dell'Oggetto SubForm.
Per ottimizzare e far funzionare quel ciclo anche sui Controlli
della SubForm devi innanzitutto avere una buona conoscenza di
VBA in quanto è d'obbligo l'uso di una Ricorsiva sulla Classe.
In pratica devi strutturare una Funzione che passando come
parametro un oggetto Form iteri tutti i controlli all'interno, ma
se tra i controlli c'è un controllo acSubForm allora deve ricorsivamente
richiamare la funzione passando la SubForm come parametro della
funzione stessa.....!
Ti ho ben confuso la faccenda vero...., il problema è che le cose stanno
proprio
così.....!
Ti faccio un esempio che peraltro dovrebbe funzionare:
Private Sub Salva_Click()
    Call checkEmpty(Me)
End Sub
Private Function checkEmpty(frm as Access.Form)
 Dim ctl As Control
 For Each ctl In frm.Controls
        If ctl.ControlType=acSubForm then
        '------------------------------------------------------
        '    QUESTA E' LA RICORSIONE
        '------------------------------------------------------
                checkEmpty(ctl.Form)
        Else
            If ctl.Tag = "x" Then
                If IsNull(ctl) Or ctl = "" Then
                      MsgBox "Il campo " & _
                                   Mid$(ctl.Name, 1) & _
                                  " non può essere  vuoto!"
                      ctl.SetFocus
                      Exit Sub
                End If
            End If
Next ctl
Spero di non averti peggiorato la faccenda.
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

ALESSANDRO Baraldi ha scritto:

Ho utilizzato il tuo esempio ma purtroppo non è cambiato nulla, 
sicuramente sbaglio in qualcosa (le mie conoscenze di VBA sono 
limitate), mi aresti una mano?
La maschera pricipale si chiama pippo la sottomaschera pluto, stando al 
tuo esempio ho scritto qnato segue:
Private Function checkEmpty(pluto As Access.Form)
  Dim ctl As Control
  For Each ctl In pippo.Controls
         If ctl.ControlType = acSubform Then
         checkEmpty (ctl.Form)
         Else
             If ctl.Tag = "x" Then
                 If IsNull(ctl) Or ctl = "" Then
                       MsgBox "Il campo " & _
                                    Mid$(ctl.Name, 1) & _
                                   " non può essere vuoto!"
                                   ctl.SetFocus
                       Exit Function
                 End If
             End If
         End If
Next ctl
...
End Function
Dove sbaglio?


Purtroppo hai voluto fare di più di quello che era necessario....!
Ora purtroppo io non sò come hai impostato la tua struttura, ma
quanto ti ho passato funziona(come ricorsione) il resto dipende dalle
tue impostazioni.
Hai messo nei controlli della SubForm nelle proprietà TAG=X...?
Poi questa dicitura che senso ha...?
        Mid$(ctl.Name, 1)
    equivale a:
        ctl.Name
    perchè usarla...?
Secondo me hai qualche altra cosa che non torna ma non saprei come
aiutarti.
Il codice corretto è questo non cambiare nulla COPIA/INCOLLA.
Private Sub Salva_Click()
    Call checkEmpty(Me)
End Sub
Private Function checkEmpty(frm As Access.Form)
   Dim ctl As Control
   For Each ctl In frm.Controls
          If ctl.ControlType = acSubform Then
              ctl.setfocus
              call checkEmpty (ctl.Form)
          Else
              If ctl.Tag = "x" Then
                  If IsNull(ctl) Or ctl = "" Then
                        MsgBox "Il campo " & _
                                     ctl.Name & _
                                    " non può essere vuoto!"
                                    ctl.SetFocus
                        Exit Function
                  End If
              End If
          End If
 Next ctl
 ...
 End Function
Ciao


ALESSANDRO Baraldi ha scritto:

E' vero avevo dimenticato qualche dettaglio ora funziona ma in parte, 
nel senso che quado passo ai controlli della sottomaschera tutto 
funziona per il primo controllo, ma per gli altri controlli non si 
verifica niente eppure anche in quelli alla voce TAG ho messo x, c'è un 
motivo?

 motivo?
Sicuramente c'č, ma devi anche imparare ad usare il DEBUG e
trovare il perchč.
Ti assicuro che funziona, a distanza e non
sapendo in che altro contesto lavora non posso dirti altro.
