In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Impresión directa sobre puerto serie
Impresión directa sobre puerto serie
Estoy haciendo una aplicación que tiene que imprimir sobre una impresora de tickets (TPV) en concreto una posiflex (aunque esto supongo que da igual)y quisiera imprimir directamente sobre ella, es esto posible ? alguien me puede decir como hacerlo ?.
Otra cuestión , como enviar a esta misma impresora códigos de avance de papel, corte de papel, etc. Los códigos los tengo, lo que pasa es que no se como hacerselos llegar.
Gracias.
Otra cuestión , como enviar a esta misma impresora códigos de avance de papel, corte de papel, etc. Los códigos los tengo, lo que pasa es que no se como hacerselos llegar.
Gracias.
-
- Mensajes: 239
- Registrado: Sab Ene 24, 2009 8:23 pm
Impresión directa sobre puerto serie
Emilio: Lo mejor que debes hacer, a mi corto entender, es instalar la
impresora en Windows.
De esta forma no tendras problemas.
Si los tienes, lo dices y algo se podra hacer.
Paco V
"Emilio Gil" <emilio-gil[at]hotmail[dot]com> escribió en el mensaje
news:4d5a3638$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Estoy haciendo una aplicación que tiene que imprimir
> sobre una impresora de tickets (TPV) en concreto una
> posiflex (aunque esto supongo que da igual)y quisiera
> imprimir directamente sobre ella, es esto posible ? alguien
> me puede decir como hacerlo ?.
>
> Otra cuestión , como enviar a esta misma impresora
> códigos de avance de papel, corte de papel, etc. Los
> códigos los tengo, lo que pasa es que no se como hacerselos
> llegar.
>
> Gracias.
impresora en Windows.
De esta forma no tendras problemas.
Si los tienes, lo dices y algo se podra hacer.
Paco V
"Emilio Gil" <emilio-gil[at]hotmail[dot]com> escribió en el mensaje
news:4d5a3638$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Estoy haciendo una aplicación que tiene que imprimir
> sobre una impresora de tickets (TPV) en concreto una
> posiflex (aunque esto supongo que da igual)y quisiera
> imprimir directamente sobre ella, es esto posible ? alguien
> me puede decir como hacerlo ?.
>
> Otra cuestión , como enviar a esta misma impresora
> códigos de avance de papel, corte de papel, etc. Los
> códigos los tengo, lo que pasa es que no se como hacerselos
> llegar.
>
> Gracias.
Impresión directa sobre puerto serie
Emilio,
intenta así (está escrito al vuelo y quizás haya algún error):
METHOD oButton1Click( oSender ) CLASS TForm1
// Cambia COM1 por el puerto al que tengas conectada la impresora
// Prueba con COM1 y COM1:
LOCAL hFile := FOpen( "COM1", 1 )
IF !Empty( hFile )
FWrite( hFile, "Emilio" + CRLF )
FClose( hFile )
ENDIF
RETURN Nil
> Otra cuestión , como enviar a esta misma impresora
> códigos de avance de papel, corte de papel, etc. Los
> códigos los tengo, lo que pasa es que no se como hacerselos
> llegar.
Envíalos como secuencias de caracteres, pe. si un código es 27 01 envíalo
con FWrite( hFile, Chr(27) + Chr(1) )
Saludos,
José Lalín
intenta así (está escrito al vuelo y quizás haya algún error):
METHOD oButton1Click( oSender ) CLASS TForm1
// Cambia COM1 por el puerto al que tengas conectada la impresora
// Prueba con COM1 y COM1:
LOCAL hFile := FOpen( "COM1", 1 )
IF !Empty( hFile )
FWrite( hFile, "Emilio" + CRLF )
FClose( hFile )
ENDIF
RETURN Nil
> Otra cuestión , como enviar a esta misma impresora
> códigos de avance de papel, corte de papel, etc. Los
> códigos los tengo, lo que pasa es que no se como hacerselos
> llegar.
Envíalos como secuencias de caracteres, pe. si un código es 27 01 envíalo
con FWrite( hFile, Chr(27) + Chr(1) )
Saludos,
José Lalín
Impresión directa sobre puerto serie
Jose:
Lo he probado y no me ha dado resultado, incluso me ha bloqueado el puerto serie y he tenido que deshabilitarlo y volverlo ha habilitar para que funcionase. De todos modos gracias.
Emilio Gil.
Lo he probado y no me ha dado resultado, incluso me ha bloqueado el puerto serie y he tenido que deshabilitarlo y volverlo ha habilitar para que funcionase. De todos modos gracias.
Emilio Gil.
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Impresión directa sobre puerto serie
¿Tienes bien configurado el puerto con las características de
comunicaciones de la impresora?
El 15/02/2011 16:29, Emilio Gil escribió:
> Jose:
>
> Lo he probado y no me ha dado resultado, incluso me ha
> bloqueado el puerto serie y he tenido que deshabilitarlo y
> volverlo ha habilitar para que funcionase. De todos modos
> gracias.
>
> Emilio Gil.
>
comunicaciones de la impresora?
El 15/02/2011 16:29, Emilio Gil escribió:
> Jose:
>
> Lo he probado y no me ha dado resultado, incluso me ha
> bloqueado el puerto serie y he tenido que deshabilitarlo y
> volverlo ha habilitar para que funcionase. De todos modos
> gracias.
>
> Emilio Gil.
>
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Impresión directa sobre puerto serie
Hola,
Define la impresora de tickets en Windows como "Generíca - Sólo Texto" y
ponle un nombre, por ejemplo "Ticket".
Usa este código, cambiando lo que necesites ya que habrá alguna función
o clase de uso mio reemplazándola por lo que tu uses, para imprimir:
METHOD ImprTicket( oSender, nTicket, cSerie ) CLASS MiClase
LOCAL cI
LOCAL nI
LOCAL cLinea
LOCAL nTotal := 0
LOCAL cQuery
LOCAL nLin := 0
LOCAL nPaso
LOCAL oFont
LOCAL nIzq
LOCAL oDet := TQuery():New()
LOCAL oCab := TQuery():New()
LOCAL oCli := TQuery():New()
cQuery := "SELECT cabtick.*, fpago.nombre AS F_Pago, " + ;
"concat( cliente.nombre, ' ', cliente.apellidos ) AS
Camarero, " + ;
"salon.nombre AS Salon " + ;
"FROM cabtick " + ;
"LEFT JOIN fpago ON fpago.id = cabtick.fpago " + ;
"LEFT JOIN cliente ON cliente.id = cabtick.id_vend " + ;
"LEFT JOIN salon ON salon.id = cabtick.salon " + ;
"WHERE serie = '" + cSerie + "' AND id_factura = " + Str(
nTicket )
oCab:Query( cQuery )
IF oCab:lError
MsgInfo( oCab:cError )
END IF
cQuery := "SELECT hismov.piezas, ( hismov.pvp * ( 1 -
hismov.descuento / 100 ) ) AS _precio, " + ;
"( hismov.piezas*( hismov.pvp * ( 1 - hismov.descuento /
100 ) ) ) AS Importe, articulo.descrip AS Descrip " + ;
"FROM hismov " + ;
"INNER JOIN articulo ON articulo.codigo = hismov.codart " + ;
"INNER JOIN cabtick ON cabtick.numero =
hismov.numeroticket AND cabtick.serie = hismov.serie " + ;
"WHERE hismov.tipo = 'V' AND cabtick.serie = '" + cSerie +
"' AND cabtick.id_factura = " + Str( nTicket ) + " " + ;
"ORDER BY hismov.id"
oDet:Query( cQuery )
IF oDet:lError
MsgInfo( oDet:cError )
END IF
IF AppData:lDatosCliente
oCli:Query( "SELECT * FROM cliente WHERE id = " + Str(
oCab:Id_Cliente ) )
END IF
IF !Empty( AppData:cPrnName )
IF oDet:nFilas > 0
oFont := TFont():New()
WITH OBJECT oFont
:cName := "Courier New"
:nSize := 9
:lBold := .F.
END WITH
Printer:nPrinterIndex := Ascan( Printer:aPrinterNames, "Ticket" )
Printer:lPreview := .F.
Printer:cJobTitle := "Ticket de caja"
Printer:StartDoc()
Printer:oCanvas:nMapMode := mmHIMETRICS //Selecciono
medidas en sistema metrico.
//Las unidades
son milímetros * 10
Printer:StartPage()
nLin := Printer:PhysicalOffset()[2]
nIzq := Printer:PhysicalOffset()[1]
WITH OBJECT Printer:oCanvas
:oFont := oFont
nPaso := ( :TextHeight( "." ) / Printer:Resolution()[2] * 254 )
cLinea := PadC( Alltrim( AppData:cNombre ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( Alltrim( AppData:cDomic ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( Alltrim( AppData:cLocal ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( Alltrim( AppData:cProvin ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( "Telefono: " + Alltrim( AppData:cTelef ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( "CIF: " + Alltrim( AppData:cCIF ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
FOR nI := 1 TO 6
cI := Alltrim( Str( nI ) )
IF !Empty( AppData:cCab&cI )
:nTextAlignment := taLEFT
:TextOut( nIzq, nLin, PadC( AppData:cCab&cI, 40 ) )
nLin += nPaso
END IF
NEXT
nLin += ( nPaso * 2 )
// cLinea := "Ticket Nº: " + PadR( Alltrim( Str( nTicket ) ),
7 ) + " " + ;
// "Fecha: " + dtoc( AppData:dFecha )
// cLinea := PadC( DiaSemana( date() ) + ", " + D2L( date()
), 40 )
IF AppData:lDatosCliente .AND. oCli:nFilas > 0
cLinea := "---------- Datos del cliente -----------"
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Apellidos, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Nombre, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Domicilio, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( StrZero( oCli:cPostal ) + " - " +
oCli:Localidad, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Provincia, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( "CIF/NIF: " + oCli:DNI_CIF, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := "----------------------------------------"
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
END IF
cLinea := DiaSemana( oCab:aRes[ 1, 2 ] ) + ", " + D2L(
oCab:Fecha )
cLinea += " (" + Left( oCab:Hora, 5 ) + ")"
cLinea := PadC( cLinea, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
IF oCab:aRes[ 1, 3 ] != 0 .AND. AppData:cTituloBotonMesas
== "&Mesa"
cLinea := PadL( "Salon ....: " + Alltrim( oCab:Salon ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadL( "Mesa N. ..: " + Str( oCab:Mesa, 10 ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
END IF
cLinea := PadL( "Factura N.: " + Alltrim( cSerie ) +
Alltrim( Str( nTicket ) ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 3 )
cLinea := "Articulo" + Space( AppData:nLonArticulo - 8 ) + " "
cLinea += "Can" + Space( AppData:nLonCantidad - 3 ) + " "
cLinea += "Pre" + Space( AppData:nLonPrecio - 3 ) + " "
cLinea += "Importe" + Space( AppData:nLonImporte - 7 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Replicate( "-", AppData:nLonArticulo ) + " "
cLinea += Replicate( "-", AppData:nLonCantidad ) + " "
cLinea += Replicate( "-", AppData:nLonPrecio ) + " "
cLinea += Replicate( "-", AppData:nLonImporte )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
oDet:GoTop()
WHILE !oDet:Eof()
cLinea := Left( oDet:Descrip, AppData:nLonArticulo ) + "
" + ;
Transform( oDet:Piezas, DimePic(
AppData:nLonCantidad, AppData:nDecCantidad ) ) + " " + ;
Transform( oDet:_Precio, DimePic(
AppData:nLonPrecio, AppData:nDecPrecio ) ) + " " + ;
Transform( oDet:Importe, DimePic(
AppData:nLonImporte, AppData:nDecImporte ) )
nTotal += oDet:Importe
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
oDet:Skip()
IF nLin / nPaso >= 60
nLin := Printer:PhysicalOffset()[2] + nPaso
Printer:EndPage()
Printer:StartPage()
END IF
END DO
cLinea := " ---------"
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := " Total ..... " + Transform(
nTotal, "@ZE 99,999.99" )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
IF ::oMaskEdit3:Value != 0
cLinea := " Entregado . " + Transform(
::oMaskEdit3:Value, "@ZE 99,999.99" )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := " ---------"
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := " Cambio .... " + Transform(
::oMaskEdit3:Value - nTotal, "@ZE 99,999.99" )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
END IF
cLinea := " ====================="
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
cLinea := PadC( "Forma de pago: " + Alltrim( oCab:F_Pago ),
40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
cLinea := PadC( "Le atendio: " + Alltrim( oCab:Camarero ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
FOR nI := 1 TO 6
cI := Alltrim( Str( nI ) )
IF !Empty( AppData:cPie&cI )
:TextOut( nIzq, nLin, PadC( AppData:cPie&cI, 40 ) )
nLin += nPaso
END IF
NEXT
FOR nI := 1 TO AppData:nLineas
cI := Alltrim( Str( nI ) )
:TextOut( nIzq, nLin, Space( 40 ) )
nLin += nPaso
NEXT
END WITH
Printer:EndPage()
Printer:EndDoc()
Printer:Preview( smMAXIMIZE, AppData:lPrev, Self )
oFont:Destroy()
cQuery := "UPDATE cabtick " + ;
"SET control = 1 " + ;
"WHERE serie = '" + cSerie + "' AND id_factura = " +
Str( nTicket )
AppData:oMySQL:Command( cQuery )
END IF
END IF
CortarTicket()
RETURN Nil
//---------------------------------------------------------- --------------------
Define la impresora de tickets en Windows como "Generíca - Sólo Texto" y
ponle un nombre, por ejemplo "Ticket".
Usa este código, cambiando lo que necesites ya que habrá alguna función
o clase de uso mio reemplazándola por lo que tu uses, para imprimir:
METHOD ImprTicket( oSender, nTicket, cSerie ) CLASS MiClase
LOCAL cI
LOCAL nI
LOCAL cLinea
LOCAL nTotal := 0
LOCAL cQuery
LOCAL nLin := 0
LOCAL nPaso
LOCAL oFont
LOCAL nIzq
LOCAL oDet := TQuery():New()
LOCAL oCab := TQuery():New()
LOCAL oCli := TQuery():New()
cQuery := "SELECT cabtick.*, fpago.nombre AS F_Pago, " + ;
"concat( cliente.nombre, ' ', cliente.apellidos ) AS
Camarero, " + ;
"salon.nombre AS Salon " + ;
"FROM cabtick " + ;
"LEFT JOIN fpago ON fpago.id = cabtick.fpago " + ;
"LEFT JOIN cliente ON cliente.id = cabtick.id_vend " + ;
"LEFT JOIN salon ON salon.id = cabtick.salon " + ;
"WHERE serie = '" + cSerie + "' AND id_factura = " + Str(
nTicket )
oCab:Query( cQuery )
IF oCab:lError
MsgInfo( oCab:cError )
END IF
cQuery := "SELECT hismov.piezas, ( hismov.pvp * ( 1 -
hismov.descuento / 100 ) ) AS _precio, " + ;
"( hismov.piezas*( hismov.pvp * ( 1 - hismov.descuento /
100 ) ) ) AS Importe, articulo.descrip AS Descrip " + ;
"FROM hismov " + ;
"INNER JOIN articulo ON articulo.codigo = hismov.codart " + ;
"INNER JOIN cabtick ON cabtick.numero =
hismov.numeroticket AND cabtick.serie = hismov.serie " + ;
"WHERE hismov.tipo = 'V' AND cabtick.serie = '" + cSerie +
"' AND cabtick.id_factura = " + Str( nTicket ) + " " + ;
"ORDER BY hismov.id"
oDet:Query( cQuery )
IF oDet:lError
MsgInfo( oDet:cError )
END IF
IF AppData:lDatosCliente
oCli:Query( "SELECT * FROM cliente WHERE id = " + Str(
oCab:Id_Cliente ) )
END IF
IF !Empty( AppData:cPrnName )
IF oDet:nFilas > 0
oFont := TFont():New()
WITH OBJECT oFont
:cName := "Courier New"
:nSize := 9
:lBold := .F.
END WITH
Printer:nPrinterIndex := Ascan( Printer:aPrinterNames, "Ticket" )
Printer:lPreview := .F.
Printer:cJobTitle := "Ticket de caja"
Printer:StartDoc()
Printer:oCanvas:nMapMode := mmHIMETRICS //Selecciono
medidas en sistema metrico.
//Las unidades
son milímetros * 10
Printer:StartPage()
nLin := Printer:PhysicalOffset()[2]
nIzq := Printer:PhysicalOffset()[1]
WITH OBJECT Printer:oCanvas
:oFont := oFont
nPaso := ( :TextHeight( "." ) / Printer:Resolution()[2] * 254 )
cLinea := PadC( Alltrim( AppData:cNombre ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( Alltrim( AppData:cDomic ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( Alltrim( AppData:cLocal ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( Alltrim( AppData:cProvin ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( "Telefono: " + Alltrim( AppData:cTelef ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadC( "CIF: " + Alltrim( AppData:cCIF ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
FOR nI := 1 TO 6
cI := Alltrim( Str( nI ) )
IF !Empty( AppData:cCab&cI )
:nTextAlignment := taLEFT
:TextOut( nIzq, nLin, PadC( AppData:cCab&cI, 40 ) )
nLin += nPaso
END IF
NEXT
nLin += ( nPaso * 2 )
// cLinea := "Ticket Nº: " + PadR( Alltrim( Str( nTicket ) ),
7 ) + " " + ;
// "Fecha: " + dtoc( AppData:dFecha )
// cLinea := PadC( DiaSemana( date() ) + ", " + D2L( date()
), 40 )
IF AppData:lDatosCliente .AND. oCli:nFilas > 0
cLinea := "---------- Datos del cliente -----------"
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Apellidos, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Nombre, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Domicilio, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( StrZero( oCli:cPostal ) + " - " +
oCli:Localidad, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( oCli:Provincia, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Left( "CIF/NIF: " + oCli:DNI_CIF, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := "----------------------------------------"
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
END IF
cLinea := DiaSemana( oCab:aRes[ 1, 2 ] ) + ", " + D2L(
oCab:Fecha )
cLinea += " (" + Left( oCab:Hora, 5 ) + ")"
cLinea := PadC( cLinea, 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
IF oCab:aRes[ 1, 3 ] != 0 .AND. AppData:cTituloBotonMesas
== "&Mesa"
cLinea := PadL( "Salon ....: " + Alltrim( oCab:Salon ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := PadL( "Mesa N. ..: " + Str( oCab:Mesa, 10 ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
END IF
cLinea := PadL( "Factura N.: " + Alltrim( cSerie ) +
Alltrim( Str( nTicket ) ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 3 )
cLinea := "Articulo" + Space( AppData:nLonArticulo - 8 ) + " "
cLinea += "Can" + Space( AppData:nLonCantidad - 3 ) + " "
cLinea += "Pre" + Space( AppData:nLonPrecio - 3 ) + " "
cLinea += "Importe" + Space( AppData:nLonImporte - 7 )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := Replicate( "-", AppData:nLonArticulo ) + " "
cLinea += Replicate( "-", AppData:nLonCantidad ) + " "
cLinea += Replicate( "-", AppData:nLonPrecio ) + " "
cLinea += Replicate( "-", AppData:nLonImporte )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
oDet:GoTop()
WHILE !oDet:Eof()
cLinea := Left( oDet:Descrip, AppData:nLonArticulo ) + "
" + ;
Transform( oDet:Piezas, DimePic(
AppData:nLonCantidad, AppData:nDecCantidad ) ) + " " + ;
Transform( oDet:_Precio, DimePic(
AppData:nLonPrecio, AppData:nDecPrecio ) ) + " " + ;
Transform( oDet:Importe, DimePic(
AppData:nLonImporte, AppData:nDecImporte ) )
nTotal += oDet:Importe
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
oDet:Skip()
IF nLin / nPaso >= 60
nLin := Printer:PhysicalOffset()[2] + nPaso
Printer:EndPage()
Printer:StartPage()
END IF
END DO
cLinea := " ---------"
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := " Total ..... " + Transform(
nTotal, "@ZE 99,999.99" )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
IF ::oMaskEdit3:Value != 0
cLinea := " Entregado . " + Transform(
::oMaskEdit3:Value, "@ZE 99,999.99" )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := " ---------"
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
cLinea := " Cambio .... " + Transform(
::oMaskEdit3:Value - nTotal, "@ZE 99,999.99" )
:TextOut( nIzq, nLin, cLinea )
nLin += nPaso
END IF
cLinea := " ====================="
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
cLinea := PadC( "Forma de pago: " + Alltrim( oCab:F_Pago ),
40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
cLinea := PadC( "Le atendio: " + Alltrim( oCab:Camarero ), 40 )
:TextOut( nIzq, nLin, cLinea )
nLin += ( nPaso * 2 )
FOR nI := 1 TO 6
cI := Alltrim( Str( nI ) )
IF !Empty( AppData:cPie&cI )
:TextOut( nIzq, nLin, PadC( AppData:cPie&cI, 40 ) )
nLin += nPaso
END IF
NEXT
FOR nI := 1 TO AppData:nLineas
cI := Alltrim( Str( nI ) )
:TextOut( nIzq, nLin, Space( 40 ) )
nLin += nPaso
NEXT
END WITH
Printer:EndPage()
Printer:EndDoc()
Printer:Preview( smMAXIMIZE, AppData:lPrev, Self )
oFont:Destroy()
cQuery := "UPDATE cabtick " + ;
"SET control = 1 " + ;
"WHERE serie = '" + cSerie + "' AND id_factura = " +
Str( nTicket )
AppData:oMySQL:Command( cQuery )
END IF
END IF
CortarTicket()
RETURN Nil
//---------------------------------------------------------- --------------------
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Impresión directa sobre puerto serie
Para el envío de comandos de impresora, teniéndola configurada en
windows como "Genérica - Sólo texto", este código me funciona bien:
//---------------------------------------------------------- --------------------
FUNCTION PrnCmd( cCmd, cJobTitle )
LOCAL oFont, nPaso, nLin, nIzq, oPrn
DEFAULT cJobTitle TO "Command"
oPrn := TPrinter():Create()
oPrn:nPrinterIndex := Ascan( oPrn:aPrinterNames, "Ticket" )
oPrn:lPreview := .F.
oPrn:cJobTitle := cJobTitle
oPrn:StartDoc()
oPrn:oCanvas:nMapMode := mmHIMETRICS
oFont := TFont():New()
nLin := oPrn:PhysicalOffset()[2]
nIzq := oPrn:PhysicalOffset()[1]
WITH OBJECT oFont
:cName := "Courier New"
:nSize := 9
:lBold := .F.
END WITH
oPrn:WriteData( cCmd, cJobTitle )
oPrn:Preview( .F. )
oFont:Destroy()
RETURN NIL
//---------------------------------------------------------- --------------------
windows como "Genérica - Sólo texto", este código me funciona bien:
//---------------------------------------------------------- --------------------
FUNCTION PrnCmd( cCmd, cJobTitle )
LOCAL oFont, nPaso, nLin, nIzq, oPrn
DEFAULT cJobTitle TO "Command"
oPrn := TPrinter():Create()
oPrn:nPrinterIndex := Ascan( oPrn:aPrinterNames, "Ticket" )
oPrn:lPreview := .F.
oPrn:cJobTitle := cJobTitle
oPrn:StartDoc()
oPrn:oCanvas:nMapMode := mmHIMETRICS
oFont := TFont():New()
nLin := oPrn:PhysicalOffset()[2]
nIzq := oPrn:PhysicalOffset()[1]
WITH OBJECT oFont
:cName := "Courier New"
:nSize := 9
:lBold := .F.
END WITH
oPrn:WriteData( cCmd, cJobTitle )
oPrn:Preview( .F. )
oFont:Destroy()
RETURN NIL
//---------------------------------------------------------- --------------------
Impresión directa sobre puerto serie
MUchas gracias Jose, voy a ir probandolo y te digo algo.
Saludos.
Emilio Gil.
Saludos.
Emilio Gil.
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Impresión directa sobre puerto serie
Esta funcion va bien para enviar al visor del cliente por el puerto serie:
//---------------------------------------------------------- --------------------
FUNCTION Visor( cPuerto, cLin1, cLin2 )
LOCAL cCLRVisor := //Secuencia ESC para limpiar el visor
LOCAL cLin1Visor := //Secuencia ESC para posicionarse en linea 1
LOCAL cLin2Visor := //Secuencia ESC para posicionarse en linea 2
IF !Empty( cPuerto )
SET PRINTER ON
SET PRINTER TO ( AppData:cVisor )
?? Num2Esc( cCLRVisor )
?? Num2Esc( cLin1Visor ) + cLin1 + Chr( 13 )
?? Num2Esc( cLin2Visor ) + cLin2 + Chr( 13 )
SET PRINTER TO
SET PRINTER OFF
END IF
RETURN Nil
//---------------------------------------------------------- --------------------
// Convierte una cadena de número del tipo
// "27 00 01"
// en su correspondiente secuencia ESC.
FUNCTION Num2Esc( cCad )
LOCAL nPos := 1
LOCAL cSal := ""
cCad += " "
WHILE nPos > 0
nPos := AT( " ", cCad )
IF Val( SubStr( cCad, 1, nPos - 1 ) ) != 0
cSal += Chr( Val( SubStr( cCad, 1, nPos - 1 ) ) )
ELSE
cSal += SubStr( cCad, 1, nPos - 1 )
END IF
cCad := SubStr( cCad, nPos + 1 )
END DO
IF Len( cCad ) > 0 .AND. Empty( cSal )
IF Val( cCad ) != 0
cSal := Chr( Val( cCad ) )
ELSE
cSal := cCad
END IF
END IF
RETURN cSal
//---------------------------------------------------------- --------------------
//---------------------------------------------------------- --------------------
FUNCTION Visor( cPuerto, cLin1, cLin2 )
LOCAL cCLRVisor := //Secuencia ESC para limpiar el visor
LOCAL cLin1Visor := //Secuencia ESC para posicionarse en linea 1
LOCAL cLin2Visor := //Secuencia ESC para posicionarse en linea 2
IF !Empty( cPuerto )
SET PRINTER ON
SET PRINTER TO ( AppData:cVisor )
?? Num2Esc( cCLRVisor )
?? Num2Esc( cLin1Visor ) + cLin1 + Chr( 13 )
?? Num2Esc( cLin2Visor ) + cLin2 + Chr( 13 )
SET PRINTER TO
SET PRINTER OFF
END IF
RETURN Nil
//---------------------------------------------------------- --------------------
// Convierte una cadena de número del tipo
// "27 00 01"
// en su correspondiente secuencia ESC.
FUNCTION Num2Esc( cCad )
LOCAL nPos := 1
LOCAL cSal := ""
cCad += " "
WHILE nPos > 0
nPos := AT( " ", cCad )
IF Val( SubStr( cCad, 1, nPos - 1 ) ) != 0
cSal += Chr( Val( SubStr( cCad, 1, nPos - 1 ) ) )
ELSE
cSal += SubStr( cCad, 1, nPos - 1 )
END IF
cCad := SubStr( cCad, nPos + 1 )
END DO
IF Len( cCad ) > 0 .AND. Empty( cSal )
IF Val( cCad ) != 0
cSal := Chr( Val( cCad ) )
ELSE
cSal := cCad
END IF
END IF
RETURN cSal
//---------------------------------------------------------- --------------------
Impresión directa sobre puerto serie
Hola José:
He probado como me dices creando una impresora genérica solo texto, si le pongo el puerto de salida COM1 no imprime nada y me da error de impresión, si le asigno el puerto de salida USB me lo lanza sin problemas a una impresora brother normal que está conectada a ese puerto.
Un saludo.
Emilio Gil.
He probado como me dices creando una impresora genérica solo texto, si le pongo el puerto de salida COM1 no imprime nada y me da error de impresión, si le asigno el puerto de salida USB me lo lanza sin problemas a una impresora brother normal que está conectada a ese puerto.
Un saludo.
Emilio Gil.
Impresión directa sobre puerto serie
Hola José.
Ahora he conseguido que escriba cosas, pero no lo que le mando sino caracteres extraños.
Un saludo.
Emilio Gil.
Ahora he conseguido que escriba cosas, pero no lo que le mando sino caracteres extraños.
Un saludo.
Emilio Gil.
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Impresión directa sobre puerto serie
Emilio
Mira como viene configurada la impresora serie, baudos (bites por
segundo), numero de bits, tipo de paridad, bits de parada . . . Todos
esos datos tienen que estar IGUAL en la impresora y en la configuración
del puerto serie en Windows.
Puedes hacer pruebas desde la consola de MS-DOS así:
MODE COM1 9600,N,8,1 (INRO)
DIR > COM1 (INTRO)
MODE establece los parámetros de configuración del puerto serie
(MODE puerto baudios, tipo de paridad, bits de datos, bits de parada)
> redirige la impresión del DIR al puerto COM1
Casi todas las impresoras serie imprimen información de la configuración
interna manteniendo pulsado el botón de ON-Line a la vez que la enciendes.
Solo decirte que una vez probado desde MS-DOS, deberás indicar la
configuración del puerto en WINDOWS (desde el panel de control).
Saludos
José Alfonso Suárez Moreno
El 16/02/2011 12:36, Emilio Gil escribió:
> Hola José.
>
> Ahora he conseguido que escriba cosas, pero no lo que le
> mando sino caracteres extraños.
>
> Un saludo.
> Emilio Gil.
>
Mira como viene configurada la impresora serie, baudos (bites por
segundo), numero de bits, tipo de paridad, bits de parada . . . Todos
esos datos tienen que estar IGUAL en la impresora y en la configuración
del puerto serie en Windows.
Puedes hacer pruebas desde la consola de MS-DOS así:
MODE COM1 9600,N,8,1 (INRO)
DIR > COM1 (INTRO)
MODE establece los parámetros de configuración del puerto serie
(MODE puerto baudios, tipo de paridad, bits de datos, bits de parada)
> redirige la impresión del DIR al puerto COM1
Casi todas las impresoras serie imprimen información de la configuración
interna manteniendo pulsado el botón de ON-Line a la vez que la enciendes.
Solo decirte que una vez probado desde MS-DOS, deberás indicar la
configuración del puerto en WINDOWS (desde el panel de control).
Saludos
José Alfonso Suárez Moreno
El 16/02/2011 12:36, Emilio Gil escribió:
> Hola José.
>
> Ahora he conseguido que escriba cosas, pero no lo que le
> mando sino caracteres extraños.
>
> Un saludo.
> Emilio Gil.
>
Impresión directa sobre puerto serie
Hola José:
Muchas gracias, ahora ya funciona todo perfectamente.
Un saludo.
Emilio Gil.
Muchas gracias, ahora ya funciona todo perfectamente.
Un saludo.
Emilio Gil.