Página 1 de 7

Set device to printer

Enviado: 06 Set 2009 22:55
por Hasse
Bom dia amigos.

Estou com uma dificuldade, já fazem mais de 3 meses, e continuo pesquisando, mas não sei mais o que fazer.

Nestas últimas versões do xHarbour, nem sei mais a partir de qual delas, acontece que o comando SET DEVICE TO PRINTER não está funcionando adequadamente, e somente em modo local. Em modo remoto não percebi qualquer problema até hoje. Aparentemente é uma questão de velocidade da CPU.

Até agora sempre contornei o problema com soluções alternativas, achado que com o tempo eu encontraria o motivo, mas isto ainda não aconteceu, e agora chegou o momento em que preciso resolver esta situação para me adequar às necessidades do cliente.

Tentei inserir "freios" no desempenho colocando MilliSec() em pontos antes e depois da citada função SET(), antes e depois da função DBSkip(), e também não surtiu efeito.

Mesmo após insistentes comandos SET DEVICE TO PRINTER a saída continua, parcialmente, saindo para a tela. Vejam que eu disse parcialmente, pois parte sai para a tela e parte para a impressora. A coisa está uma doidura total.

Já usei desta forma abaixo, para forçar o comando até que ele obrigatoriamente esteja setado, mas não surtiu efeito:

Código: Selecionar todos

WHILE SET(_SET_DEVICE) <> "PRINTER"
   SET DEVICE TO PRINTER
ENDDO
Se eu uso o comando SET PRINTER TO saida.txt o problema não ocorre.

Alguém já teve um problema desses ?

Isto pode ser algum defeito da CPU ou da interface da impressora ? Do driver não deve ser pois já desinstalei e instalei o dito várias vezes.

Alguém tem alguma sugestão ?

Re: Set device to printer

Enviado: 06 Set 2009 23:19
por ANDRIL
Hasse,

Tem alguma função no sistema que roda em segundo plano? Ja vi isso ocorrer neste caso, nao custa dar uma olhada.

Ate+,

Re: Set device to printer

Enviado: 07 Set 2009 08:57
por Hasse
Alguma função que seja de minha autoria certamente não.

Salvo aquelas do Windows.

Re: Set device to printer

Enviado: 08 Set 2009 01:52
por sygecom
Olá Hasse,
Eu nunca tive esse problema, mas post um exemplo reduzido seu que demoonstre o problema, quem sabe podemos tentar alguma outra solução.

Re: Set device to printer

Enviado: 16 Set 2009 10:39
por jamazevedo
Olá Hasse. Bom dia!

Esse bug é feio pois uso o SET DEVICE TO PRINT em todas as minha aplicações.

A versão que tenho atualmente é xHarbour 1.2.1 no Linux Ubuntu 7.04, 8.04, 8.10 e 9.04.

Seguindo a sugestão do Sygecom poste um pequeno exemplo para podermos analisá-lo.

Re: Set device to printer

Enviado: 16 Set 2009 18:55
por Hasse
Eu ainda estou elaborando pequenos aplicativos para testes, pois ainda não há estabilidade de resultados, ou seja, nem sempre o defeito acontece, passando dias sem problemas, e em seguida, tem um dia que parece que capeta solta rabanadas por tudo quanto é lado.

Mas, de qualquer forma seguem vários testes que já fiz e nenhum deles resolveu definitivamente o problema. Abaixo segue a parte do código usado no meu sistema.

Código: Selecionar todos

SET DEVICE TO PRINT
@ 00,00 SAY cfi_in + cfi_10cpi + cfi_nlq1 + cfi_under1
@ PROW(),PCOL() SAY "Per¡odo avaliado: " + c_mes1 +"/" + c_ano1 + "  a  " +;
                    c_mes2 + "/" + c_ano2 + cfi_under0
@ PROW()+1,00 SAY ""
SET DEVICE TO SCREEN
GO TOP
DO WHILE ! EOF()
   c_dat  := RIGHT(VENC,4) + SUBS(VENC,4,2)
   IF c_dat >= c_dat1 .AND. c_dat <= c_dat2
      @ 12,12 SAY "Registro:  " + STR(RECNO(),4,0)
      n_soma = n_soma + VALOR
      SET DEVICE TO PRINT
      @ PROW()+1,00 SAY BANCO + "   " + NOME
      @ PROW(),PCOL()+4 SAY F + " " + STR(VALOR,9,2)
      @ PROW(),PCOL()+4 SAY VENC
      SET DEVICE TO SCREEN
   ENDIF
   SKIP
ENDDO
SET DEVICE TO PRINT
@ PROW()+2,00 SAY "Soma...........................: " + STR(n_soma,9,2)
@ PROW(),PCOL() SAY cfi_nlq0
EJECT
set printer to
SET DEVICE TO SCREEN
Onde as variáveis cfi_* configuram a impressora (tamanho da fonte, sublinhado, itálico, etc).

Também já tentei o código abaixo, com pequena alteração na ordem do SET PRINTER....

Código: Selecionar todos

SET DEVICE TO PRINT
@ 00,00 SAY cfi_in + cfi_10cpi + cfi_nlq1 + cfi_under1
@ PROW(),PCOL() SAY "Per¡odo avaliado: " + c_mes1 +"/" + c_ano1 + "  a  " +;
                    c_mes2 + "/" + c_ano2 + cfi_under0
@ PROW()+1,00 SAY ""
GO TOP
DO WHILE ! EOF()
   c_dat  := RIGHT(VENC,4) + SUBS(VENC,4,2)
   IF c_dat >= c_dat1 .AND. c_dat <= c_dat2
      SET DEVICE TO SCREEN
      @ 12,12 SAY "Registro:  " + STR(RECNO(),4,0)
      SET DEVICE TO PRINT
      n_soma = n_soma + VALOR
      @ PROW()+1,00 SAY BANCO + "   " + NOME
      @ PROW(),PCOL()+4 SAY F + " " + STR(VALOR,9,2)
      @ PROW(),PCOL()+4 SAY VENC
   ENDIF
   SKIP
ENDDO
SET DEVICE TO PRINT
@ PROW()+2,00 SAY "Soma...........................: " + STR(n_soma,9,2)
@ PROW(),PCOL() SAY cfi_nlq0
EJECT
set printer to
SET DEVICE TO SCREEN
Como já mencionei anteriormente, já usei um loop para ter certeza que o DEVICE estava setado para a impressora:

Código: Selecionar todos

WHILE SET(_SET_DEVICE) <> "PRINTER"
   SET DEVICE TO PRINTER
ENDDO
Nenhuma das tentativas resultou em solução definitiva do problema.

Em vista disso, eu já sugeri ao cliente que substituísse o computador, ou pelo menos a interface paralela.

Vamos ver o que acontece. De qualquer forma, prometo passar as informações assim que obtiver sucesso na solução do problema.

Antecipadamente, obrigado pelo interesse.

Re: Set device to printer

Enviado: 16 Set 2009 19:50
por alxsts
Saudações a todos!

Caro Hasse:

Permita-me dar um palpite em xHarbour, embora a minha experiência tenha sido toda com Cipper:

Analisando o código postado, notei que voce alterna muito o Device dentro do loop. Será que voce não está se perdendo nesse vai e volta? Isso justificaria a sua frase:
Mesmo após insistentes comandos SET DEVICE TO PRINTER a saída continua, parcialmente, saindo para a tela.
.

Quando preciso emitir mensagens na tela durante uma impressão, uso as funções DevPos( nRow, nCol ) e DispOut( <exp>, [<cColor>] ).

Tomei a liberdade de usar o teu código como exemplo:

Código: Selecionar todos

    SET DEVICE TO PRINT  // Ativa uma única vez
    
    @ 00,00 SAY cfi_in + cfi_10cpi + cfi_nlq1 + cfi_under1
    @ PROW(),PCOL() SAY "Per¡odo avaliado: " + c_mes1 +"/" + c_ano1 + "  a  " +;
                        c_mes2 + "/" + c_ano2 + cfi_under0
    @ PROW()+1,00 SAY ""
//    SET DEVICE TO SCREEN
    GO TOP
    DO WHILE ! EOF()
       c_dat  := RIGHT(VENC,4) + SUBS(VENC,4,2)
       IF c_dat >= c_dat1 .AND. c_dat <= c_dat2
//          @ 12,12 SAY "Registro:  " + STR(RECNO(),4,0)

          // Posiciona na 12,12 e exibe uma mensagem (cor opcional)       
          DevPos( 12, 12 ) ; DevOut( "Registro:  " + STR(RECNO(),4,0), "N+/W*" )  // aceita uma cor se vc quiser
          // ---
          n_soma = n_soma + VALOR
//          SET DEVICE TO PRINT
          @ PROW()+1,00 SAY BANCO + "   " + NOME
          @ PROW(),PCOL()+4 SAY F + " " + STR(VALOR,9,2)
          @ PROW(),PCOL()+4 SAY VENC
//          SET DEVICE TO SCREEN
       ENDIF
       SKIP
    ENDDO
//    SET DEVICE TO PRINT
    @ PROW()+2,00 SAY "Soma...........................: " + STR(n_soma,9,2)
    @ PROW(),PCOL() SAY cfi_nlq0
    EJECT
    set printer to

    SET DEVICE TO SCREEN   // Desativa uma única vez
espero que ajude de alguma forma...

Re: Set device to printer

Enviado: 19 Set 2009 02:22
por sygecom
Olá Hasse,
Pode tentar assim também:

Código: Selecionar todos

SET DEVICE TO PRINT
set print to lpt1  // ou direciona para arquivo

@ 00,00 SAY cfi_in + cfi_10cpi + cfi_nlq1 + cfi_under1
@ PROW(),PCOL() SAY "Per¡odo avaliado: " + c_mes1 +"/" + c_ano1 + "  a  " +;
                    c_mes2 + "/" + c_ano2 + cfi_under0
@ PROW()+1,00 SAY ""
GO TOP
DO WHILE ! EOF()
   c_dat  := RIGHT(VENC,4) + SUBS(VENC,4,2)
   IF c_dat >= c_dat1 .AND. c_dat <= c_dat2
     SET DEVICE TO SCREEN 
     @ 12,12 SAY "Registro:  " + STR(RECNO(),4,0)
      SET DEVICE TO PRINT
      n_soma = n_soma + VALOR
      @ PROW()+1,00 SAY BANCO + "   " + NOME
      @ PROW(),PCOL()+4 SAY F + " " + STR(VALOR,9,2)
      @ PROW(),PCOL()+4 SAY VENC
   ENDIF
   SKIP
ENDDO

@ PROW()+2,00 SAY "Soma...........................: " + STR(n_soma,9,2)
@ PROW(),PCOL() SAY cfi_nlq0
EJECT

set printer to
SET DEVICE TO SCREEN
Uso assim desde o tempo do Clipper e passei para xHarbour e nunca tive problemas.

Set device to printer

Enviado: 19 Ago 2014 12:25
por BigKing
Olá.

sou clippeiro e fiz a conversão para harbour, legal praticamente compilei meus fontes, o problema que meu servidor ainda é XP, pois encontro o erro Dos Create 32, relacionado ao Set Printer to &cAqruivo, qual executo no meu servidor DBF (o executavel fica na minha maquina) roda normail, cria meu TXT e blz, qdo testo no meu pc (W7) dá esse erro alguém ja encontrou algo assim.

abços

Set device to printer

Enviado: 19 Ago 2014 12:44
por alxsts
Olá!
Dos Error 32 - Violação de compartilhamento
Seja bem-vindo ao fórum!

Você já verificou se tem permissão de gravação na pasta destino ou se já existe nesta pasta um arquivo com o mesmo nome do que você está criando?

Set device to printer

Enviado: 20 Ago 2014 09:54
por BigKing
cArquivo := "NFe00"+cNota+".txt"

comando := "Del r:\"
Run (comando+""+cArquivo)

cArq := FCreate(cArquivo,0)

If cArq = -1
Mens("Erro na criacao do arquivo")
Return
Endif

Set Console Off

set printer to cArquivo
Set Device to printer

amigo a rotina funciona normalmente qdo executo pela rede (servidor com xp)

testando no w7
quando executo na maquina com o windows7, o arquivo gera vazio. não copia nada, não imprime nada dentro do arquivo.

o erro que mencionei aparece no xp qdo executo a versão harbour. porque no clipper 5.2 roda legal.

Set device to printer

Enviado: 20 Ago 2014 10:13
por alaminojunior
Assim como o Alexandre, também percebi uns 'SET DEVICE TO SCREEN' a mais, onde fatalmente vai ocorrer o sintoma.
Se não existe necessidade de mostrar algo na tela durante a impressão, retire estes comandos do trecho.

Também costumo usar sempre:

Código: Selecionar todos

SET DEVICE TO PRINTER
SET PRINTER TO [PORTA OU ARQUIVO] 
e ao final para encerrar:

Código: Selecionar todos

SET PRINTER TO
SET DEVICE TO SCREEN

Set device to printer

Enviado: 20 Ago 2014 10:23
por Jairo Maia
Apenas complementando:

Você precisa remover esses comandos:

Código: Selecionar todos

cArq := FCreate(cArquivo,0)

If cArq = -1
Mens("Erro na criacao do arquivo")
Return
Endif
Se você diz que em Clipper está funcionando, então o Clipper tolera você criar o arquivo com o Handler aberto, mas em Harbour isso não é possível. Se você tem um Handler aberto para cArquivo, cArquivo ficará vazio porque o SET PRINTER TO cArquivo não irá funcionar até que o Handler cArq seja fechado, e como o colega Alexandre já disse, dará erro de violação de compartilhamento. Remova esta parte, porque mesmo em Clipper não precisa.

Set device to printer

Enviado: 20 Ago 2014 18:37
por JoséQuintas
O esquisito é sair na tela.

Apenas tentativa, modifique isto:

Código: Selecionar todos

// Se impressora default, não mexa com porta
// SET PRINTER TO LPT1
...
// Use a ordem abaixo no final
SET DEVICE TO SCREEN
SET PRINTER TO

Set device to printer

Enviado: 07 Fev 2015 11:29
por João Jr.
Separe para outro programa a parte de impressão.
prog1.prg
prog2.prg -> somete a parte de impressao que gera o arquivo.

Espero ter ajudado.
Jr.