Newsgroup: it.comp.appl.access
Titolo: quale evento utilizzare

salve
 
ho una serie di caselle di testo associate a campi di tabella
 
ho anche 2 caselle di testo non associate txt1 e txt2
che hanno un calcolo associato
 
ho provato a utilizzare 
txt1_after_update()
ma ma non si scantena l'aggiornamento
 
 
 
che evento devo utilizzare?
 
GRAZIE


se ho ben inteso, e comunque in generale:
 
SE ci sono textbox che effettuano calcoli con dati
che, almeno in parte, sono presenti su altri controlli della form
 
quando si apre la form le textbox che calcolano "dovrebbero" dire il giusto
 
ma se si cambiano dati che determinano il calcolo
 
occorre, all'evento afterUpdate del controllo con i dati
imporre il requery delle textbox che calcolano


grazie
 
il discorso e' un po' complesso
 
txt_legato1=campo1
txt_legato2=campo2
 
txt1 = miocalcolo ( che prende anche valori da txt_legato1 e txt_legato2)
txt2 = txt1
 
come far aggiornare in automatico txt1 e di conseguenza txt2 
 
pensavo di mettere in afterupdate txt1_legato1 e txt_legato2 
 
call esegui_miocalcolo
 
 


non ottieni niente mettendo, in afterUpdate di txt1_legato1 e txt_legato2,
txt1.requery e txt2.requery ?
 
 
 

 
provo a fare un esempio 
 
se ho 4 caselle di testo associate a campi
 
 PLordo1 
 PTara1
 PLordo2
 PTara2
 
creo due caselle di testo (non associate) con il totale peso e
 
 
txtTotNetto
txtTotPesoNetto_Testa   (un'altra casella che mi riporta lo stesso valore )
 
 
Sub mioCalcolo()
   Dim nTotPeso As Single
   nTotPeso = (Nz(PLordo1, 0) - Nz(PTara1, 0)) + _
              (Nz(PLordo2, 0) - Nz(PTara2, 0))
   txtTotNetto.Value = nTotPeso
   txtTotPesoNetto_Testa.Value = nTotPeso
End Sub
 
cioe' vorrei centralizzare i calcoli in una funzione e non nella controlSource

Perché questa bizzarra voglia...?
Vorrei capire se hai un motivo specifico oppure è una scelta arbitraria.
 
@Alex


mah, ho presente situazioni mie praticamente uguali
e in fondo la cosa appare (con sospetto per me di aver preso un abbaglio) piuttosto semplice:
 
SE i controlli sono tutti su una form
 
mioCalcolo() è, di fatto, una routine della form
(infatti ha il compito di aggiornare controlli della form)
 
quindi, ad ogni afterUpdate di 
  PLordo1 
  PTara1
  PLordo2
  PTara2
è sufficiente inserire
mioCalcolo
 
Private Sub controlloConDati_AfterUpdate()
mioCalcolo
end sub
 
se non ottieni niente 
il sospetto cade sulla funzione Nz
o nella scrittura "doppiata" (uguale) di nomeControllo E nomeCampo
 
mi sembra che RobertoA, pochi post fa,
sia incappato in un tranello simile


AGGIUNTA
e, proprio per pensarle tutte,
può essere necessario REGISTRARE il record
(se non si incappa nel mancato rispetto di una regola di convalida)
 
Private Sub controlloConDati_AfterUpdate()
If Me.Dirty = True Then Me.Dirty = False
mioCalcolo
end sub

Grazie dei messaggi
Sono arrivato a ciò perché ovviamente i calcoli sono molto più complessi e anche il numero di campi é decisamente superiore. Il discorso é di centralizzare i calcolo per poter velocemente controllare il codice.

 Sono arrivato a ciò perché ovviamente i calcoli sono molto più complessi e anche il numero di campi é decisamente superiore. Il discorso é di centralizzare i calcolo per poter velocemente controllare il codice.
 
l'edeale sarebbe scatenare un unico evento per una serie di controlli che hanno ad esempio TAG="calcola"
 
si potrebbe fare? come?

Basta mettere nell'evento la chiamata ad ù a funzione... invece di Routine Evento... e questo però è da valutare perché se hai 100 controlli lo chiamano tutti e 100... e forse è inutile.
 
@Alez

 @Alez
 
inutile ma devi pensare che non so quale dato inserisce l'utente
 
avendo una maschera con moltissimi controlli dovrei mettere la chiamata su after_update dei vari controlli ma oltre a questo lanciare la fuzione calcola quando si apre la mascehra perche' altrimenti dopo il caricamento dei valori dei campi le caselle di testo "clacolate" non si aggiornano
 
ma su che evento?  form_activate?

 si potrebbe fare? come?
 
mah
SOLO per continuare (è una mattina piovosa ...)
teoricamente mi sembra stia in piedi, ma penso che l'"impatto" sia gravoso
 
all'evento dirty della form
si può fare un ciclo dei controlli con il tag
valutando la differenza fra oldvalue e value
 
al primo riscontro di differenza si esce dal ciclo e si lancia 
la routine/funzione


NO HO SBAGLIATO,
l'evento dirty SCATTA PRIMA di update

devo tenere conto di alcune casistiche:
- maschera legata e quindi caricamento dati da record
- inserimento dati nelle caselle di testo
 
 
tutto funziona da pulsante calcola ma non funziona da ctrl_Update()
 
dubbio: qui il nome del controllo legato coincide col nome del campo
 
se credete invio link per un semplice esempio da vedere che ha problemi
https://www.transferbigfiles.com/e84e8960-3f1e-4875-9c07-9153ea032e00/CKwjtEx5xTJuhjB5uOCBig2
 



Sinceramente non riesco a seguire perché sospetto che di base ci sia qualche accrocchio.
 
Se hai 10 controlli come contribuenti del calcolo devi decidere se vuoi eseguire il ricalcolo ad ogni evento Update dei 10 controlli.
Se la risposta è sì, sì gestisce l'evento singolo e scrivendo sull'evento AfterUpdate(Non before perché può essere annullato) 
=Ricalcola()
Quindi scrivi una funzione PUBLIC nella form chiamata Ricalcola...
Nella funzione verifichi DIRTY anche se sarà sempre TRUE altrimenti non si sarebbe scatenato AfterUpdate... ma trovo buona cosa farlo, escludendo tuttavia il caso di NEWRECORD in quanto avresti inserimenti parziali.
Questo rende semplice l'aggiornamento.
 
 
Ci sono poi tecniche piu raffinate...(Classi MasterClassi con eventi persanlizzati) ma credo non sia il caso di affrontarle sia perche mi pare siano eccessive per questa necessita ma anche perché serve avere una visione più strutturata per impostare queste gestioni.
 
Boh per il resto... continuo a non capire.
 
@Alex


grazie dei consigli prima di tutto
sto portando avanti questo perche' molte volte anche a distanza di tempo mi richiedono di cambiare i calcoli e se centralizzassi il tutto diventa molto più facile.
 
il mio dubbio resta ancora: 
(come di scrivevo metto in alto sopra una CTrlTab) il totale dei totali) 
se ho una casella che visualizza il valore di un'altra che evento devo utilizzare 
 
nella funzione Ricalcola scrivo
txtTot.value  = a*b
 
 
perche' se metto nell'evento 
 
sub txtTot_AfterUpdate()
  txtTotDeiTot.value =txtTot.value
end sub
 
non funziona?
GRAZIE
 
 
 

Se fai un Me.Repaint o Recalc che succede...?
Gli eventi richiamati da VBA secondo me non hanno gli stessi effetti del sistema che li genera... intendo come Refresh video.
 
Per questo assegnare ai controlli calcolati il calcolo in OrigineControllo su n controlli, poi è sufficiente un Me.Recalc per forzare il ricalcolo dei calcolati.
La funzione inserita in ControlSource rientra nei calcolati.
 
@Alex


funziona 
se metto in origine controllo di txtDiToT   =[txtTot]
 
funziona
 
me se lascio vuota origine controllo di txtDiToT
e nell'evento AfterUpdate o Change di TxtTot
Private Sub txtTotNetto_AfterUpdate()
   txtDiTot= nTotPeso
   Me.Repaint
   Me.Recalc
End Sub  NON FUNZIONA

 End Sub  NON FUNZIONA
 
cosa succede con
 
Private Sub txtTotNetto_AfterUpdate()
If Me.Dirty = True Then Me.Dirty = False 
'che FORZA la "consapevolezza" del sistema (dovrebbe scaricare i buffer, "dovrebbe" ...)
  txtDiTot= nTotPeso
 
End Sub


ma il problema e' che se aaggiorno un campo non associato 
da VBA non si scatena l'evento _AfterUpdate?
 
Come posso forzare ?
 
GRAZIE
 
 
 

Se haingeneratonu a sub/Function che chiami dopo Update dei controlli Associati... lo sai bene quando viene aggiornato anche il controllo calcolato...
Se metti la Function come ControlSource devi generare il Recalc e la chiamata alla Function lo sai che si scatena per Update del controllo calcolato...
Cosa continua a sfuggirmi...?
 
@Alex


haingeneratonu ??? che vuol di?
 
se metto nell'avento _after_update di un controllo legato (txt1) il richiamo di una funzione che calcola valori e li mette il risulttato in in controllo non associato funziona (es txtControlloNonAssociato)
 
noto pero' che se ho un controllo txt2 che ha nella proprietà ControlSource --> =txtControlloNonAssociato questa non viene aggiornata quando si aggiorna txtControlloNonAssociato
 
pensavo di forzare mettendo 
 
sub txtControlloNonAssociato_after_update()
    txt2.value = txtControlloNonAssociato.value
end sub
 
ma noto che dal debug l'evento non si scatena nemmeno
 
 
 
 

La tastiera dei smartphone ha un linguaggio primitivo...
"HAI GENERATO UN..."
 
Infatti ti ho suggerito di far chiamare una Function così da riuscire ad averne traccia...
 
@Alex

 ma noto che dal debug l'evento non si scatena nemmeno
 
infatti, dalla guida A2003
 
Eventi PrimaDiAggiornare, DopoAggiornamento
La modifica dei dati di un controllo tramite Visual Basic o una macro contenente l'azione ImpostaValore non provoca questi eventi nel controllo. 
 


e quindi, ho provato con A2003,
se si vuol ottenere "una risposta attesa"
(e magari prolungare una catena di valorizzazioni)
dopo la modifica di un valore da codice
 
occorre definire Public l'evento AfterUpdate
nel controllo valorizzato
 
e completare la modifica da codice  
con Me.nomeControlloValorizzato_AfterUpdate