Cambiare a runtime l’ordinamento di un sottoreport MS.Access con VBA



Supponiamo di avere un applicativo il cui front-end sia sviluppato in MS. Access che gestisce la nostra contabilità, ed in particolare le vendite al banco di un negozio all’ingrosso.
Poichè in questo articolo ci occuperemo della parte di programmazione in VBA non fa nessuna differenza se il motore di database sia Access stesso o qualsiasi altro DBMS collegato in ODBC alla nostra interfaccia.

Le vendite sono gestite da una maschera che fa capo a 2 tabelle del database, supponiamo tblVenditaIntestazione e tblVenditaDettaglio, ovviamente l’intestazione conterrà le informazioni relative alla data della vendita, del cliente che sta acquistando e delle informazioni identificative della ricevuta che gli andremo a stampare e consegnare al termine della vendita.

Poichè stiamo parlando di un grossista, non è raro che il dettaglio della vendita (che contiene ovviamente la lista dei prodotti acquistati) possa essere formato da centinaia o anche migliaia di records… e sappiamo che in questi casi sicuramente sarebbe opportuno poter decidere in base a quale campo del dettaglio articoli ordinare la visualizzazione della maschera: questo ci consente ad esempio di effettuare piu facilmente ricerche per codice articolo, piuttosto che per la descrizione, colore ecc.

Ma se cambiare questo tipo di ordinamento a RunTime ad una sottomaschera è un operazione facilissima (basta utilizzare il sort della maschera stessa) la cosa non è allo stesso modo semplice x le stampe in quanto in MS.AccessVBA non è consentito cambiare l’ordinamento di un sottoreport a RunTime.

Qualche utente potrebbe pensare di aggirare l’ostacolo cambiando al volo il recordsource del sottoreport ma purtroppo questa soluzione, perfettamente funzionante per le maschere, sui report non ha alcun effetto.

Ci sono però diversi modi per agirare questo problema.
Possiamo ad esempio cambiare a RunTime il sourceobject dell’oggetto contenitore del sottoreport, ma ciò significherebbe avere n copie del nostro sottoreport, una per ogni campo o combinazione di campi per i quali vogliamo effettuare l’ordinamento. Soluzione che a me personalmente piace pochissimo anche perchè ogni volta che dobbiamo modificare un sottoreport dobbiamo ripetere la modifica n volte

La soluzione che apprezzo maggiormente è quella di utilizzare i “raggruppamenti” detti anche “livelli di gruppo” in quanto Access effettua automaticamente l’ordinamento per il campo di raggruppamento.

A differenza dell’ordinamento, il raggruppamento è perfettamente gestibile da Access/VBA con poco sforzo da parte del programmatore.

Basterà quindi inserire il seguente codice nell’evento open del sottoreport per creare i vari livelli di gruppo e sceglierne il tipo di ordinamento (crescente/decrescente)

if <condizione_che_determina_l’ordinamento> = <scelta1> then
Me.GroupLevel(0).ControlSource = “CampoOrdinamento0
Me.GroupLevel(0).SortOrder = False ‘–> crescente.  True –> decrescente
else

end if

Si possono chiaramente determinare ordinamenti per piu campi aggiungendo Me.GroupLevel(1).ControlSource = “CampoOrdinamento1” ecc.

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
Pinterest