Clipper On Line • Ver Tópico - IMPRESSÃO DE RELATÓRIOS

IMPRESSÃO DE RELATÓRIOS

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

IMPRESSÃO DE RELATÓRIOS

Mensagempor coiote64 » 29 Nov 2018 15:18

Boa tarde, desenvolvedores!

Desenvolvo programas em Harbour (nunca uso xHarbour). Uso a IDE HMG.
Desenvolvi vários relatórios que são salvos em arquivos TXT para posteriormente serem impressos pelo programa NODOSIMP.EXE.

Tem um problema esquisito que não estou conseguindo resolver.
É o seguinte...

Quando mando imprimir um determinado relatório X, sai que é uma beleza...perfeito...
Depois, quando mando imprimir o relatório Y aí acontece o problema: sai uma folha em branco e depois o relatório.
Não entendi porque o primeiro relatório não sai uma folha em branco...só o segundo relatório sai.
Já inverti os relatórios, acontece a mesma coisa: sempre ao imprimir o segundo sai uma folha em branco.

Alguma coisa fica na memória esperando pela ordem de impressão do proximo relatório e aí sai a maldita folha em branco.

Alguém já passou por isso? E como resolveu?

Help-me!

Obrigado!
Hans Frank
Campinas/SP
Avatar de usuário

coiote64
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 7
Data de registro: 13 Jun 2015 16:54
Cidade/Estado: CAMPINAS
Curtiu: 4 vezes
Mens.Curtidas: 1 vez

IMPRESSÃO DE RELATÓRIOS

Mensagempor Jairo Maia » 29 Nov 2018 15:58

Olá coiote64,

1-Isso acontece com qualquer impressora?
2-Tem como você postar um exemplo de TXT que isso ocorre?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor coiote64 » 29 Nov 2018 16:00

Complementando a mensagem anterior:

No primeiro relatório não tem a setinha apontada para cima. Mas no segundo relatório tem e é essa setinha que solta folha em branco.
Essa setinha é chamada de EJECT.
Então entre o primeiro e o segundo relatório fica na memória esta setinha (EJECT) que solta a folha em branco.
Um detalhe: quando digo folha em branco, na verdade, sai impresso apenas o logotipo da empresa que o NODOSIMP faz.

Obrigado pela pela atenção e paciencia.

Hans
Hans Frank
Campinas/SP
Avatar de usuário

coiote64
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 7
Data de registro: 13 Jun 2015 16:54
Cidade/Estado: CAMPINAS
Curtiu: 4 vezes
Mens.Curtidas: 1 vez

IMPRESSÃO DE RELATÓRIOS

Mensagempor coiote64 » 29 Nov 2018 16:07

Jairo,

1º relatório sai assim:

==============================================================================================
EMPRESA TAL 1
CONTROLE DE ENTRADA E SAIDA DE MATERIAL DE ESCRITORIO
Lista de Contas de Entrada - por Ordem Alfabetica
----------------------------------------------------------------------------------------------
No | Nome da Conta de Entrada
-----+----------------------------------------------------------------------------------------
5 | AJUSTE DE ESTOQUE
8 | C-PEL COMERCIO DE PAPELARIA LTDA
9 | DEVOLUCOES
7 | ESTORNO DE LANCAMENTO
4 | G & F COMPUTER SYSTEMS INFORMATICA LTDA
2 | GES DISTRIBUIDORA DE PAPELARIA E BRINQUEDO LTDA
11 | ICAMPA INFORMATICA
10 | INVENTARIO
3 | N P PAPELARIA E INFORMATICA LTDA
1 | PAPELARIA FULCONI LTDA
6 | TRANSFERENCIA DE SALDO DE ESTOQUE
----------------------------------------------------------------------------------------------

No 2º relatório (OBSERVE QUE NA PRIMEIRA COLUNA DA PRIMEIRA LINHA TEM UMA SETINHA DE EJECT que solta a folha em branco):

^
|==============================================================================================
EMPRESA TAL 1
CONTROLE DE ENTRADA E SAIDA DE MATERIAL DE ESCRITORIO
Lista de Contas de Entrada - por Ordem Numerica
----------------------------------------------------------------------------------------------
No | Nome da Conta de Entrada
-----+----------------------------------------------------------------------------------------
1 | PAPELARIA FULCONI LTDA
2 | GES DISTRIBUIDORA DE PAPELARIA E BRINQUEDO LTDA
3 | N P PAPELARIA E INFORMATICA LTDA
4 | G & F COMPUTER SYSTEMS INFORMATICA LTDA
5 | AJUSTE DE ESTOQUE
6 | TRANSFERENCIA DE SALDO DE ESTOQUE
7 | ESTORNO DE LANCAMENTO
8 | C-PEL COMERCIO DE PAPELARIA LTDA
9 | DEVOLUCOES
10 | INVENTARIO
11 | ICAMPA INFORMATICA
----------------------------------------------------------------------------------------------
Hans Frank
Campinas/SP
Avatar de usuário

coiote64
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 7
Data de registro: 13 Jun 2015 16:54
Cidade/Estado: CAMPINAS
Curtiu: 4 vezes
Mens.Curtidas: 1 vez

IMPRESSÃO DE RELATÓRIOS

Mensagempor Jairo Maia » 29 Nov 2018 17:54

coiote64 escreveu:No primeiro relatório não tem a setinha apontada para cima. Mas no segundo relatório tem e é essa setinha que solta folha em branco.
Sim, é o caracter ASCII que significa EJECT para comandos ESC/POS (RAW).

E ele está em seu arquivo TXT, então está sendo colocado por sua rotina quando vai gerar o segundo relatório. Para poder ajudar somente vendo a função que você usa para gerar esses TXT´s. Poste sua rotina. Antes, verifique em que momento você está usando o comando EJECT. Veja se identifica, mas se postar sua função facilitaria.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor susviela@bol.com.br » 29 Nov 2018 18:24

Então se vc imprimir o relatório 1 e sair do programa o relatório-2 não sai com salto de pagina é isso

Então ta faltando ZERAR ....ALGUMA VARIÁVEL se for algum objeto quem sabe tu passa NUL para ele assim

oRelatorio := Nil
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 236
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 153 vezes
Mens.Curtidas: 24 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor coiote64 » 30 Nov 2018 09:52

Oi, Jairo!

Segue a rotina lembrando que não é a rotina principal.
O problema, acredito eu, é o que está marcado em vermelho.

------------------------------------------------------------------------

#include <hmg.ch>

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")

L:=1
PG:=1
TAM_REL:=94
TITULOTER:="Lista de Contas de Entrada - por Ordem Alfabetica"
USE FOR_DBF.DBF
SORT TO FOR2_DBF.DBF ON FOR_NOME
USE FOR2_DBF.DBF
GO TOP

SET PRINTER TO ARQ1.TXT
SET CONSOLE OFF
SET DEVICE TO PRINTER
SET PRINT ON

CAB_REL1(TITULOPRI,TITULOSEC,TITULOTER)
? " No | Nome da Conta de Entrada "
? "-----+----------------------------------------------------------------------------------------"
DO WHILE .NOT. EOF()
IF L=67
? REPLICATE ("-",TAM_REL)
? ""
__Eject()
L:=1
CAB_REL1(TITULOPRI,TITULOSEC,TITULOTER)
? " No | Nome da Conta de Entrada "
? "-----+----------------------------------------------------------------------------------------"
ENDIF
? FOR_NRCD,"|",FOR_NOME
IF EOF()
?? REPLICATE ("-",TAM_REL)
? ""
__Eject()
L:=NIL
PG:=NIL
EXIT
ELSE
PG++
L++
SKIP
ENDIF
ENDDO


SET PRINT OFF
SET DEVICE TO SCREEN
SET CONSOLE ON
SET PRINTER TO

CLOSE ALL
RUN NODOSIMP.EXE ARQ1.TXT 96 GRA/MUL
RUN ("DEL FOR2_DBF.DBF")
RUN ("DEL ARQ1.TXT")
MENSAGEM(16,62,"Documento enviado para impressora",2)

FUNCTION CAB_REL1(TITULO_PRI,TITULO_SEC,TITULO_TER)
LARG_CAB:=TAM_REL/2
@ 0,0 SAY REPLICATE ("=",TAM_REL)
@ 1,LARG_CAB-(LEN(TITULO_PRI)/2) SAY TITULO_PRI
@ 1,TAM_REL-10 SAY STR(PG)
@ 2,LARG_CAB-(LEN(TITULO_SEC)/2) SAY TITULO_SEC
@ 3,LARG_CAB-(LEN(TITULO_TER)/2) SAY TITULO_TER
@ 4,0 SAY REPLICATE ("-",TAM_REL)
RETURN NIL

------------------------------------------------------------------------
Hans Frank
Campinas/SP
Avatar de usuário

coiote64
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 7
Data de registro: 13 Jun 2015 16:54
Cidade/Estado: CAMPINAS
Curtiu: 4 vezes
Mens.Curtidas: 1 vez

IMPRESSÃO DE RELATÓRIOS

Mensagempor susviela@bol.com.br » 30 Nov 2018 11:02

@ 0,0 é nova página se o ROW() for maior que 0 , ou estou enganado ???
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 236
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 153 vezes
Mens.Curtidas: 24 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor Jairo Maia » 30 Nov 2018 13:10

Olá Pessoal,

coiote64, você está dando o EJECT na linha 69 do relatório. Uma folha A4 tem 11 polegadas de altura, e como a impressão em modo Raw embora possa configurar para 8 linhas, o padrão é de 6 linhas por polegadas, então o máximo é de 66 linhas.

Esse EJECT está sendo colocado na próxima página, não na mesmo página. Veja que você verifica se a linha é a 67, e fecha a página com Replicate( "-", TAM_REL ), depois pula 1 linha e aplica o EJECT, volta o contador L para 1 e inicia o cabeçalho da próxima página.

Tente alterar para IF L=67 para IF L=62 por exemplo. Se persistir, diminua para 60 por exemplo, para evitar o EJECT automático da impressora (algumas têm). Teste e veja se funciona. Penso que seja isso.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor coiote64 » 30 Nov 2018 13:15

DESCOBRI!!!!!!!!!!!

O problema estava nos @x,y. Isso que causava o "eject" de uma folha em branco. Veja abaixo.

Onde se lê:
===================================================
FUNCTION CAB_REL(TITULO_PRI,TITULO_SEC,TITULO_TER)
LARG_CAB:=TAM_REL/2
@ 0,0 SAY REPLICATE ("=",TAM_REL)
@ 1,LARG_CAB-(LEN(TITULO_PRI)/2) SAY TITULO_PRI
@ 1,TAM_REL-10 SAY STR(PG)
@ 2,LARG_CAB-(LEN(TITULO_SEC)/2) SAY TITULO_SEC
@ 3,LARG_CAB-(LEN(TITULO_TER)/2) SAY TITULO_TER
@ 4,0 SAY REPLICATE ("-",TAM_REL)
RETURN NIL

Troquei por:
===================================================
FUNCTION CAB_REL(TITULO_PRI,TITULO_SEC,TITULO_TER)
LARG_CAB:=TAM_REL/2
?? REPLICATE("=",TAM_REL)
? REPLICATE(" ",LARG_CAB-(LEN(TITULO_PRI)/2))
?? TITULO_PRI
?? STR(PG)
? REPLICATE(" ",LARG_CAB-(LEN(TITULO_SEC)/2))
?? TITULO_SEC
? REPLICATE(" ",LARG_CAB-(LEN(TITULO_TER)/2))
?? TITULO_TER
? REPLICATE ("-",TAM_REL)
RETURN NIL

O comando "?" não provoca o "eject", o "@" sim.

Lição aprendida!
Hans Frank
Campinas/SP
Avatar de usuário

coiote64
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 7
Data de registro: 13 Jun 2015 16:54
Cidade/Estado: CAMPINAS
Curtiu: 4 vezes
Mens.Curtidas: 1 vez

IMPRESSÃO DE RELATÓRIOS

Mensagempor susviela@bol.com.br » 30 Nov 2018 13:54

@ 0,0 é nova página se o ROW() for maior que 0 , ou estou enganado ???


Poderia ter mudado também para: @ ROW()+1 ,0 SAY REPLICATE ("=",TAM_REL) que ia resolver.

o ROW() vai aumentando automaticamente, se vc enviar um ROW() menor que o atual, ele assume NOVA PÁGINA.
Haaaa você pode testar assim:

IF ROW() > 59 ....

Que bom que resolveu . ..
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 236
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 153 vezes
Mens.Curtidas: 24 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor JoséQuintas » 30 Nov 2018 16:49

Não pode ser isso não.
Faça um teste, coloque no início SetPrc(0,0), isso reseta o contador interno antes do relatório.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor rochinha » 30 Nov 2018 20:16

Amiguinhos,

Quando comecei a ler a postagem pensei logo no SetPrc(0,0)

Mas o outro José, o Quintas chegou antes. Deve ser o mal dos Josés, pensarem as mesmas coisas. kkkkk
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor JoséQuintas » 30 Nov 2018 23:54

Como eu digo sempre, deixo tudo em fontes, foi só confirmar... rs

https://github.com/JoseQuintas/JoseQuintas/blob/master/source/ze_printbegin.prg

printbegin.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

IMPRESSÃO DE RELATÓRIOS

Mensagempor Jairo Maia » 01 Dez 2018 10:09

Vamos entender isso então:

Este era o código que ele estava usando:
CAB_REL1(TITULOPRI,TITULOSEC,TITULOTER)
? " No | Nome da Conta de Entrada "
? "-----+----------------------------------------------------------------------------------------"
DO WHILE .NOT. EOF()
IF L=67
? REPLICATE ("-",TAM_REL)
? ""
__Eject()
L:=1
CAB_REL1(TITULOPRI,TITULOSEC,TITULOTER)
? " No | Nome da Conta de Entrada "
? "-----+----------------------------------------------------------------------------------------"
Fácil entender que L começa em 1, linha 0 (zero) da impressora. Então quando L for 67, ele está na linha 66 do formulário, e fecha com ? REPLICATE ("-",TAM_REL). Em seguida ele usa ? "". Como o limite de impressão são de 66 linhas, agora ele está na linha 67, e é quando ele coloca o __Eject() (o mesmo que EJECT). Esse EJECT foi colocado na primeira linha da próxima página, como mostra a postagem dele mais acima, e era ele que causava o EJECT da folha em branco antes de iniciar a impressão das páginas seguintes.

Possível confusão:
@ 0,0 SAY REPLICATE ("=",TAM_REL)
Se ele iniciava a impressão na linha Zero, porque não removia o caractere Chr(12) - (O EJECT)?
Porque após o EJECT, os valores PRow() e PCol() passam a serem ZERO. Portanto, a linha corrente do inicio do cabeçalho, era a linha Zero mas após o EJECT que foi colocado, também como mostra a postagem dele mais acima.

Entendendo a alteração:
The difference between ? and ?? is that the ? command first outputs a carriage-return/line-feed pair so that the output of <expression,...> always begins at a new line, while ?? outputs the values of <expression,...> at the current cursor or printhead position.
Assim, como ele grava o arquivo via SET PRINTER TO ARQ1.TXT, o sistema está usando FWrite() para gerar o arquivo. Ao trocar @ 0,0 Say... por ??, a linha inicial da próxima página que era o caractere EJECT, foi sobreposta, então não tem o EJECT que solta a folha em branco.

NOTA: Se a página é impressa em seu limite de linha, não precisa usar EJECT, a folha acabou e é ejetada, e a impressora puxa a próxima. O sistema apenas precisa zera o contador, nesse caso o "L", como ele faz. Se quer usar o EJECT, precisa ser no máximo na última linha da folha anterior, o que não é necessário, então se vai usar @ x,y Say ... precisa usar SetPRC( 0,0 ). Quando usa "?" ou "??", apenas controla número de página, inicio e final pelo número de linhas da folha, sem nenhuma outra preocupação com SetPRC() ou o que seja para gerar o arquivo. Apenas na última folha, verificar se a folha foi completamente usada, caso não, então sim usar o EJECT para ejetar a folha.

Sobre EJECT aplicar automaticamente SetPRC( 0, 0 ):
The EJECT command ejects the current page from the printer by sending a form feed control character (Chr(12)) to the printer. In addition, the functions for maintaining the current postion of the printhead are reset to zero (see PCol() and PRow()).
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro