validar si se imprimio fisicamente un documento

237 views
Skip to first unread message

GETIANG

unread,
Jan 2, 2015, 8:26:26 PM1/2/15
to publice...@googlegroups.com
Buenas noches foro... ante todo Feliz Año 2015, lleno de mucho Éxito...!

A ver quien me puede ayudar...

Se imprime una factura, la misma no puede ser impresa nuevamente a no ser que se anule el documento - Perfecto - 

Las posible soluciónes me trae limitaciones:

1.- A la hora de mandar el informe a la impresora física "se pasa un switch" y esto me sirve, siempre y cuando el documento haya sido impreso realmente.... Pero si no se imprimió o el Usuario llego al dialogo de la impresora y aborto dicha impresión......

2.- Utilizar el _pagetotal con la ayuda de sys(2040), pero en este caso, es una impresión a media página la cual cual no lleva conteo de páginas

3.- Cuadro de Dialogo donde se le pregunte al usuario si se imprimió correctamente

A quien se le ocurre algo o tiene una solución para esto...

Como nota, utilizo la libreria XFRX...

Gracias por su colaboración 

César Pistiner

unread,
Jan 2, 2015, 8:52:37 PM1/2/15
to publice...@googlegroups.com

Buenas noches

Te consulto...
Por que no puede ser impresa nuevamente? Creo que siempre vas a depender del usuario si es así... Imaginate que mandas a imprimir y no hay hojas.

Se imprime en un formulario preimpreso?

Es una impresora láser?

Creo que la limitación esa no te deja muchas opciones y así y todo nada te asegura que se imprimió porque el usuario es humano...

Saludos,
César

Víctor Hugo Espínola Domínguez

unread,
Jan 2, 2015, 9:11:40 PM1/2/15
to publice...@googlegroups.com
Hola Getiang

No deberías preocuparte por detectar si se imprimió correctamente porque eso no es garantía de que la factura impresa sea utilizable. Ejemplos:

- En una matricial el formulario se atasca y las líneas se imprimen encimadas.

- Se imprime correctamente pero la interfase silla/teclado es un bruto y rompe la hoja al retirar de la impresora.

- Justo al retirar la hoja intacta de la impresora una colega le invita un café y la taza se vuelca manchando la factura

No debes usar la opción de anular factura para que posteriormente sea reimpresa, una factura anulada solo debe reimprimirse en hoja comunes.

Creo que es mejor tener una opción de Reimprimir factura... que pedirá el número de la factura a reimprimir y el programa la anula y luego reimprime automáticamente, con otro número por supuesto.

Saludos,
Víctor.
Lambaré - Paraguay.

GETIANG

unread,
Jan 2, 2015, 9:12:55 PM1/2/15
to publice...@googlegroups.com
Buenas noches Cesar...!

Es una condición impuesta por el Dueño de la empresa... Lo que se imprime en un comprobante de pago que al imprimirse por primera vez sale la palabra "ORIGINAL" ya después de eso puedes reimprimir el comprobante pero debe indicar que es "COPIA".
Claro hay una opción donde podemos volver a imprimir el documento en forma original, pero con clave de autorización. Esto en el caso de que haya pasado inconvenientes, etc.
Es en forma continua, media página, con impresora de pines LX300

César Pistiner

unread,
Jan 2, 2015, 9:28:52 PM1/2/15
to publice...@googlegroups.com

Mmmm entiendo,

En ese caso también dejaría en manos del dueño como determinar si se imprimió una factura, presentale todos los inconvenientes que pueden haber en medio de una impresión así comprende. Si confía en los usuarios la opción de una ventana de dialogo no esta mal. Si no confía en ellos no se si hay mucho por hacer.

Integrar al cliente en el desarrollo siempre es positivo y en este caso mucho más. Comentale los inconvenientes de una forma que lo puedo comprenda a ver que dice.

Hasta donde yo sé esa impresora no puede accederse para consultar su estado.

Saludos y mucha suerte!
César

edgar suarez kummers

unread,
Jan 2, 2015, 9:28:59 PM1/2/15
to publice...@googlegroups.com
Estimado Victor:
 
Explícame mejor eso de que una factura rota o manchada de café no se debe o puede volver a imprimir.
Lo digo por lo siguiente:
Anoche mismo bajé en un PDF una factura que debo pagar mensualmente por el Internet.
Yo puedo imprimir las copias que me quiera de ella y sigue siendo la misma factura.
Debo pagar esa factura en un Banco acreditado y el Banco le hace llegar al proveedor de Internet el mensaje o la copia del CANCELADO.
Si imprimo muchas copias puedo regarlas con café o romperlas.
De todas maneras explícame por favor tu visión al respecto y tus razones.
 

Gustavo A. Mora Rivera

unread,
Jan 2, 2015, 10:36:12 PM1/2/15
to publice...@googlegroups.com
aparte de lo que te han dicho,,,,  como que la impresion de 100 facturas no es problema, pues son los mismos datos,,,  pero si es por papel preimpreso continuo, SI HAY PROBLEMA por el consecutivo...  pero bueno...

el problema mas grave para cualquier solución lo puede ser la impresora,,,, para ciertro proceso tuve que hacer algo similar  tal vez te pueda servir,,,, el asunto era que tenia que revisar que todo lo salio impreso fuera lo que se habia mandado a imprimir.. lo que hice fue poner un codigo de barras a cada hoja,, y al terminar la impresion, lo pasaba por el lector de barras y esto ya marcaba el registro como IMPRESO. sin margen de error humano.... algo asi te podria servir.

Víctor Hugo Espínola Domínguez

unread,
Jan 2, 2015, 11:36:43 PM1/2/15
to publice...@googlegroups.com
Hola Edgar

Se aplica solo para formularios preimpresos y numerados.

Saludos,
Víctor.
Lambaré - Paraguay.

Mario López

unread,
Jan 3, 2015, 7:38:38 AM1/3/15
to publice...@googlegroups.com
@Getiang: hace tiempo posteé una rutina para verificar en qué impresora se había impreso un reporte
con TO PRINTER PROMPT PREVIEW, creo que se podría usar en tu caso para verificar si se imprimió
o no: en ese caso sPrinter tendría que quedar vacío.

De cualquier forma, el hecho de que se haya enviado un trabajo a una cola de impresión no asegura
de ninguna forma que el mismo se haya completado: la cola de impresión puede estar detenida, puede ser
un driver PDF, puede estar la impresora desconectada, etc.


* Devuelve la impresora que se utilizó para un reporte

CLEAR 

IF VERSION(4) >= "08"
    SET ENGINEBEHAVIOR 70        && el GROUP BY del reporte de prueba requiere esto
ENDIF

WITH NEWOBJECT("PrinterInfo")
     * Va cualquier reporte
    sFrx = "D:\Archivos de programa\Microsoft Visual FoxPro 7\Samples\Tastrade\Reports\TOPCUST.frx" 
    .SaveJobInfo()            && Actualizo la información de los trabajos antes de mandar a imprimir

    REPORT FORM (sFRX) TO PRINTER PROMPT PREVIEW

    * Devuelvo la 1ra impresora que tenga más trabajos de impresión que antes y cuyo último trabajo
    * tenga el nombre del reporte
    sPrinter = .GetLastUsedPrinter (JUSTFNAME(sFRX))
ENDWITH

IF EMPTY(sPrinter)
    ? "No impreso"
ELSE 
    ? "Reporte Impreso en " + sPrinter
ENDIF

RETURN 


#define PRN_NAME        1        && Nombre de la impresora
#define PRN_JOBS        2        && Cantidad de trabajos pendientes
#define PRN_LAST_JOB    3        && Información del último trabajo
#define PRN_JOBS_PRE    4        && Cantidad previa de trabajos 

#define PRN_COLS         4

DEFINE CLASS PrinterInfo as Custom
    DECLARE aPrinterInfo[1]
    nPrinters = 0            && Cantidad de impresoras
    

    PROCEDURE Init
    WITH This
        .InitDlls()
        .GetPrinterInfo()
    ENDWITH
    ENDPROC 


    PROCEDURE Destroy
    This.ReleaseDlls()
    ENDPROC 


    PROCEDURE InitDlls

    DECLARE INTEGER OpenPrinter IN winspool.drv;
        STRING    pPrinterName,;
        INTEGER @ phPrinter,;
        INTEGER   pDefault

    DECLARE INTEGER ClosePrinter IN winspool.drv;
        INTEGER hPrinter

    DECLARE INTEGER EnumJobs IN winspool.drv;
        INTEGER   hPrinter,;
        INTEGER   FirstJob,;
        INTEGER   NoJobs,;
        INTEGER   Lvl,;
        STRING  @ pJob,;
        INTEGER   cbBuf,;
        INTEGER @ pcbNeeded,;
        INTEGER @ pcReturned

    ENDPROC 
     

    PROCEDURE ReleaseDlls
    CLEAR DLLS OpenPrinter, ClosePrinter, EnumJobs
    ENDPROC 
     

    * Recorro las impresoras y obtengo la información de las mismas
    PROCEDURE GetPrinterInfo

    LOCAL asPrn[1], nPrn, nBytes, nJobs, nHandle, sBuff, sRet
    sRet = ""

    WITH This
        nPrn = APRINTERS(asPrn)

        IF EMPTY(.nPrinters)
            .nPrinters = nPrn
            DIMENSION .aPrinterInfo [.nPrintersPRN_COLS]
        ENDIF

        FOR nPrn = 1 TO .nPrinters
            sPrn = asPrn [nPrn, 1]

            nJobs = -1
            IF OpenPrinter (sPrn, @nHandle, 0) > 0
                nBytes = 0
                sBuff = SPACE(1000)
                
                * Obtengo en nJobs la cantidad de trabajos de impresión
                EnumJobs (nHandle, 0, nJobs, 1, @sBuff, LEN(sBuff), @nBytes, @nJobs)

                * Obtengo el último trabajo de cada impresora
                EnumJobs (nHandle, nJobs-111, @sBuff, LEN(sBuff), 00)

                ClosePrinter (nHandle)
            ENDIF

            .aPrinterInfo [nPrn, PRN_NAME= sPrn
            .aPrinterInfo [nPrn, PRN_JOBS= nJobs
            .aPrinterInfo [nPrn, PRN_LAST_JOB= sBuff
        NEXT
    ENDWITH

    ENDPROC 
    
    
    * Guardo la información de los trabajos que tiene cada impresora
    PROCEDURE SaveJobInfo
    
    LOCAL nPrn
    
    WITH This
        FOR nPrn = 1 TO .nPrinters
            .aPrinterInfo [nPrn, PRN_JOBS_PRE= .aPrinterInfo [nPrn, PRN_JOBS]
        NEXT
    ENDWITH
    
    ENDPROC 
    
    
    * Devuelvo el nombre de la primera impresora que tiene más trabajos que antes
    * o la que tiene un trabajo nuevo con el nombre indicado
    PROCEDURE GetLastUsedPrinter (sJobName)
    
    LOCAL nPrn, sRet
    
    WITH This
        sRet = ""
        sJobName = IIF(!EMPTY(sJobName), UPPER(sJobName), .F.)
    
        .GetPrinterInfo()
        
        FOR nPrn = 1 TO .nPrinters
            IF .aPrinterInfo [nPrn, PRN_JOBS] > .aPrinterInfo [nPrn, PRN_JOBS_PRE]
                IF EMPTY(sJobName) OR (sJobName $ UPPER(.aPrinterInfo [nPrn, PRN_LAST_JOB]))
                    sRet = .aPrinterInfo [nPrn, PRN_NAME]
                    EXIT 
                ENDIF
            ENDIF
        NEXT
    ENDWITH
    
    RETURN sRet
ENDDEFINE 



***



HTH
Mario
---

GETIANG

unread,
Jan 3, 2015, 4:13:59 PM1/3/15
to publice...@googlegroups.com
Gracias a todos

Cesar muchas gracias tu solución fue efectiva - Agradecido

Un abrazo

César Pistiner

unread,
Jan 3, 2015, 4:49:29 PM1/3/15
to publice...@googlegroups.com

Me alegro!

Abrazo,
César

Reply all
Reply to author
Forward
0 new messages