Página 1 de 3

Páginas usando o WIN32prn()

Enviado: 28 Set 2015 19:32
por rbonotto
Ola pessoal,

Estou com um problema com a impressão de um relatório usando a win32prn().

Pelo programa formo um arquivo .TXT e em seguida mando para a imprimir via win32prn(), o problema é que
muitas vezes este arquivo passa de 60,70 ate umas 200 linhas e a função só imprime a primeira pagina. O arquivo txt
esta correto mas só uma parte vai para impressora.

Segue o código:

Código: Selecionar todos

cFileName   := vArCom1
cLinha      := Nil
aLinesPrint := {}
cBuffer     := FOpen( cFileName, 2 )
WHILE Hb_FReadLine( cBuffer, @cLinha, Nil, 255 ) = 0
   AADD( aLinesPrint, cLinha )
END
nPrn := ACHOICE( 03, 02, maxRow()-10, maxCol()-30, aPrn, .T., , nPrn )
IF ! EMPTY( nPrn )
   prnprtc( aPrn[nPrn] )
ELSE
   RETURN
ENDIF


***************************************************
FUNCTION prnprtc(cPrinter)
***************************************************
LOCAL oPrinter     := WIN32PRN():New(cPrinter), aFonts, nPos
oPrinter:Landscape := .F.
oPrinter:FormType  := DMPAPER_A5_TRANSVERSE
oPrinter:Copies    := nUmDEvEz

IF !oPrinter:Create()
   avs('ERRO CAMINHO DA IMPRESSORA')
ELSE
   IF !oPrinter:startDoc('')
      avs('ERRO INICIANDO DOCUMENTO.')
   ELSE
      oPrinter:UnderLine( .F. )
      oPrinter:SetFont( mAinFonte,mAinTaman,{1,20}, 0, .F., .F. )
      For i = 1 To Len ( aLinesPrint )
         oPrinter:textOut( aLinesPrint[ i ] )  // imprime a linha
         oPrinter:newLine()  // passa para proxima linha
      Next
      oPrinter:EndDoc()
      oPrinter:Destroy()
   END
END
RETURN(NIL)
Este é o conteudo do arquivo .txt:

VALOR EM ABERTO: 4,217.99 em 61 CONTA(S)
------------------------------------------------------------------------------------------------------------------------

14/12/2007 0000015443 12.00 -
16/01/2008 0000016667 9.50 -
23/01/2008 0000017141 30.00 -
23/01/2008 0000017142 13.00 -
23/01/2008 0000017143 7.00 -
25/01/2008 0000017336 7.00 -
06/02/2008 0000017847 19.80 -
28/09/2015 0000019535 10.00 -
28/09/2015 0000019536 79.98 -
28/09/2015 0000019537 90.00 -
28/09/2015 0000019538 800.00 -
28/09/2015 0000019539 300.00 -
28/09/2015 0000019540 439.89 -
28/09/2015 0000019541 13.33 -
28/09/2015 0000019542 650.00 -
28/09/2015 0000019543 666.50 -
28/09/2015 0000019544 250.00 -
28/09/2015 0000019545 220.00 -
28/09/2015 0000019546 10.00 -
28/09/2015 0000019547 10.00 -
28/09/2015 0000019548 30.00 -
28/09/2015 0000019549 10.00 -
28/09/2015 0000019550 10.00 -
28/09/2015 0000019551 10.00 -
28/09/2015 0000019552 10.00 -
28/09/2015 0000019553 10.00 -
28/09/2015 0000019554 10.00 -
28/09/2015 0000019555 10.00 -
28/09/2015 0000019556 10.00 -
28/09/2015 0000019557 10.00 -
28/09/2015 0000019558 10.00 -
28/09/2015 0000019559 10.00 -
28/09/2015 0000019560 10.00 -
28/09/2015 0000019561 20.00 -
28/09/2015 0000019562 10.00 -
28/09/2015 0000019563 10.00 -
28/09/2015 0000019564 30.00 -
28/09/2015 0000019565 10.00 -
28/09/2015 0000019566 10.00 -
28/09/2015 0000019567 30.00 -
28/09/2015 0000019568 10.00 -
28/09/2015 0000019569 10.00 -
28/09/2015 0000019570 70.00 -
28/09/2015 0000019571 20.00 -
28/09/2015 0000019572 20.00 -
28/09/2015 0000019573 10.00 -
28/09/2015 0000019574 10.00 -
28/09/2015 0000019575 10.00 -
28/09/2015 0000019576 13.33 -
28/09/2015 0000019577 10.00 -
28/09/2015 0000019578 10.00 -
28/09/2015 0000019579 10.00 -
28/09/2015 0000019580 10.00 -
28/09/2015 0000019581 10.00 -
28/09/2015 0000019582 10.00 -
28/09/2015 0000019584 10.00 -
28/09/2015 0000019585 10.00 -
28/09/2015 0000019586 10.00 -
28/09/2015 0000019587 10.00 -
28/09/2015 0000019588 10.00 -
28/09/2015 0000019589 26.66 -
------------------------------------------------------------------------------------------------------------------------

VALOR EM ABERTO: 4,217.99 em 61 CONTA(S)
------------------------------------------------------------------------------------------------------------------------

O PDF fica assim:

[Imagem

Páginas usando o WIN32prn()

Enviado: 28 Set 2015 20:04
por lucimauro
Voce tem que detectar o eject para saltar a folha.
Veja o exemplo :

cTexto:=memoread(cArq)
nLinhas:=mlcount(cTexto, 80, 1, .F.)
for nA:=1 to nLinhas
cLinha:=memoline(cTexto, tamrel, nA, 1, .F.)
if left(alltrim(cLinha),1)==chr(12) && Eject
oPrinter:NewPage()
else
oPrinter:TextOut(" " + cLinha,.T.)
endif
next

Páginas usando o WIN32prn()

Enviado: 28 Set 2015 20:42
por rbonotto
Obrigado lucimauro, mas em que parte do meu código coloco estas linhas ?

Páginas usando o WIN32prn()

Enviado: 28 Set 2015 23:34
por rbonotto
Opas ! ja coloquei no código :D

Ficou assim:

Código: Selecionar todos

LOCAL oPrinter     := WIN32PRN():New(cPrinter), aFonts, nPos
oPrinter:Landscape := .F.
oPrinter:FormType  := DMPAPER_A5_TRANSVERSE
oPrinter:Copies    := nUmDEvEz

IF !oPrinter:Create()
   Alert('ERRO CAMINHO DA IMPRESSORA')
ELSE
   IF !oPrinter:startDoc('')
      Alert('ERRO INICIANDO DOCUMENTO.')
   ELSE
      oPrinter:UnderLine( .F. )
      oPrinter:SetFont( mAinFonte,mAinTaman,{1,20}, 0, .F., .F. )
      mEconTar := 1
      FOR i = 1 To Len ( aLinesPrint )
         oPrinter:textOut( aLinesPrint[ i ] )  // imprime a linha
         oPrinter:newLine()  // passa para proxima linha
         mEconTar ++
         IF mEconTar > lImiteLin
            oPrinter:NewPage()
            mEconTar := 1
         END
      NEXT
      oPrinter:EndDoc()
      oPrinter:Destroy()
   END
END
RETURN(NIL)

Pelo que vi o win32prn() não obedece os comandos EJECT deixados internos do arquivo de texto, a formatação fica
bem complicada quando tem-se páginas com número de linhas diferentes entre elas.

Páginas usando o WIN32prn()

Enviado: 29 Set 2015 11:55
por Itamar M. Lins Jr.
Ola!
Se a impressora for matricial e/ou imprimir em DRAFT use PrintFileRaw().
No caso a folha(tamanho do papel) está para A5!
Os eject's e os CHR()'s da vida só funcionam se usar printfileraw().

Atenção! win32prn(xHarbour) ou simplesmente Win_Prn(Harbour). Até a M$ mudou os comandos para win_api tirou esse 32...

Eu uso esses códigos para setar corretamente o tamanho da página(bobina)

Código: Selecionar todos

cText := memoread(cArq)
nLinh := mlcount(cText)
nTL   := (nLinh/5)
oPrn  := win_prn():New(cPrint)
oPrn :LandScape   := .F.
oPrn :FormType    := WIN_DMPAPER_USER
oPrn :PaperLength := 8.5*25.4*nTL
oPrn :PaperWidth  := 3*25.4*10
oPrn :Copies      := 1
Obs. Usando papel bobina, e Harbour.

Saudações,
Itamar M. Lins Jr.

Páginas usando o WIN32prn()

Enviado: 29 Set 2015 22:41
por rbonotto
Valeu Itamar M. Lins Jr.

Mas os santos dos clientes colocoram um impressora Brother para páginas a4 e o printfileraw() não funciona.

Mas deu para quebrar um galho com oPrinter:NewPage()

Abraços !

Páginas usando o WIN32prn()

Enviado: 05 Nov 2015 22:19
por Laudelino Scarmagnani
Olá, boa noite!
Usando Win32PRN, preciso definir tamanho do formulário para imprimir preço em etiqueta de gôndolas de supermercado. Etiquetas amarelas, 3,1 cm.
Não sei onde encontrar isso.
Laudelino

Páginas usando o WIN32prn()

Enviado: 06 Nov 2015 10:27
por Jairo Maia
Olá Laudelino,

E qual a impressora que vai imprimir? Se for a Argox posso ajudar.

Páginas usando o WIN32prn()

Enviado: 06 Nov 2015 16:08
por Laudelino Scarmagnani
Boa tarde, Jairo.
Impressora OS-214plus Argox.
Laudelino

Páginas usando o WIN32prn()

Enviado: 07 Nov 2015 11:01
por Jairo Maia
Olá Laudelino,

Em se tratando de impressora Argox, você não usa WIN32PRN. Usamos os recursos da própria impressora. Adaptei um exemplo com base na função que uso, mas não tenho como testar a impressão, apenas gerou corretamente o arquivco a ser enviado para a impressora.

Faça um teste de impressão, e verifique o layout, e tente fazer as mudanças necessárias as suas necessidades.

Anexei também o manual em linguagem PPLA.

Código: Selecionar todos

/*
  Compilar usando: Hbmk2 exemplo.prg -lhbwin
*/
Function Main()

 cProduto := "NESCAU 2.0 LATA 400 G"
 cUnitario := "UN" // UN, KG, LT, FD, CX, etc...
 nPreco := 4.80
 cCodigo := "7891000053508"  // GTIN valido ou nao sera impresso

 EtqGondola( cProduto, cUnitario, nPreco, cCodigo )
 
Return Nil

Function EtqGondola( cProduto, cUnitario, nPreco, cCodigo )
 Local cCtr := chr(2), cEol := Hb_Eol(), cDescProd
 Local cPrinter, cFileImp:="Gondola.Txt"

 SET DEVI TO PRIN
 SET PRIN TO ( cFileImp )

 @ Prow()+0, PCol() Say cCtr + "e" + cEol     // habilita o sensor gap
 @ Prow()+0, PCol() Say cCtr + "m" + cEol     // unidade em milimitro
 @ Prow()+0, PCol() Say cCtr + "M0300" + cEol // fixa o comprimento em 30mm
 @ Prow()+0, PCol() Say cCtr + "L" + cEol     // entra em modo formato etiqueta
 @ Prow()+0, PCol() Say "H20"      + cEol     // fixa temperatura vai de: H10 a H20 recomendavel H16
 @ Prow()+0, PCol() Say "D11"      + cEol     // Padrao para pixels

 cDescProd:=AllTrim( cProduto )

 If Len( cDescProd ) > 23
  @ Prow()+0, PCol() Say "190000401900010" + cDescProd + cEol  // titulo em fonte pequena
 Else
  @ Prow()+0, PCol() Say "190000601800050" + cDescProd + cEol  // titulo em fonte grande
 EndIf

 @ Prow()+0, PCol() Say "190000500500900" + cUnitario + cEol  // UN ou KG
 @ Prow()+0, PCol() Say "160000700500500" + Tran( nPreco, "@E 9,999.99" ) + cEol  // preço de venda
 @ Prow()+0, PCol() Say "1F0008000300050" + Left( cCodigo,12) + cEol  // codigo de barras (sem digito verificador)

 @ Prow()+0, PCol() Say "E"      + cEol  // envia para a impressora
 @ Prow()+0, PCol() Say "Q" + cEol       // esvazia a memória da impressora

 SET PRIN TO
 SET DEVI TO SCREEN

 cPrinter := GetDefaultPrinter()  // pega impressora padrao
 PrintFileRaw( cPrinter, cFileImp, "Etiqueta de Gondola" )

Return 

Páginas usando o WIN32prn()

Enviado: 07 Nov 2015 11:07
por Laudelino Scarmagnani
Jairo, bom dia!
Tentei fazer uns testes de impressão da etiqueta e não imprimiu. A impressora roda as etiquetas e não imprime. Não tenho experiência nisso. Estou usando o xHabour, mas acredito que o processo seja igual ao Clipper.
Uso os comando da seguinte forma:
WNOMER=espro->nomercad
oPrinter:SetFont('Courier New',nAltu,{1,21}, 0, .F., .F.)
oPrinter:SetPrc(oprinter:Prow()+1,1)
oPrinter:Textout(WFRAME)
SELECT PRE
WFRAME = TRANSFORM(VLPRECO1, '@E 999,999,999.99')
oPrinter:SetPrc(oprinter:Prow()+2,5)
oPrinter:SetFont('Courier New',15,{1,10}, 0, .F., .F.)
oPrinter:Textout(WFRAME)
oPrinter:SetFont('Courier New',nAltu,{1,21}, 0, .F., .F.)
if !empty(espro->cdcodean)
oPrinter:SetPrc(oPrinter:Prow()+1, 5 )
oPrinter:TextOut(ALLTRIM(espro->cdcodean))
endif
WFRAME='.'
oPrinter:SetPrc(oprinter:Prow()+3,1)
oPrinter:Textout(WFRAME)

Tens como me orientar neste tipo de impressão?
Laudelino

Páginas usando o WIN32prn()

Enviado: 07 Nov 2015 11:16
por Jairo Maia
Laudelino, como as mengaens foram quase simultâneas, preciso perguntar se você viu meu exemplo no post anterior a este seu último.

Da forma que você está fazendo, não vai funcionar. Precisa enviar toda configuração via um arquivo .txt como mostra meu exemplo acima.

Páginas usando o WIN32prn()

Enviado: 07 Nov 2015 11:45
por Laudelino Scarmagnani
Ok, Jairo. Recebi o exemplo e o Manual. Vou estudá-los.
Ví que mais complicado do que pensava.
Programo com xHarbour e vou verificar como fazer isso. Não domino muito a linguagem.
Obrigado pela ajuda.

Somente para clarear um pouco.
Pelo que vi, por cima, no manual do impressora, aceita os comando DOS. Pelo que você falou e verifiquei no exemplo, enviando um arquivo.
Então, gero a impressão normal como qualquer outro relatório, gerando os caracteres de controles específicos. Ao final, envio o arquivo à impressora?
Desculpe as perguntas meio bobas, mas, não domino muito a "micro_informática". Meu dia a dia é Cobol em Maiframe.
Abraços
Laudelino

Páginas usando o WIN32prn()

Enviado: 07 Nov 2015 12:26
por Jairo Maia
Olá Laudelino,
Laudelino Scarmagnani escreveu:Então, gero a impressão normal como qualquer outro relatório, gerando os caracteres de controles específicos. Ao final, envio o arquivo à impressora?
Isso mesmo. No caso do exemplo acima será gerado esse arquivo texto que é enviado a impressora:
Gondola.Txt
(147 Bytes) Baixado 473 vezes

Páginas usando o WIN32prn()

Enviado: 07 Nov 2015 13:03
por Laudelino Scarmagnani
Jairo,
estou implementando o exemplo, mas tenho problemas aqui.
Ao compilar, usando HbMake v1.20 - sHarbour Make Utility, xHarbour build 1.0.0 Intel. (Simplex) / Borland C++ 5.5.1 e
deu o seguinte erro:
Error:Unresolved external '_HB_FUN_LIB_HB_EOL' referenced from C:\SISTEMA\XHB\OBJ\PRECOS.OBJ
Está faltando algo aí, e não sei o que pode ser. Ou tenho que definir algo no .prg?
Laudelino