Hoje vou mostrar uma função feita, que retorna o total de páginas de um relatório em AdvPL.
Se você precisa imprimir em um relatório, algo como “Página 3 de 10”, você deve primeiro calcular em como chegar no 10. E como fazer isso?
A forma mais simples, é pegar o número total de registros, por exemplo, 520, e dividir pelo número de linhas que cabem em uma página que será impressa, por exemplo, 30.
Assim, 520 dividido por 30, dará 17.33, que seria algo como 17 páginas e meia, mas como não queremos “o meia”, se a divisão teve resto, aumentamos uma página, ficando 18.
Então em um relatório que cabe 30 linhas por página, e teve 520 registros, ele terá 18 páginas. Com essa lógica, foi desenvolvido o fonte abaixo, que basta você passar o total de registros e o número de linhas por página na função u_zTotPag().
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} zTotPag
Retorna o número total de páginas para imprimir em um relatório
@author Atilio
@since 02/06/2019
@param nRegistros, numeric, Quantidade total de registros que serão impressos, por exemplo, 520
@param nPorPag, numeric, Quantidade de registros / linhas que cabem em uma página, por exemplo, 30
@version 1.0
@example
...
Local nLinhas := 30
...
DbSelectArea('SEU_ALIAS')
SEU_ALIAS->(DbGoTop())
Count To nTotRegis
...
nPagFim := u_zTotPag(nTotRegis, nLinhas)
...
oPrint:Say(nLinRod+20, 3100, 'Página ' + cValToChar(nPag) + ' de ' + cValToChar(nPagFim), oFontRod,,,,PAD_RIGHT)
/*/
User Function zTotPag(nRegistros, nPorPag)
Local aArea := GetArea()
Local nTotPag := 0
Default nRegistros := 0
Default nPorPag := 0
//Se tiver mais registros do que cabe por página
If nRegistros > nPorPag
//O total de páginas, será a parte inteira da divisão de quantidade de registros pelo número de linhas que cabe numa página
nTotPag := Int(nRegistros / nPorPag)
//Se houver resto na divisão, então sobrou 1 página
If nRegistros % nPorPag != 0
nTotPag++
EndIf
//Senão será apenas 1 página
Else
nTotPag := 1
EndIf
RestArea(aArea)
Return nTotPag
Agora, caso seu relatório tenha blocos dinâmicos ou variações, ai talvez você deva fazer uma função para simular a impressão, assim a cada linha impressa você aumentaria o contador de linhas, e quando houvesse o endpage, você incrementaria a variável do total de páginas.
Bom pessoal, por hoje é só.
Abraços e até a próxima.