Bom Dia Amigos!
Estou precisando de uma rotina q me imprima um determinado relatorio a partir de uma determinada pagina, ou num intervalo de paginas. É q tenho um cliente q gosta de imprimir grandes relatorios, e as vezes a impressora engancha e fica complicado para começar do inicio, então ele me pediu para imprimir por pagiana. Já fiz isso a muito tempo atrás e não tenho mais os fontes, e não me lembro como fiz. Aguem pode me ajudar?
Um grande abraço
Um Feliz Natal e um próspero 20
Imprimir Relatorio por pagina
Moderador: Moderadores
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Use a técnica de arquivos TeXTo.
Salve cada pagina com um nome irrepetivel tipo RELA001, RELA002, ...
Exemplo:
Antes do DO...WHILE de execução do seu relat'roio coloque:
nPagina := 1
cPagina := "RELA"+str(nPagina,3)+".PRN"
crlf := chr(13)+chr(10)
errHandle:= fCreate( cPagina )
do while .not. eof()
...
// Troque os @ ... SAY ... cDadosASeremImpressos por fWrite()
fWrite( errHandle, cDadosASeremImpressos + crlf )
...
skip
if nLinha > 60 .or. eof() // Tamanho maximo de sua pagina
// Toque o EJECT por fClose()
fClose( errHandle )
if .not. eof()
nPagina := nPagina + 1
cPagina := "RELA"+str(nPagina,3)+".PRN"
errHandle:= fCreate( cPagina )
endif
endif
enddo
fClose( errHandle )
...
Coloque os arquivos gerados num menu para ser escolhido para visualização ou previsão.
nContador := adir( "*.PRN" )
txtNomes := {}
if nContador != 0
declare txtNomes[ nContador ]
adir( "*.PRN" )
asort(txtNomes)
endif
nPagina := aChoice(txtNomes)
memoedit( "RELA"+str(nPagina,3)+".PRN" )
A partir daqui voce deverá programar o comando CTRL-P em uma função chamada pelo memoedit() para imprimir o arquivo selecionado.
Veja um codigo que voce podera adaptar para o seu uso:
De uma analisada no arquivo PE.PRG que faz parte dos sources do Clipper para saber como utilizar melhor a memoedit().
Espero não ter complicado...
@braços :?)
Use a técnica de arquivos TeXTo.
Salve cada pagina com um nome irrepetivel tipo RELA001, RELA002, ...
Exemplo:
Antes do DO...WHILE de execução do seu relat'roio coloque:
nPagina := 1
cPagina := "RELA"+str(nPagina,3)+".PRN"
crlf := chr(13)+chr(10)
errHandle:= fCreate( cPagina )
do while .not. eof()
...
// Troque os @ ... SAY ... cDadosASeremImpressos por fWrite()
fWrite( errHandle, cDadosASeremImpressos + crlf )
...
skip
if nLinha > 60 .or. eof() // Tamanho maximo de sua pagina
// Toque o EJECT por fClose()
fClose( errHandle )
if .not. eof()
nPagina := nPagina + 1
cPagina := "RELA"+str(nPagina,3)+".PRN"
errHandle:= fCreate( cPagina )
endif
endif
enddo
fClose( errHandle )
...
Coloque os arquivos gerados num menu para ser escolhido para visualização ou previsão.
nContador := adir( "*.PRN" )
txtNomes := {}
if nContador != 0
declare txtNomes[ nContador ]
adir( "*.PRN" )
asort(txtNomes)
endif
nPagina := aChoice(txtNomes)
memoedit( "RELA"+str(nPagina,3)+".PRN" )
A partir daqui voce deverá programar o comando CTRL-P em uma função chamada pelo memoedit() para imprimir o arquivo selecionado.
Veja um codigo que voce podera adaptar para o seu uso:
Código: Selecionar todos
func iPrintFile( nPagina )
EditFile := memoread( "RELA"+str(nPagina,3)+".PRN" )
if .not. isprinter()
beep()
mensagem('Impressora esta desconectada ou desligada!',3)
return
endif
set print on
set device to print
@ 0,0 SAY chr(15)
m->tam_memo := MLCOUNT( EditFile, 132 )
m->li_nha := 1
for i = 1 to m->tam_memo
set device to screen
mensagem('Imprimindo linha '+alltrim(str(i,3))+' de '+alltrim(str(m->tam_memo,3)))
set device to print
@ m->li_nha,00 say MailMerge( memoline( EditFile, 132 ,i) )
m->li_nha := m->li_nha + 1
if m->li_nha > m->rel_linhas
eject
m->li_nha := 1
setprc(0,0)
endif
next
@ prow()+1,0 SAY chr(18)
SETPRC(0,0)
set device to screen
set print off
return (NIL)
FUNCTION MENSAGEM( TEXTO, PAUSA )
//
// -> Funcao que imprime mensagens na tela
//
// TEXTO => Recebe o texto a ser impresso na linha de mensagem.
// TEMPO => Recebe o tempo de espera para a mensagem.
//
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SETCURSOR(), DE_VI_CE
IF TEXTO = NIL; TEXTO := ""; ENDIF
CURSOR( DESLIGA )
IF SET( 20 ) = "PRINTER"
DE_VI_CE = "PRINTER"
SET( 20 , "SCREEN" )
ENDIF
@ 0, 75 SAY STR(MEMORY(0),5) COLOR CONTECOR[ 13 ]
IF m->defPDV = 'X'
IF m->defTEFON = .T.
@ MAXROW()-1, 00 SAY 'TEF-ON ' COLOR CONTECOR[ 2 ]
ELSE
@ MAXROW()-1, 00 SAY 'TEF-OFF' COLOR CONTECOR[ 2 ]
ENDIF
ENDIF
IF m->defCUPOM = 'X'
@ MAXROW(), 11 SAY STR(M->NO_CUPOM+1,1)+'³'+PADC( TEXTO, 56 ) COLOR CONTECOR[ 2 ]
ELSE
@ MAXROW(), 11 SAY PADC( TEXTO, 58 ) COLOR CONTECOR[ 2 ]
ENDIF
IF PAUSA = NIL
ULT_MENSAGEM := TEXTO
ELSE
TEC_MOU( PAUSA )
@ MAXROW(), 11 SAY PADC( ULT_MENSAGEM, 58 ) COLOR CONTECOR[ 2 ]
ENDIF
IF DE_VI_CE = "PRINTER"
Set( 20, "PRINTER" )
ENDIF
SETCURSOR( ULT_CURSOR )
RETURN NIL
Espero não ter complicado...
@braços :?)
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Agradecimento
Amigo Rochinha!
Obrigado pela sua ajuda, vou ver se consigo resolver aqui.
Um grande abraço
Um Feliz Natal
Obrigado pela sua ajuda, vou ver se consigo resolver aqui.
Um grande abraço
Um Feliz Natal
Vamos ver se entendí, digamos que vc esteja imprimindo um relatório de 20 páginas, lá pela 10ª página a impressora dá pau e vc não quer começar todo o relatório de novo porque já tem 9 páginas impressas, é isso? Se for faça assim: Faça uma rotina que mande imprimir o relatório e pergunte se vc quer refazer o relatório, caso a resposta seja positiva, pergunte a partir de qual página e até qual página quer imprimir, então direcione a impressão para um arquivo no disco, quando chegar na página que vc quer imprimir direcione a saída para a impressora até a página desejada.
- ERASMO ANDRIOLI
- Usuário Nível 2

- Mensagens: 51
- Registrado em: 15 Jul 2004 16:15
- Localização: Sorriso-MT
- Contato:
IMPRESSAO POR FOLHA
CARAS!!!!
Eu estava boiando / navegando aqui no forum, porque eu tambem quero usar esse tipo de rotina, e vi como o nosso amigo (Grings) acima mostra de forma facil e rapida a resolver o problema do colega usuário.
Por enquanto só estou vendo a opnião acima, más pela lógica funcionada. Só resta testar os comando "in loco".
Deus abençoe a todos nós...
Fui....
Erasmo
Ah... Moderador.... acredito ser importantíssimo sua participação no reconhecimento das idéias aqui expostas. São usuários talvez, que perdem grande parte de seu tempo, para ajudar os que estão necessitados relacionados a isso.
Eu estava boiando / navegando aqui no forum, porque eu tambem quero usar esse tipo de rotina, e vi como o nosso amigo (Grings) acima mostra de forma facil e rapida a resolver o problema do colega usuário.
Por enquanto só estou vendo a opnião acima, más pela lógica funcionada. Só resta testar os comando "in loco".
Deus abençoe a todos nós...
Fui....
Erasmo
Ah... Moderador.... acredito ser importantíssimo sua participação no reconhecimento das idéias aqui expostas. São usuários talvez, que perdem grande parte de seu tempo, para ajudar os que estão necessitados relacionados a isso.
Sigo o raciocínio do Grigs e até o momento tem funcionado blz.Grings escreveu: Faça uma rotina que mande imprimir o relatório e pergunte se vc quer refazer o relatório, caso a resposta seja positiva, pergunte a partir de qual página e até qual página quer imprimir, então direcione a impressão para um arquivo no disco, quando chegar na página que vc quer imprimir direcione a saída para a impressora até a página desejada.
Veja como faço:
Código: Selecionar todos
li := 06 ; ci := 12 ; lf := 15 ; cf := 66
JANELA2(li,ci,lf,cf,"..:: INFORME O NR. DAS PAGINAS ::..", vCOR_JAN, vCOR_TIT )
@ li+02,ci+02 SAY "Pagina Inicial :"
@ li+03,ci+02 SAY " Pagina Final :"
cPAGi = 1
BEGIN SEQUENCE
DO WHILE .T.
@ li+02,ci+19 GET cPAGi PICT "999"
READ
IF LASTKEY() = 27
EXIT
ENDIF
cPAGf = cPAGi
DO WHILE .T.
@ li+03,ci+19 GET cPAGf PICT "999" VALID(cPAGf >= cPAGi)
READ
IF LASTKEY() = 27
EXIT
ENDIF
BREAK
ENDDO
ENDDO
ENDSEQUENCE
IF LASTKEY() = 27
FOR i=1 to LEN(Arq)
CLOSE (Arq[i])
NEXT
RstEnv( aEnv )
RETURN .T.
ENDIF
MENS_REL()
IF cPAGi = 1
SET PRINTER ON
SET DEVICE TO PRINTER
SET PRINTER TO LPT1
SET CONSOLE OFF
ELSE
FERASE("TABELA.TXT")
SET PRINT ON
SET PRINTER TO TABELA.TXT
SET DEVICE TO PRINTER
SET CONSOLE OFF
ENDIF
vPAGINA = 1
SETPRC(0,0)
@ PROW() + 00, 00 SAY REPLICATE("-",79)
NEGRITO()
@ PROW() + 01, 00 SAY "TABELA DE PRECO DE PRODUTO"
@ PROW() + 00, 40 SAY "Em " + DTOC(DATE())
@ PROW() + 00, 69 SAY "Pagina " + STRZERO(vPAGINA,3)
TIRA_NEGRITO()
@ PROW() + 01, 00 SAY REPLICATE("-",79)
@ PROW() + 01, 00 SAY "Cod. Descricao Un Custo Prc.Venda"
@ PROW() + 01, 00 SAY REPLICATE("-",79)
SELECT PRODUTO
DBSETORDER(2)
GOTO TOP
OrdScope( 0, "S" )
OrdScope( 1, "S" )
GOTO TOP
DO WHILE !EOF()
@ PROW() + 01, 00 SAY STRZERO(CODIGO,4)
@ PROW() , 06 SAY DESCRI PICT "@!"
@ PROW() , 47 SAY UNIPRD PICT "@!"
@ PROW() , 52 SAY PRCCOM PICT "@E 99,999.99"
@ PROW() , 64 SAY PRCMER PICT "@E 99,999.99"
DBSKIP()
IF PROW() > 60
EJECT
vPAGINA = vPAGINA + 1
IF cPAGi > 1
IF vPAGINA = cPAGi
SET CONSOLE ON
SET PRINTER OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET PRINTER ON
SET DEVICE TO PRINTER
SET PRINTER TO LPT1
SET CONSOLE OFF
ENDIF
ENDIF
IF vPAGINA > cPAGf
EXIT
ENDIF
@ PROW() + 00, 00 SAY REPLICATE("-",79)
NEGRITO()
@ PROW() + 01, 00 SAY "TABELA DE PRECO DE PRODUTO"
@ PROW() + 00, 40 SAY "Em " + DTOC(DATE())
@ PROW() + 00, 69 SAY "Pagina " + STRZERO(vPAGINA,3)
TIRA_NEGRITO()
@ PROW() + 01, 00 SAY REPLICATE("-",79)
@ PROW() + 01, 00 SAY "Cod. Descricao Un Custo Prc.Venda"
@ PROW() + 01, 00 SAY REPLICATE("-",79)
ENDIF
ENDDO
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Se voce imprime o numero da pagina no relatorio critique o codigo:
...
nPaginaInicial := 5 // Pagina que vc escolheu para de inicio da impressao
... // Coloque aqui toda a parte do codigo que realmente imprime
if nPagina >= nPaginaInicial
set device to print
...
set device to
endif
if nPagina = nPaginaFinal // Termina todo processo de impressao
...
endif
endif
nPagina = nPagina + 1
Passe como parametro para a sua rotina de impressao a pagina inicial e final. Faça os testes e use o codigo acima como referencia pois nem lembro mais como usa-los
Se voce imprime o numero da pagina no relatorio critique o codigo:
...
nPaginaInicial := 5 // Pagina que vc escolheu para de inicio da impressao
... // Coloque aqui toda a parte do codigo que realmente imprime
if nPagina >= nPaginaInicial
set device to print
...
set device to
endif
if nPagina = nPaginaFinal // Termina todo processo de impressao
...
endif
endif
nPagina = nPagina + 1
Passe como parametro para a sua rotina de impressao a pagina inicial e final. Faça os testes e use o codigo acima como referencia pois nem lembro mais como usa-los
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
