Reports

4.8 Modulo per la gestione della stampa dei totali in calce al report compresa gestione della stampa su più pagine.
  Davide La Mantia (Sib)
Un sistema per realizzare un report con un numero costante di righe per pagina indipendentemente dal numero di record da stampare è usare un codice come questo:
Option Compare Database
Option Explicit

Dim RigheStampate As Integer 'Conta le righe stampate
Dim RigheTotali As Integer 'Righe da stampare in totale (vengono conteggiate all'inizio)
Dim PagineTotali As Integer 'Pagine da stampare (vengono calcolate all 'inizio)
Dim PagineStampate As Integer 'Conta le pagine stampate
Const RighePerPagina = 20 'Righe da stampare in ogni pagina
Const RigheFinali = 6 'Righe occupate dal pie' di pagina di gruppo

Private Sub Corpo_Print(Cancel As Integer, PrintCount As Integer)
   Dim ctl As Control
   RigheStampate = RigheStampate + 1
   If PagineStampate < PagineTotali Then
      If RigheStampate >= RighePerPagina Then
         If RigheStampate > RighePerPagina Then
            RigheVisibili False
         End If
         If RigheStampate < ((RighePerPagina + RigheFinali) * PagineStampate) Then
            Me.NextRecord = False
         End If
      End If
   Else
      If RigheStampate >= RigheTotali + (PagineTotali - 1) * RigheFinali Then
         If RigheStampate > RigheTotali + (PagineTotali - 1) * RigheFinali Then
            RigheVisibili False
         End If
         If RigheStampate < RighePerPagina * PagineStampate + (PagineTotali - 1) * RigheFinali Then
            Me.NextRecord = False
         End If
      End If
   End If
End Sub

Private Sub IntestazioneGruppo0_Print(Cancel As Integer, PrintCount As Integer)
   RigheTotali = DCount("idfatturerighe", "T_fatturerighe", "idfattura ='" & Me.IdFattura & "'")
   PagineTotali = Int(RigheTotali / RighePerPagina) + IIf((RigheTotali Mod RighePerPagina) > 0, 1, 0)
   PagineStampate = PagineStampate + 1
   RigheVisibili True
End Sub

Private Sub PièDiPaginaGruppo1_Print(Cancel As Integer, PrintCount As Integer)
   RigheStampate = 0
   PagineStampate = 0
   PagineTotali = 0
End Sub

Private Function RigheVisibili(fVisibili As Boolean)
   Dim ctl As Control
   For Each ctl In Me.Corpo.Controls
      ctl.Visible = fVisibili
   Next ctl
End Function
Si basa sul semplice principio che, per inserire righe vuote, è sufficiente ripetere la stampa dell'ultimo record tante volte quanto è necessario ad arrivare in fondo alla pagina senza però farne vedere il contenuto.
In questa soluzione è previsto un pie' di pagina di gruppo che occupi 6 righe (RigheFinali), questo parametro serve per poter gestire la stampa su più pagine. Dato che il pie' di pagina di gruppo viene visualizzato solo sull'ultima pagina del gruppo è necessario aggiungere 6 righe vuote per mantenere costante il numero di righe per pagina.
Nell'esempio proposto l'intestazione di gruppo è riportata su ogni pagina (altrimenti sarebbe necessario aggiungere righe vuote anche in testa).
Certamente questo codice puo' essere migliorato sia nella compattezza sia nell'efficienza, ma svolge il suo compito correttamente.


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