Página 1 de 1

Compartilhando Soluções Paliativas-Impressão de Formulários

Enviado: 07 Jun 2007 04:11
por Spitzer
Oi, pessoal!

Sei que aqui há muitos mestres, pelos quais não escondo tremenda admiração, mas que também há pessoas que sofrem como eu em algumas soluções... hehehehehe

Pois bem, devido a necessidade de um cliente de utilizar um específico formulário Windows ("formulário" não no sentido de forms, mas sim de documento) totalmente gráfico, inclusive com logotipo, encontrei uma solução que não é nenhuma maravilha, mas que está sendo um bom paliativo na impressão deste formulário e desejo compartilhar.
Para tal, será necessário a "interação" entre o Clipper (uso a versão 5.2e com Blinker 5.1), a biblioteca de terceiros "ClipWKS" e o Excel!
Estou falando de um formulário (nota fiscal, recibo, fatura...) e não de um relatório!

O texto ficará extenso... Mas quem tiver problemas semelhantes ao meu, creio que ajudará, e quem já tiver uma solução, por favor, leia também, pois estou aberto a novas sugestões, e sei que a solução que criei, resolve, mas que certamente há outras melhores, mais fáceis e mais práticas. Inclusive, aceito de bom grado sugestões de melhorar esta solução que estou postando.

No Excel...Numa planilha que gravei como "PLAN.XLS", criei o formulário (trabalhoso, e muito, mas não é difícil).
Desenhei nas células, e não com os recursos de caixa de texto, mas que também é possível, e acho que até mais fácil do que criar formulários diretamente nas células.
O logotipo foi baba, né? Ctrl+C no arquivo .jpg do logotipo, Ctrl+V no Excel, podendo arrastá-lo para onde quiser!
Nas células da planilha que irão os dados, coloquei as fórmulas com vínculos de outra planilha (a PLAN_TMP.XLS) que será criada pelo Clipper.
Depois digo porque da criação desta segunda planilha.
As fórmulas são mais ou menos assim (a condição "SE" é para não ficar com "0" (zero) quando não tiver conteúdo na célula):

Código: Selecionar todos

*******************
=SE('C:\Desenv\Cli1\[PLAN_TMP.xls]PLAN_TMP'!$A$1="";"";'C:\Desenv\Cli1\[PLAN_TMP.xls]PLAN_TMP'!$A$1)
=SE('C:\Desenv\Cli1\[PLAN_TMP.xls]PLAN_TMP'!$A$2="";"";'C:\Desenv\Cli1\[PLAN_TMP.xls]PLAN_TMP'!$A$2)
=SE('C:\Desenv\Cli1\[PLAN_TMP.xls]PLAN_TMP'!$A$3="";"";'C:\Desenv\Cli1\[PLAN_TMP.xls]PLAN_TMP'!$A$3)
*******************
Criei uma macro com o nome de auto_open(). Este nome é obrigatório para que a macro seja executada assim que a planilha for aberta sem a intervenção do usuário.
A macro executa uma impressão e fecha a planilha sem salvar e sem a intervenção do usuário.
A macro (não preciso gravar os dados da planilha, que só é utilizada para impressão, pois os dados são gerados pelo Clipper!):

Código: Selecionar todos

*******************
Sub auto_open()
' Região de Impressão
    Range("A1:AC56").Select
' Imprime a planilha ativa
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

'Quit Microsoft Excel.
    Application.Quit

    ThisWorkbook.Close SaveChanges:=False
End Sub

*******************
Aí, pelo menu do Excel:
1) "Editar", "Vínculos", botão "Prompt de inicialização...", escolhi a última opção, que é "Não exibir o alerta e atualizar vínculos";
2) "Ferramentas", "Opções...", guia "Editar", demarquei a caixa "Confirmar atualização de vínculos automáticos";
3) "Ferramentas", "Macro", "Segurança", escolhi a última opção, que é "Baixo (não recomendável). Você não está protegido contra macros...".
Os itens 1 e 2, evitam que apareça aquela caixa de alerta perguntando se quer atualizar os vínculos e atualizam-nos automaticamente sem perguntar, e o item 3, é para permitir a execução da macro.

Quando preciso fazer alguma atualização na planilha, é bem arcaico a forma que achei (quando abro-a, ela executa automaticamente e fecha, lembram?); Abro o Excel e no menu "Ferramentas", "Macro", "Segurança", defino "Muito alto. Somente macros...". Aí, abro a planilha, que não se autoexecutará mais, faço as alterações necessárias e volto a definir o modo de segurança de macros como baixo, e salvo-a.
Aceito sugestões... Não sei desativar uma macro!

A parte do Excel, se não esqueci nada, acabou!


No clipper...Aqui é mais baba... Afinal, mesmo com inexperiência, é nosso mundo, né?
Deve ser linkado com o sistema, a biblioteca "clpwks52.lib" (vi que tem também a biblioteca "clpwks53.lib").
Esta biblioteca permite criar e manipular planilhas do Excel até a versão 4.0, é, agora, free e está disponibilizada pelo seu autor no link abaixo:

http://www.jbooth-consulting.com/products_clipwks.asp

Ah, a biblioteca tem um excelente NG!
Aí, no programa, coloquei estes códigos:

Código: Selecionar todos

******************************** BOF File
.
.
.
// Cria Arquivo do Excel na versao 4.0

LOCAL laXls := LCREATE("PLAN_TMP.XLS","E4")

// Caminho e arquivo Excel de impressão que será executado

// Na execução, será aberto o arquivo Plan.xls, e não Plan_Tmp.xls que foi criado
LOCAL lcExec := "C:\ARQUIV~1\MICROS~2\OFFICE11\EXCEL.EXE PLAN.XLS"

LOCAL lcDados1 := "Pode ser uma variável!"

// Se não for possível criar a planilha PLAN_TMP.XLS, mensagem de erro!
IF EMPTY(laXls)
   ?
   ? "Nao foi Possivel Criar a Planilha Excel [PLAN_TMP.XLS]"
   ?
   RETURN NIL
ENDIF

// Inclui os dados na planilha criada
// "A1", "A2", "A3"..., são as células que irão os dados
// O apóstrofe simples é para forçar um texto na fórmula. Preferi assim!
LPUT(laXls,"'Aqui pode ser um literal","A1")
LPUT(laXls,"'"+lcDados1,"A2")
LPUT(laXls,"'Pode ser uma fórmula!","A3")

// Fecha a planilha criada
LCLOSE (laXls)

// Chama o Excel e abre uma outra planilha
// Abre Plan.xls, e não Plan_Tmp.xls que foi criado
IF !SWPRUNCMD(lcExec,0)
   ?
   ? "Nao foi Possivel Abrir a Planilha Excel PLAN.XLS"
   ?
ENDIF
.
.
.
******************************** EOF File
Talvez haja algum erro aí nos códigos, troca de nomes de planilhas, sintaxe...

A parte do Clipper, também se não esqueci nada, acabou!

Agora, a resposta da pergunta que certamente farão: "Porque duas planilhas Excel?".
Bom, foi a solução que encontrei para os problemas, e talvez houvessem outras que não fosse necessário a criação de dois arquivos.
E os problemas foram:
1) Formatos... A biblioteca "ClipWKS" tem também a função de leitura e reescrita numa célula, só que aí, toda a formatação da célula (cor de texto, cor de fundo, rachurados, negrito, fontes, tamanho de fontes...) ia tudo por água abaixo!
2) Esta lib trabalha com o Excel até a versão 4.0. Até consegui criar a macro numa planilha salva nesta versão, só que depois dela ter sido salva, ao reabrir, adeus, macro!

Pontos negativos:
1) Uma boa interatividade com o Excel no que diz respeito à criação de documentos;
2) Chato pra caramba... Após imprimir, o foco sai do programa (é que vai para o Excel para a impressão), e não sei voltá-lo ao programa! hehehehehe

Aceito sugestões pro item 2. Será que um comando na macro do Excel resolve? Tipo, recuperar o foco assim que o Excel é aberto e antes de fechar, voltar o foco?
Sei lá... Tô viajando! Não sei trabalhar com macros.

Era isto!

Re: Compartilhando Soluções Paliativas-Impressão de Formulár

Enviado: 01 Jul 2007 02:29
por Pablo César
Spitzer escreveu:Aceito sugestões pro item 2. Será que um comando na macro do Excel resolve? Tipo, recuperar o foco assim que o Excel é aberto e antes de fechar, voltar o foco?
Oi Spitzer ! Muito criativo a sua idéia de criar duas planilhas. Teve colega que postou como fazer a formatação de coluna em planilha geradas pelo Clipper.

Bem a questão 2 que não volta ao programa que chamou o Excel, não tem nada a ver com o Excel nem muito menos com as macros do mesmo. Se deve que o ambiente do seu aplicativo não é GUI (gráfico) e o Excel sim. Experimenta muda o modo de exibição do seu aplicativo-Clipper antes de chamar o Excel. Mude-o para modo Janelado (Alt Enter), possivelmente retorne (não fiz esse teste com seu aplicativo). Outra sugestão é chamar o Excel através de:

Código: Selecionar todos

SWPRUNCMD("START /W "+lcExec,0)
O start é do SO e deve esperar que seja executado o Exce para retornar a sua aplicação.

Se a sua aplicação roda em WIN XP, tenho para te indicar o -WINDOW2TOP da WAPI do Maligno. Que com certeza você conseguirá retornar a sua aplicação principal após chamado o Excel.

Espero ter ajuda e obrigado por ter compartilhado sua idéia conosco. Parabéns !

Re: Compartilhando Soluções Paliativas-Impressão de Formulár

Enviado: 01 Jul 2007 12:02
por Maligno
Pablo César escreveu:Se a sua aplicação roda em WIN XP, tenho para te indicar o -WINDOW2TOP da WAPI do Maligno. Que com certeza você conseguirá retornar a sua aplicação principal após chamado o Excel.
Seria mais apropriado, se for do interesse do colega, baixar a biblioteca completa do meu site e tentar utilizar as funções após uma leitura do README. Mas não recomendo utilizar os parâmetros de linha de comando. As funções abstraem seu uso e facilitam o trabalho.

Enviado: 21 Ago 2007 09:56
por Bruno de Almeida
Só para registrar...

Semana passada precisei de algo semelhante a isto para gerar e imprimir uma fatura cheia de firulas, inclusive com logotipo.
Vim aqui no fórum, li, li, li (li vários tópicos)... E encontrei este tópico.

ONTEM CONCLUÍ E HOJE JÁ ESTÁ RODANDO NA PRODUÇÃO DESDE AS 08:00, SEM QUALQUER PROBLEMA!

Agora iniciei outro projeto com urgência de cronograma e assim que concluir, voltarei para testar as dicas de após a impressão no Excel, retornar ao programa Clipper.

PARABÉNS AO AUTOR PELA INICIATIVA, ALÉM DE QUE, A POSTAGEM É UM VERDADEIRO STEP-BY-STEP!

Obrigado!

Bruno

COMPARTILHANDO

Enviado: 21 Ago 2007 19:14
por Netavin
... caro Spitzer!!!
Parabéns pela iniciativa. Com certeza é o início de uma grande obra.

Forte abraço!

Netavin.