Newsgroup: it.comp.appl.access
Titolo: Aggiornamento controlli calcolati (maschere e sottomaschere)

Buongiorno a tutti,
ho un problema da cui non riesco ad uscire.
Struttura delle maschere:
Ho una maschera "FrmProgetto" con campo chiave "Progetto" nella tabella sottostante.
 
Sottomaschera "SFrmOfferta" collegata alla maschera "FrmProgetto" tramite il campo "Progetto". Ha campo chiave "idofferta" e poi i campi "revisione" e "datarevisione".
 
Altra sottomaschera di "FrmProgetto" non collegata a nessun campo di "FrmProgetto", dal nome "SFrmOffertaRighe". Contiene i dettagli dell'offerta riguardante il progetto (varie descrizioni, costo interno di ogni riga di offerta, prezzo richiesto al cliente...). 
La tabella sottostante è collegata a quella di "SFrmOfferta" tramite il campo "idofferta". 
Nell'origine dati di "SfrmOffertaRighe", una query, ho un filtro legato al valore corrente di "idOfferta" in "SFrmOfferta" ([Maschere]![FrmProgetto]![SFrmOfferta]![IdOfferta]).
Sull'evento "Current" di "SFrmOfferta" ho inserito me.parent.SfrmOffertaRighe.requery, in modo che quando mi sposto da una riga all'altra di "SfrmOfferta" le righe di "SFrmOffertaRighe" si aggiornano di conseguenza.
 
(Se mi dite: perchè non hai usato una SubForm annidata in "SFrmOfferta": in Access 365 sembra ci sia un baco per cui l'annidamento mi dava problemi. In più con la struttura che ho creato, la lettura dei dati è più chiara).
 
Fin qui comunque tutto funziona. Il problema arriva adesso:
 
Nella maschera principale, "FrmProgetto" ho dei controlli calcolati (usano DSum) in cui sommo i campi di costo e di prezzo presenti in "SFrmOffertaRighe". 
Per fare in modo che modificando le righe di "SFrmOffertaRighe" questi campi calcolati si aggiornino, ho inizialmente inserito il seguente codice nell'evento "Form_AfterUpdate" di "SFrmOffertaRighe":
 
Me.Parent.BdgTot.Requery
Me.Parent.OrdTot.Requery
 
 
In sè funziona, i controlli calcolati si aggiornano. Il problema è che in "SFrmOffertaRighe" il focus si sposta sempre al primo record, mentre io vorrei andasse al record nuovo da compilare, o, almeno, rimanesse nel record che ho appena inserito/modificato.
Cercando nel gruppo e riciclando anche qualche soluzione che avevo già utilizzato, ho usato il seguente codice sempre in "AfterUpdate":
 
Dim rst As Recordset, strSearchName As String
 
 
'    Set rst = Me.RecordsetClone
 
'        strSearchName = Me!IdOffertaRiga
 
         Me.Parent.BdgTot.Requery
         Me.Parent.OrdTot.Requery
 
 
'       rst.FindFirst "IdOffertaRiga= " & strSearchName
'       me.Bookmark = rst.Bookmark
'                
 
In teoria funzionerebbe, però dopo l'evento "AfterUdate" si scatena anche l'evento "Current" di "SfrmOfferta" (me.parent.SfrmOffertaRighe.requery) e quindi torno sempre al primo record di "SFrmOffertaRighe".
 
Da qui ho "pastrocchiato" un po' cercando soluzioni alternative, ma senza risultato... qualche consiglio?
 
Grazie mille in anticipo!
 
Alessandro
 

Se apriamo la Guida di MS... scopriamo cose interessanti, ovvero le sostanziali differenze tra i 3 Metodi che molti non conoscono e confondono nell'utilizzo, e per non sbagliare usano il REQUERY.
 
I 3 Metodi sono:
RECALC
REFRESH
REQUERY
 
RECALC
https://docs.microsoft.com/en-us/office/vba/api/access.form.recalc
 
 
REFRESH
https://docs.microsoft.com/en-us/office/vba/api/access.form.refresh
 
 
REQUERY
https://docs.microsoft.com/en-us/office/vba/api/access.form.requery
 
 
Se la tua esigenza è di AGGIORNARE i campi calcolati... leggendo le 3 GUIDE probabilmente scoprirai che non serve il REQUERY... ma basta un RECALC
 
@Alex


Ciao Alex,
grazie. Avevo già letto le guide, ma ho approfittato per rileggere e capirci qualcosa in più anche grazie alla tua indicazione.
Il problema non mi si risolve anche con recalc, causa il fatto che dopo l'afterupdate della sottomaschera "SFrmOffertaRighe" si scatena l'evento "Current" della sottomaschera "SFrmOfferta" in cui, come scritto, ho il requery della sottomaschera "SFrmOffertaRighe". Non capisco perchè parta l'evento "Current"... comunque così è.
Ho risolto togliendo tutto il codice di cui sopra e mettendo un bel tasto nella maschera principale per il ricalcolo dei totali. Non elegantissimo, ma efficace.
 
Grazie dell'aiuto.
 
A.

Purtroppo come dicevo in un'altro 3D, l'evento CURRENT delle SubForm viene scatenato nonsolo su Richiesta, ma anche da tutta una serie di AZIONI ed EVENTI esterni alla SUBFORM...
Esempio se hai una Combo alla quale cambi il ROWSOURCE generi REQUERY di tutti gli oggetti DataBound e di fatto il CURRENT...
In certi casi si può Valutare l'uso di un campo che maschera nei REQUERY non voluti alcune azioni... ma nel tuo caso penso sia giusto come hai fatto.
 
@Alex

Se ho capito bene, invece di utiizzare i controlli nella maschera "FrmProgetto" per avere la somma dei campi di costo e di prezzo presenti in "SFrmOffertaRighe" prova a spostare gli stessi nel Piè di pagina della "SFrmOffertaRighe" assegnando alla loro Proprietà Origine controllo la formulla =Somma([nome campo]) e sarà direttamente access a fare il ricalcolo senza bisogno di nessun codice.