Página 1 de 2
Qual a forma ideal de imprimir ???
Enviado: 08 Mai 2012 17:57
por jjr_rs
Olá pessoal, não sei se aqui seria o correto para colocar este tópico, qualquer coisa já peço desculpas ao moderador.
Estou com um problema. Estou utilizando há algum tempo a Minigui do Roberto Lopez (HMG IDE versão:2010.06.20). Achei muito boa a utilização da IDE, já tendo me acostumado com ela. Mas agora me deparo com uma situação. Preciso realizar impressão e, do jeito antigo ao utilizar o Clipper e depois o xHarbour, sempre direcionando para lpt1 e usando @ prow(),00 say...
O que procuro agora é deixar essa seleção de porta de impressora e a própria impressora a cargo do windows e não "setar" mais a lpt1.
Dei uma olhada na IDE e testei a parte de criação de relatórios. De fato é muito simples, e por isso fiquei pensando na possibilidade do uso da win32prn, já que há tempos leio os posts do pessoal usando-a. Gostaria de saber a princípio, não apenas seus comandos, pois aqui será fácil encontrá-los mas sim uma explicação do porquê utilizá-la. Suas reais vantagens e caso essa não seja a melhor saída, qual seria a opção ideal para gerar impressões para um sistema que irá imprimir tanto em folha A4, letter, como também em impressoras do tipo Bematech, que utiliza bobina de impressão ao invés de folha grande.
Sinceramente é devido a esse conhecimento que ainda me falta, que me mantenho de certa forma "travado" no desenvolvimento dos relatórios... Temporariamente posso gerar uma tela num form, para o usuário realizar a seleção dos filtros e depois de gerar o relatório, enviá-lo direto para a impressora via Lpt1, mas não é isso que quero. Claro, se os colegas me mostrarem que essa forma é a mais correta, entenderei e continuarei nela, mas preciso da opinião de vocês sobre como utilizam nos sistemas desenvolvidos atualmente.
Desde já agradeço a compreensão e ajuda de todos !!! Grande abraço !!!
Qual a forma ideal de imprimir ???
Enviado: 08 Mai 2012 18:15
por Pablo César
A colocação deste tópico aqui na seção MiniGui, dependerá se você está procurando uma solução em Harbour ou até mesmo xHarbour através de recursos da HMG ou MiniGUI, como preferir.
Em forma geral falando, na minha opinião, tudo depende como você quer imprimir e o quê irá imprimir. Se você tem uma situação que o seu antigo sistema imprime pela impressora matricial e você não quer mudar para modo gráfico, pois esta além de ser mais lenta ou ineficaz em impressoras matriciais, elevam o custo por requerer mais tinta do que se fosse em modo texto.
Eu sempre escolhi como preferência, gerar arquivos textos e depois mandar a impressão pelo spooler do SO. Isso dá uma certa praticidade, tanto para visualizar o relatório em arquivo, como para re-imprimir o relatório sem precisar processar os dados para composição do relatório novamente. A impressão para a impressora direto, só o faço quando for no modo gráfico.
Então temos a situação de qual modo escolher (dependerá do hardware), ora seja pela rapidez e economia em matriciais imprimir em modo texto ou em modo gráfico quando tiver muita mudança de impressoras que ´não utilizam comandos de formatação como era feito com o padrão Epson e que o usuário venha requerer uma apresentação mais apurada nos relatório (melhor estética, melhor definição).
Também tem que avaliar, se o usuário irá demandar por geração de relatórios em PDF ou até mesmo em Excel, que é muito comum vermos hoje em dia.
Qual a forma ideal de imprimir ???
Enviado: 09 Mai 2012 15:22
por jjr_rs
Olá Pablo César,
Muito obrigado pelo seu retorno !
Aproveitando que você disse "Eu sempre escolhi como preferência, gerar arquivos textos e depois mandar a impressão pelo spooler do SO.", como no meu caso eu sempre enviava direto a impressão para a LPT1 ao invés de gerar arquivo texto, lhe peço para mostrar um exemplo, para eu poder analisar e assim também poder utilizá-la, já que você comentou que também gerava a visualização desse arquivo, o que para mim é super importante.
Abraço !
Qual a forma ideal de imprimir ???
Enviado: 09 Mai 2012 18:51
por Pablo César
Tem várias formas de direcionar a impressão para arquivo.
1. Opção:
Código: Selecionar todos
SET ALTERNATE TO BAIXA.TXT
SET ALTERNATE ON
?? "Linha 1"
? "Linha 2"
SET ALTERNATE OFF
SET ALTERNATE TO
2. Opção:
Código: Selecionar todos
SET PRINTER TO ETIQ.TXT
SET DEVICE TO PRINTER
@ 00,00 SAY "Linha 1"
@ 01,00 SAY "Linha 2"
SET PRINTER TO
SET DEVICE TO SCREEN
3. Opção (minha preferida):
Código: Selecionar todos
fh1:= fcreate("LOCA_01.PRN")
fwrite(fh1,"Linha 1"+Chr(13)+Chr(10))
fwrite(fh1,"Linha 2"+Chr(13)+Chr(10))
fclose(fh1)
E para visualizar o arquivo texto, eu importo o conteúdo para um arquivo dbf e visualizo com DbEdit que permite aplicar uma função própria para controle de visualização.
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 10:31
por jjr_rs
Obrigado pelos exemplos Pablo !!!
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 13:53
por jjr_rs
Pablo,
Agora verificando o modo como realizava as impressões, lembrei que usava o "prow()" para imprimir linha a linha, assim:
@ prow()+1,00 say replicate("-",55)
@ prow()+1,00 say " Data Produto Qtd. Valor Total"
@ prow()+1,00 say replicate("-",55)
Mas agora fui tentar utilizá-lo e dá erro... Será que faltou alguma biblioteca ou o xHarbour + Minigui não aceitam mais esse comando ? Usava o prow() para que não pulasse a página a cada nova impressão, já que meu sistema imprime em bobina de 89 colunas.
Caso o prow() não seja mais utilizado, como devo fazer para solucionar esse problema ? Tipo... como faço para pegar o número da linha que a impressora parou na última impressão ? Pois lembro que, se criar uma variável nLin = 0 e colocá-la no lugar do prow() no exemplo acima, quando mandar imprimir, a impressora entenderá que deve pular página, estou correto ?
Desde já agradeço a ajuda !!!
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 14:24
por Pablo César
Agora verificando o modo como realizava as impressões, lembrei que usava o "prow()" para imprimir linha a linha
Sim o PRow() é claro que existe, o Harbour mantém a compatibilidade com o Clipper diria 99,9%. E o PRow() nada mais é que uma função que retorna a linha em que se encontra a cabeça de impressão.
Mas agora fui tentar utilizá-lo e dá erro...
Qual erro ?
Será que faltou alguma biblioteca ou o xHarbour + Minigui não aceitam mais esse comando ?
Eu não utilizo o xHarbour, mas acredito que também deva ter o PRow. Como foi que você compilou xHarbour com Minigui ? Você não estaa usando o HMG ? Se for assim, fica muito mais fácil de te ajudar.
Usava o prow() para que não pulasse a página a cada nova impressão, já que meu sistema imprime em bobina de 89 colunas.
Eu para este caso, sempre usei o SET ALTERNATE com
? " Data Produto Qtd. Valor Total" (por exemplo). A cada ? muda a linha, se quiser continuar onde a cabeça de impressão parou use ??, bem fácil de usar. Mas aí você iria ter que mudar todo o seu código.
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 14:48
por jjr_rs
Pablo,
O erro que deu é: Error BASE/1081 Erro nos parametros +, e deu nessa linha:
@ prow()+1,00 say cf_cidade + " - " + cf_fone
sendo que cf_cidade e cf_fone tem seus conteúdos no formato caracter.
Sobre a versão, estou utilizando a HMG 3.0.35 que tem o Harbour 2.0.0.
Sobre usar o SET ALTERNATE, se for necessário, não há problema em mudar o código para utilizá-lo.
Mas fico com uma dúvida. Nessa impressão tenho que enviar para uma impressora LX-810 e tenho os seguintes comandos dela em variáveis:
_imp_normal :=chr(27)+'P'+chr(18) // letra tamanho normal
_imp_comprimi :=chr(27)+'P'+chr(15) // letra tamanho comprimido
_imp_ini_negrito :=chr(27)+'E' // inicio letra em negrito
_imp_fim_negrito :=chr(27)+'F' // final letra em negrito
Se for usar o SET ALTERNATE ou qualquer outra forma de imprimir que fores me indicar, esse comandos serão aceitos ? Já que nesse relatório necessito imprimir comprimido e em negrito em algumas linhas. Por exemplo como utilizava antes, conforme comando abaixo:
@ prow()+1,00 say _imp_comprimi + cf_empresa
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 15:10
por Pablo César
@ prow()+1,00 say cf_cidade + " - " + cf_fone
sendo que cf_cidade e cf_fone tem seus conteúdos no formato caracter.
Ahh então está dando erro na hora de execução. Você poderia inicializar a página com SETPRC(0,0) que serve para setar na linha zero e coluna zero.
Quanto a você mudar o seu código para o exemplo que citei cm SET ALTERNATE e ? com respeito as variáveis que você utiliza, não vai ter problema algum em impressora LX-810. O SET ALTERNATE, você irá criar um arquivo concatenando os dados que estariam sendo processados no seu relatório. Pode também substituir pela terceira opção com fwrite... mas nada impede de você deixar com PRow() também. Então uma vez você ter criado o arquivo de impressão, com a formatação de fontes para tal impressora, restaria você mandar para LPT1 ou a porta em que ela estiver conectada. Senão for uma impressora em USB, bastaria utilizar o COPY FILE(nome_arquivo) TO (porta_impressora).
Ela é uma impressora de rede ?
Se quiser postar o seu código eu dou uma revisada no módulo.
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 17:06
por jjr_rs
Pablo,
Verifiquei e corrigi o erro inicial, que havia uma função antes que não estava chamando e assim não estava carregando algumas variáveis, inclusive a cf_cidade e cf_fone.
Agora testei e a principio, ao dar o comando SET PRINTER TO LIST, foi criado arquivo list.prn.
Verifiquei seu conteúdo e estava correto.
Logo após, alterei o SET PRINTER TO LIST para SET PRINTER TO ( GetDefaultPrinter() ), para que sempre envie a impressão para a impressora padrão do sistema. Ao testar notei que foi criado arquivo com o nome da impressora (Epson LX-810.prn). Importante saber que no momento desse teste, não havia nenhuma impressora conectada ao micro, apenas seus drivers instalados. Então pergunto: quando eu tiver a impressora instalada, a impressão sairia nela direto?
Segue abaixo parte do código usado:
Código: Selecionar todos
set printer to ( GetDefaultPrinter() )
set device to printer
@ prow()+1,00 say _imp_comprimi + cf_empresa
@ prow()+1,00 say cf_endereco
@ prow()+1,00 say cf_cidade + " - " + cf_fone
@ prow()+1,00 say "Data: " + dtoc( date() ) + " - Hora:" + substr( time(),1,5 )
@ prow()+1,00 say replicate("-",55)
@ prow()+1,00 say "Cliente.: " + str(Cliente->codigo,5) + " - " + Left( Cliente->nome, 35 )
@ prow()+1,00 say replicate("-",55)
@ prow()+1,00 say " Data Produto Qtd. Valor Total"
@ prow()+1,00 say replicate("-",55)
@ prow()+7,00 say _imp_normal + ""
set printer to
set device to screen
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 17:27
por Pablo César
Verifiquei e corrigi o erro inicial, que havia uma função antes que não estava chamando e assim não estava carregando algumas variáveis, inclusive a cf_cidade e cf_fone.
Imaginei algo errado, não podia ser: não por causa do PRow()...
Logo após, alterei o SET PRINTER TO LIST para SET PRINTER TO ( GetDefaultPrinter() ), para que sempre envie a impressão para a impressora padrão do sistema. Ao testar notei que foi criado arquivo com o nome da impressora (Epson LX-810.prn).
Pois é... ao colocar GetDefaultPrinter() você apenas deu o nome do arquivo para a impressora default. Mas isso não quer dizer que irá imprimir nela. Sugiro você mudar o nome para algo que identifique o nome do relatório, por exemplo: "CLIENTE.PRN" ou "CLIENTE.TXT" como quiser mas que seja fixo para depois você jogar o conteúdo no spool da impressora.
Lembrando também que você está impriminfo em modo texto, não gráfico. E que você está mudando os formatados de impressão através de comando da própria impressora. Isto deixa você amarrado à impressora LX-810 e se futuramente mudar a impressora e esta não for do padrão EPSON, vai precisar que você altere o seu código fonte. Você se ainda preferir imprimir em modo texto (porque é mais econômico e rápido) você poderia fazer um bd de impressoras com os comandos equivalentes as:
- _imp_normal := ... // letra tamanho normal
_imp_comprimi := ... // letra tamanho comprimido
_imp_ini_negrito := ... // inicio letra em negrito
_imp_fim_negrito := ... // final letra em negrito
Fica aí a sugestão. Mas se quiser fazer em modo gráfico, daí você terá que refazer o seu módulo (seu prg).
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 17:53
por jjr_rs
Pois é Pablo,
Sei que ainda estou usando comandos para impressão em modo texto, mas é porque ainda não sei qual seria a melhor maneira de realizar a impressão em modo gráfico.
Então aceitaria sugestões, pois tenho vários tipos de impressões a serem geradas e de diversas formas... Tanto em A4, como em bobinas, sem falar que em muitos ainda tenho que imprimir comprimido ou em negrito também e no momento, apesar de ter visto algumas maneiras de gerar esses relatórios, não sei ainda para que lado ir e qual utilizar.
Procuro na verdade uma solução que sirva para qualquer situação, tipo de impressão e impressora.
O que tu me indicaria e se possível com um pequeno exemplo.
Novamente te agradeço a ajuda !!!
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 18:17
por Pablo César
Mas eu já tinha respondido para você. Não existe a melhor forma de imprimir, sem levar em consideração o seu hardware e outros aspectos como: qualidade de impressão, rapidez, economia.
Imprimir em modo gráfico, irá com certeza dar maior flexibilidade sobre qualquer impressora que imprima em modo gráfico. Tem impressora que não imprimem em modo gráfico. Pois imprimir em modo gráfico, irá precisa do drive adequado para sua impressora para que o Windows imprima, já no modo texto você não necessariamente irá precisar estar todos os drivers de cada impressora instalado e direitinho.
Já pensou imprimir em modo gráfico nessa impressora Epson LX-810 ? É muito lenta a impressão gráfica, além de ser muito barulhenta por causa das agulhas de impressão.
De todas formas, para aprendizado, veja o exemplo Imprime(cTexto,cPrinter) do
STRU - Lista estrutura dos arquivos dbfs que disponibilizei na seção de Downloads, onde utililiza o WIN_PRN().
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 19:19
por sygecom
Eu concordo com o Pablo, não existe uma melhor forma hoje em dia. Estamos entre a era da Matricial e Laser ou jato de tinta, até as matricial sumir do mercado que ainda levará um bom tempo, eu usarei TXT e imprimo em qualquer impressora, quando identifico que é LPT eu mando imprimir usando PRINTFILERAW(), claro que alguns relatório exige algo mais moderno ai eu uso FastReport.
Qual a forma ideal de imprimir ???
Enviado: 14 Mai 2012 19:55
por Pablo César
eu usarei TXT e imprimo em qualquer impressora, quando identifico que é LPT eu mando imprimir usando PRINTFILERAW()
É uma forma também prática de definir que a impressora possa ser matricial ou não. Mas na minha opinião outra forma mais segura seria
através de um conjunto de propriedades como: Largura, Altura, Cores e Porta.