Página 1 de 1

Imprimir Várias Vias

Enviado: 16 Set 2010 00:46
por Josmar dos Santos
Ola, esse relatório e do tipo ficha, gostaria de aprender como imprimir várias vias, ou seja, após o o filtro, dar a opção de quantas vias ! Ele ta imprimindo certinho, na tela, impressora e arquivo.

Código: Selecionar todos

SET COLOR TO 21,79
FILTRO := SPACE( 5 )
SAVE SCREEN TO TELA1
SET COLOR TO N/W
@ 04,07 CLEAR TO 09,50
@ 04,7 TO 09,50
WHILE .T.
    SET COLOR TO N/W,W+/R,,,N/W
    @ 06, 10 SAY "Digite o codigo do cliente.....:" GET FILTRO
    SET CURSOR ON
    READ
    SET CURSOR OFF
    IF LASTKEY()=27
        RESTORE SCREEN FROM TELA1
        EXIT
    ENDIF
    SEEK FILTRO
    IF EOF()
        BEEP()
        ALERT("Registro nao encontrado...")
        MENSAGEM("TECLE ESC PARA SAIR")
        LOOP
    ENDIF
    EXIT
ENDDO
IF LASTKEY()=27
   RETURN
ENDIF
RESTORE SCREEN FROM TELA1

TIPO_PRN="I"
IF .NOT. MENU_PRN1("ARQUIVO")
    RETURN
ENDIF
SET DEVICE TO PRINTER
X=1
PAG=1
SAI_DA="S"
DO WHILE .NOT. EOF()
   IF INKEY()=27
      SET DEVICE TO SCREEN
      SAI_DA=PERGUNTA("CONTINUA A IMPRESSAO")
      SET DEVICE TO PRINTER
      IF SAI_DA="N"
         EXIT
      ENDIF
   ENDIF
   IF .NOT.(CODIGO=FILTRO_1)
        EXIT
   ENDIF
   IF X=1
      IF TIPO_PRN<>"T"
         @ 00,01 SAY CHR(18)
      ENDIF
      @ 01,01 SAY "RELATÓRIO DE CLIENTES TIPO FICHA"
      @ 01,45 SAY "PAGINA:"+SUBS(STR(PAG+10000,5),2)
      PAG=PAG+1
      @ 02,01 SAY ""
      @ 02,45 SAY "DATA:" +DTOC(DATE())
      @ 04,01 SAY REPL("-",58)
      X=05
    ENDIF
    @ X+00,001 SAY "CODIGO:"
    @ X+00,009 SAY CODIGO
    @ X+01,001 SAY "NOME..:"
    @ X+01,009 SAY NOME1
    X=X+4
    SKIP
    IF X>58
        X=1
    ENDIF
  ENDDO
  EJECT
  SET DEVICE TO SCREEN
  IF TIPO_PRN="A"
     SET PRINTER TO
  ELSEIF TIPO_PRN = "T" .AND. SAI_DA="S"
    SET PRINTER TO
    IMP_TELAT("ARQUIVO",59, 1)
   RESTORE SCREEN FROM TELA1
  ENDIF

Obrigado,

Josmar

Imprimir Várias Vias

Enviado: 16 Set 2010 09:50
por Pablo César
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.

Re: Imprimir Várias Vias

Enviado: 16 Set 2010 10:36
por Josmar dos Santos
Pablo, mais uma vez obrigado pelas suas dicas, vou implantar e fazer os testes que vc mencionou, pode acreditar....

Obrigado

josmar

Re: Imprimir Várias Vias

Enviado: 19 Set 2010 21:45
por Josmar dos Santos
Ola Pablo, tudo bom ?
To tentando usar essas funções q vc me passou e tambem fiz as alterações que vc me orientou a fazer, porém está dando erro de Argument: Alltrim . Isso ocorre na hora de fazer o filtro para imprimir...Fiz varios testes, mas nao consigui eliminar o mesmo !

Josmar

:(

Re: Imprimir Várias Vias

Enviado: 20 Set 2010 07:03
por Toledo
Josmar, poste aqui a sua função MENU_PRN1(), assim fica mais fácil lhe ajudar.

Abraços,

Re: Imprimir Várias Vias

Enviado: 20 Set 2010 13:53
por rochinha
Amiguinho,

Mude este trecho:

Código: Selecionar todos

X=1
PAG=1
SAI_DA="S"
DO WHILE .NOT. EOF()
   IF INKEY()=27
      SET DEVICE TO SCREEN
      SAI_DA=PERGUNTA("CONTINUA A IMPRESSAO")
      SET DEVICE TO PRINTER
      IF SAI_DA="N"
         EXIT
      ENDIF
   ENDIF
   ....
   resto do codigo
   ....
   IF X>58
      X=1
   ENDIF
ENDDO
Para este:

Código: Selecionar todos

X=1
PAG=1
SAI_DA="S"
**************************************************
VIAS=3
DO WHILE VIAS > 0 // .NOT. EOF()
   **************************************************
   IF INKEY()=27
      SET DEVICE TO SCREEN
      SAI_DA=PERGUNTA("CONTINUA A IMPRESSAO")
      SET DEVICE TO PRINTER
      IF SAI_DA="N"
         EXIT
      ENDIF
   ENDIF
   ....
   resto do codigo
   ....
   IF X>58
      X=1
   ENDIF
   **************************************************
   if eof() // Se chegou ao final, diminui quantidade de vias e reinicia leitura
      VIAS := VIAS - 1
      go top
   endif
   **************************************************
ENDDO

Re: Imprimir Várias Vias

Enviado: 23 Set 2010 15:34
por Josmar dos Santos
Ola Pessoal, desculpa a demora para responder, tiva enrolaado esses dias !
Rochinha, eu fiz a alteração que vc sugeriu, porém contina a mesma coisa ! Não mudou em relação ao codigo anterior !

Toledo, estou tentando usar essa função do Pablo, MeNU_PRN...!!!

Josmar

Imprimir Várias Vias

Enviado: 23 Set 2010 17:06
por Pablo César
Toledo escreveu:Josmar, poste aqui a sua função MENU_PRN1()
Na verdade seria interessante que você Josmar postar o OFICR01.PRG onde deve estar seu código que imprime o relatório.
Josmar escreveu:Rochinha, eu fiz a alteração que vc sugeriu, porém contina a mesma coisa ! Não mudou em relação ao codigo anterior !
O que o Rochinha sugeriu no seu código era para imprimir num laço de repetição para que pudesse repetir tantas vezes o usuário optar nas quantidade de vias. Mas isso implica em reprocessamento, que na minha opinião torna-se desnecessário. E ainda não resolve o problema para gerar SEMPRE o arquivo que irá no spool de impressão.
Josmar escreveu:está dando erro de Argument: Alltrim
Ontem eu precisei fazer essas implementações num código antigo de um cliente e que não era meu e acabei fazendo a minha sugestão. Só que é muito vago essa informação de erro de Alltrim, mas na tentativa de adivinhar no seria na constante IMPRESSORA ? Se for, deveria ir o nome da impressora default, ou o nome da impressora selecionada do menu das impressoras instaladas no Windows. Vou anexar um código exemplo utilizando a biblioteca WAPI do Maligno. E adapte para que ele atribua o retorno a essa variável IMPRESSORA.

Re: Imprimir Várias Vias

Enviado: 23 Set 2010 22:29
por Josmar dos Santos
Obrigado Pablo, ja baixei e to fazendo o teste. Em relação ao código oficr01, é a primeiro de todos ja postado nesse topico !
Josmar

Re: Imprimir Várias Vias

Enviado: 24 Set 2010 08:25
por Pablo César
é a primeiro de todos ja postado nesse topico
Ahhh sei, mas parece que está incompleto.

Imprimir Várias Vias

Enviado: 24 Set 2010 13:16
por Pablo César
O seu relatorio estava incompleto mesmo, não abria dbf e continha erros. Veja se o código abaixo dá certo.

Código: Selecionar todos

#include "OFIC.CH"

SET COLOR TO 21,79
FILTRO := SPACE( 5 )
SAVE SCREEN TO TELA1
SET COLOR TO N/W
@ 04,07 CLEAR TO 09,50
@ 04,7 TO 09,50
SELE 1
if userede("CLIENTES",.f.,30,.f.) 
   IF(!FILE("CLIENTES.CDX"))
     _FECHA()
     INDEX ON COD_CLI TAG CLIENT_1 TO CLIENTES
     INDEX ON NOM_CLI TAG CLIENT_2 TO CLIENTES
     _ABRE()
   ENDIF
   DBSETINDEX("CLIENTES")
else
   TONE( 250, 4 )
   MENSAGEM( "Nao foi possivel abrir arquivo CLIENTES", 5 )
   MENSAGEM( "tente novamente", 5 )
   RETURN 0
endif
DO WHILE .T.
   SET COLOR TO N/W,W+/R,,,N/W
   @ 06, 10 SAY "Digite o codigo do cliente.....:" GET FILTRO
   SET CURSOR ON
   READ
   SET CURSOR OFF
   IF LASTKEY()=27
      RESTORE SCREEN FROM TELA1
      EXIT
   ENDIF
   SEEK FILTRO
   IF EOF()
      BEEP()
      ALERT("Registro nao encontrado...")
      MENSAGEM("TECLE ESC PARA SAIR")
      LOOP
   ENDIF
   EXIT
ENDDO
IF LASTKEY()=27
   RETURN
ENDIF
RESTORE SCREEN FROM TELA1

ARQUIVO:="OFIC_01"
IMPRESSORA:="Impressora"
TIPO_PRN=""
TIPO_PRN=MENU_PRN(ARQUIVO) // para cada relatorio tem um numero OFIC_02, OFIC_03...
IF EMPTY(TIPO_PRN)
    RETURN
ENDIF
SET CURSOR OFF
SET PRINTER TO (ARQUIVO+".PRN")
SET DEVICE TO PRINTER
X=1
PAG=1
SAI_DA="S"
DO WHILE .NOT. EOF()
   IF INKEY()=27
      SET DEVICE TO SCREEN
      SAI_DA=PERGUNTA("CONTINUA A IMPRESSAO")
      SET DEVICE TO PRINTER
      IF SAI_DA="N"
         EXIT
      ENDIF
   ENDIF
   IF .NOT.(COD_CLI=FILTRO)
      EXIT
   ENDIF
   IF X=1
      IF TIPO_PRN<>"T"
         @ 00,01 SAY CHR(18)
      ENDIF
      @ 01,01 SAY "RELATORIO DE CLIENTES - TIPO FICHA"
      @ 01,45 SAY "PAGINA:"+SUBS(STR(PAG+10000,5),2)

      PAG=PAG+1
      @ 02,01 SAY ""
      @ 02,45 SAY "DATA:" +DTOC(DATE())
      @ 04,01 SAY REPL("-",58)
      X=05
   ENDIF
   @ X+00,001 SAY "CODIGO:"
   @ X+00,009 SAY COD_CLI
   @ X+01,001 SAY "NOME..:"
   @ X+01,009 SAY NOM_CLI
   X=X+4
   SKIP
   IF X>58
      X=1
   ENDIF
ENDDO
EJECT
SET DEVICE TO SCREEN
CLOSE CLIENTES // feche o dbf, nao ha necessidade de ficar aberto
SET PRINTER TO
IF TIPO_PRN = "T"
   IMP_TELA(ARQUIVO,59)
ELSE
   // procedimento para definir n§ de vias
   FICA:=.T.
   DO WHILE FICA=.T.
      nVias:=1
      cTela2:=SAVESCREEN(20,33,23,48)
      GWEXPLODE(20,34,22,46,200,"T","BG+/B")
      SOMBRA(20,34,22,46)
      MENSAGEM("Informe a quantidade de vias a serem impressas")
      @ 20,35 SAY PADC(" N§ vias ",9,"Ä") COLOR "BG+/B"
      SET CURSOR ON
      @ 21,39 GET nVias PICT "9" COLOR "W+/N"
      READ
      IF LASTKEY()=27
         FICA:=.F.
      ELSE
         IF nVias=0
            if alert("Deseja cancelar a impress„o ?",{"N„o","Sim"})=2
               return 1
            endif
         ELSE
            FICA:=.F.
         ENDIF
      ENDIF
      SET CURSOR OFF
      RESTSCREEN(20,33,23,48,cTela2)
   ENDDO

   /* 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.
   */
   if IMPRESSORA="Impressora"
      aPrinters:=GETPRINTERS()
      VT:=LEN(aPrinters)
      IF VT=0
         IMPRESSORA:="Paralela (local)"
         cImp:="LPT1" /* ou p/impres.em rede colocando o caminho:
                         cImp:="\\pc3\epson
                      */
         FOR I=1 TO nVias
             COPY FILE(ARQUIVO+".PRN") TO (cImp)
         NEXT
      ELSEIF VT=1
         IMPRESSORA:=aPrinters[1,2]
         cImp:=CHARREM(":",aPrinters[1,3])
      ELSE
         aImpressora:={}
         FOR I=1 TO VT
             AADD(aImpressora,aPrinters[I,2]) // Controi VETOR da MATRIZ
         NEXT
         cColor:=SETCOLOR()
         ctela1:=SAVESCREEN(14,15,23,64)
         JANELA(14,16,VT+15,63,"Sele‡„o de impressora")
         SETCOLOR(CONTECOR[4])
         IF (OP:=ACHOICE(15,17,22,62,aImpressora))!=0
            IMPRESSORA=aImpressora[OP]
            cImp:=CHARREM(":",aprinters[OP,3])
         ELSE
            // Verifica qual ‚ a impressora padr„o
            OP=0
            FOR I=1 TO VT
                IF aPrinters[I,1]=.T.
                   OP=I
                ENDIF
            NEXT
            IMPRESSORA:=aPrinters[OP,2]
            cImp:=CHARREM(":",aPrinters[OP,3])
         ENDIF
         SETCOLOR(cColor)
         RESTSCREEN(14,15,23,64,ctela1)
      ENDIF
   endif
   DELETE FILE("LOG.TXT")
   FOR I=1 TO nVias
       SWPRUNCMD("WAPI -PRINT:"+CHR(34)+"Epson LX-300"+CHR(34)+";"+ARQUIVO+".PRN;"+CHR(34)+"Clientes - Tipo Ficha"+CHR(34)+";F;A;F;"+str(nVias,1,0)+";F;LOG.TXT",0,"","")
   NEXT
   // IF !PrintFile(IMPRESSORA,"OFIC_01.PRN","Clientes - Tipo ficha",.F.,"A",.T.,.F.,.F.,.F.,1,.T.)
   lSucesso:=.f.
   IF FILE("LOG.TXT")
      IF ALLTRIM(MEMOREAD("LOG.TXT"))="0"
         lSucesso:=.t.
      ENDIF
      DELETE FILE("LOG.TXT")
   ENDIF
   IF lSucesso=.f.
      ALERT("Falha na tentativa de impress„o")
   ENDIF
ENDIF
RESTORE SCREEN FROM TELA1

Re: Imprimir Várias Vias

Enviado: 24 Set 2010 17:31
por Josmar dos Santos
Quem sabe ! sabe !, quem não sabe corre atrás, hehehe, valew Pablo, Brigadão !

Josmar
:))