IMPRESSÃO DE RELATÓRIOS

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

Moderador: Moderadores

Avatar do usuário
coiote64
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 13 Jun 2015 16:54
Localização: CAMPINAS

IMPRESSÃO DE RELATÓRIOS

Mensagem por coiote64 »

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 do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

IMPRESSÃO DE RELATÓRIOS

Mensagem por Jairo Maia »

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 do usuário
coiote64
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 13 Jun 2015 16:54
Localização: CAMPINAS

IMPRESSÃO DE RELATÓRIOS

Mensagem por coiote64 »

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 do usuário
coiote64
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 13 Jun 2015 16:54
Localização: CAMPINAS

IMPRESSÃO DE RELATÓRIOS

Mensagem por coiote64 »

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 do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

IMPRESSÃO DE RELATÓRIOS

Mensagem por Jairo Maia »

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 do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

IMPRESSÃO DE RELATÓRIOS

Mensagem por susviela@bol.com.br »

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 do usuário
coiote64
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 13 Jun 2015 16:54
Localização: CAMPINAS

IMPRESSÃO DE RELATÓRIOS

Mensagem por coiote64 »

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 do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

IMPRESSÃO DE RELATÓRIOS

Mensagem por susviela@bol.com.br »

@ 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 do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

IMPRESSÃO DE RELATÓRIOS

Mensagem por Jairo Maia »

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 do usuário
coiote64
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 13 Jun 2015 16:54
Localização: CAMPINAS

IMPRESSÃO DE RELATÓRIOS

Mensagem por coiote64 »

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 do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

IMPRESSÃO DE RELATÓRIOS

Mensagem por susviela@bol.com.br »

@ 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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

IMPRESSÃO DE RELATÓRIOS

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

IMPRESSÃO DE RELATÓRIOS

Mensagem por rochinha »

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 [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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

IMPRESSÃO DE RELATÓRIOS

Mensagem por JoséQuintas »

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

https://github.com/JoseQuintas/JoseQuin ... tbegin.prg
printbegin.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

IMPRESSÃO DE RELATÓRIOS

Mensagem por Jairo Maia »

Vamos entender isso então:

Este era o código que ele estava usando:

Código: Selecionar todos

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:

Código: Selecionar todos

@ 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)
Responder