IMPRESION: USANDO @

402 views
Skip to first unread message

mhlezama

unread,
Sep 7, 2016, 9:08:17 PM9/7/16
to Comunidad de Visual Foxpro en Español
Saludos amigos

En este momento no quiero usar  el REPORT FORM, quiero utilizarlo de forma manual.
es decir:


SET DEVICE TO printer
SET CONSOLE OFF
SET PRINT ON 

vlinea = 20

@vlinea,45 say chr(15)+"IMPRIMIR EL TITULO"

EJECT 

SET DEVICE TO screen
SET CONSOLE ON
SET PRINT OFF

Lo estoy enviando a una impresora de tinta.  La pregunta es porque no imprime?

o solo funciona para impresora de matriz?

HernanCano

unread,
Sep 8, 2016, 1:53:08 AM9/8/16
to Comunidad de Visual Foxpro en Español
Hola.
Es complejo pero lo intentaré.

La impresión con los comandos que indicas van normalmente al puerto LPT1, puerto paralelo número uno y a un dispositivo llamado PRN.

Pero éso era en los tiempos del sistema operativo DOS.

Con la "llegada" de Windows se cambió el concepto a lo que hoy conoces como "cola de impresión", lo que significa que la impresión es capturada por Windows en vez de ser efectivamente enviada a la impresora.

Las impresoras de inyección de tinta y las láser mejoran sus prestaciones cuando Windows las "administra" con la "cola de impresión", mientras que las impresoras de puntos (las que se conectan ---normalmente--- por puerto paralelo) funcionan mejor por puerto paralelo sin cola de impresión.

Cuando digo "mejor" me refiero a sus prestaciones. Lo que te está pasando es que lo que envías se intenta direccionar al puerto LPT1 el cual evidentemente no tiene impresora conectada: la impresora está por un puerto USB (¿tal vez USB001?)

------------------------------------------------
Como workarround (alternativa) a lo que intentas hacer, te indico:

1. Dirigir todo lo que intentas con @say a un archivo de texto y luego enviarlo tú mismo a la impresora, más o menos así:

local M.cTxt
M.cTxt = 'C:\IMPRESIONES\TEXTO.TXT'
set console off
set device to file (M.cTxt)
*!* set print on 
M.vLinea = 20
@M.vLinea,45 say chr(15)+"IMPRIMIR EL TITULO"
@prow(),pcol() say chr(18)
eject 
set device to screen
set console on
*!* set print off
run C:\IMPRESIONES\Imprimir.bat

El comando SET PRINTER ON no se recomienda "combinarlo" con SET DEVICE TO PRINTER. 
Se usa SET DEVICE TO PRINTER con @say.
Sólo se necesita SET PRINTER ON cuando utilizas ?, ?? y ???.
Pero combinar ambas formas no es pertinente, pues hay casos (frecuentes) en que lo que quieres imprimir no sale en la sgte línea, sino que se brinca la hoja completa e imprime lo que sigue en la pág sgte.
Igual no creo que combines @say con ??.

El contenido de C:\IMPRESIONES\Imprimir.bat es:

@echo off
rem Imprimir.bat
cd C:\IMPRESIONES
copy TEXTO.TXT prn

rem o también copy TEXTO.TXT LPT1
rem o también copy TEXTO.TXT LPT2
rem o también copy TEXTO.TXT LPT3
rem o también podrías utilizar el puerto al que está conectada tu impresora


2. También podrías redireccionar el puerto. Para ello se usa el comando DOS llamado MODE. Ve al símbolo del sistema de Windows y pide la ayuda de este comando 

mode /?

Quizá algo como

mode LPT1:=COM1:

que redirecciona el puerto LPT1 al COM1, donde COM1 es el puerto donde hay conectada un impresora (( escribo puerto COM pues es lo que indica la ayuda; tú debes probar a ver si el comando te funciona para redireccionar a un puerto USB001; yo no lo he necesitado aún )).


3. Otra alternativa:
Para imprimir a impresoras de burbuja y a impresoras láser te recomiendo REPORT FORM. Y además con FoxPreviewer.
Para imprimir a impresoras de puntos te recomiendo @say, y sin FoxPreviewer.


Ensaya y nos cuentas.

mhlezama

unread,
Sep 8, 2016, 8:48:45 PM9/8/16
to Comunidad de Visual Foxpro en Español
Saludos

Entendí que los siguientes comandos se usaron en FOX

SET DEVICE TO printer
SET CONSOLE OFF
SET PRINT ON

Realmente estos comandos son los que yo usaba en fox, siempre uso el REPORT pero esta vez necesito hacerlo MANUALMENTE.
Entiendo que estos comandos son para los puertos LPT1 y no USB

El asunto es el siguiente, tengo una impresora EPSON (punto) y CANON (tinta).  En ambas maquinas se debe imprimir el mismo
reporte.

1. Será que debo codificar de forma diferente para cada una de las impresoras?

2. en ambos casos debo usar los siguientes comandos solamente?
SET DEVICE TO PRINTER
SET CONSOLE ON


3. No quiero enviarlo a un archivo.
4. sigo usando el SAY?
5. He visto un comando nuevo prow(), como trabaja eso?


gracias, disculpen estoy un poco enredado en esto ultimo

Fidel Charny

unread,
Sep 9, 2016, 8:54:24 AM9/9/16
to Comunidad de Visual Foxpro en Español
Te paso una idea básica sobre como trabajar sin Report Form.
También puedes escribir en un archivo de texto, direcccionando SET PRINTER TO &lcNombreArchivo.
Verás que no se utiliza LPT1 o similares, sino el nombre de la impresora instalada en Windows (ya sea local, compartida por otro equipo o impresora de red (puerto IP, por ejemplo).
Puedes utilizar GetPrinter() para selecciona una impresora (devuelve el nombre de la seleccionada) o crear un array con APRINTERS(), donde la columna 1 tendrá el nombre de la impresora.

lcFontName = "Lucida Console"
lnFontSize
= 8
lnColumn
= 5
lcString
= "Lo que sea"

lcNameWindows_Printer
= GETPRINTER()

SET PRINTER TO NAME
(lcNameWindows_Printer)
SET CONSOLE OFF
IF lGraphic_printer
   
* Cualquier impresora, incluso matriz de puntos si tiene modo gráfico.

    SET PRINTER ON
   
? lcString
   
? Padr("** Importe I.V.A.: ",30) ;
       
+TRansform(niMPIVA,"999,999,999.99");
        at lnColumn FONT
'Lucida Console',9
       
    FOR i
= 1 TO lnRows
       
? laArray[i] at lnColumn font lcFontName,lnFontSize
    NEXT
    EJECT

    SET PRINTER OFF

ELSE
   
* Para utilizar con secuencia de escape.
   
* No utiliza el driver de la impresora

   
#DEFINE DPMODE    CHR(27) + CHR(64)
   
#DEFINE INCOMP    CHR(27) + CHR(15)
   
#DEFINE OFCOMP    CHR(18)
   
#DEFINE INDOCE    CHR(27) + CHR(77)
   
#DEFINE OFDOCE    CHR(27) + CHR(80)
   
#DEFINE CHICO     CHR(27) + CHR(48)
   
#DEFINE GRANDE    CHR(27) + CHR(50)
   
#DEFINE PAGNN     CHR(27) + CHR(67)

   
#DEFINE draf         CHR(27) + CHR(120) + CHR(0)
   
#DEFINE QUALY        CHR(27) + CHR(120) + CHR(1)
   
#DEFINE DOBLE_WID    CHR(27) + CHR(33) + CHR(32)
   
#DEFINE ENFASIS      CHR(27) + CHR(33) + CHR(8)
   
#DEFINE COMUN        CHR(27) + CHR(33) + CHR(0)
   
#DEFINE DOCECPI      CHR(27) + CHR(33) + CHR(1)
   
#DEFINE On_Dstrik    CHR(27) + CHR(71)
   
#DEFINE oF_Dstrik    CHR(27) + CHR(72)
   
#DEFINE Ava180      74
   
#DEFINE Relavan    216
   

    SET DEVICE TO PRINTER
    lcLarPage
=PAGNN+CHR(72)
   
??? DPMODE+LLP+DRAF+OFCOMP+INDOCE
   
@ PROW(),0 SAY " "
    lnLin
= 0
    FOR i
= 1 TO lnRows
        lnLIn
= lnLIn + 1
       
@ lnLin,5 SAY laArray[i]
    NEXT
   
??? INCOMP
   
@ PROW(),0 SAY ""
    lnLin
= lnLin + 1
   
@ lnLin,5 say "Saludos"
   
??? OFDOCE
   
??? OFCOMP
    EJECT
   
    SET DEVICE TO SCREEN

ENDIF
SET PRINTER TO
SET CONSOLE ON

Rodolfo Ortiz González

unread,
Sep 9, 2016, 9:39:23 AM9/9/16
to publice...@googlegroups.com
Te mando un programa completo de cuando hacíamos impresiones en programa de MS-Dos, este programa funcionaba en matriz de puntos, inyección de tinta y laser, saludos!
 
PROC IMPRIMEDOS
  LETRA="FONT 'ARIAL NARROW', 12 STYLE 'C'"
  LETRA1="FONT 'ARIAL NARROW', 10 STYLE 'C'"
  LETRA2="FONT 'ARIAL NARROW',  8 STYLE 'CN'"
  SET DEVICE TO PRINTER
  conta=0
  DO TITIMP
  STORE 0 TO ST1, ST2, ST3, ST4, T1, T2, T3, T4
  CAMBIO=0
  SELE TEMP
  DO WHILE .NOT. EOF() 
    @ CONTA,0 SAY FECHA &LETRA2
    @ CONTA,10 SAY FOLIO PICT '999999' &LETRA2
    LLAVE=(NUMCTE)
    SELE CTES
    SEEK (LLAVE)
    SELE TEMP
    @ CONTA,17 SAY NUMCTE PICT '99999'   &LETRA2
    @ CONTA,23 SAY SUBSTR(CTES.NOMBRE,1,39) &LETRA2
    IF STATUS=1
       @ CONTA,63 SAY TOTAL PICTU '99,999,999.99'  &LETRA2
       IF MONEDA=1
         @ CONTA,77 SAY CARGOS-IVA PICTU '99,999,999.99'  &LETRA2
         @ CONTA,91 SAY IVA PICTU '99,999,999.99'  &LETRA2
         @ CONTA,105 SAY CARGOS PICTU '99,999,999.99'  &LETRA2
         T1=T1+TOTAL
         T2=T2+(CARGOS-IVA)
         T3=T3+IVA
         T4=T4+CARGOS
       ELSE
         @ CONTA,77 SAY ROUND((CARGOS-IVA)*TIPOC,4) PICTU '99,999,999.99'   &LETRA2
         @ CONTA,91 SAY ROUND(IVA*TIPOC,4) PICTU '99,999,999.99'   &LETRA2
         @ CONTA,105 SAY ROUND(CARGOS*TIPOC,4) PICTU '99,999,999.99'   &LETRA2
         T1=T1+TOTAL
         T2=T2+ROUND((CARGOS-IVA)*TIPOC,4)
         T3=T3+ROUND(IVA*TIPOC,4)
         T4=T4+ROUND(CARGOS*TIPOC,4)
       ENDIF
       @ CONTA,119 SAY AGENTE PICT '999'   &LETRA2
       @ CONTA,123 SAY TIPOC PICTU '99.9999'  &LETRA2
       IF TREP=2
         LLAVE=ALLT(SERIE)+STR(FOLIO00,3)+STR(FOLIO0,3)+STR(FOLIO,8)
         SELE AUXPAR
         SEEK LLAVE
         IF FOUND()
           DO DETALLE
         ENDIF
         SELE TEMP
       ENDIF
    ELSE
      @ CONTA,68 SAY 'FACTURA CANCELADA'   &LETRA2
    ENDIF
    SELE TEMP
    SKIP
    CONTA=CONTA+1
    IF CONTA>57 
      DO TITIMP
    ENDIF
  ENDDO
  DO TOTEMP
SET DEVI TO SCREE
IF SALIDA=1
  MODI COMM &DIREC\TEMP.TXT NOMO
ELSE
  SET PRINT TO
ENDIF
SELE TEMP
USE
*DELETE FILE &DIREC\TEMP.*
SELE AUXENC
SET ORDER TO TAG AUXENC7
SET KEY TO RANGE ALLT(VSER)+STR(1,3)+STR(1,3)+STR(1,8), ALLT(VSER)+STR(1,3)+STR(1,3)+STR(99999999,8)
RETURN    


PROC TITIMP
  SELE 1
  @ 0,40 SAY ALLT(CIA) &LETRA
  HOJA=HOJA+1
  HOJ=STR(HOJA,4)
  @ 2,1 SAY 'Emision :'+DTOC(DATE())+' Hora:'+time()  &LETRA2
  @ 2,45 SAY TIT &LETRA1
  @ 2,110 SAY 'HOJA No.'+TRIM(HOJ)   &LETRA2
  @ 3,0 SAY REPLI ('=',150)   &LETRA2
  @ 4,2 SAY 'Fecha'   &LETRA2
  @ 4,10 SAY 'Factura'   &LETRA2
  @ 4,19 SAY 'Cliente'   &LETRA2
  @ 4,63 SAY 'Unidades'   &LETRA2
  @ 4,79 SAY 'Neto'   &LETRA2
  @ 4,95 SAY 'I.V.A.'   &LETRA2
  @ 4,109 SAY 'Total'   &LETRA2
  @ 4,118 SAY 'Age.'   &LETRA2
  @ 4,123 SAY 'T.C.'   &LETRA2
  @ 5,0 SAY REPLI ('=',150)   &LETRA2
  CONTA=6
  SELE TEMP
RETURN  



PROC DETALLE
  DO WHILE NOT EOF()
    IF ALLT(SERIE)+STR(FOLIO00,3)+STR(FOLIO0,3)+STR(FOLIO,8)=LLAVE
      CONTA=CONTA+1
      LLAP=NUMPROD
      SELE PROD
      SEEK ALLTRIM(LLAP)
      @ CONTA,5 SAY LLAP   &LETRA2
      @ CONTA,20 SAY NOMBRE   &LETRA2
      SELE AUXPAR
      @ CONTA,61 SAY PIEZAS PICTU '999,999.99'   &LETRA2
      IF MONEDA=1
        @ CONTA,85 SAY PRECIO PICTU '999,999.99'   &LETRA2
        @ CONTA,99 SAY PIEZAS*PRECIO PICTURE '999,999,999.99'   &LETRA2
      ELSE
        @ CONTA,85 SAY ROUND(PRECIO*TEMP.TIPOC,2) PICTU '999,999.99'  &LETRA2 
        @ CONTA,99 SAY ROUND((PIEZAS*PRECIO)*TEMP.TIPOC,2) PICTURE '999,999,999.99'   &LETRA2
      ENDIF
      IF CONTA>57
        DO TITIMP
        SELE AUXPAR
      ENDIF
    ELSE
      GO BOTT
    ENDIF
    SKIP
  ENDDO
  CONTA=CONTA+2
RETURN  

PROC TOTEMP
  @ CONTA,63 SAY REPLI('=',90)    &LETRA2
  CONTA=CONTA+1
  @ CONTA,63 SAY T1 PICTU '999,999,999.99' &LETRA2   
  @ CONTA,77 SAY T2 PICTU '999,999,999.99' &LETRA2   
  @ CONTA,91 SAY T3 PICTU '999,999,999.99' &LETRA2   
  @ CONTA,105 SAY T4 PICTU '999,999,999.99' &LETRA2
  CONTA=CONTA+1
  @ CONTA,63 SAY REPLI('=',90)    &LETRA2
RETURN

HernanCano

unread,
Sep 9, 2016, 6:50:36 PM9/9/16
to Comunidad de Visual Foxpro en Español
Hola, lezama.

>>> 1. Será que debo codificar de forma diferente para cada una de las impresoras?

No necesariamente: puedes generar un reporte (binario .FRX/.FRT) sencillo sin imágenes, sin cambios de letra exagerados,...
Y enviarlo a ambas impresoras.

Tip: Un reporte binario .FRX/.FRT a ambas impresoras.
Tip: Un reporte basado en @say sólo a las de puntos.

>>> 3. No quiero enviarlo a un archivo.
>>> 4. sigo usando el SAY?

Con SET DEVICE TO PRINTER puedes enviar lo que escribes con @say "directamente" a la impresora de puntos (debes probar mucho, analizar lo efectos de la cola de impresión, si te deja o no, si tienes puerto LPT1 ó LPT2 ó LPT3 ó si no tienes paralelos, probar, probar, probar).

Tip: Un reporte basado en @say sólo a las de puntos.

>>> 5. He visto un comando nuevo: prow(). ¿Cómo trabaja éso?

Las ayudas de VFP9 son muy completas. Míralas por favor.

------------------------------------------
Fidel y Rodolfo te dan tips. Ensáyalos y comentas.

HernanCano

unread,
Sep 9, 2016, 6:53:14 PM9/9/16
to Comunidad de Visual Foxpro en Español
Sí, Rodolfo.

La dificultad que se le presenta a lezama es que "no imprime".

Muy seguramente ustedes tenían el hardware configurado de alguna forma que lo permitía (tal vez las impr se conectaban por puerto COM y se usaba el MODE LPT1:=COM1: (¿o era al revés? ... algo así... con MODE...)

Rodolfo

unread,
Sep 9, 2016, 7:08:18 PM9/9/16
to publice...@googlegroups.com
Era por lpt y por usb, recuerdo vagamente que teníamos un manual para este tipo de impresoras, voy a ver si localizo lo alguno y lo subo, saludos!

Enviado desde mi iPhone
Reply all
Reply to author
Forward
0 new messages