terça-feira, 24 de maio de 2016

Integração Advpl x Word #2


Fala galera!

Continuando o post sobre integração Advpl x Word, hoje vamos detalhar sobre a codificação da rotina. Vamos criar um novo programa no Developer Studio e nomeá-lo. Darei o nome de AdvplDoc.prw, mas você pode definir o nome que preferir.

Integração Advpl x Word #2


Primeiramente vamos dar uma olhada no código fonte e posteriormente passaremos ponto a ponto com uma breve explicação.

#include "protheus.ch"
#include "rwmake.ch"                 
#include "tbiconn.ch"
#include "msole.ch"
/**
_________________________________________________________________________________
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦+---------------------------------------------------------------------------+¦¦
¦¦¦Programa  ¦ ADVPLDOC  ¦ Autor ¦ Renan Ramos              ¦ Data ¦ 19.05.16 ¦¦¦
¦¦¦----------+----------------------------------------------------------------¦¦¦
¦¦¦Descriçäo ¦ Realiza integração do Protheus com documentos Word.            ¦¦¦
¦¦+---------------------------------------------------------------------------+¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*/
user function advplDoc  

local hWord 
local cTitulo1  := "Arquivo Word"
local cExtensao := "Modelo Word | *.dot | *.dotx"
local cFileOpen := ""

PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01"
 
cFileOpen := cGetFile(cExtensao, cTitulo1,,,.T.)          
 
hWord := OLE_CreateLink()

OLE_SetProperty(hWord, oleWdVisible,   .T.)
OLE_SetProperty(hWord, oleWdPrintBack, .F.) 

OLE_NewFile(hWord, cFileOpen)

dbSelectArea("SA1")
dbSetOrder(1)                                                                                        
dbGoTop()
                                              
OLE_SetDocumentVar(hWord, "A1_COD"   ,SA1->A1_COD)
OLE_SetDocumentVar(hWord, "A1_NOME"  ,SA1->A1_NOME)
OLE_SetDocumentVar(hWord, "A1_END"   ,SA1->A1_END)
OLE_SetDocumentVar(hWord, "A1_BAIRRO",SA1->A1_BAIRRO)
OLE_SetDocumentVar(hWord, "A1_MUN"  ,SA1->A1_MUN)
OLE_SetDocumentVar(hWord, "A1_EST"   ,SA1->A1_EST) 

OLE_UpdateFields(hWord) 
OLE_saveFile(hWord)                                
OLE_PrintFile(hWord,"ALL",,,1)

cFileSave := subStr(cFileOpen,1,At(".",trim(cFileOpen))-1)
OLE_saveAsField(hWord, cFileSave+".doc")

OLE_closeLink(hWord)

return

Como podem perceber, é um fonte pequeno sem muitas linhas. Um ponto fundamental para conseguir realizar a comunicação é lembrar de incluir a biblioteca msole.ch, pois esta biblioteca permite que você possa utilizar as funções para efetuar a comunicação com o Word.

A biblioteca tbiconn.ch permite que você utilize o comando PREPARE ENVIRONMET EMPRESA, isto é muito útil, pois permite que você faça o teste da rotina sem ter a necessidade de acessar o Protheus e fazer todo o processo desde o login até a execução do programa. Para utilizá-lo, basta adicionar a empresa (no meu caso 99, pois é base teste) e a filial. Seu objetivo é inicializar o ambiente no qual será testada a rotina.

A método OLE_CreateLink() faz a conexão entre o Protheus e o MS-Office. Para verificar se a conexão foi realizada com sucesso, é indicado utilizar uma variável do tipo numérico (handle) para que receba o retorno desta função. Se o retorno da função for 0, a conexão ocorreu com sucesso, mas caso seja -1, houve problema na conexão.

Assim que a conexão estiver estabelecida, utilizaremos o método OLE_NewFile(nHandle, cPath) que possui dois parâmetros:

  • nHandle: é o valor retornado da método OLE_CreateLink();
  • cPath: é o diretório onde se encontra o arquivo que receberá os valores do Protheus.
Na parte seguinte do código, temos a conexão com banco (SA1), onde ordenamos e posicionamos nos registros satisfatórios.

Como em minha base tenho somente um cliente registrado, não foi necessário fazer um filtro e posicionar em um registro específico. Então, após posicionar ou filtrar no registro relacionado ao cliente desejado, vamos setar as variáveis com os valores correspondentes aos campos da tabela.

A método OLE_SetDocumentVar() define o conteúdo que será passado à variável que inserimos no documento no post anterior. Lembre-se que o nome da variável nesta função deve ser a mesma que foi inserida no documento Word, mas não necessariamente na mesma sequência.

Na sequencia temos três importantes métodos que são descritos a seguir:
  • OLE_UpdateFields: atualiza todas as variáveis do documento word criado;
  • OLE_saveFile: salva o documento atualizado;
  • OLE_PrintFile: executa a impressão do arquivo word. O parâmetro definido como "ALL" define que seja impresso todo documento.
Ao final do fonte, é chamado o método OLE_CloseLink() que é responsável por encerrar a conexão entre Protheus e Word.

Bom galera, espero que este post ajude vocês a desenvolverem uma rotina que facilite a vida do usuário. Acessem nosso GitHub, todos os códigos - inclusive o desse post - estão disponíveis para consultas e uso.

Até mais!

;)
Renan Rodrigues Ramos Desenvolvedor

Sou desenvolvedor, amo desenvolvimento de software, músico e apaixonado por filmes e seriados.