Olá Josmar,
Essa forma de impressão, ora que com menu para decidir Tela, Impressora ou Arquivo, quando selecionado Impressora, está enviando diretamente para a saída paralela em forma local, pelo que lembro do Miro3. Eu aconselho Josmar que você mude isso, mude para que SEMPRE grave em arquivo. Uma vez criado o arquivo de impressão, você pode exibir, imprimir e até mesmo repetir a impressão quantas vezes quiser. Além do mais, com a criação do arquivo, você pode direcionar a qualquer impressora da rede e a impressão não fica lenta nem amarrada quando se tem uma impressora local que está compartilhada. Mandando o arquivo para o spool do SO é a coisa certa a fazer, principalmete em WINXP. No WIN98 não dá para notar lentidão durante a impressão mas ja no WINXP sim. Então o jeito é mudar no PRG do relatório e as funções MENU_PRN, IMP_TELA e se ainda quiser localizar textos ou imprimir durante a exibição do relatório em tela você pode alterar a função FUN_IMP. Vou disponibilizar as minhas funções ja alteradas que você pode substituir pelas que você ja tem.
MENU_PRN - Menu que seleciona (Tela ou Impressora) saida para arquivo foi eliminada
Código: Selecionar todos
FUNCTION MENU_PRN(VARQ_PRN)
JANELA( 07, 19, 14, 59, ALLTRIM( (IMPRESSORA) ) )
COR( "MENU" )
@ 09,24 CLEAR TO 12,55
@ 07, 23 SAY PADC(ALLTRIM(IMPRESSORA), 35 ) COLOR CONTECOR[ 5 ]
MENU_CFG := { " (" + CHR( 7 ) + ") Tela "," (" + CHR( 7 ) + ") Impressora" }
SETCOLOR( CONTECOR[ 2 ] + "," + CONTECOR[ 7 ] )
KEYBOARD CHR( 32 )
VOPC_PRN := ACHOICE( 10, 26, 12, 54, MENU_CFG, .T., "FUN_CFG" )
DO CASE
CASE VOPC_PRN=1
VRET="T"
CASE VOPC_PRN=2
VRET="I"
OTHERWISE
VRET=""
ENDCASE
MENSAGEM("Tecle <ESC> para pausa ou interrup‡„o")
RETURN VRET
IMP_TELA - Função para exibir a impressão na tela. Utiliza a CT.LIB
Código: Selecionar todos
FUNCTION IMP_TELA(VARQ_PRN,VTAM_LIN,MARG_ESQ)
IF PCOUNT()=2
VMARG_ESQ=0
ENDIF
VMARG_ESQ=VMARG_ESQ+1
MENSAGEM("Aguarde processamento")
PUBL QUAN_REG,ULT_POS,VSTRING
VARQ_PRN1="C:"+VARQ_PRN+"."+SUBS(STR((VAL(SUBS(TIME(),4,2))*10)+VAL(SUBS(TIME(),7,2))+1000,4),2)
ARQ_PRN:={}
EDI_TAR:={}
FOR I=1 TO CEILING(VTAM_LIN/75)
AADD(ARQ_PRN,{"COL"+STRZERO(I,5,0),"C",75,0})
AADD(EDI_TAR,"COL"+STRZERO(I,5,0))
IF I=1
VINDEX="COL"+STRZERO(I,5,0)
ELSE
VINDEX=VINDEX+"+COL"+STRZERO(I,5,0)
ENDIF
NEXT
DBCREATE(VARQ_PRN1,ARQ_PRN)
USE (VARQ_PRN1) NEW
APPEND FROM &(VARQ_PRN+".PRN") SDF
VQUAN_REG=LASTREC()
IF VQUAN_REG=0
VQUAN_REG=1
ENDIF
GOTO TOP
SET COLOR TO W+/B
@ 02,00 CLEAR TO 23,79
@ 03,78 SAY CHR(24)
@ 22,78 SAY CHR(25)
FOR VX=3 TO 22
@ VX,78 SAY CHR(176) COLOR "W+/B"
NEXT
SET COLOR TO GR+/B
@ 02,00 TO 23,79
SET COLOR TO W+/N,R/W,,,W/B
KEYBOARD CHR(65)
VULT_POS=6
MENSAGEM("<F2> Pesquisa palavra | <F3> Continua a pesquisa")
DBEDIT(03,02,22,77,EDI_TAR,"FUN_IMP","","","","")
USE
ERASE &VARQ_PRN1
RELEASE QUAN_REG,ULT_POS,ARQ_PRN
RETURN
FUN_IMP - Função utilizada no DBEDIT que controla a navegação e foi implementado a pesquisa por string e podem ser implementados a impressão durante exibição e até mesmo a geração de planilha excel.
Código: Selecionar todos
FUNCTION FUN_IMP
DO CASE
CASE LASTKEY()=27
RETURN 0
CASE LASTKEY()=-1
VSTRING=SPACE(78)
SET CURSOR ON
@ 24,11 SAY "Procurar por: "
@ 24,25 GET VSTRING PICT "@S44"
READ
SET CURSOR OFF
IF !LASTKEY()=27
IF !EMPTY(VSTRING)
LOCATE FOR UPPER(ALLTRIM(VSTRING)) $ &(VINDEX)
IF FOUND()
FOR I=1 TO FCOUNT()
IF ALLTRIM(VSTRING) $ FIELDGET(I)
KEYBOARD CHR(26)+REPLICATE(CHR(4),I-1)
EXIT
ENDIF
NEXT
ENDIF
ENDIF
ENDIF
CASE LASTKEY()=-2 .AND. VALTYPE(VSTRING)="C"
SKIP
LOCATE REST FOR ALLTRIM(VSTRING) $ &(VINDEX)
IF FOUND()
FOR I=1 TO FCOUNT()
IF ALLTRIM(VSTRING) $ FIELDGET(I)
KEYBOARD CHR(26)+REPLICATE(CHR(4),I-1)
EXIT
ENDIF
NEXT
ELSE
KEYBOARD CHR(0)
ENDIF
CASE LASTKEY()=1
GOTO TOP
CASE LASTKEY()=6
GOTO BOTT
ENDCASE
@ VULT_POS,78 SAY CHR(176) COLOR "W+/B"
VULT_POS=3+(((RECNO()*100)/VQUAN_REG)/5)
IF RECNO()=1
VULT_POS=3
ENDIF
IF VULT_POS=23
VULT_POS=22
ENDIF
@ VULT_POS,78 SAY CHR(219) COLOR "GR+/B"
RETURN 1
Substitua no seu código, as linhas 31 a 34 pelas seguintes:
Código: Selecionar todos
TIPO_PRN=""
TIPO_PRN=MENU_PRN("OFIC_01") // para cada relatorio tem um numero OFIC_02, OFIC_03...
IF EMPTY(TIPO_PRN)
RETURN
ENDIF
SET CURSOR OFF
SET PRINTER TO ("OFIC_01.PRN")
Substitua no seu código, as linhas 75 a 81 pelas seguintes:
Código: Selecionar todos
CLOSE CLIENTES // feche o dbf, nao ha necessidade de ficar aberto
SET PRINTER TO
IF TIPO_PRN = "T"
IMP_TELA("OFIC_01",59)
ELSE
/* Aqui voce pode implementar um menu para selecionar a impressora
podendo selecionar conforme o que esta instalado no seu Windows.
Mas vou dar um exemplo simples ja predefinido.
*/
cImp:="LPT1" // ou p/impres.em rede colocando o caminho=> cImp:="\\pc3\epson"
COPY FILE("OFIC_01.PRN") TO (cImp)
ENDIF
RESTORE SCREEN FROM TELA1
Mas lembre que toda essa alteração vai implicar em todos os relatório, pois terá que adaptar todos eles.
A outra saída é colocar um contador dentro de um laço de repetição que irá imprimir do jeito que está. Mas eu não recomendo isso, pois alé de ficar lenta a impressão (pela falta de arquivo de impressão) irá também demandar reprocessamento desnecessário. É dizer, vai compor o relatorio com as suas devidas pesquisas em arquivo tantas vezes for o numero solicitado de vias para imprimir.