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à                Numerico
La 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.IdMovimento
La 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:
 
  TotProgrQuery2.zip (17Kb) MSAccess97 database


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.