Queries

2.1 Come posso inserire nella mia query un campo progressivo?
  Stefano Bettini
La cosa è realizzabile inserendo un campo calcolato basato su di una funzione che, appoggiandosi ad una var globale (o static) per memorizzare il progressivo, lo ritorni incrementato di una unità ad ogni record estratto.

L' unico problema di questo semplice approccio è che in questo modo ad ogni esecuzione della query la var globale non viene resettata, ed il progressivo ricomincia sempre dall' ultimo valore ottenuto nell' esecuzione precedente !

Per ovviare a questo problema si può sfruttare una particolarità del modo di lavorare del "motore" SQL.
La clausola "Where" dello statement infatti, contrariamente al "corpo" della query, viene valutata una sola volta all' inizio; sfruttando adeguatamente questa opportunità possiamo scrivere una funzione che reagisca in modo diverso se eseguita all'inizio della query o durante l' estrazione dei record....

<< ESEMPIO >>

[Funzione e modulo]
Option Compare Database
Option Explicit

Dim rval As Integer    ' La variabile globale di appoggio

Public Function Progressione(Valore As String) As Integer
   If Valore = "Azzera" Then
      rval = 0
   Else
      rval = rval + 1
   End If
   Progressione = rval
End Function

[Utilizzo in query]
----------------------------------------------------------------
SELECT MiaTab.ID, MiaTab.Nome, Progressione((ID)) AS Progressione
FROM MiaTab
WHERE (((Progressione("Azzera"))=0))
ORDER BY MiaTab.Nome;

Purtroppo, a causa delle ottimizzazioni insite in Access, questo tipo di query non si presta ad essere utilizzata in una maschera od in modalità interattiva (a meno che la maschera non sia sufficiente a visualizzare tutti i record ritornati dalla query); l'unico modo "sicuro" x utilizzarla è tramite VBA, aprendo un recordset basato sulla query.

Questo tipo di query ed il "trucco" della doppia chiamata si presta molto bene anche all'implementazione di query che ritornino totali di movimenti e "saldi" tipiche delle gestioni contabili.


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