Página 1 de 1

Imprimir Relatorio por pagina

Enviado: 20 Dez 2005 12:57
por Ricardo Sales Ribeiro
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

Enviado: 20 Dez 2005 15:30
por rochinha
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:

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
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 :?)

Agradecimento

Enviado: 21 Dez 2005 15:50
por Ricardo Sales Ribeiro
Amigo Rochinha!

Obrigado pela sua ajuda, vou ver se consigo resolver aqui.


Um grande abraço

Um Feliz Natal

Enviado: 21 Dez 2005 17:08
por Grings
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.

IMPRESSAO POR FOLHA

Enviado: 10 Fev 2007 15:06
por ERASMO ANDRIOLI
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.

Enviado: 10 Fev 2007 20:37
por janio
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.
Sigo o raciocínio do Grigs e até o momento tem funcionado blz.

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 
Jânio

Enviado: 10 Fev 2007 20:42
por rochinha
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