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.