Função que retorna o total de páginas em AdvPL

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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta