Cual clase para imprimir tickets? (SOLUCIONADO)

User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Cual clase para imprimir tickets? (SOLUCIONADO)

Post by Armando »

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
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Cual clase para imprimir tickets?

Post by leandro »

Buenas noches Armando,

Con la tdosprn funciona de maravillas y hasta puedes enviar comando de apertura cajon.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Cual clase para imprimir tickets?

Post by karinha »

Ejemplo,

Code: Select all

/*
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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Cual clase para imprimir tickets?

Post by Armando »

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
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Cual clase para imprimir tickets?

Post by karinha »

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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Cual clase para imprimir tickets?

Post by Armando »

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
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Cual clase para imprimir tickets?

Post by karinha »

João Santos - São Paulo - Brasil
User avatar
MauroArevalo
Posts: 98
Joined: Thu Jan 19, 2006 11:47 pm
Location: Bogota DC. Colombia
Contact:

Re: Cual clase para imprimir tickets?

Post by MauroArevalo »

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 19.06 xHarbour 1.2.1, Pelles C, Fivedit, Borland 7.30
http://www.hymplus.com
Tratando de retomar la programación....
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Cual clase para imprimir tickets?

Post by Armando »

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
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Cual clase para imprimir tickets?

Post by Loren »

Armando, buenas:

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

Code: Select all


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


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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Cual clase para imprimir tickets?

Post by Armando »

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
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: Cual clase para imprimir tickets?

Post by sysctrl2 »

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
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Cual clase para imprimir tickets?

Post by Armando »

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
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Cual clase para imprimir tickets?

Post by FranciscoA »

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

//--------------------------------//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.

Fwxh1204-MySql-TMySql
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Cual clase para imprimir tickets?

Post by Armando »

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
Post Reply