Newsgroup: it.comp.appl.access
Titolo: Simulare una msgbox con una mia maschera

Dalle FAQ, ho usato il codice che fa apparire un messaggio, che mi
chiede se voglio salvare i dati
appena modificati in una maschera.
Tutto ok
Solo che ora volevo ricostruire una maschera simile con i tre pulsanti
di scelta.
Ho provato, ma mentre con il codice da faq, quando modifico i dati ad
esempio nel record n.5 di maschera_base,
passo al record successivo, si apre la msgbox che mi consente o di
salvare la modifica, o di ritornare a maschera _base, o di annullare le
modifiche fatte.
Nel momento in cui si apre la msgbox, dietro alla stessa continuo a
vedere masch_base che rimane sul record 5 e solo se clicco su: Si
Accetto Modifiche, la maschera si posiziona sul record 6.
Invece, se creo una mia maschera (simile) e sull’evento
Form_BeforeUpdate di masch_base la apro, praticamente il record di
maschera base, passa subito a quello successivo, ed č chiaro che a
questo punto non posso, o meglio non so piů, come fare a ricreare i 3
pulsanti con le rispettive azioni simili a quelli della msgbox.
Eppure il codice che apre la msg e la maschera_simile č sempre dentro lo
stesso evento Form_BeforeUpdate di masch_base; la msgbox perň intercetta
l’evento, mentre la maschera_simile no.
Quindi devo risolvere sia il problema di intercettazione (come fa la
msgbox) e sia poi
il codice da inserire dentro i 3 pulsanti.
-----------
Riporto a titolo informativo l’oggetto e il codice della FAQ
E' possibile far apparire un messaggio che mi chiede se voglio salvare i
dati appena modificati in una maschera? Autore: Federico Luciani [
fluciani @
libero.it
] Ogni volta che Access cerca di salvare un record,
viene generato l'evento BeforeUpdate (Prima di aggiornare) prima che il
record venga realmente salvato.
Quindi se vogliamo annullare l'aggiornamento del record, ci basta
intercettare questo evento.
Private Sub Form_BeforeUpdate(CANCEL As Integer)
Dim retValue As Integer
   Dim strTtl As String
   Dim strMsg As String
   strTtl = "Salvare il record?"
   strMsg = "I dati sono cambiati." & vbCrLf & _
            "Vuoi salvare le modifiche?"
   retValue = MsgBox(strMsg, vbQuestion + vbYesNoCancel, strTtl)
   Select Case retValue
       Case vbYes
           'non fare nulla
       Case vbNo
           DoCmd.RunCommand acCmdUndo
       Case vbCancel
           CANCEL = True
   End Select
End Sub
------------
Ringrazio in anticipo

 maschera base, passa subito a quello successivo, ed è chiaro
cut
Il problema e' semplice.
Quando in una routine apri un msgbox, il codice interrompe l'esecuzione fino
a quando non premi uno dei pulsanti, mentre quando apri una maschera il
codice prosegue l'esecuzione senza indugio.
Quindi dovresti complicare un po' le cose per ottenere lo stesso risultato
con una maschera.
Ma tu quali pulsanti vuoi aggiungere? perche' in un msgbox hai varie
combinazioni, solitamente sufficielni a fare un po' di tutto.
Ciao, Sib
--
------------------------------------------------------
il sito comune di it.comp.database.access:
http://members.xoom.it/it_db_access
------------------------------------------------------
4000 anni fa', il saggio egizio Ptahhotep scrisse:
"... perche' non esistono saggi per nascita."
------------------------------------------------------
Saturiamo ECHELON:
bomba saddam attentato medio oriente

 combinazioni, solitamente sufficielni a fare un po' di tutto.
Devo aggiungere gli stessi pulsanti che ho nella msgbox della faq:
1)pulsante si: accetta modifiche al record
-in questo caso la msgbox si chiude e la masch_base va al record sucessivo
2) puls. no: non accetta modifiche
e si ritorna a masch_base con annullate le modifiche inserite
3) puls. annulla :
nessuna variazione, si ritorna alla masch_base, le modifiche inserite sono
rimaste, il record
è lo stesso e quindi posso continuare a modificare.
Solo che, nella mia maschera, poi ho la possibilità di aggiungere anche delle
caselle
di testo che mi servono per confrontare il valore precedente
(oldvalue) con quello eventualmente modificabile.
Ma mi sono fermato subito sull'apertura della maschera.
E' risolvibile?
Oppure vi sono altre soluzioni per avere quindi queste 3 azioni su una maschera
dove
posso anche leggere i valori vecchi con quelli nuovi eventuali.
ciao e grazie

"rr12rr" <rr1...@NOSPAMusa.net> ha scritto nel messaggio
news:39F2816E...@NOSPAMusa.net...

Prova a dare uno sguardo all'help alle proprietà delle maschere "Popup", "A
scelta obbligatoria" e "Stile bordo".
Magari con Popup = Si, A scelta obbligatoria = Si e Stile bordo = Dialogo
qualcosa riesci a fare.

Grazie a tutti per suggerimenti e chiarimenti inviati.
(funziona se in apertura maschera uso il Docmd.OpenForm … e acDialog)
Rimane ora il problema del codice da assegnare ai pulsanti.
1)pulsante si: accetta modifiche al record
-in questo caso la msgbox si chiude e la masch_base va al record successivo
nella msgbox è risolto con:
            Case vbYes              'non fare nulla
su click del mio pulsante
            DoCmd.Close acForm, "Maschera_che_simula_msg"
(n.b. da codice diretto non funziona, da macro invece si.
Quindi problema del 1° pulsante l’ho superato solo se su click inserisco una
macro
chiudi maschera )
2) puls. no: non accetta modifiche
e si ritorna a masch_base con annullate le modifiche inserite
nella msgbox risolto con:
Case vbNo
           DoCmd.RunCommand acCmdUndo
nel mio pulsante
[Forms]![masch_base].Undo
 DoCmd.Close
solo che mi dà il seguente errore
L’espressione su click immessa come impostazione della proprietà di evento ha
provocato il seguente
errore: La dichiarazione della routine di eventi non corrisponde alla
descrizione dell’evento con lo stesso
nome.
*L’espressione non corrisponde al nome di una macro, di una funzione definita
dall’utente oppure a
[Routine Evento].
*Si è verificato un errore durante la valutazione di una funzione, di un evento
o di una macro.
praticamente lo stesso errore che dava per il primo pulsante solo
che ora non so come fare un macro che svolga tale procedura
3) puls. annulla :
nessuna variazione, si ritorna alla masch_base, le modifiche inserite sono
rimaste, il record è lo stesso e quindi posso continuare a modificare.
nella msgbox risolto con:
Case vbCancel
           CANCEL = True
nel mio codice del pulsante ho messo
Private Sub Comando3_Click()
''CANCEL = True
''DoCmd.Close
End Sub
solo che dà lo stesso errore di sopra
Riporto nuovamente il codic della faq
Quindi se vogliamo annullare l'aggiornamento del record, ci basta
intercettare questo evento.
Private Sub Form_BeforeUpdate(CANCEL As Integer)
Dim retValue As Integer
   Dim strTtl As String
   Dim strMsg As String
   strTtl = "Salvare il record?"
   strMsg = "I dati sono cambiati." & vbCrLf & _
            "Vuoi salvare le modifiche?"
   retValue = MsgBox(strMsg, vbQuestion + vbYesNoCancel, strTtl)
   Select Case retValue
       Case vbYes
           'non fare nulla
       Case vbNo
           DoCmd.RunCommand acCmdUndo
       Case vbCancel
           CANCEL = True
   End Select
End Sub
Ringrazio di nuovo

 rimaste, il record è lo stesso e quindi posso continuare a modificare.

Perchè non provi ad inserire i pulsanti di comando attivando
l'autocomposizione controllo, così il codice VBA viene creato
automaticamente?
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/
---------------------------------------------

Ulteriore grazie per gli ulteriori suggerimenti postatomi
(riposterò come Annullare l’evento Sub Form_BeforeUpdate)
N.b.  considerare nel post
Sub =
Private Sub Form_BeforeUpdate(Cancel As Integer)
……….
End Sub
Devo ora risolvere l'azione dell'ultimo pulsante: mentre nel codice della
msgbox,  posso assegnare
alla variabile CANCEL di Sub il valore true, essendo, tale assegnazione una
parte del codice della
msgbox e quindi scritto proprio dentro la procedura Sub, la stessa cosa non la
posso più fare da un
evento click di un pulsante messo su una maschera che viene aperta dalla
procedura stessa Sub.
Devo al click fare in modo che la Sub non venga portata a termine.
Praticamente quello che fa l’assegnazione CANCEl=true della msgbox
Ho provato anche con docmd.cancelevent dentro al click del pulsante ed anche da
macro ma non va.
Ho provato a mettere dentro la Sub di masch_base anche cancel=MiaVariabile
Poi sul click di masch_2 MiaVariabile=True ma niente
dà variabile non definita. La variabile in realtà è public ma ipotizzo che
siccome
la routineevento Sub è privata (impostazione predefinita; si può rendere
pubblica?)
allora non riconosce MiaVariabile
Risintetizzo i vari passi confrontandoli con quelli della msgbox
Ho una masch_base con tre caselle di testo collegate a tre campi.
Sull'evento prima di aggiornare di masch_base ho una routine
che mi apre una msg box che mi chiede se voglio
1)salvare le modifiche
2)non salvare le modifiche
3)annulla
se clicco su annulla, si chiude la msgbox e ho la maschera nel punto
immediatamente
prima dell'apertura della msgbox: se mi trovavo nel record 5 e avevo modificato
la prima casella,
mi ritrovo sempre allo stesso punto; quindi casella 5 e casella con la modifica
che avevo scritto.
Praticamente viene annullato l'evento Sub dal codice della msgbox infatti vi è
Cancel=True.
Ora, se invece di aprire una msgbox, apro una mia maschera, è chiaro che dentro
la  Sub non ho più la
possibilità di scegliere Cancel=True, ma devo fare in modo che dalla maschera
aperta dalla Sub
io possa comunque annullare la procedura stessa (Sub)
Non so proprio come fare
Quindi:
Con la msgbox:
Private Sub Form_BeforeUpdate(Cancel As Integer)
all'interno
posso scrivere cancel=true
e quindi annullare la sub
End Sub
Con una mia maschera_2
Private Sub Form_BeforeUpdate(Cancel As Integer)
apro la mia maschera_2
e a questo punto dal click di un pulsante su
tale maschera non posso
più  intercettare la sub con un cancel=true
(meglio dire:  non so come si possa fare)
End Sub
Riporto anche il codice della msgbox
Private Sub Form_BeforeUpdate(CANCEL As Integer)
Dim retValue As Integer
   Dim strTtl As String
   Dim strMsg As String
   strTtl = "Salvare il record?"
   strMsg = "I dati sono cambiati." & vbCrLf & _
            "Vuoi salvare le modifiche?"
   retValue = MsgBox(strMsg, vbQuestion + vbYesNoCancel, strTtl)
   Select Case retValue
       Case vbYes
           'non fare nulla
       Case vbNo
           DoCmd.RunCommand acCmdUndo
       Case vbCancel
           CANCEL = True             < -------------  qui mi annulla la sub
   End Select
End Sub
Spero di essere stato chiaro
Ciao