Página 1 de 2
Copiando Aquivo de Impressao Direto para impressora na rede!
Enviado: 24 Dez 2007 13:08
por frank_fpc
Oi amigos, sei que pra isso tem até um tópico fixo no forum, mas gostaria de saber se alguém de alguma forma conseguiu implementar da forma como gostaria que funcionasse.
Eu faço as impressões diretamente num arquivo, para em seguida jogá-lo para a impressora padrão (tanto local como em rede e mesmo com impressoras USB), isso acelera e muito a liberdade do programa. Isso é perfeitamente funcional no Win98, como muitos de vcs sabem. Quando vamos para o XP ainda na impressão local funciona perfeitamente, mas quando se trata de impressoras em rede, só vc redirecionando a porta de impressao.
Nesse aspecto é que eu gostaria de fazer diferente, pois queria copiar o arquivo de impressao diretamente para o caminho da impressora compartilhada, sem redirecionar as portas de impressao: a questão é que quando estamos no promp de comando funciona perfeitamente, por exemplo: COPY TEMP001.TXT \\TERMINAL\FX-1170. Realiza a impressao perfeitamente, no entanto se uso esse mesmo comando dentro do Clipper por meio do comando de execução externa (!/RUN) dá o erro "Parêmtro Inválido" e não funciona.
Gostaria de saber dos amigos se sabem me informar como corrigir ou meios para superar isso.
Obrigado a todos e até!
[/b]
Enviado: 25 Dez 2007 11:55
por Augusto
Tente...
SWPRUNCMD("COPY TEMP001.TXT \\TERMINAL\FX-1170") ao invés de RUN COPY TEMP001.TXT \\TERMINAL\FX-1170
EM TEMPO: Outras formas tbm devem funcionar (não testei):
SWPRUNCMD("PRINT TEMP001.TXT > \\TERMINAL\FX-1170")
SWPRUNCMD("TYPE TEMP001.TXT > \\TERMINAL\FX-1170")
Enviado: 26 Dez 2007 08:25
por Pablo César
Eu sempre utilizei o comando COPY FILE(ARQ.PRN) TO (VONDE) para impressora NÃO USBs, onde ´VONDE é a varivel que pode ser passado como parâmetro ora seja da linha de comando ou gravado num DBF onde contém as impressoras e seus comandos de impressão e o campo onde contém o caminho.
Eu nunca tive esse problema, claro que sempre informei o caminho, conforme a impressora estiver instalada. Por isso para cada estação deve-se configurar as impressoras que estiverem instaladas em cada estação. Pode ser usado a biblioteca do WAPI que capturaria as impressoras instaladas e seu caminho. Mas teria também fazendo assim:
VIMP:="COPY ARQUIVO.PRN \\PC\IMPRESSSORA"
RUN (VIMP)
Mas até imagino por quê está dando esse erro... deve-se ao fato que no DOS o nome do computador e o nome da impressora deve ser até 8 caracteres (nome curtos), experimenta renomear ´para ver se for isso.
E a outra possibilidade é usar a biblioteca WAPI que iria colocar o arquivo de impressão na fila de impressão, independete se é USB, local ou de rede...
Enviado: 28 Dez 2007 12:14
por frank_fpc
Oi amigos, desde já agradeço a contribuição de cada para a resolução do meu problema, no entanto o que pude perceber foi o seguinte:
- Ao usar a função do blinker ( Swpruncmd() ) para executar os comandos do dos, continuou da mesma forma, ou seja, dá a msg de parâmetro inválido no comando (vá entender... rssss);
- Tentei tmb, sem sucesso, usar o comando do proprio Clipper, COPY FILE ... TO, mas tmb dá o mesmo erro;
- No entanto ao usar o comando PRINT a impressão foi realizada com sucesso, mas apresentou 2 incovenientes: 1) Mesmo direcionando as mensagens para o NUL, de forma que não aparecam, ainda surge a mensagem de que o arquivo está sendo impresso, 2) Ela só está disponível nas versões do Windows XP e família 2000/2003, mas no Windows 98 ela não é disponível, o que dificulta a padronização.
- E para que ninguém pense que realmente pode haver algo de errado no comando passado para o DOS, coloquei-o numa variável e executei a depois com a função Swpruncmd(), e o seu conteúdo era exatamente esse:
COPY /B Temp036.prn \\TERMINAL\FX-1170
- Estou olhando a biblioteca WAPI do nosso amigo Maligno, parece interessante, mas gostaria de o máximo possível usar só funções natas do Clipper mesmo e da CaTools, não gosto de aquele amontoado de bibliotecas sendo utilizadas, gosto de criar as soluções, mas se não for possível, não terei alternativas...
Mais uma vez obrigado a todos que contribuíram e irão contribuir com certeza.
Enviado: 28 Dez 2007 13:49
por Eolo
Frank, embora esta não seja uma resposta direta à sua pergunta, aqui vai: eu tb apanhei com a impressão Clipper52e / USB (mesmo usando o PageScript), até que mudei pro XHarbour (console) e os problemas sumiram.
Eu tive que mudar quase nada nos meus fontes (as mudanças são mínimas) e, pra função WIN32PRN(), do XHarbour, não há diferença entre LPT1/USB, local/rede, Win98/XP... e vc ainda imprime a cores, escolhe retrato/paisagem etc., tudo nativo. A função manda a impressão pro spool do Win e sua aplicação fica livre. É fantástico.
Enviado: 28 Dez 2007 14:30
por Daniel
eu uso assim.
mais vi falar que nao funciona em todas as maquinas, mais aqui funciona
Set Console Off
Set Device To Printer
Set Printer On
Set Printer To \\servidor\epson\lpt1
?? "X0"
?? ""
?? "P"
?? "C!"
Enviado: 28 Dez 2007 15:18
por Eolo
Daniel, a sua solução não elimina o problema da aplicação ficar "presa" até terminar a impressão do relatório, que é algo que o Frank não deseja...
Também, vc disse "aqui funciona", mas isso quer dizer o que? Que funciona com printers paralelas e/ou USB, sob qualquer Windows?
Enviado: 28 Dez 2007 16:23
por ABeltrani
Frank
Eu utilizo as funções da CATools netredir() e netcancel() que fazem a mesma coisa que o NET USE do DOS. Funciona perfeito. Já testei em Windows 98 e XP.
A netredir() faz o mesmo que o NET USE <PORTA> <\\ESTAÇAO\COMPARTILHAMENTO> e a netcancel() faz o mesmo que o NET USE <PORTA> /DELETE.
Enviado: 28 Dez 2007 17:23
por Daniel
Eolo
ele so funciona em impressora paralela compativel com dos e libera o programa sim.
em usb estou usando a lib do Maligno q seria uma otima solucao pro problema dele
Exemplo
xim:= "I" + (StrZero(Val(StrTran(Str(Seconds()), ".", "")), 7)) + ".txt"
Set Console Off
Set Device To Printer
Set Printer To &xim
Set Printer On
?? "P"
?? "2"
?? "C!"
@ .....
@.....
?? "CB"
Set Printer To
Set Device To Screen
Set Printer Off
Set Console On
cPrinter:= SetaImp()
If ! Empty(cPrinter)
PrintFile(cPrinter, xim, "Relatorio de Vendas")
EndIf
FErase(xim)
********************************
Function SetaImp()
Local aPrinter, op, x2:= 10, TelaAnt
TelaAnt:= SaveScreen()
aPrinter:= GetPrinters()
@ 9, 23 Clear To (10 + LEN(aPrinter)), 51
@ 9, 23 To (10 + LEN(aPrinter)), 51
For x:= 1 TO LEN(aPrinter)
xp:= 20 - Len(AllTrim(aPrinter[x,2]))
@ x2, 25 Prompt Str(x, 2) + "-> " + aPrinter[x, 2] + Space(xp)
x2++
Next
Menu To op
RestScreen(,,,,TelaAnt)
If LastKey() == 27
Return Nil
EndIf
If Empty(aPrinter)
@ 24, 10 Clear
@ 24, 13 Say "Nao ha Impressora instalada!"
Return Nil
Else
Return aPrinter[op, 2]
EndIf
Return Nil
Enviado: 28 Dez 2007 19:31
por Eolo
ele so funciona em impressora paralela compativel com dos e libera o programa sim...
em usb estou usando a lib do Maligno q seria uma otima solucao pro problema dele
Daniel, cada um com seu jeito de trabalhar mas eu, ao invés de usar uma solução pra paralela matricial, outra pra paralela jato de tinta, outra pra paralela laser, outra pra USB matricial, outra pra USB inkjet etc etc... (desculpe, não resisti ao exagero!), prefiro usar só o XHarbour. Uma só solução pra qq(s) impressora(s), qualquer Windows... Cara, se vc experimentar, não larga mais.
E repíto: a alteração, nos PRGs, é coisa de menos de 1%. Muito menos.
Enviado: 31 Dez 2007 09:41
por Daniel
Eolo feliz ano novo
vc pode notar na minha assinatura q eu uso o minigui nao tenho problema de impressao. Citei uma solucao para o clipper, ja q tem varias, esta de usar a lib do Maligno e muito facil de usar.
Enviado: 31 Dez 2007 12:30
por Pablo César
frank_fpc escreveu:dá a msg de parâmetro inválido no comando (vá entender... rssss)
Não teria por quê dar erro a não ser pelo nome da impressora dada (acho que é alí o problema).
para que ninguém pense que realmente pode haver algo de errado no comando passado para o DOS... o seu conteúdo era exatamente esse:
COPY /B Temp036.prn \\TERMINAL\FX-1170
Frank, experimente renomear o nome da impressora compartilhada. Isto é, pelo que eu percebo seria conveniente TIRAR o "-" do FX-1170, deixe com o nome de compartilhamento como: FX1170 (sem espaços, sem outro caracter). Experimente e nos diga se deu certo.
A outra opção que tem é utilizar o USB.EXE do Heveraldo e acredito que não teria problema algum em rodar.
Enviado: 31 Dez 2007 13:05
por sygecom
Outra opção, seria vc migrar essa app para xharbour, ou se não quer sair do clipper agora, simplesmente fazer somente essa parte de impressão em xharbour, tarefa essa muito facil...que pode contar com a sessão de xharbour aqui fo forum para auxiliar.
Enviado: 02 Jan 2008 23:40
por Maligno
Isso é perfeitamente funcional no Win98, como muitos de vcs sabem. Quando vamos para o XP ainda na impressão local funciona perfeitamente, mas quando se trata de impressoras em rede, só vc redirecionando a porta de impressao.
Se você já redireciona sua impressão pra arquivo, o melhor é usar um programa que envie o conteúdo desse arquivo pro spooler do Windows. Independentemente de qual for a solução utilizada pra isso, você resolve esse seu problema de forma bem fácil. Agora, estando no seu lugar, já com o arquivo pronto, eu usaria a biblioteca WAPI (é um programa externo), que é a forma mais discreta, já que este programa é embutido no Clipper e você nem o vê. E você só precisa usar uma função. Exemplo:
PrintFile("#","print.txt")
Isso envia para o spooler o conteúdo do arquivo de impressão chamado "print.txt", para que seja direcionado para a impressora configurada como a padrão no seu Windows. Opcionalmente você pode trocar a string "#" pelo nome de qualquer impressora que esteja configurada no seu Windows, sela ela local ou remota.
Enviado: 02 Jan 2008 23:41
por Maligno
Em tempo: a biblioteca WAPI também tem uma função que lista as impressoras disponíveis no Windows.