Olá..
Toledo... jóia esse seu exemplo, muito bom mesmo... dá para aproveitar todos os relatórios que já tenho no sistema...
Tõ apanhando com o posicionamento das colunas, se puder dar uma ajuda.
É o seguinte:
Na impressão em anexo aí...
Pode observar que na linha que identifica o cliente, a descricao "Cliente:" tá normal e o nome do cliente tá condensado e negrito. Quanto tá normal ou itálico como pode ser visto no cabeçalho eu mando imprimir em Prow(),83 e o win_prn alinha certinho na coluna 83, mas se mando condensar na mesma linha, perde-se o controle de coluna. Observe que na linha do cliente e na linha abaixo, do Endereço, a Barra "|" não ficou no mesmo alinhamento e nas duas linhas mandei imprimir na prow(),110. Pode ser observado também um pouco acima no texto "P/ uso Instituicao financeira", porque condensou ele perdeu o alinhamento. No meu conceito quando mando o comando para desativar o condensado, deveria voltar para o normal onde a margem direita seria 83, correto? Observe que ele ativa e desativa condensado como mostra a linha do municipio.
Outra coisa, como ativo sublinhado?
Na epson matricial os comandos esc/p que uso são:
Código: Selecionar todos
* IMPRESSORA EPSON
GRANDE := CHR(14) // ATIVA EXPANDIDO
NORMAL := CHR(20) + CHR(18) // ATIVA 10 CPI
PEQUENO := CHR(15) // ATIVA 15 CPI (CONDENSADO)
PEQUENOD := CHR(18)
NEGRITO := CHR(27) + 'E' // ATIVA NEGRITO
NEGRITOD := CHR(27) + 'F' // DESATIVA NEGRITO
SUBLI := CHR(27) + '-' + '1' // ATIVA SUBLINHADO
SUBLID := CHR(27) + '-' + '0' // DESATIVA SUBLINHADO
ITALICO := CHR(27) + '4' // ATIVA ITALICO
ITALICOD := CHR(27) + '5' // DESATIVA ITALICO
e funcionam belezinha... são os mesmo que estou usando para gerar o arquivo do relatório que é enviado pra a sua função.
O meu código:
Código: Selecionar todos
********************************************************************************
FUNCTION RELDUP()
LOCAL cTela := SAVESCREEN(00,00,24,79)
LOCAL GetList := {}
LOCAL nRecno, nLocalRecno := RECNO()
* IMPRESSORA EPSON
GRANDE := CHR(14) // ATIVA EXPANDIDO
NORMAL := CHR(20) + CHR(18) // ATIVA 10 CPI
PEQUENO := CHR(15) // ATIVA 15 CPI (CONDENSADO)
PEQUENOD := CHR(18)
NEGRITO := CHR(27) + 'E' // ATIVA NEGRITO
NEGRITOD := CHR(27) + 'F' // DESATIVA NEGRITO
SUBLI := CHR(27) + '-' + '1' // ATIVA SUBLINHADO
SUBLID := CHR(27) + '-' + '0' // DESATIVA SUBLINHADO
ITALICO := CHR(27) + '4' // ATIVA ITALICO
ITALICOD := CHR(27) + '5' // DESATIVA ITALICO
IF !ABREARQ(,{"CR","CLI"})
BEEP()
MENSAGEMD("N„o foi poss¡vel abrir o arquivo de dados, abortando !",3)
RETURN NIL
ENDIF
WHILE( .T. )
SETCURSOR(1)
RESTSCREEN( ,,,,cTela )
JANELA( 05,02,09,40, "Imprime Duplicata pelo numero" )
cNUMERO:=SPACE(10)
@ 07,10 SAY "Nr.DUPLICATA:" GET cNUMERO PICT "@!"
READ
IF ESC()
EXIT
ENDIF
IF AT('-',cNUMERO)=0
MUDACOD( @cNUMERO )
ELSE
cNUMERO := ALLTRIM(cNUMERO)
ENDIF
SELE CR
DBSETORDER(1)
DBGOTOP()
IF !DBSEEK( cNUMERO )
MENSAGEM("Nao existe nenhuma venda com este numero...")
LOOP
ENDIF
COR("GETS")
cARQ := cNUMERO+'.TXT'
SET PRINTER TO &cARQ
SET DEVICE TO PRINTER
* COMPRNOFF()
nQTDEDUPLI := 0 // CONTROLE PARA NAO IMPRIMIR FORA DO LUGAR
nVLNOTFIS := CR->VLNOTFIS_
cNOTFIS := CR->NOTFIS_
cNUMERO_ := CR->NUMERO_ ; CLI->( DBSETORDER(2) )
cCLIENTE := CR->CODIGO+"-"+IF( CLI->( DBSEEK( CR->CODIGO ) ),CLI->NOME,"CLIENTE "+CR->CODIGO+" NAO CADASTRADO - VERIFIQUE" )
cENDERECO := TRIM(CLI->ENDCOB)+"-"+CLI->BAICOB
cCIDADE := CLI->CIDCOB
cESTADO := CLI->UFCOB
cCEP := CLI->CEPCOB
cPRACA := CR->PRACA_
cCGC := IF(LEFT(CLI->CGC,1)!=SPACE(1),CLI->CGC,CLI->CPF)
cRG := IF(!EMPTY(CLI->INSCRICAO),CLI->INSCRICAO,CLI->RG)
cVALOREXT := VALEXT( CR->VALOR_ )
nVALOR := CR->VALOR_
SETPRC(0,0)
nQTDEDUPLI ++
@ PROW() ,00 SAY "+-----------------------------------------------+------------------------------+"
@ PROW()+1,00 SAY "| "+NEGRITO+PERS->EMPRESA+NEGRITOD+" | C.G.C. "+PERS->CGC ; @ PROW(),83 SAY "|"
@ PROW()+1,00 SAY "| "+ITALICOD+PERS->RAZAO+ITALICOD+" | Insc. Est. "+PERS->INSCRICAO ; @ PROW(),83 SAY "|"
@ PROW()+1,00 SAY "+-----------------------------------------------+------------------------------+"
@ PROW()+1,00 SAY "| "+ITALICOD+pers->endereco+" "+pers->telefone+" Cep78.690-000 Nova Xavantina-MT"+ITALICOD; @ PROW(),83 SAY "|"
@ PROW()+1,00 SAY "+------------------------------------------------------------------------------+"
@ PROW()+1,00 SAY "| Data de Emissao: "+DIA( CR->DTEMIS_ ) ; @ PROW(),MAXCOL() SAY '|'
@ PROW()+1,00 SAY "+-----------------------------------------------------------+------------------+"
@ PROW()+1,00 SAY "| Fatura Duplicata |"+PEQUENO+"P/ uso Instituicao financeira"+PEQUENOD + '|'
@ PROW()+1,00 SAY "+------------+----------+------------+----------+-----------| |"
@ PROW()+1,00 SAY "| Valor R$ | Numero | Valor R$ | No.Ordem | Vencimento| |"
@ PROW()+1,00 SAY "| "+NEGRITO+TRAN( nVLNOTFIS ,"@E 999,999.99") +' |'+;
cNOTFIS +'| '+;
TRAN( nVALOR ,"@E 999,999.99") +' |'+;
cNUMERO_ +'| '+;
DTOC(CR->DTVENC_)+NEGRITOD+'|' ; @ PROW(),83 SAY '|'
@ PROW()+1,00 SAY "+------------+----------+------------+----------+-----------+------------------+"
@ PROW()+1,00 SAY "| | Juros por dia de atraso: |"
@ PROW()+1,00 SAY "| | Cliente: "+PEQUENO+NEGRITO+cCLIENTE+NEGRITOD ; @ PROW(),110 SAY '|'+PEQUENOD
@ PROW()+1,00 SAY "| | Endereco: "+PEQUENO+cENDERECO ; @ PROW(),110 SAY '|'+PEQUENOD
@ PROW()+1,00 SAY "| | Municipio: "+PEQUENO+cCIDADE+PEQUENOD+" UF:"+PEQUENO+cESTADO+PEQUENOD+" CEP:"+PEQUENO+cCEP+PEQUENOD
@ PROW()+1,00 SAY "| | Praca de Pagamento: "+PEQUENO+cPRACA +PEQUENOD
@ PROW()+1,00 SAY "| | CGC/CPF:" +PEQUENO+cCGC+PEQUENOD+ " IE/RG: "+PEQUENO+cRG+PEQUENOD
@ PROW()+1,00 SAY "| | Valor por extenso: "+PEQUENO+IF( LEN( cVALOREXT ) > 55,LEFT(cVALOREXT,55),cVALOREXT )+PEQUENOD
@ PROW()+1,00 SAY "| | "+PEQUENO+IF( LEN( cVALOREXT ) > 55,SUBSTR(cVALOREXT,56,LEN(cVALOREXT)-54),"")+PEQUENOD
@ PROW()+1,00 SAY "| | "+PEQUENO+" Reconheco(emos) a exatidao desta DUPLICATA de Venda Mercantil/Prestacao de Servicos "+PEQUENOD
@ PROW()+1,00 SAY "| | "+PEQUENO+"na importancia acima que pagarei(emos) a "+pers->razao+" ou a sua ordem na"+PEQUENOD
@ PROW()+1,00 SAY "| --------------------- | "+PEQUENO+"praca e vencimento indicados."+PEQUENOD
@ PROW()+1,00 SAY "| "+pequeno+pers->razao+' |' ; @ PROW(),130 SAY '|'+PEQUENOD
@ PROW()+1,00 SAY "| | |"
@ PROW()+1,00 SAY "| | ______________ ___________________________ |"
@ PROW()+1,00 SAY "+-----------------------+ Data do aceite Assinatura do Cliente |"
@ PROW()+1,00 SAY "| "+PEQUENO+" A falta do pagamento no vencimento, serao cobrados juros legais mais despesas bancarias; nao dispensar nem condicional "+PEQUENOD+'|'
@ PROW()+1,00 SAY "+-----------------------+------------------------------------------------------+"
@ PROW()+4,00 SAY ""
* COMPRNON()
SET PRINTER TO
SET DEVICE TO SCREEN
OPEN_REL( cARQ )
* RUN &cARQ
/* cPRINTER := GetDefaultPrinter()
PrintFileRaw( cPRINTER, cARQ , "SALDO DE CLIENTES" )
*/
ENDDO
SETCURSOR(0)
RESTSCREEN(,,,,cTela )
ABREARQ(,.F.)
RETURN( NIL )
Sua função Open_rel:
Código: Selecionar todos
********************************************************************************
* Impressao com a HBWin
FUNCTION OPEN_REL( cFILE )
Local oFont, oFont2, oFont3
Local nColunas := 0
Local cText := MemoRead(cFile)
// Comandos de impressao
Private chr_pcom:="CHR(15)" // ativa comprimido
Private chr_tcom:="CHR(18)" // desativa comprimido
Private chr_pc20:="CHR(27)+'M'+CHR(15)" // ativa comprimido (20 cpp)
Private chr_tc20:="CHR(27)+'P'" // desativa comprimido (20 cpp)
Private chr_peli:="CHR(27)+'M'" // ativa elite
Private chr_teli:="CHR(27)+'P'" // desativa elite
Private chr_penf:="CHR(27)+'E'" // ativa enfatizado
Private chr_tenf:="CHR(27)+'F'" // desativa enfatizado
Private chr_pexp:="CHR(27)+'W'+CHR(1)" // ativa expansao
Private chr_texp:="CHR(27)+'W'+CHR(0)" // desativa expansao
Private chr_pde8:="CHR(27)+'0'" // ativa 8 lpp
Private chr_tde8:="CHR(27)+'2'" // desativa 8 lpp
Private chr_pita:="CHR(27)+'4'" // ativa Italico
Private chr_tsub:="CHR(27)+'5'" // desativa italico
/*
Escolhe a impressora...
Vou imprimir na impressora default
for i=1 to len(aPrinters)
IF aPrinters[i] == WIN_PRINTERGETDEFAULT()
vCombo1:=i
exit
ENDIF
next
*/
nCop_ := 1 // numero de copias
cTit_ := "Titulo do Relatorio"
lOri_ := .F. // .T. para imprimir em modo paisagem
Imprime_hb(cFILE,GetDefaultPrinter(),nCop_,cTit_,lOri_)
RETURN NIL
********************************************************************************
Function Imprime_hb(cArq,cPrinter,nCop_,cTit_,lOri_)
Local oPrinter := win_prn():New(cPrinter)
Local nBold_ := 0, lItalic:=.F., lUnder:=.F., cCPI_atu:="10", cCPI_ant:="", area_
Local aDrvp_ := {{&chr_pcom.,17},{&chr_pc20.,20},{&chr_peli.,12},{&chr_pexp.,5},{&chr_penf.,.T.},{&chr_pde8.,.T.},{CHR(27)+'4',.T.},{CHR(27)+'5',.T.}}
Local aDrvt_ := {{&chr_tcom.,17},{&chr_tc20.,20},{&chr_teli.,12},{&chr_texp.,5},{&chr_tenf.,.F.},{&chr_tde8.,.F.},{CHR(27)+'4',.F.},{CHR(27)+'5',.F.}}
Local qt_lido, buf_, buffer_, lin_, t_, lEdrv, e_
Private nCPI10:=11, nCPI12:=13, nCPI17:=18, nCPI20:=21, nCPI05:=6
IF (area_:=FOPEN(cArq))<0
ALERT("Não foi possivel abrir o arquivo gerado para Impressão")
Return NIL
ENDIF
oPrinter:FormType := 9 // A4
oprinter:SetPrintQuality(-1)
oPrinter:Copies := nCop_
oPrinter:landscape:= lOri_
IF oPrinter:Create()
IF oPrinter:StartDoc(cTit_)
oPrinter:CharSet(255)
FSEEK(area_,0)
qt_lido=500
buf_=""
WHILE qt_lido=500
buffer_ := SPAC(500)
qt_lido := FREAD(area_,@buffer_,500)
buffer_ := buf_+buffer_
buf_ := ""
IF RIGHT(buffer_,2)=CHR(13)+CHR(10)
buffer_+="*$*ReTiRaR*$*"
ENDIF
WHILE LEN(buffer_)>0
lin_=PARSE(@buffer_,CHR(13)+CHR(10))
IF LEN(buffer_)>0 .OR. qt_lido<>500
IF buffer_=="*$*ReTiRaR*$*"
buffer_:=""
ENDIF
t_=AT(CHR(12)+CHR(13),lin_)
IF t_>0
buffer_:=SUBS(lin_,t_+2)+CHR(13)+CHR(10)+buffer_
lin_=LEFT(lin_,t_-1)
ENDIF
Private aLin:={}
WHILE LEN(lin_)>0
lEdrv_:=.F.
FOR i=1 TO 8
IF aDrvp_[i,1]==LEFT(lin_+spac(10),LEN(aDrvp_[i,1]))
IF i<5
AADD(aLin,{STRZERO(aDrvp_[i,2],2),nBold_,lItalic,lUnder,""})
cCPI_ant+=cCPI_atu
cCPI_atu:=STRZERO(aDrvp_[i,2],2)
ELSE
IF i=5
nBold_:=800
ENDIF
IF i=6
oPrinter:LineHeight:=Int( oPrinter:PixelsPerInchY / 8 )
ENDIF
IF i=7
lItalic:=!lItalic
ENDIF
IF i=8
lUnder:=!lUnder
ENDIF
AADD(aLin,{cCPI_atu,nBold_,lItalic,lUnder,""})
ENDIF
lin_=SUBS(lin_,LEN(aDrvp_[i,1])+1)
lEdrv_:=.T.
EXIT
ENDIF
IF aDrvt_[i,1]==LEFT(lin_+spac(10),LEN(aDrvt_[i,1]))
IF i<5
IF LEN(cCPI_ant)>0
AADD(aLin,{RIGHT(cCPI_ant,2),nBold_,lItalic,lUnder,""})
cCPI_atu:=RIGHT(cCPI_ant,2)
cCPI_ant:=LEFT(cCPI_ant,LEN(cCPI_ant)-2)
ELSE
AADD(aLin,{cCPI_atu,nBold_,lItalic,lUnder,""})
ENDIF
ELSE
IF i=5
nBold_:=0
ENDIF
IF i=6
oPrinter:LineHeight:=Int( oPrinter:PixelsPerInchY / 6 )
ENDIF
IF i=7
lItalic:=!lItalic
ENDIF
IF i=8
lUnder:=!lUnder
ENDIF
AADD(aLin,{cCPI_atu,nBold_,lItalic,lUnder,""})
ENDIF
lin_=SUBS(lin_,LEN(aDrvt_[i,1])+1)
lEdrv_:=.T.
EXIT
ENDIF
NEXT
IF !lEdrv_
e_:=LEN(aLin)
IF e_>0
aLin[e_,5]+=LEFT(lin_,1)
ELSE
AADD(aLin,{cCPI_atu,nBold_,lItalic,lUnder,LEFT(lin_,1)})
ENDIF
lin_:=SUBS(lin_,2)
ENDIF
ENDDO
FOR i=1 TO LEN(aLin)
if lOri_ .and. i<2
cCpi:="nCPI"+aLin[i,1]
oPrinter:setfont('Courier New',12,&cCpi,aLin[i,2],aLin[i,3],aLin[i,4])
oPrinter:TextOut(spac(15))
endif
IF !EMPT(aLin[i,5])
cCpi:="nCPI"+aLin[i,1]
oPrinter:setfont('Courier New',12,&cCpi,aLin[i,2],aLin[i,3],aLin[i,4])
oPrinter:TextOut(aLin[i,5])
ENDIF
NEXT
IF (oPrinter:MaxRow()-2 ) <= oPrinter:Prow() .OR. t_>0
oPrinter:NewPage()
ELSE
oPrinter:newline()
ENDIF
ELSE
buf_=lin_
ENDIF
ENDDO
ENDDO
oPrinter:EndDoc()
oPrinter:Destroy()
ELSE
ALERT("Não foi possivel Iniciar a Impressão, Favor Verificar a Impressora")
ENDIF
ELSE
ALERT("Não foi possivel Iniciar a Impressão, Favor Verificar a Impressora")
ENDIF
FCLOSE(area_)
RETURN NIL
Arquivo TXT do relatório
Arquivo PDF
Obrigado
Rubens