Mudando a sequencia de impressão de um relatório no Protheus

Olá pessoal…

Vou mostrar hoje como fazer uma impressão com a sequência diferente no Protheus (teste realizado com TMSPrinter).

Por padrão pessoal, a impressão no Protheus é sequencial, então por exemplo, se o relatório possui 5 páginas, e se for impresso duas cópias, a sequência de impressão será 1, 2, 3, 4, 5, 1, 2, 3, 4 e 5.

Foi criado uma rotina, que altera essa sequência, sendo que, ao invés de sair sequencial, sai página a página conforme número de cópias, por exemplo, se forem duas cópias de 5 páginas, a impressão será 1, 1, 2, 2, 3, 3, 4, 4, 5 e 5. Otimizando o tempo de impressão.

Para usar a rotina, antes de chamar o Preview do relatório (no caso de TMSPrinter), insira os seguites comandos:

	//Definindo atalho para impressão de mais de uma página por vez (Alt+F8)
	SetKey(K_ALT_F8,{|| u_zImpAux(oPrint) })
	
	//Visualiza o relatório
	oPrint:Preview()

	//Limpando o atalho
	SetKey(K_ALT_F8,{|| Nil })

Dessa forma, ao apertar Alt+F8, é mostrado a tela para digitação da quantidade de cópias.

Tela para digitação de quantidade de cópias

Tela para digitação de quantidade de cópias

Abaixo o código fonte da função criada.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zImpAux
Função que imprime os jpegs em sequencia diferente
@type function
@author Atilio
@since 24/11/2015
@version 1.0
	@param oPrint, Objeto, Objeto de impressão criado via TMSPrinter
	@example
	u_zImpAux(oPrint)
/*/

User Function zImpAux(oPrint)
	Local aArea := GetArea()
	Local nCopies := 2
	Local nCopAux := nCopies
	Local oDlgQtd
	Local nAtuPag := 0
	
	//Filtra vendedor
	Define MsDialog oDlgQtd Title "Quantidade de cópias" From 000,000 To 080,300 PIXEL
		//Mostrnado um label (texto na janela)
		@ 010,010 Say "Qtde.:" Size 55,07 Of oDlgQtd Pixel
		
		//Mostrando um campo que irá armazenar valor
		@ 010,050 MsGet nCopAux Size 55,11 Of oDlgQtd Pixel PICTURE "@E 99"
		
		//Criando um botão de confirmar com ações
		Define SButton From 005,120 Type 1 Action (nOpca:=1,oDlgQtd:End()) Enable Of oDlgQtd
		
		//Criando um botão de cancelar com ações		
		Define SButton From 025,120 Type 2 Action (nOpca:=2,oDlgQtd:End()) Enable Of oDlgQtd
	//Ativando a janela
	Activate MsDialog oDlgQtd Centered
	
	//Se a rotina for confirmada
	If nOpca == 1
		nCopies := nCopAux
	
		//Percorre as imagens / páginas
		For nAtuPag := 1 To oPrint:nPage
			oPrint:Print( {nAtuPag}, nCopies )
		Next
	EndIf
	
	RestArea(aArea)
Return

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação