Queries |
2.16 Come si può ottenere il totale progressivo di un campo in una query e come si può numerare progressivamente le righe di una query? |
Roberto |
Nella Sezione Queries di questo sito è già pubblicata una FAQ intitolata "Come si può ottenere il totale progressivo di un campo in una query?" che affronta e risolve il problema di creare il totale progressivo di un campo utilizzando una funzione scritta in codice VBA che viene richiamata da un campo calcolato della query, funzione che si preoccupa appunto di calcolare il totale progressivo di un campo della query. Altresì sempre nella Sezione Queries c'è una FAQ intitolata "Come posso inserire nella mia query un campo progressivo?" per inserire in un campo calcolato la numerazione progressiva delle righe contenute nella query. Nel database di esempio allegato a questa FAQ si risolvono i due problemi di cui sopra senza fare uso del codice VBA, ma usando esclusivamente il linguaggio SQL. Questo database contiene tre queries che danno tre soluzioni diverse alla creazione di una numerazione progressiva delle righe della query d alla creazione del totale progressivo di un campo della query. Tutte e tre le queries di esempio fanno riferimento ad una tabella chiamata tblMovimenti e che ha la seguente struttura: IdMovimento Contatore e chiave primaria IdProdotto Numerico DataMovimento Data/ora Quantità NumericoLa tabella su cui sono basate le 3 queries deve avere una chiave primaria, ma, come è mostrato negli esempi, la query non deve essere necessariamente ordinata per la chiave primaria della tabella, ma può esere ordinata per altri campi; le tre qeries di esempio sono ordinate per DataMovimento. La prima query che ordina i record per DataMovimento e contestualmente ottiene il totale progressivo del campo Quantità e la numerazione progressiva delle righe, si chiama QueryRaggruppamento ed ha il seguente codice SQL: SELECT SUM(1) AS NumProgr, Tab1.IdMovimento, First(Tab1.IDProdotto) AS IDProdotto, Tab1.DataMovimento, First(Tab1.Quantità) AS Quantità, SUM(Tab2.Quantità) AS Progressivo FROM tblMovimenti AS Tab1 INNER JOIN tblMovimenti AS Tab2 ON Format(Tab1.Datamovimento, "yyyymmdd") & Format(Tab1.IdMovimento, "000000") >= Format(Tab2.Datamovimento, "yyyymmdd") & Format(Tab2.IdMovimento, "000000") GROUP BY Tab1.DataMovimento, Tab1.IdMovimento ORDER BY Tab1.DataMovimento, Tab1.IdMovimentoLa seconda query si chiama invece QuerySubQuery ed ha il seguente codice SQL: SELECT (Select Count (*) FROM tblMovimenti as AAA WHERE Val(Format(AAA.DataMovimento, "yyyymmdd") & Format(AAA.IDMovimento, "000000") ) < Val(Format(tblMovimenti.DataMovimento, "yyyymmdd") & Format(tblMovimenti.IDMovimento, "000000") )+1) AS NumProgr, tblMovimenti.IDMovimento, tblMovimenti.IDProdotto, tblMovimenti.DataMovimento, tblMovimenti.Quantità, (Select Sum (AAA.Quantità) FROM tblMovimenti as AAA WHERE Val(Format(AAA.DataMovimento, "yyyymmdd") & Format(AAA.IDMovimento, "000000") ) < Val(Format(tblMovimenti.DataMovimento, "yyyymmdd") & Format(tblMovimenti.IDMovimento, "000000") )+1) AS Progressivo FROM tblMovimenti ORDER BY tblMovimenti.DataMovimento, tblMovimenti.IDMovimento;Infine la terza query si chiama QueryDCountDSum ed ha il seguente codice SQL: SELECT Val(DCount("*","tblMovimenti","(Format([DataMovimento], 'yyyymmdd') & Format([IDMovimento], '000000')) <='" & Format([DataMovimento],'yyyymmdd') & Format([IDMovimento],'000000') & "'")) AS NumProgr, tblMovimenti.IDMovimento, tblMovimenti.IDProdotto, tblMovimenti.DataMovimento, tblMovimenti.Quantità, CDbl(DSum("Quantità","tblMovimenti","(Format([DataMovimento], 'yyyymmdd') & Format([IDMovimento], '000000')) <='" & Format([DataMovimento],'yyyymmdd') & Format([IDMovimento],'000000') & "'")) AS Progressivo FROM tblMovimenti ORDER BY tblMovimenti.DataMovimento, tblMovimenti.IDMovimento;Quest'ultima fa uso delle funzioni di aggregazione sui dominii e pertanto è sicuramente la meno performante. Download: |