Newsgroup: it.comp.appl.access
Titolo: sommare valori numerici presenti in più campi

Buona sera,
ho circa 150 campi  con un numero basso di record
 
per ogni record sono presenti valori numerici in campi diversi 
 
ho anche dei campi che fungono da descrittore dei campi numerici.
 
ecco un esempio schematico
 
docente    Importo1  descr1   importo2  descr2   Importo3   descr3 ......... 
fanciullo    300       b        200        c       150        b
toma         150       c        40         b        300       a   
ricci        70        a        200        c       120        c 
tonello
 
devo sommare i descrittori B  di tutti i campi distintamente
così vale anche per gli altri descrittori C, e A
 
devo visualizzare le somme in delle caselle di testo in una maschera
 
texbox descristore B = 490
texbox descrittore A = 370
texbox descrittore c = 670
 
 
ho bisogno del vostro aiuto
grazie


i descrittori sono solo 3 a,b,c o sono di più?
dei 150 campi, quelli con importi da sommare sono tre o di più?
le colonne si chiamano esattamente cosi:  ImportoN-->DecrN  ?
 
 
 
ciao
BFS
 
 


sì i descrittori sono tre A, B, C
 
i campi da sommare sono 150
 
le colonne si chiamano proprio così importo1 --> descr1, e così via
 
e i totali devono essere proprio la somma di tutti i descrittori A, B, C presenti in tutti campi
 
grazie


se ti va bene una soluzione tramite codice la butto li velocemente:
 
se la tua tabella si chiama tabella e hai da importo1 a importo150
farei con dao
 
Dim db As DAO.Database
Set db = CurrentDb
Dim tuatab As DAO.Recordset
Set tuatab = db.OpenRecordset("tabella")
 
 
Dim descrA As Currency
Dim descrB As Currency
Dim descrC As Currency
 
Dim i As Integer
Dim totcol As Integer
 
totcol = 3 'cambia con 150
 
descrA = 0
descrB = 0
descrC = 0
 
While Not tuatab.EOF
     For i = 1 To totcol
         Select Case tuatab.Fields("descr" & i)
             Case "A"
             descrA = descrA + tuatab.Fields("importo" & i)
             Case "B"
             descrB = descrB + tuatab.Fields("importo" & i)
             Case "C"
             descrC = descrC + tuatab.Fields("importo" & i)
 
         End Select
     Next i
     tuatab.MoveNext
Wend
 
MsgBox "descr A = " & descrA & " descr B = " & descrB & " descr B = " & 
descrC
 
 
con la tabella del tuo esempio i conti tornano:
 
vedi qui
https://ibb.co/1rSxTWx
 
 
i risultati che hai nelle tre variabili puoi usarli dove vuoi
 
ciao
BFS
 
 
 

Il giorno mercoledì 31 luglio 2019 23:32:55 UTC+2, 
vito.f...@istitutoalberghieroabano.net
 ha scritto:

bellissimooooo,
io ci sarai arrivato per una via forse più tortuosa (DAO) appena sistemo il codice te lo invio così ci confrontiamo
grazie


In quale caso vengono memorizzati i dati in questo modo 
(descrittore/valore)?
Puoi farci un esempio dell'applicazione finale?

Il 01/08/2019 16:30, 
vito.fa...@istitutoalberghieroabano.net
 ha scritto:

ma come mai la tabella è strutturata in questo modo cosi strano?
avrebbe più senso usare due tabelle in relazione uno a molti
 
tabella docente con:
iddocente
nomedocente
...
 
tabella "importi"
 
iddocente
tipodescrittore
importo
 
fare la somma degli importi sarebbe cosi una banalità
 
BFS
 
 

Il giorno mercoledì 31 luglio 2019 23:32:55 UTC+2, 
vito.f...@istitutoalberghieroabano.net
 ha scritto:

IL fatto è che i dati provengono da un form con chronoform, quindi tutti in una tabella unica, per non scazzarmi a dividere i dati esportati da chronoform ho mantenuto tutto in una tabella. Ma presto ho intuito quanto è difficile gestire 150 campi


ciao BFS ecco il codice che ho con molta fantasia ho elaborato, ma funziona
 
Private Sub Form_Current()
Me.totA = 0
Me.TotB = 0
Me.TotC = 0
 
Dim DBx As Database
Set DBx = CurrentDb
Dim rs As Recordset
Dim NomeCampo As String 'il nome del campo che contiene gli importi: importo1
Dim Nomecampo2 As String ' il nome del campo che contiene i descrittori: descr1
 
 
Dim Fld As DAO.Field
For Each Fld In DBx.TableDefs("importi").Fields
   NomeCampo = Fld.Name
    If InStr([NomeCampo], "importo") Then
    Nomecampo2 = Right([NomeCampo], 1) ' prendo 1 dal campo importo1
    Nomecampo2 = "descr" & Nomecampo2 ' antepongo descr a 1 quindi ottento il nome del Nomecampo2 = descr1
 
 
    Set rs = CurrentDb().OpenRecordset("SELECT Sum(" & NomeCampo & ")as sommaB FROM importi GROUP BY " & Nomecampo2 & " HAVING " & Nomecampo2 & " ='b'")
        If rs.BOF Then
        'salta
        Else
        Me.TotB = Me.TotB + Nz(rs!sommaB)
        End If
 
    End If
 
    'quindi ripeto lo stesso codice per A e per C
Next
rs.Close
 
End Sub
 
Grazie a tutti per l'interessamento




Il tuo codice è molto più elegante e funzionale anche se ho fatto fatica a capire cosa fa. Ed ho capito questo:
tu in sostanza fai un ciclo tra tutti i record della tabella importi
poi per ogni record scorri i campi e con select case metti nelle variabili i valori del campo importi in base al descrittore A, B, C


Definire 'chronoform'
 


Chronoform è un componente Joomla che permette di implementare questionari in rete

 nomedocente


========================================
Private Sub Command8_Click()
Dim RS As Recordset, i, Sa, Sb, Sc
Set RS = CurrentDb.OpenRecordset("T", dbOpenDynaset)
Do Until RS.EOF
    For i = 2 To 6 Step 2
        If RS(i) = "a" Then Sa = Sa + RS(i - 1)
        If RS(i) = "b" Then Sb = Sb + RS(i - 1)
        If RS(i) = "c" Then Sc = Sc + RS(i - 1)
    Next
    RS.MoveNext
Loop
MsgBox Sa & "   " & Sb & "   " & Sc
End Sub
=======================================
 
Bruno


Perfetto funziona ma ho dovuto cambiare For i = 2 To 6 in For i = 3 To 7 perché  l'indice dei campi parte da 0

on 03-08-19, 
vito.fa...@istitutoalberghieroabano.net
 supposed :

Bravo! da me funziona così come esposto perché in Field 0 c'è
"Docente", poi da 1 a 6 la serie di campi Importo/Descr,
come riportato nell'esempio che hai indicato.
Cerca di essere meno approssimativo.
 
Bruno

Immagino che il valore del campo possa assumere solo 1 valore non 3... sicché controllarne semore 3 è inutile... come inutile è il ciclo interno peraltro..
 
Si usa
 IF...elseif...end if
 SELECT CASE... end Select
 
 
For i = 2 To 6 Step 2 
   SELECT CASE RS.Fields(i).value
      Case "a":  Sa = Sa + RS(i - 1) 
      Case "b":  Sb = Sb + RS(i - 1) 
      Case "c":  Sc = Sc + RS(i - 1) 
   End Select
Next 
 
Oppure dal momento che sono 3 controlli il ciclo dir...Next non serve a nulla sempre 3 righe di codice servo:
 
Do Until RS.EOF 
    If RS(2) = "a" Then Sa = Sa + RS(1) 
    If RS(4) = "b" Then Sb = Sb + RS(3) 
    If RS(6) = "c" Then Sc = Sc + RS(5) 
    RS.MoveNext 
Loop
 
@Alex


Tutto interessante, ringrazio per le lezioni:
BFS, RobertoA, Alex
Vito