Cual clase para imprimir tickets? (SOLUCIONADO)

Cual clase para imprimir tickets? (SOLUCIONADO)

Postby Armando » Wed Aug 08, 2018 12:45 am

Hola Amigos:

Necesito imprimir tickets en una impresora de carro angosto 6.3cms,
que clase me recomiendan?

TPrinter, TReport, TDosPrt?

He visto en el foro muchas recomendaciones muy antiguas, tal vez ahora
las clases se han mejorado y lo que antes era recomendable ahora ya no.

Ah, me olvidaba también debo imprimir imágenes.

Saludos
Last edited by Armando on Wed Aug 15, 2018 6:01 pm, edited 1 time in total.
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3063
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cual clase para imprimir tickets?

Postby leandro » Wed Aug 08, 2018 3:34 am

Buenas noches Armando,

Con la tdosprn funciona de maravillas y hasta puedes enviar comando de apertura cajon.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Cual clase para imprimir tickets?

Postby karinha » Wed Aug 08, 2018 2:09 pm

Ejemplo,

Code: Select all  Expand view

/*
USB com TDOSPRN.PRG

Enla cabecera de mi rutina de impresión hice esto:

cPorta := PrnGetPort()
cPrinter := PrinterPortToName( cPorta )
if empty(cPrinter)
   cPrinter := PrinterPortToName( "USB002" )
   if empty(cPrinter)
      cPrinter := PrinterPortToName( "USB001" )
   endif
endif
 

Despues empiezo la impresión, preo creando un archivo:


oPrin := TDosPrn():New("minuta.txt")
oPrin:StartPage()
...
...
 

Y en el fin de la rutina hago esto:


...
...
oPrin:EndPage()
oPrin:End()


PrintFileRaw( cPrinter, TrueName("MINUTA.TXT"), "Impressão de Vendas" )
*/


// ----------------------------------------------------------------------------

//----- Definicao de comando SAY para TdosPrn ---------------------------------
//

#xcommand @ <nRow>, <nCol> SAY <cText> OF <oPrinter> => <oPrinter>:Say(<nRow>, <nCol>, <cText> )

//-------------------------------------------------------------------------//
// Imprime os Cupons Nao Fiscal da Pizzaria/Restaurante
//-------------------------------------------------------------------------//

FUNCTION IMPRIMIR_CUPOM( nKey, aGetVenda, oLbx, oDlgVendas, DbClientes,;
                                                DbEstoque,  DbPedidos )

    FIELD QTD_VENDEU, DESCRICAO, VLUNITARIO, TOTITEM, TOTPEDIDO
    FIELD MENSAG1, MENSAG2, MENSAG3, MENSAG4, MENSAG5

    LOCAL nLinha, nPag, oPrn, Conta, Pula, DbMensag

    MEMVAR XNUMPEDIDO,   nNumeroTel,   cCodClien,   cNomeClien,   cEndClien,  ;
           cNomeProduto, nQuantidade,  nValorProd,  nValorCompra, oSayCxLivre,;
           XCGCCLI,      nQtdeEstoque, nCodigoProd
    MEMVAR nDinheiro,    nCheque,     nChequePre,  nTickets,     nCartaoCred,;
           nCartaoDebi,  nContraVale, nTaxaEntreg, nValorTroco,  nSomaSubTot,;
           XTROCOCLI,    Valor_Pago,  nValor_Pago, oSayEmpresa

    //-> Nome Fantasia da Empresa - Est  em EMPRESA.DBF
    PUBLIC XDA, XCAIXA, XCODVEND, XNOMEEMP, XFANTASIA, XIMPQTDECOP, ;
           XPULARLINHA

    nLinha      := 0
    nPag        := 1

    IF XIMPQTDECOP <= 0
       XIMPQTDECOP := 1
    ENDIF

    //-> Mensagens do Rodape
    IF NETUSE( "MENSAGEM", .T. )
       DATABASE DbMensag
       DbMensag:Load()
       DbMensag:SetBuffer( .T. )
    ENDIF

    SELECT ( DbPedidos:cAlias )
    DbPedidos:SetOrder( 1 )
    GO TOP

    // Para Rede de Computadores
    // oPrn:New("\\seuterminal\suaimpressora\LPT1")
    oPrn:= TDosPrn():New( "CUPOM.TXT" ) // para ir para um arquivo .txt
    // oPrn:= TDosPrn():New()        // para ir para impressora em definitivo
    // oPrn := TDosPrn():New("lpt1") // para ir para impressora em definitivo
    // Este Comando, Liga a Impressora. NÆo Tirar Nunca
    oPrn:StartPage() // da Start(inicializa) na p gina.
    oPrn:lZeraBuffer := .T.             // Inibe o Pulo da P gina

    //-> Inicia a Impressao - Cabe‡alho do Cupom
    //-> Modo Draft
    @ nLinha, 00 SAY +CHR(18)+CHR(27)+"2"+CHR(27)+"H"          OF oPrn

    @ nLinha, 00 SAY SUBST( XNOMEEMP, 1, 23 )                  OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY CHR(15)+REPLICATE("-",38)                 OF oPrn
    nLinha := nLinha + 1

    //-> Modo Condensado
    @ nLinha, 00 SAY CHR(15)+"HORA: " + TIME() + " - " + ;
                            + DTOC(XDA)                        OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY OemToAnsi("PEDIDO N§: " ) + ;
                     ALLTRIM(STRZERO( XNUMPEDIDO ) )           OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY "FONE..: " + nNumeroTel                   OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY SUBSTR( cNomeClien, 1, 40 )               OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY SUBSTR( cEndClien, 1, 40 )                OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY REPLICATE("-",38)                         OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY "Cod   Qtde   Descricao  Unit     Valor"  OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY REPLICATE("-",38)                         OF oPrn
    nLinha := nLinha + 1

    //-> Imprime o Pedido
    WHILE !EOF()

       SYSREFRESH()

       IF EOF()
          EXIT
       ENDIF

       @ nLinha, 00 SAY ( DbPedidos:cAlias )->CODIGO          OF oPrn
       nLinha := nLinha + 1

       @ nLinha, 00 SAY ( ALLTRIM( STR( QTD_VENDEU ) ) ) +[ - ]+ ;
                        ( SUBSTR( DESCRICAO, 01, 17 ) )  OF oPrn

       nLinha := nLinha + 1

       @ nLinha, 00 SAY ( SUBSTR( DESCRICAO, 18, 35 ) )            +  ;
                          TRANSFORM( VLUNITARIO, "@E  99,999.99" ) +  ;
                          TRANSFORM( TOTITEM,    "@E 999,999.99" ) OF oPrn

       nLinha := nLinha + 1

       DBSKIP()

    ENDDO

    //-> Total do Pedido
    IF EOF() .OR. TOTPEDIDO <= 0
       SKIP(-1)
    ENDIF

    @ nLinha, 00 SAY CHR(15)+REPLICATE("-",38)                  OF oPrn
    nLinha := nLinha + 1

    IF nDinheiro    > 0
       @ nLinha, 00 SAY "EM DINHEIRO:   " + ;
                    TRANSFORM( nDinheiro, "@E 999,999.99" )    OF oPrn
       nLinha := nLinha + 1
    ENDIF

    IF nCheque      > 0
       @ nLinha, 00 SAY "EM CHEQUE:     " + ;
                    TRANSFORM( nCheque, "@E 999,999.99" )      OF oPrn
       nLinha := nLinha + 1
    ENDIF

    IF nChequePre   > 0
       @ nLinha, 00 SAY "EM CHEQUE PRE: " + ;
                    TRANSFORM( nChequePre, "@E 999,999.99" )   OF oPrn
       nLinha := nLinha + 1
    ENDIF

    IF nTickets     > 0
       @ nLinha, 00 SAY "EM TICKETS:    " + ;
                    TRANSFORM( nTickets, "@E 999,999.99" )     OF oPrn
       nLinha := nLinha + 1
    ENDIF

    IF nCartaoCred  > 0
       @ nLinha, 00 SAY "EM C. CREDITO: " + ;
                    TRANSFORM( nCartaoCred, "@E 999,999.99" )  OF oPrn
       nLinha := nLinha + 1
    ENDIF

    IF nCartaoDebi  > 0
       @ nLinha, 00 SAY "EM C. DEBITO:  " + ;
                    TRANSFORM( nCartaoDebi, "@E 999,999.99" )  OF oPrn
       nLinha := nLinha + 1
    ENDIF

    IF nContraVale  > 0
       @ nLinha, 00 SAY "EM C. VALE:    " + ;
                    TRANSFORM( nContraVale, "@E 999,999.99" )  OF oPrn
       nLinha := nLinha + 1
    ENDIF

    @ nLinha, 00 SAY CHR(15)+REPLICATE("-",38)                  OF oPrn
    nLinha := nLinha + 1

    //-> Fechou o Cupom
    @ nLinha, 00 SAY +CHR(18)+CHR(27)+"2"+CHR(27)+"H"  + ;
                     "TOTAL: "                         + ;
                     TRANSFORM( TOTPEDIDO, "@E 9,999,999.99" )  OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY CHR(15)+REPLICATE("-",38)                  OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY CHR(15)+"TROCO:    " + ;
                 TRANSFORM( XTROCOCLI, "@E 999,999.99" )        OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY "CAIXA: " + STRZERO( XCAIXA, 3 ) + [ - ] + ;
                     "OPERADOR: " + XCODVEND                    OF oPrn
    nLinha := nLinha + 1

    @ nLinha, 00 SAY CHR(15)+REPLICATE("-",38)                  OF oPrn
    nLinha := nLinha + 1

    SELECT ( DbMensag:cAlias )
    GO TOP

    WHILE !EOF()

       SYSREFRESH()

       IF EOF()
          EXIT
       ENDIF

       IF (MENSAG1 ) != SPACE(40)
          @ nLinha, 00 SAY MENSAG1  OF oPrn
          nLinha := nLinha + 1
       ENDIF

       IF (MENSAG2 ) != SPACE(40)
          @ nLinha, 00 SAY MENSAG2  OF oPrn
          nLinha := nLinha + 1
       ENDIF

       IF (MENSAG3 ) != SPACE(40)
          @ nLinha, 00 SAY MENSAG3  OF oPrn
          nLinha := nLinha + 1
       ENDIF

       IF (MENSAG4 ) != SPACE(40)
          @ nLinha, 00 SAY MENSAG4  OF oPrn
          nLinha := nLinha + 1
       ENDIF

       IF (MENSAG5 ) != SPACE(40)
          @ nLinha, 00 SAY MENSAG5  OF oPrn
          nLinha := nLinha + 1
       ENDIF

       @ nLinha, 00 SAY CHR(15)+REPLICATE("-",38)              OF oPrn
       nLinha := nLinha + 1

       DBSKIP()

    ENDDO

    //-> Pulos do Cupom
    FOR PULA = 1 TO XPULARLINHA
       @ nLinha, 00 SAY "."                                    OF oPrn
       nLinha := nLinha + 1
    NEXT PULA

    //-> Modo Draft
    @ nLinha, 00 SAY +CHR(18)+CHR(27)+"2"+CHR(27)+"H"           OF oPrn

    oPrn:EndPage()
    oPrn:End()

    //--- imprime no spool do windows, liberando o micro para trabalhar.
    ImpSpool( "CUPOM.TXT",, .T. ) // esta em DBMANT.PRG impressora USB/matricial
    //--- opcionamente pode-se apagar o arquivo passando .t. no 3o. parametro.

    DbMensag:Close()

    SELECT ( DbPedidos:cAlias )
    DbPedidos:SetOrder( 1 )
    DbPedidos:Gotop()

RETURN NIL
//----------------------------------------------------------------------------//
// Funcao    : ImpSpool( cFileTxt, cPorta, lErase )
// Autor     : Ednaldo Rolim (edrol@pop.com.br)
// Descricao : Envia um arquivo TXT criado pela TDosPrn para uma
//             porta de Impressora.
//----------------------------------------------------------------------------//
FUNCTION ImpSpool( cFileTxt, cPorta, lErase )

    LOCAL CPRINTER

    //para capturar antes da impressão
    //cPorta := PrnGetPorta()
    //WinExec( cPorta )
    //depois da impressão
    //WinExex( "Net Use Lpt1: \Delete" )
    //Ficou mais facil e simples do que criar as portas na Classe TDosPrn
    //cPorta := If( cPorta == nil, Alltrim( PrnGetPort() ), cPorta ) ; lErase := If( lErase == nil, .T., lErase );

    //cPorta := PrnGetPort()
    Default cPorta := Alltrim( PrnGetPort() ), lErase:= .t.

    cPrinter := PrinterPortToName( cPorta )

    IF EMPTY( cPrinter )

       cPrinter := PrinterPortToName( "USB002" )

       IF EMPTY(cPrinter)

          cPrinter := PrinterPortToName( "USB001" )

       ENDIF

    ENDIF
   
    IF .NOT. FILE( cFileTxt )

       MsgInfo( OemToAnsi( "NÇO ACHEI O ARQUIVO MODO TEXTO PARA IMPRIMIR NA MATRICIAL" ), ;
                OemToAnsi( "NÇO ACHEI O ARQUIVO MODO TEXTO PARA IMPRIMIR NA MATRICIAL" ) )

       RETURN( .F. )

    ENDIF

    IF .NOT. EMPTY( cPrinter )  // TEM USB

       PrintFileRaw( cPrinter, TrueName( "CUPOM.TXT" ), "Impressão de Vendas" )

    ELSEIF LEN( cPorta ) <= 5 .and. Left( Upper(cPorta), 4 ) = "LPT1"

       //--- Spool Local - Matricial em LPT1
       cPorta:= "PRN"

       WAITRUN("COMMAND.COM /C COPY /B " + cFileTxt + " " + cPorta, 0 )

    ELSE

       //--- Spool Remoto - Matricial em LPT1
       WAITRUN("COMMAND.COM /C COPY /B " + cFileTxt + " " + cPorta, 0 )

    ENDIF

    IF lErase // Vem .T. da tela de vendas
       FERASE( cFileTxt )
    ENDIF

RETURN( .T. )
 


Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7234
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Cual clase para imprimir tickets?

Postby Armando » Wed Aug 08, 2018 7:12 pm

Leandro, Karinha:
Karinha, Leandro:

Muchas gracias por sus respuestas.

Una pregunta más, con la TDosPrn puedo imprimir imágenes, diferentes fonts, colores?

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3063
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cual clase para imprimir tickets?

Postby karinha » Wed Aug 08, 2018 7:20 pm

Armando wrote:Leandro, Karinha:
Karinha, Leandro:

Muchas gracias por sus respuestas.

Una pregunta más, con la TDosPrn puedo imprimir imágenes, diferentes fonts, colores?

Saludos


Que yo sepa no.

Que pretendes, usar QRCODE és esto?

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7234
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Cual clase para imprimir tickets?

Postby Armando » Wed Aug 08, 2018 7:22 pm

Karihna:

Pretendo imprimir el logotipo de la empresa así como iamgenes
de los productos vendidos.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3063
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cual clase para imprimir tickets?

Postby karinha » Wed Aug 08, 2018 7:40 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7234
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Cual clase para imprimir tickets?

Postby MauroArevalo » Wed Aug 08, 2018 11:09 pm

Armando:

Con EasyReport. La ventaja es que usted lo conoce y me enseño a utilizarlo....Saludos...

Image
Edgar Mauricio Arévalo Mogollón.
Bogotá DC. Colombia
FWH FTDN, xHarbour 1.2.1, Pelles C, Fivedit, Visual Studio Code, Borland 7.30, Mysql, Dbfs
http://www.hymplus.com http://www.hymlyma.com
Tratando de retomar la programación....
User avatar
MauroArevalo
 
Posts: 105
Joined: Thu Jan 19, 2006 11:47 pm
Location: Bogota DC. Colombia

Re: Cual clase para imprimir tickets?

Postby Armando » Wed Aug 08, 2018 11:35 pm

Mauricio:

Gracias por la sugerencia, fijate que lo he intentado pero
al imprimir la letra la hace muy pequeña. Tal vez sea
necesario configurar la impresora.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3063
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cual clase para imprimir tickets?

Postby Loren » Fri Aug 10, 2018 11:27 am

Armando, buenas:

Lo mejor es Tprinter. Puedes cambiar el tipo de letra, tamaño, imprimir logos... etc...

Code: Select all  Expand view


PRINT oPrn NAME "ticket" to lanza_impreticket()
 DEFINE FONT aFonP   NAME "COURIER NEW" SIZE 0,convertic(8 ,nanchoPapel) OF oprn
 DEFINE FONT aFonN   NAME "COURIER NEW" SIZE 0,convertic(10,nanchoPapel) OF oprn
 PAGE
     if !empty(configu->clogo) && aquí muestro el código que utilizo si el usuario quiere incluir en logo en el ticket. El programa calcula el tamaño del logo y lo redimensiona al ancho del carro automáticamente.
      if file(camino+'\logos\ticket'+cFileNoPath(configu->clogo))
       DEFINE BITMAP oBmp FILE camino+'
\logos\ticket\'+cFileNoPath(configu->clogo)
       aCoords := oPrn:Cmtr2Pix(nanchoPapel/10,0) && pasando los cm a pixel
       if oBmp:nWidth()>aCoords[1] && el bmp es mas grande que el ancho de carro seleccionado
        aalto=oprn:Pix2Mmtr(aCoords[1],((aCoords[1]*oBmp:nHeight())/oBmp:nWidth())) && convierte los pixel a mm
        oprn:saybitmap(0,0,camino+'
\logos\ticket\'+cFileNoPath(configu->clogo),aCoords[1],((aCoords[1]*oBmp:nHeight())/oBmp:nWidth()))
       else
        aalto=oprn:Pix2Mmtr(oBmp:nWidth(),oBmp:nHeight())
        oprn:saybitmap(0,((aCoords[1]-oBmp:nWidth())/2),camino+'
\logos\ticket\'+cFileNoPath(configu->clogo),oBmp:nWidth(),oBmp:nHeight())
       endif
       y+=(aalto[2]/10)+s*2-1
      endif
     endif
     ....
     ....
    oPrn:CmSay(y,0,"Hola, esto es una prueba...",aFonN)
    ....
   ENDPAGE
  ENDPRINT
  abrir_cajon()


Mi usuario, en la opción de "ajustes del programa", puede seleccionar tamaño de letra, incluir o no logo, separación entre líneas, apertura de cajón portamonedas... etc...

Te muestro también el código para abrir el cajón portamonedas:
Code: Select all  Expand view


funct abrir_cajon()
 LOCAL hFile,opencajon:='CHR(27)+"p"+CHR(0)+CHR(25)+CHR(250)'       && VISTO EN http://forums.fivetechsupport.com/viewtopic.php?f=6&t=26970&start=0
 If configu->liticket=.t. && el usuario tiene cajón portamonedas.
  IF !File('opn.esc')
       hFile:=FCreate('opn.esc')
       FWrite(hFile,&opencajon) //Abrir cajón
       FClose(hFile)
  ENDIF
  PrintFileRaw(lanza_impreticket(),'opn.esc','')
  release oPrn
 endif
return

 


NOTA:
1.- la función lanza_impreticket() determina por qué impresora saldrá impreso el ticket según las preferencias de cada usuario en los ajustes del programa, en caso de estar en un entorno multiusuario con varias impresoras de ticket
interconectadas.
2.- La funcion convertic() determina el tamaño de la fuente según las preferencias del usuario en los ajustes del programa. El usuario puede establecer un zoom haciendo que el ancho y alto del ticket en su conjunto cambie según ese zoom. De esta manera el ticket se adapta a cualquier impresora de ticket tanto de carro muy estrecho, estrecho o ancho.


Saludos.
LORENZO
Loren
 
Posts: 479
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Cual clase para imprimir tickets?

Postby Armando » Fri Aug 10, 2018 2:46 pm

Loren:

Eres muy amable, he intentado con la TPrinter pero la impresora reduce
la impresión y sale muy compacta, sospecho que habrá que configurar la
impresora.

Voy a pedir el modelo de la impresora para ver si es por ahí.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3063
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cual clase para imprimir tickets?

Postby sysctrl2 » Fri Aug 10, 2018 11:16 pm

Paisa, tprinter
en mi caso tdosprn solo lo uso para abrir el cajón de dinero :)

el corte de papel esa tarea se la dejas a windows.

saludos.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 952
Joined: Mon Feb 05, 2007 7:15 pm

Re: Cual clase para imprimir tickets?

Postby Armando » Fri Aug 10, 2018 11:27 pm

César:

Gracias paisano.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3063
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cual clase para imprimir tickets?

Postby FranciscoA » Sat Aug 11, 2018 4:11 pm

Hola Armando.
Tengo un programa para comandas de bar y restaurante, en el cual imprimo tarjeta de identificacion del empleado.
Talvez si lo adaptas a tus necesidades te pueda ser util. (o a otros compañeros)
Aqui expongo el codigo completo.

Code: Select all  Expand view
//--------------------------------//10 Tarjetas con Foto y Code-Bar en caja hoja tam carta
Function MyCarnet(cAlias)
   local oPrn, oFont, oFont2, oFontCBar, oPen1, cIcon := ".\Gorra.ico"
   //local cFontCBar := ".\EAN-13.ttf", cNombre := "EAN-13"
   local cFontCBar := ".\Code3of9.TTF", cNombre := "Code3of9"
   local cImagePath  := "..\FOTOS\"  
   local aDir := {}, aDire := Directory( cImagePath +"
*.*" )  
   local nWidth, nHeight, nWid,nHei
   local n,i,nRow, nCol, nn, nRec, nImages:=0
   local lStretch := .t.   // to stretch image or not
   Local aImage := {}, aNombre := {}, aCargo := {}, aCode := {}
   local aImages:= {}, aNombres:= {}, aCargos:= {}, aCodes:= {}
   local nRowStep:=0, nColStep:=0
   local nCancel:=0, n2:=0, nLin:=0, aTokens
   local nWdIcon:=0, nHtIcon:=0


   //ARRAY CON LAS FOTOS Y OTROS DATOS
   nRec := (cAlias)->(Recno())
   (cAlias)->(dbgotop())
   While (cAlias)->(!eof())
      if ( n:= Ascan(aDire,{|a| a[1] = cFileNoExt(StrZero((cAlias)->Codigo,3))} ))  != 0
          AAdd( aDir, { aDire[ n,1 ],;
                        (cAlias)->nombre,;
                        (cAlias)->cargo ,;
                        StrZero((cAlias)->Codigo,3) ;  //+ Alltrim(Upper((cAlias)->Nombre)) ;
                      } )

      else
         if ( n:= Ascan(aDire,{|a| a[1] = cFileNoExt("
000")} )) != 0
             AAdd( aDir, { aDire[ n,1 ],;
                           (cAlias)->nombre,;
                           (cAlias)->cargo ,;
                           StrZero((cAlias)->Codigo,3) ;  //+ Substr(upper((cAlias)->nombre),1,9) ;
                         } )
         endif
      endif
      (cAlias)->(dbSkip())
   Enddo
   (cAlias)->(dbGoTo(nRec))
   SysRefresh()
   //FIN ARRAY CON LAS FOTOS Y OTROS DATOS

   //SEPARAMOS DATOS EN ARRAYS DIFERENTES
   for n := 1 to Len( aDir ) step 2  
      For nn := 1 to 2  
         nImages ++
         if nImages <= Len(aDir)
            aadd(aImages, cImagePath + aDir[ nImages ][ 1 ])
            aadd(aNombres, aDir[ nImages ][ 2 ])
            aadd(aCargos,  aDir[ nImages ][ 3 ])
            aadd(aCodes,  "
*"+ aDir[ nImages ][ 4 ] +"*")
         else
            aadd(aImages,  "
")
            aadd(anombres, "
")
            aadd(aCargos,  "
")
            aadd(aCodes,   "
")
         endif
      Next
      AAdd( aImage,  aImages )
      AAdd( aNombre, aNombres )
      AAdd( aCargo,  aCargos )
      AAdd( aCode,   aCodes )
      aImages  := {}
      aNombres := {}
      aCargos  := {}
      aCodes   := {}
   next
   //FIN SEPARAMOS DATOS EN ARRAYS DIFERENTES


   PrnSetSize(2160,2790)   // tam carta
   PrnPorTrait()           // Vertical

IF ( nCancel := PrinterSetup(oPrn) ) == 0
     return nil
ENDIF

   AddFontResource( cFontCBar )  //cuando font no esta instalada en windows

   PRINT oPrn NAME "
Carnet" PREVIEW

   DEFINE PEN oPen1 WIDTH 1
   DEFINE FONT oFont NAME "
Arial" SIZE 0,-10 OF oPrn BOLD
   DEFINE FONT oFont2 NAME "
Arial" SIZE 0,-12 OF oPrn BOLD
   DEFINE FONT oFontCBar NAME cNombre  SIZE 0,-16 OF oPrn

   nRowStep := oPrn:nVertRes/60
   nColStep := oPrn:nHorzRes/80

   nHeight  := nRowStep * 11   //alto del carnet : 12 (5 filas de carnets)
   nWidth   := nColStep * 32   //ancho del carnet: 33 (2 cols de carnets)

   nHei  := nHeight - (4  * nRowStep)    //alto  foto
   nWid  := nHei / 1.40                  //ancho foto

   nWdIcon :=1.5*nRowStep  //ancho icon
   nHtIcon :=1.5*nRowStep  //alto icon

   for n := 1 to Len( aImage ) step 5  //5 Carnets por hoja carta (5 carnets vert por 2 horizontales)

      PAGE
      nRow  := 1 * nRowStep
      nCol  := 3 * nColStep

      for i := n to Min( n + 4, Len( aImage ) )
        if !Empty(aImage[ i, 1 ])
           oPrn:Box(nRow,nCol, nRow+nHeight, nCol+nWidth, oPen1)
           oPrn:SayImage( nRow+(2*nRowStep), nCol+(nWidth-(4*nColStep)), cIcon, nWdIcon, nHtIcon, nil, lStretch )
           oPrn:SayImage( nRow+(2*nRowStep), nCol+(1*nColStep), aImage[ i, 1 ], nWid, nHei, nil, lStretch )
           oPrn:Say( nRow+(nRowStep*.5), nCol+(1*nColStep), EMPRESA, oFont2)

           aTokens := FA_Tokens(aNombre[i,1])
           nLin := nRow+(nRowStep*2)
           For n2 := 1 to len(aTokens)
              nLin+=nRowStep
              oPrn:Say( nLin, nCol+nWid+(3*nColStep), aTokens[n2], oFont)
           Next

           oPrn:Say( nRow+(nRowStep*7.5), nCol+nWid+(2*nRowStep), Capitalize(aCargo[i,1]), oFont)
           oPrn:Say( nRow+(nRowStep*9.3), nCol+(1*nColStep), aCode[i,1], oFontCBar)
        endif

        if !Empty(aImage[ i, 2 ])
           nCol += nWidth
           oPrn:Box(nRow,nCol, nRow+nHeight, nCol+nWidth, oPen1)
           oPrn:SayImage( nRow+(2*nRowStep), nCol+(nWidth-(4*nColStep)), cIcon, nWdIcon, nHtIcon, nil, lStretch )
           oPrn:SayImage( nRow+(2*nRowStep), nCol+(1*nColStep), aImage[ i, 2 ], nWid, nHei, nil, lStretch )
           oPrn:Say( nRow+(nRowStep*.5), nCol+(1*nColStep), EMPRESA, oFont2)

           aTokens := FA_Tokens(aNombre[i,2])
           nLin := nRow+(nRowStep*2)
           For n2 := 1 to len(aTokens)
              nLin+=nRowStep
              oPrn:Say( nLin, nCol+nWid+(3*nColStep), aTokens[n2], oFont)
           Next

           oPrn:Say( nRow+(nRowStep*7.5), nCol +nWid+(2*nColStep), Capitalize(aCargo[i,2]), oFont)
           oPrn:Say( nRow+(nRowStep*9.3), nCol+(1*nColStep), aCode[i,2], oFontCBar)
        endif

        nRow  +=  nHeight  
        nCol  := 3 * nColStep
      next

      ENDPAGE

   next n

   ENDPRINT

   oFont:End()
   oFont2:End()
   oFontCBar:End()
   oPen1:End()

   *RemoveFontResource( cFontCBar )  //cuando font no esta instalada en windows

   //Tarjeta()  //probando otra font code-bar
return nil

//----------------------//DEVUELVE ARRAY CON NOMBRES, APELLIDOS, EN CADA LINEA
Function FA_Tokens(cString)
local aTokens := {}, cToken := "
", n

   For n := 1 to len(cString)
      cToken := Upper( StrToken( cString, n ) )
      if !Empty( cToken )
         AAdd( aTokens, cToken )
      endif
   Next

Return aTokens

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Cual clase para imprimir tickets?

Postby Armando » Sat Aug 11, 2018 7:28 pm

Francisco:

Muchas gracias, le voy a tirar un ojo.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3063
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 10 guests