Set device to printer

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Set device to printer

Mensagem 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 ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Set device to printer

Mensagem 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+,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Set device to printer

Mensagem por Hasse »

Alguma função que seja de minha autoria certamente não.

Salvo aquelas do Windows.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Set device to printer

Mensagem 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.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
jamazevedo
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 29 Dez 2005 16:50
Localização: Manaus - AM

Re: Set device to printer

Mensagem 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.
______________________________________________________
Usando: Linux Ubuntu 18.04, Harbour 3.2.0dev r1811161533
______________________________________________________
José Airton de Menezes Azevedo
Manaus - AM
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Set device to printer

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Set device to printer

Mensagem 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...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Set device to printer

Mensagem 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.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
BigKing
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 15 Ago 2014 09:34
Localização: lins/sp

Set device to printer

Mensagem 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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Set device to printer

Mensagem 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?
[]´s
Alexandre Santos (AlxSts)
BigKing
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 15 Ago 2014 09:34
Localização: lins/sp

Set device to printer

Mensagem 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.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Set device to printer

Mensagem 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
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Set device to printer

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Set device to printer

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
João Jr.
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 06 Abr 2011 09:38
Localização: Tupã/SP

Set device to printer

Mensagem 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.
Responder