Condividi tramite

Qual'è il codice vba che permette di sommare i valori di un campo Recordset?

Anonimo
2012-04-17T10:24:37+00:00

Poniamo di creare un Recordset con il codice seguente:

Set Sp = CurrentDb.OpenRecordset("SELECT RISORSA, IMPORTO FROM Movimenti")

mettiamo che il Recordset venga popolato così:

Risorsa 1   Importo 200

Risorsa 2   Importo 300

Come faccio a sommare 200 e 300 ? Ho provato con questo codice: 

Set Ps = CurrentDb.OpenRecordset("SELECT Sum(" & Str(CDec(Nz(Sp(1)))) & ")")

ma quando vado a leggere Ps(0) mi dice "Tipo non corrispondente".

Tra l'altro, questa somma (500), dovrei aggiornarla nel campo x di una tabella "fisica" Y

Non è che si possa sommare e aggiornare tutto in una riga vba?

Tipo ad esempio:

CurrentDb.Execute "UPDATE Y SET Y.x = Sum(" & Str(CDec(Nz(Sp(1)))) & ")"

Se sì, come bisogna correggere quest'ultima riga di codice?

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2012-04-17T15:16:40+00:00

Ah ecco, l'apertura del recordset Sp che avevi mostrato faceva pensare che il campo importo era un campo della tabella Movimenti.

Non so di quanti records stiamo parlando relativamente ad Sp quindi puoi provare alternativamente

  • a ciclare Sp come ti avevo mostrato in precedenza in modo tale da recuperare il valore sommato all'interno della variabile dbTotale. Questa procedura in presenza di molti records potrebbe risultare più lenta della successiva.

oppure

  • crea una tabella di appoggio con 1 solo campo, Importo, e una query di accodamento con cui farai l'insert in questo campo del risultato della tua query così:

Insert Into TabellaAppoggio (Importo) SELECT Sum(nz([EMOV])+nz([EARC])-nz([UMOV])-nz([UARC])) AS IMPORTO FROM Temp HAVING (((Sum(nz([EMOV])+nz([EARC])-nz([UMOV])-nz([UARC])))>0))

a questo punto hai l'importo totale nel record della tabella di appoggio che potrai utilizzare per aggiornare l'altra tabella.

David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

5 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2012-04-17T14:39:08+00:00

    Non devo sommare il campo di una tabella e aggiornarlo in un'altra, ma

    1) creare un Recordset che legga la tabella Movimenti:

    Set Sp = CurrentDb.OpenRecordset("SELECT RISORSA, IMPORTO FROM Movimenti")

    2) sommare il secondo campo di detto Recordset (Sp(1))

    1. aggiornare la somma su una tabella

    Utilizzando il codice che mi hai scritto, il pgm ci passa sopra, senza dare alcun errore, ma non aggiorna niente.

    Ti chiederai: ma perchè non somma Importo da Movimenti e non lo aggiorna sulla tabella?

    Perchè il campo importo in realtà è la somma algebrica di più campi.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-04-17T14:05:19+00:00

    non necessariamente. Guarda la soluzione con il Dsum

    Currentdb.Execute "UPDATE NomeTabella SET NomeCampo = DSum("Importo","Movimenti");"

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-04-17T13:37:31+00:00

    Il problema non è di sommare il campo Importo della tabella "fisica" Movimenti e aggiornarlo in un'altra tabella, ma di sommare il campo Importo di un Recordset e aggiornarlo in un'altra tabella. A quanto sembra, non si può in una sola riga vba, ma bisogna ciclare. Giusto?

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2012-04-17T12:01:52+00:00

    Ciao Francesco,

    se devi semplicemente sommare il campo importo ti basta aprire direttamente il primo recordset in questo modo:


    Set Sp = CurrentDb.OpenRecordset("SELECT SUM(IMPORTO) AS TotImporto FROM Movimenti")


    Se invece ti serve di aprirlo nel modo che hai mostrato, per sommare successivamete il campo importo puoi ciclare il recordset SP sommando il campo importo in questo modo:


    With Sp

        While Not .Eof

            dbTotale = dbTotale + !Importo          'Ricorda di dicharare la variabile dbTotale come Double

        .MoveNext

        Wend

    End With


    avendo alla fine il tuo totale all'interno della variabile dbTotale da utilizzare nella query di aggiornamento

    Oppure puoi utilizzare la funzione di aggregazione Dsum


    Currentdb.Execute "UPDATE NomeTabella SET NomeCampo = DSum("Importo","Movimenti");"

    'Oppure

    Currentdb.Execute "UPDATE NomeTabella SET NomeCampo = " & dbTotale


    David

    La risposta è stata utile?

    0 commenti Nessun commento