Impresión en Epson LX810 desde Visual FoxPro 9

764 views
Skip to first unread message

Guillermo Edgardo Lombardi

unread,
Aug 16, 2014, 3:35:28 PM8/16/14
to publice...@googlegroups.com
Hola "Foxeros". Tengo unos problemitas con la impresión desde Visual FoxPro 9 empleando el viejo método de impresión de FoxPro para D.O.S. (@ x,y Say...). Al tener que actualizar una vieja aplicación de FoxPro Lan 2.0 para D.O.S. a Visual FoxPro 9 necesito si o si respetar la forma de imprimir las facturas y reportes del viejo sistema en el nuevo, empleando un puerto LPT1 al que está conectada una impresora matricial Epson LX810.
El primer problema es que pese a leer el puerto LPT donde quiero que se imprima desde una variable .mem, cuando se imprime desde la aplicación en VFP9 la impresión SIEMPRE se dirige a la impresora marcada como "Predeterminada" en Windows. Esta forma de seleccionar el puerto de impresión funciona a la perfección en el programa escrito en FoxPro Lan 2.0 para D.O.S.
El segundo problema es que al imprimir en la Epson LX810 desde la aplicación VFP9 empleando una secuencia de instrucciones @ x,y Say... entre las que se emplean caracteres de control tendientes a cambiar el tamaño de la letra (chr(15), chr(18)+chr(14) y cosas por el estilo), aún imprimiendo en una impresora matricial, en lugar de cambiar el tamaño de la letra aparecen caracteres raros (cuadraditos) en el papel, tal como cuando se usan dichos caracteres de control en una impresión dirigida a un archivo de texto.
Leí en las ayudas que se puede emplear la instrucción SET PDSETUP TO [[cControladorImpresora]] pero no encuentro el nombre del archivo controlador de la Epson LX810.
Espero haber sido claro en la exposición de los problemas y quedo a la espera de alguna ayuda.
Saludos.

Guillermo

francisco prieto

unread,
Aug 16, 2014, 3:50:21 PM8/16/14
to publice...@googlegroups.com
Guillermo...

En Windows generate una impresora con driver generico text only y ponele un nombre...

Luego desde vfp pone

set printer to name \\servername\nombreimpresora

Y listo a partir de ahi vas a imprimir como si estuviera en DOS.

Saludos,

Pancho
Córdoba
Argentina

Guillermo Edgardo Lombardi

unread,
Aug 16, 2014, 3:57:26 PM8/16/14
to publice...@googlegroups.com
Hola Pancho... Ante todo gracias por la rápida respuesta. Tu solución me genera una duda... Si dirijo la impresión a la impresora genérica sólo texto, ¿cómo hago para que salga por la Epson LX810 que tengo conectada en el puerto LPT1?
¿Se entiende?

Guillermo.

francisco prieto

unread,
Aug 16, 2014, 3:59:43 PM8/16/14
to publice...@googlegroups.com
Justamente Guillermo...

Lo que te digo que pruebes es que la impresora solo texto sea la Epson Lx810....

Saludos,

Pancho
Córdoba
Argentina


Guillermo Edgardo Lombardi

unread,
Aug 16, 2014, 4:07:25 PM8/16/14
to publice...@googlegroups.com
Bien... y ya que "te tengo en línea"... ¿Hay alguna manera de pre visualizar el documento tal como se vería impreso en la Epson LX810?. El tema es que estoy haciendo pruebas sin tener disponible la impresora... y el cliente para el cual necesito solucionar el problema está a 750 km de donde yo vivo...
Desde ya gracias.

francisco prieto

unread,
Aug 16, 2014, 4:21:44 PM8/16/14
to publice...@googlegroups.com
Guillermo,

No lo probe, pero he escuchado buenos comentarios de esto...


Por otra parte imprimir generico en una matriz de punto es como imprimir en un archivo txt, por lo tanto si te queres hacer una vista previa de lo impreso, deberías dirigir tu impresion a un archivo txt y luego con un modify file archivo.txt noedit tendrias tu vista previa...

Saludos,

Pancho
Córdoba
Argentina

Guillermo Edgardo Lombardi

unread,
Aug 16, 2014, 4:31:28 PM8/16/14
to publice...@googlegroups.com
Ya probé dirigir la impresión a un archivo de texto y el resultado es que en el lugar donde uso, por ejemplo, la instrucción @ x,y say chr(15) aparece en el txt un cuadradito y no cambia el tamaño de la letra...
De todas maneras mil gracias.

francisco prieto

unread,
Aug 16, 2014, 6:25:16 PM8/16/14
to publice...@googlegroups.com
Guillermo,

Revisa esto...


Saludos,

Pancho
Córdoba
Argentina

Guillermo MDQ

unread,
Aug 16, 2014, 6:26:37 PM8/16/14
to publice...@googlegroups.com
Tocayo, una solucion para tus problemas puede ser el DosPrint del colega Victor Espina, especialmente para trabajar desde VFP con impresoras matricilaes.
Aqui tienes el link de donde puedes descargarlo:

http://vfpx.codeplex.com/wikipage?title=VFPDosPrint&referringTitle=Home


Saludos
Guillermo

Guillermo Edgardo Lombardi

unread,
Aug 16, 2014, 7:03:52 PM8/16/14
to publice...@googlegroups.com
Mil gracias por la colaboración... Pero perdón que sea reiterativo... ¿Saben si esta aplicación me permitirá trabajar con caracteres condensados (chr(15)) y expandidos (chr(18)+chr(14))?

francisco prieto

unread,
Aug 16, 2014, 7:15:17 PM8/16/14
to publice...@googlegroups.com
Guille,

La verdad es que vas a tener que probar o esperar que Victor vea el mail y te responda...

Siendo un foro, te diría que pruebes, porque en mi caso respondo siempre que puedo y creo que es el caso de la mayoría... Pero tené en cuenta que no siempre podemos responder todos los días, porque ademas cada uno tiene su trabajo y sus quilombos :)

Lo que si es una comunidad que responde siempre pero a veces la solución no llega en el momento que se necesita.

Saludos,

Pancho
Córdoba
Argentina

Guillermo Edgardo Lombardi

unread,
Aug 16, 2014, 7:27:23 PM8/16/14
to publice...@googlegroups.com
Lo entiendo y agradezco muchísimo la buena onda... Sólo aprovecho que los veo en linea y "me abuso"... ja ja ja

Gracias!!!

J. Enrique Ramos Menchaca

unread,
Aug 16, 2014, 11:56:11 PM8/16/14
to publice...@googlegroups.com
Tengo un rato que no utilizó la clase DosPrint de Victor Espina, pero si te permite enviar carácteres de control.

mapner

unread,
Aug 17, 2014, 9:19:43 AM8/17/14
to publice...@googlegroups.com
Una solución para imprimir en matriz de punto con caracteres de formato como ser chr(15) es enviar el texto en forma directa a la impresora con el comando ??? ,

Ejemplo

Set printer to "lx810"
Set printer on
??? Chr(15) + "HOLAAAAAAAAA"
set printer off

Imprimir de esta forma es bastante mas rudimentario que usar reports u otras soluciones pero te da un control mas efectivos sobre lo que estás enviando.
Yo lo utilizo para imprimir cheques.

Saludos

Guillermo Edgardo Lombardi

unread,
Aug 17, 2014, 11:44:01 AM8/17/14
to publice...@googlegroups.com
O sea... reemplazar el @ x,y say chr(15)+"Hola" por ??? chr(15)+"Hola"... Aún sabiendo que puedo estar violando las normas del foro, aprovechando la buena voluntad de mis colegas foxeros y habida cuenta que nunca en mi vida usé esta forma rudimentaria de impresión (siempre me bastó en FoxPro Lan para D.O.S. el "@ nReng,nColu say") necesitaría saber como hago para controlar el RENGLON y la COLUMNA (o al menos el renglón) donde imprimir el texto usando el comando "???" ya que lo necesito para imprimir reportes y especialmente facturas que tienen lugares específicos para imprimir determinados datos.
Desde ya mil gracias.

mapner

unread,
Aug 17, 2014, 11:56:14 AM8/17/14
to publice...@googlegroups.com
Si vas a utilizar ??? El conteo de filas los haces a manto, cada vez que imprimas línea incrementá una variable, y por el lado poscionamiento de columna, suponiendo que usas el mismo tamaño para toda la fila lo podés hacer con una variable del tipo
cLinea = SPACE(120) && o el ancho máximo que utilices
Luego podés usar la función STUFF para insertar strings en una posición (columna) de cLinea.

Ej.
cLinea = SPACE(120)
cLinea = STUFF(cLinea, 40, Len(nombre_cliente), nombre_cliente)
??? chr(15)+cLinea

O sea, creamos una linea en blanco, luego en la posición 40 insertamos un campo string cn el nombre del cliente, se pueden insertar mas campos o strings...
Una armada la linea, se imprime...

Saludos

Guillermo Edgardo Lombardi

unread,
Aug 17, 2014, 12:31:47 PM8/17/14
to publice...@googlegroups.com
Mapner... Te pido un sólo favor y te juro que no molesto más... ¿Me podrías dar el código para controlar el avance de carro (renglón) de la impresión?. Para el caso en que imprima una lista (ya sea reporte o factura), el largo del reporte (cantidad de renglones) es variable y en el caso de la factura hay renglones FIJOS en los que se debe imprimir un dato en particular. Ya me enseñaste como controlar la posición horizontal (columna), te pido ahora que me ayudes con la posición vertical (renglón) ya que de esa manera podría seguir empleando los bucles para determinar hasta cuando imprimir una lista de ítems...
Nuevamente... MUCHISIMAS GRACIAS POR EL APORTE!!!!

mapner

unread,
Aug 17, 2014, 1:05:01 PM8/17/14
to publice...@googlegroups.com
Te paso un método esbozado que seguramente se puede optimizar

Para hacer el control de posición vertical podes hacerlo con una "hoja virual" que vas llenando en un cursor auxiliar.

CREATE CURSOR xHoja (linea c(120))

* lo inicializo con N lineas en blanco...
FOR i= 1 to 72 && o la cantidad de renglones que tengas..
APPEND BLANK
ENDFOR

Luego te podés hacer una función para situar un string en la fila columna que requieras...

FUNCTION Str2xHoja
LPARAMETERS nFila, nCol, cStr

SELECT xHoja
IF nFila < 1 OR nFila > RECCOUNT()
Return .f. && fila equivocada
ENDIF
GOTO nFila
REPLACE linea WITH STUFF(linea,nCol,len(cStr), cStr)

RETURN .t.

Endfunc

luego lo usas desde tus datos..

SELECT Facturas
SCAN
Str2xHoja(5,10,Facturas.nombre_cliente)
Str2xHoja(5,70,DTOC(Facturas.fecha))


...

Una vez que ya llenaste la hoja con datos, la imprimís..

SELECT xHoja
FOR i=1 to RECCOUNT()
??? Linea && podés usar tus caracteres de control como chr(15) o lo que necesites...
ENDFOR

REPLACE linea with "" ALL in xHoja && acá limpias las líneas de xHoja para el próximo ciclo...

ENDSCAN


Saludos

mapner

unread,
Aug 17, 2014, 6:52:26 PM8/17/14
to publice...@googlegroups.com
Lo anterior un poco más aprolijado y  con una clase

**********
* Prueba

CREATE CURSOR facturas (cliente c(30), fecha d, importe N(15,2))

INSERT INTO facturas VALUES ("JUAN",DATE(2014,5,2),1000)
INSERT INTO facturas VALUES ("PEDRO",DATE(2014,5,2),2500)

oHoja = CREATEOBJECT('HojaPRN') && ver clase definida abajo...
oHoja.NombrePrn = 'EPSON LX80'
oHoja.nMaxLineas = 72
oHoja.nMaxColumnas = 120

SELECT facturas
SCAN

oHoja.CrearHoja() && Crea hoja en blanco
oHoja.Poner(5,10,facturas.cliente) && inserto nombre
oHoja.Poner(5,70,DTOC(facturas.fecha)) && inserto fecha
oHoja.Poner(20,20,TRANSFORM(facturas.importe,"999999.99")) && inserto importe
oHoja.Imprimir() && Imprimo

ENDSCAN

**********
*
DEFINE CLASS HojaPRN AS SESSION

cNombrePrn = ''
nMaxLineas = 50
nMaxColumnas = 80

**********
*
PROCEDURE CreaHoja

CREATE CURSOR xHoja (linea c(nMaxColumnas))
* lo inicializo con N lineas en blanco...
FOR i= 1 TO nMaxLineas
APPEND BLANK
ENDFOR

ENDPROC

**********
*
FUNCTION Poner
LPARAMETERS nFila, nCol, cStr

SELECT xHoja
IF nFila < 1 OR nFila > RECCOUNT()
MESSAGEBOX('PONER_EN_FC ... Nro. de Fila no válida',64,'Error')
RETURN .F. && fila equivocada
ENDIF

GOTO nFila
REPLACE linea WITH STUFF(linea,nCol,LEN(cStr), cStr)

RETURN .T.

ENDFUNC

**********
*
FUNCTION Imprimir
LPARAMETERS nFila, nCol, cStr
LOCAL i

SET PRINTER TO (THIS.NombrePrn)
SET PRINTER ON
SET CONSOLE OFF
SELECT xHoja
SCAN
??? linea && podés usar tus caracteres de control como chr(15) o lo que necesites...
ENDSCAN
SET PRINTER OFF
SET PRINTER TO DEFAULT

ENDFUNC

ENDDEFINE

Miguel Canchas

unread,
Aug 18, 2014, 9:13:55 AM8/18/14
to publice...@googlegroups.com

Hace un tiempo, no recuerdo cuando… lo que hacia era poner predeterminada la impresora por la que deseaba imprimir…y luego la regresaba a su configuración habitual….

 

MK

Walter Cordova

unread,
Aug 18, 2014, 9:42:06 AM8/18/14
to publice...@googlegroups.com
Puedes enviar tu reporte a un archivo de texto, primero y luego ese archivo lo envias al LPT1 


copy file MIREPORTE.PRN to lpt1.dos

y listo, 

Espero te sirva
--
-------------------------------
Wálter Córdova N.
Sistemas TQC
612-6565 Anexo 147

Miguel Canchas

unread,
Aug 19, 2014, 9:47:10 AM8/19/14
to publice...@googlegroups.com

Impresora por Defecto

 

Por la Redacción de FoxPress

http://www.fpress.com/

Otro tema recurrente es la forma de cambiar la impresora por defecto que usa la aplicación.

De forma interactiva se puede usar mediante SYS(1037) y SET PRINTER TO
NAME GETPRINTER()

Pero quizás la forma mejor de hacerla por código sea usando el Windows Sripting Host con un código parecido a:

oWshNet = CREATEOBJ('Wscript.Network')
oWshNet.SetDefaultPrinter(Nombre de la impresora o del device)

Este código funciona con la versión 2.0 del WSH pero no con la versión 1.0

FoxPress – Enero de 2000

© 1999 FoxPress. All rights reserved

 

 

MK

Fernando D. Bozzo

unread,
Aug 19, 2014, 10:19:34 AM8/19/14
to publice...@googlegroups.com
Cambiar la impresora por defecto de Fox es lo habitual y una buena práctica, cambiar la impresora por defecto de todo Windows no lo es, y puede ser tan agresivo como cambiar los temas de windows o cualquier otra preferencia del sistema, solo por la conveniencia de una aplicación.

No me quedó claro el problema que se está teniendo con esto...

Fernando D. Bozzo

unread,
Aug 19, 2014, 10:29:19 AM8/19/14
to publice...@googlegroups.com
Hola Guillermo :

Antes de invertir un montón de tiempo en pruebas y ajustes con los códigos de control de la impresora, deberías probar el dosprint de Victor Espina que está en VFPX, ya que podrías ahorrar más tiempo del que crees.

Saludos

Jorge Montúfar

unread,
Aug 19, 2014, 12:05:27 PM8/19/14
to publicesvfoxpro
no si estoy en lo correcto en cuanto a lo que esta preguntando, pero yo recomendaria si lo esta corriendo en vfp9 que haga por medio de reporte que es lo mas facil y  si no pues cambiaria los famosos @ f,c say  por ? que a mi me resulto facil y rapido de hacer cuando tenia  @ f,c say ya que con set device to screen y print para no me gustaba.

Saludos Cordiales



Fernando D. Bozzo

unread,
Aug 19, 2014, 12:22:49 PM8/19/14
to publice...@googlegroups.com
Hola Jorge:

Sí, esa sería le mejor opción. El problema es que comenta que tiene sí o sí que usar la impresión como la tiene.


Jorge Montúfar

unread,
Aug 19, 2014, 12:27:33 PM8/19/14
to publicesvfoxpro
bueno que lastima porque segun yo va o esta perdiendo mucho tiempo.

Saludos Amigo Fernando (por cierto tengo un hijo que se llama Henry Fernando)


Luis la Romana

unread,
Aug 20, 2014, 1:42:00 PM8/20/14
to publice...@googlegroups.com
Interesante tema, es difícil igualar el estilo de impresión estilo retro de Foxpro para DOS, yo todavía tengo código de esa época trabajando así (aclaro que no fue hecho por mí) pero la clase DosPrint del sr. Espina es ya legendaria en este tema, pienso que vale la pena invertir tiempo en conocerla bien.
Reply all
Reply to author
Forward
0 new messages