Página 1 de 2

IMPRESSÃO DE RELATÓRIOS

Enviado: 29 Nov 2018 16:18
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!

IMPRESSÃO DE RELATÓRIOS

Enviado: 29 Nov 2018 16:58
por Jairo Maia
Olá coiote64,

1-Isso acontece com qualquer impressora?
2-Tem como você postar um exemplo de TXT que isso ocorre?

IMPRESSÃO DE RELATÓRIOS

Enviado: 29 Nov 2018 17:00
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

IMPRESSÃO DE RELATÓRIOS

Enviado: 29 Nov 2018 17:07
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
----------------------------------------------------------------------------------------------

IMPRESSÃO DE RELATÓRIOS

Enviado: 29 Nov 2018 18:54
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.

IMPRESSÃO DE RELATÓRIOS

Enviado: 29 Nov 2018 19:24
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

IMPRESSÃO DE RELATÓRIOS

Enviado: 30 Nov 2018 10:52
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

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

IMPRESSÃO DE RELATÓRIOS

Enviado: 30 Nov 2018 12:02
por susviela@bol.com.br
@ 0,0 é nova página se o ROW() for maior que 0 , ou estou enganado ???

IMPRESSÃO DE RELATÓRIOS

Enviado: 30 Nov 2018 14:10
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.

IMPRESSÃO DE RELATÓRIOS

Enviado: 30 Nov 2018 14:15
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!

IMPRESSÃO DE RELATÓRIOS

Enviado: 30 Nov 2018 14:54
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 . ..

IMPRESSÃO DE RELATÓRIOS

Enviado: 30 Nov 2018 17:49
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.

IMPRESSÃO DE RELATÓRIOS

Enviado: 30 Nov 2018 21:16
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

IMPRESSÃO DE RELATÓRIOS

Enviado: 01 Dez 2018 00:54
por JoséQuintas
Como eu digo sempre, deixo tudo em fontes, foi só confirmar... rs

https://github.com/JoseQuintas/JoseQuin ... tbegin.prg
printbegin.png

IMPRESSÃO DE RELATÓRIOS

Enviado: 01 Dez 2018 11:09
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()).