Newsgroup: it.comp.appl.access
Titolo: calcolo campi con do until

Salve ho da porvi un quesito per me strano, anche se sono sicuro che la soluzione sarà semplice. Di fatto però non riesco a trovare la soluzione, e per questo chiedo il vostro prezioso aiuto.
 
In pratica ho creato una sub all'interno di una maschera con 4 sottomaschere,
la cui sub deve assegnare il valore di un campo calcolato di ogni singola sottomaschera, a 4 differenti campi della maschera madre. Successivamente questi ultimi campi verranno calcolati per restituire un totale.
Cerco di spiegarmi meglio:
 
Le maschere in questione sono:
 
Masc0 (maschera madre)
 
Le sottomaschere
Sot_masc1
Sot_masc2
Sot_masc3
Sot_masc4
 
Ogni sottomaschera è calcolata in base a due campi Tot=[Q.tà]*[Prezzo]. A pié di pagina una casella di testo somma i risultati del Recordset.
 
la sub che ho creato funziona così
 
Sub calcola()
Do Until IsNull(id)
 
If IsNull([Sot_masc1].Form![Testo1]) Then
masc0_testo1 = 0
Else
masc0_testo1 = [Sot_masc1].Form![Testo1]
End If
 
If IsNull([Sot_masc2].Form![Testo2]) Then
masc0_testo2 = 0
Else
masc0_testo2 = [Sot_masc2].Form![Testo2]
End If
 
If IsNull([Sot_masc3].Form![Testo3]) Then
masc0_testo3 = 0
Else
masc0_testo3 = [Sot_masc3].Form![Testo3]
End If
 
If IsNull([Sot_masc4].Form![Testo4]) Then
masc0_testo4 = 0
Else
masc0_testo4 = [Sot_masc4].Form![Testo4]
End If
 
Masc0_totale = masc0_testo1 - masc0_testo2 + masc0_testo3 - masc0_testo4
 
Me.id.SetFocus
Loop
Close
End Sub
 
fin qui tutto ok
 
IL PROBLEMA
Quando avvio la sub calcola, si avvia il processo
e ogni campo testo della maschera principale ha un risultato corretto tranne masc0_testo4 che restituisce valore 0 per tutto il recordset.
 
Ho notato che se creo un bottone con il solo codice 
If IsNull([Sot_masc4].Form![Testo4]) Then
masc0_testo4 = 0
Else
masc0_testo4 = [Sot_masc4].Form![Testo4]
End If
 
il risultato viene aggiornato correttamente, ma come capite bene per ogni record dovrei cliccare sul bottone allungando di molto i tempi.
 
Vorrei chiedervi cosa causa il problema e come potrei risolverlo.
Grazie anticipatamente!!
 
 

Nel codice su digitato manca una stringa prima della chiusura del ciclo:
DoCmd.GoToRecord , , acNext
 
un'altra cosa che ho notato:
quando clicco sul secondo comando che avvia separatamente il calcolo di masco0_testo4
 
talvolta devo cliccare 2 volte per ottenere il risultato.

help please...!!!

eseguì il ciclo in debug x vedere se le espressioni vengono valutate correttamente e o record valutati sono quelli giusti

Il codice si ripete 4 volte (cambiano solo i campi di riferimento). Non capisco perché per i primi tre funziona e per l'ultimo no.

A me sembra che il codice è abbastanza corretto.
 
Certo che non è ben chiaro da dove prenda i dati la maschera "Masc0"
ma immaginiamo che si tratti di una tabella con 5 campi associati rispettivamente a:
masc0_testo1
masc0_testo2
masc0_testo3
masc0_testo4
Masc0_totale
( evitiamo di parlare della rindondanza che c'è fra il campo Masc0_totale e gli altri 4 campi ( il 1° è la sonna degli altri ?? ))
 
Non mi è assolutamente chiaro da dove prendano i dati le 4 sottomaschere
ma non è rilevante perche in fondo le consideriamo delle caselle di testo con dentro dei valori numerici
 
 
Quello che invece mi sembra veramente ASSENTE è 1 riga che ti sposta in avanti nei record ???
ma questo non dovrebbe provocarti l'inconveniente lamentato
    <code>
      ' ........
      Me.id.SetFocus
      DoCmd.GoToRecord , , acNext
      Loop
      ' .........
    </code>
 
Dacci qualche dettaglio in piu  oppure postaci una minidemo con il problema
 
.

@mancini, intanto grazie per aver risposto.
Per quanto riguarda le tue domande provo rispondere, aiuteranno anche altri a capire meglio quale potrebbe essere il problema:
 
La masc0 ha 5 caselle di testo. 4 di esse ricevono un valore (valuta) dalle sottomaschere. Es. Testo1 della masc0 riceve il valore dalla sot_masc1. Testo2 della masc0 riceve il valore dalla sot_masc2, e così testo3 e testo4. Somma e differenza (vedi codice scritto sopra) calcolano nella casella di testo5 il  "gran totale".
 
Il valore che viene passato dalle sottomaschere ė la somma della colonna tot_parz che ognuna delle sottomaschere ha. Ognuna delle sottomaschere, infatti, prevede 3 campi, così predisposti:
q.tà * prezzo = tot_parz1 (tutto questo per n record). A pié di pagina in una casella di testo viene calcolata la somma dei tot_parz (codice: =somma(tot_parz1) ). È questo risultato che viene passato alla casella di testi1 della masc0.
 
La sot_masc2, sempre a piè di pagina, ha una somma dei tot_parz2. Questo valore viene passato alla casella di testo2 della masc0.
 
E così tot_parz3 e tot_parz4.
 
 
Per quanto riguarda  il codice che permette l'avanzamento a record successivo è stata una svista nel trascriverlo in questo 3D. Nel codice sorgente del database è correttamente inserito.
 
Il problema che si verifica, riguarda soltanto la mancanza di passaggio del valore durante il ciclo di tot_parz4 alla casella di testo4. Alla fine del ciclo, infatti tutti i record presenti in masc0 hanno in tutti i record  nella casella di testo4 valore = a zero.
 
Ulteriori info:
Masc0 raccoglie tutti i dati anagrafici dei clienti + quelle caselle di testo di cui abbiamo parlato fino ad ora che rappresentano il totale dei diversi movimenti effettuati riportati nelle 4 sottomaschere. Queste ultime sono collegate a 4 tabelle che hanno una relazione 1 a molti con la tabella anagrafica clienti, dalla quale, come ho detto prima, prende i dati masc0.
 
Mi auguro che così sia piú chiaro :D

@fair87 grazie anche a te. Potresti spiegarmi meglio cosa/come dovrei fare, per favore? 


Si,  è piu chiaro ma non è diverso da come lo havevo gia capito.
quindi confermo deve ( dovrebbe ) funzionare 
 
Ho la sensazione che il problema sta in  [Sot_masc4].Form![Testo4] 
noi prendiamo per buono che li ci sia un valore,  ma ne sei sicuro ???
 
prova a fare 2 esperimenti:
 
1°
In [Sot_masc4].Form![Testo4]   elimini la sua formula di Somma o Altro che sia
e ci metti un "Valore Predefinito"  ( per esempio 12 )
----  Vediamo se ti restituisce ancora tutti zeri !!!!!!!
 
2°
sostituisci il tuo codice con questo che fa esattamente le stesse cose ma ha 
delle variabili che puoi vedere facendo il Debug nella finestra delle variabili locali e controlli record per record il valore della sottomaschera4  (T4)
 
[code]
Sub calcola()
 
Dim T1 As Double, T2 As Double, T3 As Double, T4 As Double
 
    Do Until IsNull(Me.id.Value)
        T1 = Nz([Sot_masc1].Form![Testo1].Value, 0)
        T2 = Nz([Sot_masc2].Form![Testo2].Value, 0)
        T3 = Nz([Sot_masc3].Form![Testo3].Value, 0)
        T4 = Nz([Sot_masc4].Form![testo4].Value, 0)
 
        Stop   ' si fermera qui,  Apri la "Finestra delle variabili locali" e leggi il valore di T4
        ' poi mettici un apostrofo prima di Stop
 
        Me.masc0_testo1.Value = T1
        Me.masc0_testo2.Value = T2
        Me.masc0_testo3.Value = T3
        Me.masc0_testo4.Value = T4
        Me.Masc0_totale.Value = T1 - T2 + T3 - T4
        Me.id.SetFocus
        DoCmd.GoToRecord , , acNext
 
    Loop
 
Close   'Cosa devi chiudere ???????
'elimina questo Close se non ti serve !!!
 
End Sub
[/code]
 
 
 
 
 
 
 
 
 

@mancini
ho provato il codice che mi hai inviato (esteticamente molto più bello e snello)
ma il risultato non cambia :(
 
non so come risolvere il problema!!

> ma il risultato non cambia :(
 
A parer mio hai un problema che non c'entra nulla con il codice,
 
bensi c'entra con il valore della casella di testo
[Sot_masc4].Form![Testo4]
 
 
ma per caso prima di eseguire quella "Sub calcola()" vai ad eseguire delle operazioni di imposta valore sulla casella di testo "[Testo4]" ???
oppure sui controlli che danno origine al valore calcolato di "[Testo4]" ???
 
e se si considerato che stiamo parlando proprio dell'ultima casella 
ti sei ricordato di spostare il focus altrove ?????
Verifica bene questo dettaglio  perche è importante <<<<<<
 
 
Facci sapere
 

@MANCINI
Purtroppo proprio non riesco a capire quale sia il problema. Da quello che ho letto sul web probabilmente dipende dal comando DoCmd.GoToRecord , , acNext all'interno del ciclo do loop.
 
infatti nei diversi tentativi fatti ho cambiato completamente tutta la struttura del programma, adesso infatti c'è una sola sottomaschera.
Ma ahimé rimane il problema del passaggio di valori durante lo svolgimento del ciclo do loop.
 
Nella speranza che il tutto si possa risolvere posto il link dove poter scaricare una dimostrazione e visionare nello specifico il flusso del codice:
 
https://www.dropbox.com/s/7isqz8lxopw8uu5/xx%20Dati%20Libri%202013.mdb
 

In pratica la mia difficoltà è come passare, i valori ottenuti attraverso il ciclo do loop, da una sottomaschera a una maschera principale. Lo stesso codice del bottone di comando nella sottomaschera (copio e incollo in una routin click della maschera principale con le opportune modifiche per il rif. ai campi della sottomaschera) e il ciclo ancora funziona. Ma se lo inserisco in form_load () o altre routin automatiche il codice non va.
Sapete perché ?

 Sapete perché ?
 
Non ho capito tutto,
Forse questo  xx06.mdb si avvicina alla soluzione
https://skydrive.live.com/#cid=A571D4F7DF332873&id=A571D4F7DF332873%21116
 
 
facci sapere
.