Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 4 123 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 35

Calcolo somma con VBA per Microsoft Access.

  1. #1
    webmassimo non è in linea Novello
    Post
    41
    Like Inviati  
    0
    Like Ricevuti  
    0
    Salve a tutti,
    chiedo aiuto, per sapere se si può fare un tipo di programmazione con VBA per Access. Riporto il problema.
    Ho tre campi Access nominati CLASSE, DATA, PUNTEGGIO.
    Esempio:

    CLASSE DATA PUNTEGGIO
    A 01/01/2000 5
    B 01/02/2000 2
    C 01/03/2000 4
    A 01/05/2000 10
    A 01/05/2000 20
    A 01/06/2000 15
    B 01/07/2000 4
    B 01/08/2000 6
    B 01/08/2000 8


    Devo sommare i primi 3 valori del campo punteggio più alti
    per ogni CLASSE. Per poter fare tale somma è necessario che ogni CLASSE sia riportata almeno due volte.
    Esempio:
    CLASSE A 5,10,20,15 SOMMA E' 45 (da scartare è 5)
    CLASSE B 2, 4,6,8 SOMMA E' 18 (da scartare è 2)
    CLASSE C (non si procede perché è riportata una sola volta).

    Grazie per l'aiuto che mi saprete dare.
    Saluti a tutti.

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,819
    Like Inviati  
    0
    Like Ricevuti  
    23
    La cosa non è banale ed immediata...
    ti propongo questa soluzione, solo perchè è la più comoda che ho trovato avendo pochissimo tempo...
    SELECT CLASSE,  fSommaTop3([CLASSE]) AS STop3
    FROM XX
    GROUP BY CLASSE, fSommaTop3([CLASSE])
    HAVING Count(CLASSE)>2;
    
    XX=NomeTabella
    Ora devi creare in un Modulo la Funzione che estrae la Somma del TOP 3 dei Punteggi più alti escludendo i più bassi...
    Public Function fSommaTop3(ParamClass As String) As Long
        Dim rs As DAO.Recordset
        Dim lngVAL As Long
        Set rs = DBEngine(0)(0).OpenRecordset("SELECT TOP 3, PUNTEGGIO FROM XX WHERE CLASSE='" & ParamClass & "' ORDER BY PUNTEGGIO DESC")
        rs.MoveFirst
        Do Until rs.EOF
            lngVAL = lngVAL + rs.Fields("PUNTEGGIO").Value
            rs.MoveNext
        Loop
        rs.Close
        Set rs = Nothing
        fSommaTop3= lngVAL
    End Function
    
    Ricorda sempre che XX=NomeTabella...
    Di certo non è ottimizzata, credo si potrebbe fare di meglio ma una query con l'uso di TOP non consente il Raggruppamento per SOMMA quindi avresti dovuto creare altre 2 Queries... e sapendo che la somma coinvolge solo 3 Records ho valutato che il ritardo sia minimo...!

    Ho provato ad usare i dati che hai postato e funziona regolarmente...
    CLASSE	STop3
    A	45
    B	18
    
    ℹ️ Leggi di più su @Alex ...

  3. #3
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Post
    731
    Like Inviati  
    0
    Like Ricevuti  
    0
    Per realizzare quanto ti riprometti puoi utilizzare direttamente le query e agendo con una condizione che selezioni le classi che abbiano più di una occorrenza e di queste prenderne i tre valori più grandi, utilizzando il predicato
    SELECT TOP n record per gruppo
    Microsoft Access tips: Subquery basics

    Oppure con la stessa logica, impiegando il VBA, ciclare su un recordset ordinato per classe (ascendente) e punteggio (decrescente) in modo che si contino le occorrenze di ciascuna classe, tralasciando quelle con singoli elementi e sommando i primi tre punteggi disponibili.
    ℹ️ Leggi di più su willy55 ...

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,819
    Like Inviati  
    0
    Like Ricevuti  
    23
    Ciao Willy, puoi fare un'esempio pratico reale del predicato SQL...

    Io ho provato a realizzarlo, ma mi sono scontrato con il conteggio dei Records per l'esclusione(>2 per considerare la Classe), e l'uso di TOP 3 per il calcolo ad inversione DESC per escludere i più bassi... che cozza con i raggruppamenti/somme...
    Probabilmente le tabelle derivate potrebbero risolvere ma potrebbero anche essere molto meno performanti... boh... attendo lumi.
    ℹ️ Leggi di più su @Alex ...

  5. #5
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Post
    731
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao Alex,
    come da te richiesto evidenzio la costruzione in SQL.

    Immaginiamo di avere una tabella (TabellaPunteggi) con i campi:
    - Classe
    - DataAssegnazione
    - Punteggio

    Realizziamo una prima query (qryNrElementiClasseMaggiori1) che conti le occorrenze e prenda quelle con più di un elemento
    SELECT TabellaPunteggi.Classe, Count(TabellaPunteggi.Classe) AS NrElementiNellaClasse
    FROM TabellaPunteggi
    GROUP BY TabellaPunteggi.Classe
    HAVING (((Count(TabellaPunteggi.Classe))>1));
    
    Implementiamo una query (QryTopPunteggi) che prenda i primi 3 elementi (se esistono) dei punteggi per ciascuna classe:
    SELECT TabellaPunteggi.Classe, TabellaPunteggi.DataAssegnazione, TabellaPunteggi.Punteggio
    FROM TabellaPunteggi
    WHERE (((TabellaPunteggi.Punteggio) In (SELECT TOP 3 Punteggio                            
       FROM TabellaPunteggi AS Dupe                              
       WHERE Dupe.Classe = TabellaPunteggi.Classe        
       ORDER BY Dupe.Classe, Dupe.Punteggio DESC)))
    ORDER BY TabellaPunteggi.Classe;
    
    Determiniamo la query risultante (qryTopSommaPunteggio) che comprende le due precedenti con la relazione in base alla "Classe" (la quale effettua la somma dei punteggi).
    SELECT qryNrElementiClasseMaggiori1.Classe, Sum(QryTopPunteggi.Punteggio) AS SommaPunteggioTop
    FROM qryNrElementiClasseMaggiori1 INNER JOIN QryTopPunteggi ON qryNrElementiClasseMaggiori1.Classe = QryTopPunteggi.Classe
    GROUP BY qryNrElementiClasseMaggiori1.Classe;
    
    e otterremo direttamente con questa i valori risultanti voluti.
    ℹ️ Leggi di più su willy55 ...

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,819
    Like Inviati  
    0
    Like Ricevuti  
    23
    Beh si... con 3 Query indipendenti era abbastanza scontato... pensavo avessi voluto intendere alla possibiltà di usare una sola Query con delle SubQuery... almeno io avevo inteso/sperato ipotizzassi quel modo...

    In tutti i casi effettivamente si può appunto usando le Tabelle derivate come dicevo inizialmente, quindi Mixando le query diventa questo:
    SELECT QryTopPunteggi.Classe, Sum(QryTopPunteggi.Punteggio) AS SommaDiPunteggio
    FROM (SELECT XX.Classe, Count(XX.Classe) AS NrElementiNellaClasse
          FROM XX
          GROUP BY XX.Classe
          HAVING (((Count(XX.Classe))>1))) As qryNrElementiClasseMaggiori1
    INNER JOIN (SELECT XX.Classe, XX.Punteggio
                FROM XX
                WHERE (((XX.Punteggio) In (SELECT TOP 3 Punteggio                            
                                           FROM XX AS Dupe                              
                                           WHERE Dupe.Classe = XX.Classe        
                                           ORDER BY Dupe.Classe, Dupe.Punteggio DESC)))
                ORDER BY XX.Classe, XX.Punteggio)  AS QryTopPunteggi 
    ON qryNrElementiClasseMaggiori1.Classe = QryTopPunteggi.Classe
    GROUP BY QryTopPunteggi.Classe;
    
    dove [XX]= NomeTabella

    P.S. avrei lasciato il [>2] visto che la somma va fatta per TOP3... quindi nel caso ci siano meno di 3 ricorrenze... la somma avverrebbe su 2 e non su 3... valuterà l'OP se il risultato è quello chiesto, e direi che ha tutti gli Elementi necessari per farlo.
    Ultima modifica di @Alex; 05-01-2013 01:37 
    ℹ️ Leggi di più su @Alex ...

  7. #7
    webmassimo non è in linea Novello
    Post
    41
    Like Inviati  
    0
    Like Ricevuti  
    0
    Vi ringrazio molto delle informazioni. Per mettermi all'opera vi sarei grato se mi faceste sapere qual è la via migliore per inserire i codici nelle query. Mi spiego meglio: creo le query e poi passo nella visualizzazione sql per le modifiche? Oppure c'è la possibilità di lavorare direttamente in linguaggio sql con Microsoft Access? Grazie.

  8. #8
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Post
    731
    Like Inviati  
    0
    Like Ricevuti  
    0
    Con le query puoi operare sia attraverso l'interfaccia grafica QBE (Query By Example) di più semplice utilizzo, in quanto con il mouse si possono selezionare gli oggetti, oppure è possibile agire nella modalità di "visualizzazione SQL" che offre l'opportunità di inserire direttamente il linguaggio SQL (Structured Query Language). In questo ultimo caso si ha una maggiore versatilità (in quanto si possono inserire anche query non previste dal QBE) e ci si avvicina a quelle che sono le modalità di impiego disponibili con altri database basati sul modello relazionale (RDBMS) facilitando l'opera di passaggio fra ambienti diversi.
    Access memorizza la query in linguaggio SQL ma effettua in output una conversione per offrire all'utente l'opportunità di agire con l'interfaccia QBE.

    Per ampliare le conoscenze sull'argomento si possono vedere i seguenti link.

    Introduzione sulle query SQL
    Informazioni sulle query SQL (MDB) - Access - Office.com

    Elenco delle proprietà modificabili nelle query
    Come modificare le proprietà delle query in Microsoft Access

    Per una panoramica generale sull'impiego delle query
    Microsoft Access for Beginners
    http://www.mondadorinformatica.it/al...39;esempio.pdf

    Per un elenco sulle prerogative utilizzabili nelle query
    Microsoft Access Query Tips and Techniques with SQL and VBA Code
    ℹ️ Leggi di più su willy55 ...

  9. #9
    webmassimo non è in linea Novello
    Post
    41
    Like Inviati  
    0
    Like Ricevuti  
    0
    Finora va tutto bene e vi ringrazio. Perché io possa continuare, è per me necessario associare i campi CLASSE, DATA, PUNTEGGIO ad un altro campo COGNOME. Quest'ultimo campo "COGNOME" fa parte di un'altra tabella denominata "DATI". Grazie.
    Ultima modifica di webmassimo; 05-01-2013 15:54 

  10. #10
    webmassimo non è in linea Novello
    Post
    41
    Like Inviati  
    0
    Like Ricevuti  
    0
    Richiedo aiuto.
    Sono riuscito grazie al vostro aiuto ad eseguire i codici sopra descritti. Vi sarei grato se si potesse eseguire una modifica al codice per fare in modo che si possa riconoscere per ogni Cognome (un altro campo in tabella a parte). Inoltre il codice va bene ma in un caso non somma i primi 3 valori più alti, ma ne somma 4 anziché 3. Ecco l'esempio per capirci:
    CLASSE A 10,10,20,10 SOMMA E' 50 (anziché scartare 10, tale numero uguale al terzo valore più alto è sommato)

    Grazie per l'aiuto che mi saprete dare.
    Saluti a tutti.

+ Rispondi al messaggio
Pagina 1 di 4 123 ... ultimoultimo

Potrebbero interessarti anche ...

  1. Calcolo Somma all'interno di una gridview
    Da maurizio75 nel forum C#
    Risposte: 2
    Ultimo Post: 16-12-2020, 10:46
  2. Creazione tabella da query
    Da mauropac nel forum Presentazioni e saluti
    Risposte: 2
    Ultimo Post: 28-09-2016, 22:17
  3. PHP e Microsoft Access
    Da thefoxwhite nel forum PHP
    Risposte: 8
    Ultimo Post: 06-10-2011, 09:56
  4. Risposte: 1
    Ultimo Post: 22-10-2010, 16:12
  5. Microsoft Access
    Da luca1981 nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 23-04-2007, 15:12