Convertendo Sistema do GASPRO para Harbour
Enviado: 29 Out 2012 08:33
Olá e bom dia a todos!
Olá Pablo César. Da forma como você postou agora, entendi o que você havia dito sobre os comandos ESC/P estarem nos locais corretos.
Lembro também que os relatórios foram gerados automaticamente pelo GASPro 4.0 e se faço envio do relatório para uma impressora LX-300 (por exemplo) ele sai de forma correta com esses mesmos comandos nesses mesmos locais. Também: se gero o relatório em arquivo e depois envio para o DOSPRINTER a impressão sai correta, em qualquer impressora e também nas "impressoras" que geramm PDF.
Segue abaixo o código fonte:
Aqui a função que coloca os comando ESC/P para impressora
Abaixo os comando usados para impressão
Agradeço pela atenção fico no aguardo
Abraços
Olá Pablo César. Da forma como você postou agora, entendi o que você havia dito sobre os comandos ESC/P estarem nos locais corretos.
Lembro também que os relatórios foram gerados automaticamente pelo GASPro 4.0 e se faço envio do relatório para uma impressora LX-300 (por exemplo) ele sai de forma correta com esses mesmos comandos nesses mesmos locais. Também: se gero o relatório em arquivo e depois envio para o DOSPRINTER a impressão sai correta, em qualquer impressora e também nas "impressoras" que geramm PDF.
Segue abaixo o código fonte:
Código: Selecionar todos
#include "sisirmao.ch" // inicializa constantes manifestas
PRIV dele_atu, cur_atual, getlist:={}, so_um_reg, sit_dbf
PARA lin_menu, col_menu, imp_reg
PRIV tem_borda:=.t., op_menu:=VAR_COMPL, l_s:=6, c_s:=13, l_i:=10, c_i:=70, tela_fundo:=SAVESCREEN(0,0,MAXROW(),79)
nucop=1
so_um_reg=(PCOUNT()>2)
IF !so_um_reg // vai receber a variaveis?
SETCOLOR(drvtittel)
vr_memo=NOVAPOSI(@l_s,@c_s,@l_i,@c_i) // pega posicao atual da tela
CAIXA(mold,l_s,c_s,l_i,c_i) // monta caixa da tela
@ l_s,c_s+19 SAY " IMPRESSŽO DE PEDIDO "
SETCOLOR(drvcortel)
@ l_s+01,c_s+1 SAY "Pedido n§:"
@ l_s+02,c_s+1 SAY "Emiss„o__:"
@ l_s+03,c_s+1 SAY "Cliente__:"
ENDI
PRIV scodped:=SPAC(8) // Pedido
PRIV lin_med:=SPAC(1) // Lin_med
DO WHILE .t.
rola_t=.f.
cod_sos=56
IF !so_um_reg
SET KEY K_ALT_F8 TO ROLATELA
SETCOLOR(drvcortel+","+drvcorget+",,,"+corcampo)
@ l_s+01 ,c_s+12 GET scodped;
PICT "99999999";
VALI CRIT("PTAB(scodped,'PEDI0000',1).AND.PTAB(scodped,'PECL0000',1).AND.PTAB(PECL0000->codcli,'CLIE0000',1)~N£mero de pedido n„o encontrado")
AJUDA "Entre com o n£mero de pedido....|{F8 - consulta}"
CMDF8 "VDBF(6,11,20,77,'PEDI0000',{'codped','datped','totped','totmad','totdiv'},1,'codped',[])"
MOSTRA {"LEFT(TRAN(PEDI0000->datped,[@D]),10)", 2 , 12 }
MOSTRA {"LEFT(TRAN(CLIE0000->nomcli,[@!]),45)", 3 , 12 }
@ l_s+01 ,c_s+22 GET lin_med;
VALI CRIT("!EMPT(lin_med)~Necess rio informar LIN_MED");
WHEN ".f."
READ
SET KEY K_ALT_F8 TO
IF rola_t
ROLATELA(.f.)
LOOP
ENDI
IF LASTKEY()=K_ESC // se quer cancelar
RETU // retorna
ENDI
ENDI
#ifdef COM_REDE
IF !USEARQ("PEDI0000",.f.,10,1) // se falhou a abertura do arq
RETU // volta ao menu anterior
ENDI
#else
USEARQ("PEDI0000") // abre o dbf e seus indices
#endi
PTAB(codven,"VEND0000",1,.t.) // abre arquivo p/ o relacionamento
SET RELA TO codven INTO VEND0000 // relacionamento dos arquivos
titrel:=criterio := "" // inicializa variaveis
cpord=""
chv_rela:=chv_1:=chv_2 := ""
tps:=op_x:=ccop := 1
arq_=drvporta // porta de saida configurada
IF !so_um_reg
fil_ini="codped=M->scodped"
IF !opcoes_rel(lin_menu,col_menu,1,11,fil_ini) // nao quis configurar...
CLOS ALL // fecha arquivos e
LOOP // volta ao menu
ENDI
#ifdef COM_REDE
ELSE
tps=lin_menu
#endi
ENDI
IF tps=2 // se vai para arquivo/video
arq_=ARQGER() // entao pega nome do arquivo
IF EMPTY(arq_) // se cancelou ou nao informou
LOOP // retorna
ENDI
ELSE
arq_=drvporta // porta de saida configurada
ENDI
SET PRINTER TO (arq_) // redireciona saida
EXIT
ENDD
cur_atual=SETCURSOR(0)
criterio_=criterio // salva criterio e ordenacao
cpord_=cpord // definidos se huver
criterio=""
#ifdef COM_REDE
IF !USEARQ("PECL0000",.f.,10,1) // se falhou a abertura do arq
RETU // volta ao menu anterior
ENDI
#else
USEARQ("PECL0000") // abre o dbf e seus indices
#endi
PTAB(codcli,"CLIE0000",1,.t.) // abre arquivo p/ o relacionamento
SET RELA TO codcli INTO CLIE0000 // relacionamento dos arquivos
cpord="codped"
criterio=""
INDTMP()
#ifdef COM_REDE
IF !USEARQ("PEIT0000",.f.,10,1) // se falhou a abertura do arq
RETU // volta ao menu anterior
ENDI
#else
USEARQ("PEIT0000") // abre o dbf e seus indices
#endi
cpord="codped"
criterio=""
INDTMP()
#ifdef COM_REDE
IF !USEARQ("PEIT0000",.f.,10,1) // se falhou a abertura do arq
RETU // volta ao menu anterior
ENDI
#else
USEARQ("PEIT0000") // abre o dbf e seus indices
#endi
cpord="codped"
criterio=""
INDTMP()
#ifdef COM_REDE
IF !USEARQ("PETT0000",.f.,10,1) // se falhou a abertura do arq
RETU // volta ao menu anterior
ENDI
#else
USEARQ("PETT0000") // abre o dbf e seus indices
#endi
PTAB(codcon,"COND0000",1,.t.) // abre arquivo p/ o relacionamento
SET RELA TO codcon INTO COND0000 // relacionamento dos arquivos
cpord="codped"
criterio=""
INDTMP()
#ifdef COM_REDE
IF !USEARQ("PEPG0000",.f.,10,1) // se falhou a abertura do arq
RETU // volta ao menu anterior
ENDI
#else
USEARQ("PEPG0000") // abre o dbf e seus indices
#endi
PTAB(codcar,"CART0000",1,.t.) // abre arquivo p/ o relacionamento
PTAB(codban,"BANC0000",1,.t.)
SET RELA TO codcar INTO CART0000,; // relacionamento dos arquivos
TO codban INTO BANC0000
cpord="codped+codcon"
criterio=""
INDTMP()
criterio=criterio_ // restabelece criterio e
cpord=cpord_ // ordenacao definidos
SELE PEDI0000
dele_atu:=SET(_SET_DELETED,.t.) // os excluidos nao servem...
POE_GAUGE("[ESC] Interrompe","AGUARDE...","Emitidos:")
SET DEVI TO PRIN // inicia a impressao
maxli=56 // maximo de linhas no relatorio
BEGIN SEQUENCE
DO WHIL ccop<=nucop // imprime qde copias pedida
pg_=1; cl=50000
IF so_um_reg
GO imp_reg
ELSE
INI_ARQ() // acha 1o. reg valido do arquivo
ENDI
IF EOF()
EXIT
ENDI
ccop++ // incrementa contador de copias
ult_imp=0 // ultimo reg impresso
DO WHIL !EOF().AND.(!so_um_reg.OR.imp_reg=RECN()).AND.POE_GAUGE()
IF IN_KEY()=K_ESC // se quer cancelar
IF canc() // pede confirmacao
BREAK // confirmou...
ENDI
ENDI
REL_CAB(1,.t.) // soma cl/imprime cabecalho
IMPCTL(drvpeli) // comprime os dados
@ cl,000 SAY "Vendedor :"
@ cl,012 SAY TRAN(VEND0000->nomven,"@!") // Nome vendedor
IMPCTL(drvteli) // retira comprimido
ult_imp=RECNO() // ultimo reg impresso
chv029=codped
SELE PECL0000
SEEK chv029
IF FOUND()
IF cl+3>maxli // se cabecalho do arq filho
REL_CAB(0,.t.) // nao cabe nesta pagina
ENDI // salta para a proxima pagina
IMPCTL(drvpeli) // comprime os dados
cl+=1 // soma contador de linha
@ cl,000 SAY "Cliente :"
@ cl,012 SAY TRAN(nomcli,"@!") // Nome cliente
@ cl,059 SAY "Telefone:"
@ cl,069 SAY TRAN(foncli,"@R (99)9999-9999") // 1§ Fone
cl+=1 // soma contador de linha
@ cl,000 SAY "Entrega :"
@ cl,012 SAY '('+IF(tipent='C','Cliente retira','Entregar')+')'// Tipo
IF !EMPTY(datent) // pode imprimir?
@ cl,029 SAY TRAN(datent,"@D") // Data
ENDI
IMPCTL(drvteli) // retira comprimido
DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
IF IN_KEY()=K_ESC // se quer cancelar
IF canc() // pede confirmacao
BREAK // confirmou...
ENDI
ENDI
IF (tipent='E') //.OR. so_um_reg // se atender a condicao...
REL_CAB(1) // soma cl/imprime cabecalho
IMPCTL(drvpeli) // comprime os dados
@ cl,000 SAY "Endereco :"
@ cl,012 SAY TRAN(endent,"@!") // Endere‡o
@ cl,059 SAY "Bairro:"
@ cl,067 SAY TRAN(baient,"@!") // Bairro
IMPCTL(drvteli) // retira comprimido
REL_CAB(1) // soma cl/imprime cabecalho
IMPCTL(drvpeli) // comprime os dados
@ cl,000 SAY "Referencia:"
@ cl,012 SAY TRAN(refent,"@!") // Referˆncia
IMPAC("Melhor hor rio:",cl,065)
@ cl,081 SAY horent // Hor rio
IMPCTL(drvteli) // retira comprimido
SKIP // pega proximo registro
ELSE // se nao atende condicao
SKIP // pega proximo registro
ENDI
ENDD
IF cl+1>maxli // se cabecalho do arq filho
REL_CAB(0,.t.) // nao cabe nesta pagina
ENDI // salta para a proxima pagina
IMPCTL(drvpeli) // comprime os dados
cl+=1 // soma contador de linha
@ cl,000 SAY REPL("-",96)
IMPCTL(drvteli) // retira comprimido
ENDI
SELE PEDI0000 // volta ao arquivo pai
chv029=codped+"M"
SELE PEIT0000
SEEK chv029
IF FOUND()
IF (tipite='M') //.OR. so_um_reg // se atender a condicao...
IF cl+4>maxli // se cabecalho do arq filho
REL_CAB(0,.t.) // nao cabe nesta pagina
ENDI // salta para a proxima pagina
IMPCTL(drvpeli) // comprime os dados
cl+=1 // soma contador de linha
IMPEXP(cl,002,'*** Madeira ***',30) // Titulo
cl+=1 // soma contador de linha
IMPAC("Produto/Descricao Qtdade Medida Unit rio Total",cl,002)
cl+=1 // soma contador de linha
@ cl,002 SAY REPL("-",78)
IMPCTL(drvteli) // retira comprimido
ENDI
DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
IF IN_KEY()=K_ESC // se quer cancelar
IF canc() // pede confirmacao
BREAK // confirmou...
ENDI
ENDI
IF (tipite='M') //.OR. so_um_reg // se atender a condicao...
REL_CAB(1) // soma cl/imprime cabecalho
IMPCTL(drvpeli) // comprime os dados
@ cl,002 SAY TRAN(codite,"99999") // C¢digo
IF PTAB(codite,'MADE0000',1)
@ cl,008 SAY TRAN(LEFT(ALLTRIM(MADE0000->desmad)+' '+codaca,35),"@!") // Descri‡„o
ENDI
@ cl,044 SAY TRAN(qtdite,"@E 999999.99") // Qtdade
@ cl,054 SAY TRAN(comite,"@E 999.99") // Comprimento
@ cl,061 SAY TRAN(vlrite,"@E 99,999.99") // Unit rio
@ cl,071 SAY TRAN(vlrite*qtdite,"@E 99,999.99")// Valor total
IMPCTL(drvteli) // retira comprimido
SKIP // pega proximo registro
ELSE // se nao atende condicao
SKIP // pega proximo registro
ENDI
ENDD
cl+=1 // soma contador de linha
ENDI
SELE PEDI0000 // volta ao arquivo pai
chv029=codped+"D"
SELE PEIT0000
SEEK chv029
IF FOUND()
IF (tipite='D') //.OR. so_um_reg // se atender a condicao...
IF cl+4>maxli // se cabecalho do arq filho
REL_CAB(0,.t.) // nao cabe nesta pagina
ENDI // salta para a proxima pagina
IMPCTL(drvpeli) // comprime os dados
cl+=1 // soma contador de linha
IMPEXP(cl,002,'*** Diversos ***',32) // Titulo
cl+=1 // soma contador de linha
IMPAC("Produto/Descricao Qtdade Unit rio Total",cl,002)
cl+=1 // soma contador de linha
@ cl,002 SAY REPL("-",78)
IMPCTL(drvteli) // retira comprimido
ENDI
DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
IF IN_KEY()=K_ESC // se quer cancelar
IF canc() // pede confirmacao
BREAK // confirmou...
ENDI
ENDI
IF (tipite='D') //.OR. so_um_reg // se atender a condicao...
REL_CAB(1) // soma cl/imprime cabecalho
IMPCTL(drvpeli) // comprime os dados
@ cl,002 SAY TRAN(codite,"99999") // C¢digo
IF PTAB(codite,'DIVE0000',1) // pode imprimir?
@ cl,008 SAY TRAN(LEFT(DIVE0000->desdiv,35),"@!")// Descri‡„o
ENDI
@ cl,049 SAY TRAN(qtdite,"@E 999999.99") // Qtdade
@ cl,060 SAY TRAN(vlrite,"@E 99,999.99") // Unit rio
@ cl,071 SAY TRAN(vlrite*qtdite,"@E 99,999.99")// Valor total
IMPCTL(drvteli) // retira comprimido
SKIP // pega proximo registro
ELSE // se nao atende condicao
SKIP // pega proximo registro
ENDI
ENDD
cl+=1 // soma contador de linha
ENDI
SELE PEDI0000 // volta ao arquivo pai
chv029=codped
SELE PETT0000
SEEK chv029
IF FOUND()
IF cl+2>maxli // se cabecalho do arq filho
REL_CAB(0,.t.) // nao cabe nesta pagina
ENDI // salta para a proxima pagina
IMPCTL(drvpeli) // comprime os dados
cl+=1 // soma contador de linha
@ cl,000 SAY REPL("-",96)
IMPCTL(drvteli) // retira comprimido
DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
IF IN_KEY()=K_ESC // se quer cancelar
IF canc() // pede confirmacao
BREAK // confirmou...
ENDI
ENDI
REL_CAB(1) // soma cl/imprime cabecalho
IMPCTL(drvpeli) // comprime os dados
@ cl,002 SAY "Madeiras :"
@ cl,013 SAY TRAN(PEDI0000->totmad,"@E 9999,999.99")// Total madeira
@ cl,031 SAY "Diversos :"
@ cl,042 SAY TRAN(PEDI0000->totdiv,"@E 9999,999.99")// Total diversos
@ cl,065 SAY "Total do pedido :"
@ cl,083 SAY TRAN(totpet,"@E 9999,999.99") // Total cobrado
IMPCTL(drvteli) // retira comprimido
chv030=codped+codcon
SELE PEPG0000
SEEK chv030
IF FOUND()
IF cl+3>maxli // se cabecalho do arq filho
REL_CAB(0,.t.) // nao cabe nesta pagina
ENDI // salta para a proxima pagina
cl+=1 // soma contador de linha
@ cl,002 SAY "Vencimento Valor Pagamento"
IF tippag='1' // pode imprimir?
@ cl,052 SAY 'Agencia' // Agˆncia nome
ENDI
IF tippag='1' // pode imprimir?
@ cl,063 SAY 'Conta' // Conta numero
ENDI
cl+=1 // soma contador de linha
@ cl,002 SAY "---------- ----------- -----------------------------------------------"
DO WHIL ! EOF() .AND. chv030=LEFT(&(INDEXKEY(0)),LEN(chv030)).AND.POE_GAUGE()
IF IN_KEY()=K_ESC // se quer cancelar
IF canc() // pede confirmacao
BREAK // confirmou...
ENDI
ENDI
REL_CAB(1) // soma cl/imprime cabecalho
@ cl,002 SAY TRAN(datpag,"@D") // Vencimento
@ cl,013 SAY TRAN(vlrpag,"@E 9999,999.99")// Valor
@ cl,026 SAY IF(tippag='0','Dinheiro',IF(tippag='1','Cheque',IF(tippag='2','Cart„o',IF(tippag='3','Boleto','NP/Carteira'))))// Tipo
IF tippag$'12' // pode imprimir?
@ cl,036 SAY TRAN(IF(tippag='1',BANC0000->nomban,CART0000->nomcar),"@!")// Cart„o/Banco
ENDI
@ cl,052 SAY TRAN(ageban,"@!") // Agˆncia
@ cl,063 SAY TRAN(conban,"@!") // Conta
SKIP // pega proximo registro
ENDD
cl+=1 // soma contador de linha
ENDI
SELE PETT0000 // volta ao arquivo pai
SKIP // pega proximo registro
ENDD
ENDI
SELE PEDI0000 // volta ao arquivo pai
SKIP // pega proximo registro
ENDD
IMPCTL(drvpeli) // comprime os dados
REL_RDP(.t.) // imprime rodape' do relatorio
IMPCTL(drvteli) // retira comprimido
ENDD ccop
EJEC // salta pagina
END SEQUENCE
SETCURSOR(cur_atual)
SET PRINTER TO (drvporta) // fecha arquivo gerado (se houver)
SET DEVI TO SCRE // direciona saida p/ video
IF tps=2 // se vai para arquivo/video
BROWSE_REL(arq_,2,3,MAXROW()-2,78)
ENDI // mostra o arquivo gravado
GRELA(1) // grava variacao do relatorio
SELE PEPG0000 // seleciona arquivo
SET RELA TO // retira os relacionamentos
SELE PETT0000 // seleciona arquivo
SET RELA TO // retira os relacionamentos
SELE PECL0000 // seleciona arquivo
SET RELA TO // retira os relacionamentos
SELE PEDI0000 // seleciona arquivo
SET RELA TO // retira os relacionamentos
SET(_SET_DELETED,dele_atu) // os excluidos serao vistos
IF so_um_reg
POINTER_DBF(sit_dbf)
ENDI
RETU
STATIC PROC REL_RDP(volta_reg) // rodape'
LOCAL ar_:=ALIAS(), reg_atual
SELE PEDI0000 // volta ao arquivo pai
reg_atual=RECNO()
IF volta_reg .AND. ult_imp>0
GO ult_imp // ajusta reg p/ imp de campos no rodape'
ENDI
IF pg_>1
IMPCTL(drvpenf) // comprime os dados
@ 57,000 SAY TRAN(PADC(ALLTRIM(M->mensa1),96),"@!") // Rodap‚ pedido
@ 58,000 SAY TRAN(PADC(ALLTRIM(M->mensa2),96),"@!") // Rodap‚ pedido
@ 59,000 SAY TRAN(PADC(ALLTRIM(M->mensa3),96),"@!") // Rodap‚ pedido
@ 60,000 SAY TRAN(PADC(ALLTRIM(M->mensa4),96),"@!") // Rodap‚ pedido
IMPCTL(drvtenf) // comprime os dados
@ 61,000 SAY REPL("-",96)
IF R00102F9() // pode imprimir?
@ 62,000 SAY lin_med // Linha das m‚dias
ENDI
@ 63,000 SAY REPL("=",96)
ENDI
IF volta_reg
GO reg_atual // retorna reg a posicao original
ult_imp = reg_atual
ENDI
SELE (ar_)
RETU
STATIC PROC REL_CAB(qt, volta_reg) // cabecalho do relatorio
LOCAL ar_:=ALIAS()
volta_reg=IF(volta_reg=NIL,.f.,volta_reg)
IF qt>0 // se parametro maior que 0
cl=cl+qt // soma no contador de linhas
ENDI
IF cl>maxli .OR. qt=0 // quebra de pagina
IMPCTL(drvpeli) // comprime os dados
REL_RDP(volta_reg) // imprime rodape' do relatorio
SELE PEDI0000 // volta ao arquivo pai
@ 0,000 SAY REPL("=",96)
@ 1,000 SAY PADC('Impress„o de pedido para simples conferencia',96)// Titulo
IMPEXP(2,000,PADC(ALLTRIM(M->nemp),48),96) // Empresa
@ 3,000 SAY PADC(ALLTRIM(M->endemp)+' - '+ALLTRIM(M->baiemp)+' - '+TRANS(M->cepemp,'@R 99999-999'),96)// Endere‡o
@ 4,000 SAY PADC(R00101F9(),96) // Cidade
@ 5,000 SAY REPL("=",96)
@ 6,000 SAY "Pedido :"
IMPEXP(6,012,TRAN(codped,"99999999"),16) // Pedido
@ 6,041 SAY "Emissao:"
IMPEXP(6,050,TRAN(datped,"@D"),20) // Data
SELE (ar_)
IMPCTL(drvteli) // retira comprimido
cl=qt+6 ; pg_++
ENDI
RETU
* \\ Final de SIS_R001.PRG
Código: Selecionar todos
/*
Sintaxe: IMPCTL( <ExpC> )
Funcao.: Imprime codigo de controle na impressora
ExpC = codigo de controle
Retorna: NIL
*/
FUNC IMPCTL(ctl_)
LOCAL li_:=PROW(), co_:=PCOL() // salva posicao do carro da impressora
IF LEN(ctl_)>0 // se foi passado um codigo de controle
lp_=SET(_SET_PRINTER,.t.) // liga "echo" para impressora
lc_=SET(_SET_CONSOLE,.f.) // desliga saidas para video
?? &ctl_. // imprime caracteres de controle
SET(_SET_PRINTER,lp_) // retorna o "echo" original da impressora
SET(_SET_CONSOLE,lc_) // impressao no video habilitada
SETPRC(li_,co_) // retorna cabeca impressora
ENDI
RETURN NIL // para a posicao originalCódigo: Selecionar todos
Ativa comprime 17,5 cpp CHR(15)
Desativa comprime 17,5 cpp CHR(18)
Ativa comprime 20 cpp.. CHR(27)+'M'+CHR(15)
Desativa comprime 20 cpp.. CHR(27)+'P'
Ativa elite............ CHR(27)+'M'
Desativa elite............ CHR(27)+'P'
Ativa negrito.......... CHR(27)+'E'
Desativa negrito.......... CHR(27)+'F'
Ativa expandido........ CHR(27)+'W'+CHR(1)
Desativa expandido........ CHR(27)+'W'+CHR(0)
Ativa 8 lin/pol........ CHR(27)+'0'
Desativa 8 lin/pol........ CHR(27)+'2' Abraços