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
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
|
* 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 [.nPrinters, PRN_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-1, 1, 1, @sBuff, LEN(sBuff), 0, 0) 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 *** |
Me alegro!
Abrazo,
César